First draft of dashboard integration
This commit is contained in:
parent
111390d23d
commit
714e1b3f91
@ -1,6 +1,14 @@
|
||||
Changelog
|
||||
=========
|
||||
|
||||
3.0.0
|
||||
+++++
|
||||
|
||||
- Introduce dashboards
|
||||
- Redmine 4.1 or newer ist required
|
||||
- FontAwesome 5.14.0 support
|
||||
|
||||
|
||||
2.0.24
|
||||
++++++
|
||||
|
||||
|
1
Gemfile
1
Gemfile
@ -3,6 +3,7 @@ source 'https://rubygems.org'
|
||||
gem 'deface', '1.5.3'
|
||||
gem 'gemoji', '~> 3.0.0'
|
||||
gem 'invisible_captcha'
|
||||
gem 'rss'
|
||||
gem 'slim-rails'
|
||||
|
||||
group :development, :test do
|
||||
|
64
app/controllers/dashboard_async_blocks_controller.rb
Normal file
64
app/controllers/dashboard_async_blocks_controller.rb
Normal file
@ -0,0 +1,64 @@
|
||||
require 'open-uri'
|
||||
|
||||
class DashboardAsyncBlocksController < ApplicationController
|
||||
before_action :find_dashboard
|
||||
before_action :find_block
|
||||
|
||||
helper :additionals_routes
|
||||
helper :additionals_queries
|
||||
helper :additionals_tag
|
||||
helper :queries
|
||||
helper :issues
|
||||
helper :activities
|
||||
helper :dashboards
|
||||
|
||||
include DashboardsHelper
|
||||
|
||||
def show
|
||||
partial_locals = build_dashboard_partial_locals @block, @block_definition, @settings, @dashboard
|
||||
|
||||
respond_to do |format|
|
||||
format.js do
|
||||
render partial: partial_locals[:async][:partial],
|
||||
content_type: 'text/html',
|
||||
locals: partial_locals
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def find_dashboard
|
||||
@dashboard = Dashboard.find params[:dashboard_id]
|
||||
raise ::Unauthorized unless @dashboard.visible?
|
||||
|
||||
if @dashboard.dashboard_type == DashboardContentProject::TYPE_NAME && @dashboard.project.nil?
|
||||
@dashboard.content_project = find_project_by_project_id
|
||||
else
|
||||
@project = @dashboard.project
|
||||
deny_access if @project.present? && !User.current.allowed_to?(:view_project, @project)
|
||||
end
|
||||
|
||||
@can_edit = @dashboard&.editable?
|
||||
rescue ActiveRecord::RecordNotFound
|
||||
render_404
|
||||
end
|
||||
|
||||
def find_block
|
||||
@block = params['block']
|
||||
@block_definition = @dashboard.content.find_block @block
|
||||
render_404 if @block.blank?
|
||||
render_403 if @block_definition.blank?
|
||||
|
||||
@settings = @dashboard.layout_settings @block
|
||||
end
|
||||
|
||||
def find_project_by_project_id
|
||||
begin
|
||||
@project = Project.find params[:project_id]
|
||||
rescue ActiveRecord::RecordNotFound
|
||||
render_404
|
||||
end
|
||||
deny_access unless User.current.allowed_to?(:view_project, @project)
|
||||
end
|
||||
end
|
216
app/controllers/dashboards_controller.rb
Normal file
216
app/controllers/dashboards_controller.rb
Normal file
@ -0,0 +1,216 @@
|
||||
class DashboardsController < ApplicationController
|
||||
menu_item :dashboards
|
||||
|
||||
before_action :find_dashboard, except: %i[index new create]
|
||||
before_action :find_optional_project, only: %i[new create index]
|
||||
|
||||
accept_rss_auth :index, :show
|
||||
accept_api_auth :index, :show, :create, :update, :destroy
|
||||
|
||||
rescue_from Query::StatementInvalid, with: :query_statement_invalid
|
||||
|
||||
helper :queries
|
||||
helper :issues
|
||||
helper :activities
|
||||
helper :watchers
|
||||
helper :additionals_routes
|
||||
helper :dashboards
|
||||
helper :additionals_issues
|
||||
helper :additionals_queries
|
||||
helper :additionals_tag
|
||||
|
||||
include AdditionalsRoutesHelper
|
||||
include AdditionalsQueriesHelper
|
||||
include QueriesHelper
|
||||
include WatchersHelper
|
||||
include SortHelper
|
||||
|
||||
def index
|
||||
case params[:format]
|
||||
when 'xml', 'json'
|
||||
@offset, @limit = api_offset_and_limit
|
||||
else
|
||||
@limit = per_page_option
|
||||
end
|
||||
|
||||
scope = Dashboard.visible
|
||||
@query_count = scope.count
|
||||
@query_pages = Paginator.new @query_count, @limit, params['page']
|
||||
@dashboards = scope.sorted
|
||||
.limit(@limit)
|
||||
.offset(@offset)
|
||||
.to_a
|
||||
|
||||
respond_to do |format|
|
||||
format.html { render_error status: 406 }
|
||||
format.api
|
||||
end
|
||||
end
|
||||
|
||||
def show
|
||||
respond_to do |format|
|
||||
format.js if request.xhr?
|
||||
format.api
|
||||
end
|
||||
end
|
||||
|
||||
def new
|
||||
@dashboard = Dashboard.new(project: @project,
|
||||
author: User.current)
|
||||
@dashboard.dashboard_type = assign_dashboard_type
|
||||
@allowed_projects = @dashboard.allowed_target_projects
|
||||
end
|
||||
|
||||
def create
|
||||
@dashboard = Dashboard.new(author: User.current)
|
||||
@dashboard.safe_attributes = params[:dashboard]
|
||||
@dashboard.dashboard_type = assign_dashboard_type
|
||||
@dashboard.role_ids = params[:dashboard][:role_ids] if params[:dashboard].present?
|
||||
|
||||
@allowed_projects = @dashboard.allowed_target_projects
|
||||
|
||||
if @dashboard.save
|
||||
flash[:notice] = l(:notice_successful_create)
|
||||
|
||||
respond_to do |format|
|
||||
format.html { redirect_to dashboard_link_path(@project, @dashboard) }
|
||||
format.api { render action: 'show', status: :created, location: dashboard_url(@dashboard, project_id: @project) }
|
||||
end
|
||||
else
|
||||
respond_to do |format|
|
||||
format.html { render action: 'new' }
|
||||
format.api { render_validation_errors(@dashboard) }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def edit
|
||||
return render_403 unless @dashboard.editable_by?(User.current)
|
||||
|
||||
@allowed_projects = @dashboard.allowed_target_projects
|
||||
|
||||
respond_to do |format|
|
||||
format.html
|
||||
format.xml {}
|
||||
end
|
||||
end
|
||||
|
||||
def update
|
||||
return render_403 unless @dashboard.editable_by?(User.current)
|
||||
|
||||
@dashboard.safe_attributes = params[:dashboard]
|
||||
@dashboard.role_ids = params[:dashboard][:role_ids] if params[:dashboard].present?
|
||||
|
||||
@project = @dashboard.project if @project && @dashboard.project.present? && @dashboard.project != @project
|
||||
@allowed_projects = @dashboard.allowed_target_projects
|
||||
|
||||
if @dashboard.save
|
||||
flash[:notice] = l(:notice_successful_update)
|
||||
respond_to do |format|
|
||||
format.html { redirect_to dashboard_link_path(@project, @dashboard) }
|
||||
format.api { head :ok }
|
||||
end
|
||||
else
|
||||
respond_to do |format|
|
||||
format.html { render action: 'edit' }
|
||||
format.api { render_validation_errors(@dashboard) }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def destroy
|
||||
return render_403 unless @dashboard.destroyable_by?(User.current)
|
||||
|
||||
begin
|
||||
@dashboard.destroy
|
||||
flash[:notice] = l(:notice_successful_delete)
|
||||
respond_to do |format|
|
||||
format.html { redirect_to @project.nil? ? home_path : project_path(@project) }
|
||||
format.api { head :ok }
|
||||
end
|
||||
rescue ActiveRecord::RecordNotDestroyed
|
||||
flash[:error] = l(:error_remove_db_entry)
|
||||
redirect_to dashboard_path(@dashboard)
|
||||
end
|
||||
end
|
||||
|
||||
def query_statement_invalid(exception)
|
||||
logger&.error "Query::StatementInvalid: #{exception.message}"
|
||||
session.delete(additionals_query_session_key('dashboard'))
|
||||
render_error l(:error_query_statement_invalid)
|
||||
end
|
||||
|
||||
def update_layout_setting
|
||||
block_settings = params[:settings] || {}
|
||||
|
||||
block_settings.each do |block, settings|
|
||||
@dashboard.update_block_settings(block, settings.to_unsafe_hash)
|
||||
end
|
||||
@dashboard.save
|
||||
@updated_blocks = block_settings.keys
|
||||
end
|
||||
|
||||
# The block is added on top of the page
|
||||
# params[:block] : id of the block to add
|
||||
def add_block
|
||||
@block = params[:block]
|
||||
if @dashboard.add_block @block
|
||||
@dashboard.save
|
||||
respond_to do |format|
|
||||
format.html { redirect_to dashboard_link_path(@project, @dashboard) }
|
||||
format.js
|
||||
end
|
||||
else
|
||||
render_error status: 422
|
||||
end
|
||||
end
|
||||
|
||||
# params[:block] : id of the block to remove
|
||||
def remove_block
|
||||
@block = params[:block]
|
||||
@dashboard.remove_block @block
|
||||
@dashboard.save
|
||||
respond_to do |format|
|
||||
format.html { redirect_to dashboard_link_path(@project, @dashboard) }
|
||||
format.js
|
||||
end
|
||||
end
|
||||
|
||||
# Change blocks order
|
||||
# params[:group] : group to order (top, left or right)
|
||||
# params[:blocks] : array of block ids of the group
|
||||
def order_blocks
|
||||
@dashboard.order_blocks params[:group], params[:blocks]
|
||||
@dashboard.save
|
||||
head 200
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def assign_dashboard_type
|
||||
if params['dashboard_type'].present?
|
||||
params['dashboard_type']
|
||||
elsif params['dashboard'].present? && params['dashboard']['dashboard_type'].present?
|
||||
params['dashboard']['dashboard_type']
|
||||
elsif @project.nil?
|
||||
DashboardContentWelcome::TYPE_NAME
|
||||
else
|
||||
DashboardContentProject::TYPE_NAME
|
||||
end
|
||||
end
|
||||
|
||||
def find_dashboard
|
||||
@dashboard = Dashboard.find(params[:id])
|
||||
raise ::Unauthorized unless @dashboard.visible?
|
||||
|
||||
if @dashboard.dashboard_type == DashboardContentProject::TYPE_NAME && @dashboard.project.nil?
|
||||
@dashboard.content_project = find_project_by_project_id
|
||||
else
|
||||
@project = @dashboard.project
|
||||
end
|
||||
|
||||
@can_edit = @dashboard&.editable?
|
||||
rescue ActiveRecord::RecordNotFound
|
||||
render_404
|
||||
end
|
||||
end
|
@ -12,12 +12,11 @@ module AdditionalsClipboardjsHelper
|
||||
|
||||
data['clipboard-text'] = clipboard_text_from_button if clipboard_text_from_button.present?
|
||||
|
||||
content_tag(:button, nil,
|
||||
id: "zc_#{target}",
|
||||
class: 'clipboard_button far fa-copy',
|
||||
type: 'button',
|
||||
title: l(:label_copy_to_clipboard),
|
||||
data: data)
|
||||
tag.button id: "zc_#{target}",
|
||||
class: 'clipboard_button far fa-copy',
|
||||
type: 'button',
|
||||
title: l(:label_copy_to_clipboard),
|
||||
data: data
|
||||
end
|
||||
|
||||
def render_clipboardjs_javascript(target)
|
||||
|
@ -12,7 +12,7 @@ module AdditionalsFontawesomeHelper
|
||||
return '' if info.blank?
|
||||
|
||||
post_text = ''
|
||||
options['aria-hidden'] = 'true'
|
||||
options[:'aria-hidden'] = 'true'
|
||||
options[:class] = if options[:class].present?
|
||||
info[:classes] + ' ' + options[:class]
|
||||
else
|
||||
@ -29,7 +29,7 @@ module AdditionalsFontawesomeHelper
|
||||
post_text = options[:post_text]
|
||||
options.delete(:post_text)
|
||||
end
|
||||
s << content_tag('span', '', options)
|
||||
s << tag.span(options)
|
||||
if post_text.present?
|
||||
s << ' '
|
||||
s << post_text
|
||||
@ -41,7 +41,7 @@ module AdditionalsFontawesomeHelper
|
||||
options[:include_blank] ||= true unless options[:required]
|
||||
html_options = {}
|
||||
|
||||
additionals_fontawesome_add_selected(selected)
|
||||
additionals_fontawesome_add_selected selected
|
||||
|
||||
name, options = Additionals.hash_remove_with_default(:name, options, :icon)
|
||||
loader, options = Additionals.hash_remove_with_default(:loader, options, true)
|
||||
@ -71,8 +71,6 @@ module AdditionalsFontawesomeHelper
|
||||
end
|
||||
|
||||
def additionals_fontawesome_loader(options, html_options = {})
|
||||
# Rails.logger.warn "debug selected_store: #{@selected_store.inspect}"
|
||||
|
||||
html_options[:class] ||= 'select2-fontawesome-field'
|
||||
options[:template_selection] = 'formatFontawesomeText'
|
||||
options[:template_result] = 'formatFontawesomeText'
|
||||
|
@ -1,15 +1,20 @@
|
||||
module AdditionalsIssuesHelper
|
||||
def issue_author_options_for_select(project, issue = nil)
|
||||
authors = project.users.sorted
|
||||
def author_options_for_select(project, issue = nil)
|
||||
authors = if project.present?
|
||||
project.users.sorted
|
||||
else
|
||||
Principal.active.where(type: 'User').sorted
|
||||
end
|
||||
|
||||
s = []
|
||||
return s unless authors.any?
|
||||
|
||||
s << content_tag('option', "<< #{l(:label_me)} >>", value: User.current.id) if authors.include?(User.current)
|
||||
s << tag.option("<< #{l(:label_me)} >>", value: User.current.id) if authors.include?(User.current)
|
||||
|
||||
if issue.nil?
|
||||
s << options_from_collection_for_select(authors, 'id', 'name')
|
||||
else
|
||||
s << content_tag('option', issue.author, value: issue.author_id, selected: true) if issue.author && !authors.include?(issue.author)
|
||||
s << tag.option(issue.author, value: issue.author_id, selected: true) if issue.author && !authors.include?(issue.author)
|
||||
s << options_from_collection_for_select(authors, 'id', 'name', issue.author_id)
|
||||
end
|
||||
safe_join(s)
|
||||
|
@ -4,7 +4,6 @@ module AdditionalsJournalsHelper
|
||||
# Returns the textual representation of a journal details
|
||||
# as an array of strings
|
||||
def entity_details_to_strings(entity, details, no_html = false, options = {})
|
||||
Rails.logger.debug "debug entity_details_to_strings: #{details.inspect}"
|
||||
entity_type = entity.model_name.param_key
|
||||
show_detail_method = "#{entity_type}_show_detail"
|
||||
options[:only_path] = options[:only_path] != false
|
||||
|
@ -60,7 +60,7 @@ module AdditionalsMenuHelper
|
||||
.joins(members: :project).where(projects: { status: Project::STATUS_ACTIVE })
|
||||
.distinct
|
||||
.reorder(nil)
|
||||
.pluck(:id)
|
||||
.ids
|
||||
|
||||
items.each do |item|
|
||||
additionals_custom_top_menu_item(item, user_roles)
|
||||
@ -177,15 +177,14 @@ module AdditionalsMenuHelper
|
||||
s = []
|
||||
pages.each_with_index do |item, idx|
|
||||
s << if item[:title] == '-'
|
||||
content_tag(:li, tag(:hr))
|
||||
tag.li(tag.hr)
|
||||
else
|
||||
html_options = { class: 'help_item_' + idx.to_s }
|
||||
if item[:url].include? '://'
|
||||
html_options[:class] << ' external'
|
||||
html_options[:target] = '_blank'
|
||||
end
|
||||
content_tag(:li,
|
||||
link_to(item[:title], item[:url], html_options))
|
||||
tag.li(link_to(item[:title], item[:url], html_options))
|
||||
end
|
||||
end
|
||||
safe_join(s)
|
||||
|
10
app/helpers/additionals_projects_helper.rb
Normal file
10
app/helpers/additionals_projects_helper.rb
Normal file
@ -0,0 +1,10 @@
|
||||
module AdditionalsProjectsHelper
|
||||
def project_overview_name(_project, dashboard = nil)
|
||||
name = [l(:label_overview)]
|
||||
if dashboard.present?
|
||||
name << dashboard.name if dashboard.always_expose? || !dashboard.system_default
|
||||
end
|
||||
|
||||
safe_join name, Additionals::LIST_SEPARATOR
|
||||
end
|
||||
end
|
@ -270,4 +270,11 @@ module AdditionalsQueriesHelper
|
||||
|
||||
tags
|
||||
end
|
||||
|
||||
def render_query_group_view(query, locals = {})
|
||||
return if locals[:group_name].blank?
|
||||
|
||||
render partial: 'queries/additionals_group_view',
|
||||
locals: { query: query }.merge(locals)
|
||||
end
|
||||
end
|
||||
|
82
app/helpers/additionals_routes_helper.rb
Normal file
82
app/helpers/additionals_routes_helper.rb
Normal file
@ -0,0 +1,82 @@
|
||||
module AdditionalsRoutesHelper
|
||||
def _dashboards_path(project, *args)
|
||||
if project
|
||||
project_dashboards_path(project, *args)
|
||||
else
|
||||
dashboards_path(*args)
|
||||
end
|
||||
end
|
||||
|
||||
def _dashboard_path(project, *args)
|
||||
if project
|
||||
project_dashboard_path(project, *args)
|
||||
else
|
||||
dashboard_path(*args)
|
||||
end
|
||||
end
|
||||
|
||||
def _dashboard_async_blocks_path(project, *args)
|
||||
if project
|
||||
project_dashboard_async_blocks_path(project, *args)
|
||||
else
|
||||
dashboard_async_blocks_path(*args)
|
||||
end
|
||||
end
|
||||
|
||||
def _edit_dashboard_path(project, *args)
|
||||
if project
|
||||
edit_project_dashboard_path(project, *args)
|
||||
else
|
||||
edit_dashboard_path(*args)
|
||||
end
|
||||
end
|
||||
|
||||
def _new_dashboard_path(project, *args)
|
||||
if project
|
||||
new_project_dashboard_path(project, *args)
|
||||
else
|
||||
new_dashboard_path(*args)
|
||||
end
|
||||
end
|
||||
|
||||
def _update_layout_setting_dashboard_path(project, *args)
|
||||
if project
|
||||
update_layout_setting_project_dashboard_path(project, *args)
|
||||
else
|
||||
update_layout_setting_dashboard_path(*args)
|
||||
end
|
||||
end
|
||||
|
||||
def _add_block_dashboard_path(project, *args)
|
||||
if project
|
||||
add_block_project_dashboard_path(project, *args)
|
||||
else
|
||||
add_block_dashboard_path(*args)
|
||||
end
|
||||
end
|
||||
|
||||
def _remove_block_dashboard_path(project, *args)
|
||||
if project
|
||||
remove_block_project_dashboard_path(project, *args)
|
||||
else
|
||||
remove_block_dashboard_path(*args)
|
||||
end
|
||||
end
|
||||
|
||||
def _order_blocks_dashboard_path(project, *args)
|
||||
if project
|
||||
order_blocks_project_dashboard_path(project, *args)
|
||||
else
|
||||
order_blocks_dashboard_path(*args)
|
||||
end
|
||||
end
|
||||
|
||||
def dashboard_link_path(project, dashboard, options = {})
|
||||
options[:dashboard_id] = dashboard.id
|
||||
if dashboard.dashboard_type == DashboardContentProject::TYPE_NAME
|
||||
project_path project, options
|
||||
else
|
||||
home_path options
|
||||
end
|
||||
end
|
||||
end
|
@ -1,11 +1,9 @@
|
||||
module AdditionalsSettingsHelper
|
||||
def additionals_settings_tabs
|
||||
tabs = [{ name: 'general', partial: 'additionals/settings/general', label: :label_general },
|
||||
{ name: 'content', partial: 'additionals/settings/overview', label: :label_overview_page },
|
||||
{ name: 'wiki', partial: 'additionals/settings/wiki', label: :label_wiki },
|
||||
{ name: 'macros', partial: 'additionals/settings/macros', label: :label_macro_plural },
|
||||
{ name: 'rules', partial: 'additionals/settings/issues', label: :label_issue_plural },
|
||||
{ name: 'projects', partial: 'additionals/settings/projects', label: :label_project_plural },
|
||||
{ name: 'users', partial: 'additionals/settings/users', label: :label_user_plural },
|
||||
{ name: 'web', partial: 'additionals/settings/web_apis', label: :label_web_apis }]
|
||||
|
||||
|
@ -21,7 +21,7 @@ module AdditionalsTagHelper
|
||||
' '
|
||||
end
|
||||
|
||||
content_tag(:div, safe_join(s, sep), class: 'tags')
|
||||
tag.div(safe_join(s, sep), class: 'tags')
|
||||
end
|
||||
|
||||
# plain list of tags
|
||||
@ -48,29 +48,27 @@ module AdditionalsTagHelper
|
||||
end, sep)
|
||||
end
|
||||
|
||||
def additionals_tag_link(tag, options = {})
|
||||
def additionals_tag_link(tag_object, options = {})
|
||||
tag_name = []
|
||||
tag_name << tag.name
|
||||
tag_name << tag_object.name
|
||||
|
||||
unless options[:tags_without_color]
|
||||
tag_bg_color = additionals_tag_color(tag.name)
|
||||
tag_fg_color = additionals_tag_fg_color(tag_bg_color)
|
||||
tag_bg_color = additionals_tag_color tag_object.name
|
||||
tag_fg_color = additionals_tag_fg_color tag_bg_color
|
||||
tag_style = "background-color: #{tag_bg_color}; color: #{tag_fg_color}"
|
||||
end
|
||||
|
||||
tag_name << content_tag('span', "(#{tag.count})", class: 'tag-count') if options[:show_count]
|
||||
tag_name << tag.span("(#{tag_object.count})", class: 'tag-count') if options[:show_count]
|
||||
|
||||
if options[:tags_without_color]
|
||||
content_tag('span',
|
||||
link_to(safe_join(tag_name), additionals_tag_url(tag.name, options)),
|
||||
class: 'tag-label')
|
||||
tag.span(link_to(safe_join(tag_name), additionals_tag_url(tag_object.name, options)),
|
||||
class: 'tag-label')
|
||||
else
|
||||
content_tag('span',
|
||||
link_to(safe_join(tag_name),
|
||||
additionals_tag_url(tag.name, options),
|
||||
style: tag_style),
|
||||
class: 'additionals-tag-label-color',
|
||||
style: tag_style)
|
||||
tag.span(link_to(safe_join(tag_name),
|
||||
additionals_tag_url(tag_object.name, options),
|
||||
style: tag_style),
|
||||
class: 'additionals-tag-label-color',
|
||||
style: tag_style)
|
||||
end
|
||||
end
|
||||
|
||||
|
433
app/helpers/dashboards_helper.rb
Normal file
433
app/helpers/dashboards_helper.rb
Normal file
@ -0,0 +1,433 @@
|
||||
module DashboardsHelper
|
||||
def dashboard_sidebar?(dashboard, params)
|
||||
if params['enable_sidebar'].blank?
|
||||
if dashboard.blank?
|
||||
# defaults without dashboard
|
||||
!@project.nil?
|
||||
else
|
||||
dashboard.enable_sidebar?
|
||||
end
|
||||
else
|
||||
Additionals.true? params['enable_sidebar']
|
||||
end
|
||||
end
|
||||
|
||||
def welcome_overview_name(dashboard = nil)
|
||||
name = [l(:label_home)]
|
||||
name << dashboard.name if dashboard&.always_expose? || dashboard.present? && !dashboard.system_default?
|
||||
|
||||
safe_join name, Additionals::LIST_SEPARATOR
|
||||
end
|
||||
|
||||
def dashboard_css_classes(dashboard)
|
||||
classes = ['dashboard', dashboard.dashboard_type.underscore, "dashboard-#{dashboard.id}"]
|
||||
safe_join classes, ' '
|
||||
end
|
||||
|
||||
def sidebar_dashboards(dashboard, project = nil, user = nil)
|
||||
user ||= User.current
|
||||
|
||||
scope = Dashboard.visible
|
||||
scope = if project.present?
|
||||
scope.where(project_id: project.id)
|
||||
.or(scope.where(dashboard_type: DashboardContentProject::TYPE_NAME)
|
||||
.where(system_default: true))
|
||||
.or(scope.where(dashboard_type: DashboardContentProject::TYPE_NAME)
|
||||
.where(author_id: user.id)
|
||||
.where(project_id: nil))
|
||||
else
|
||||
scope.where dashboard_type: dashboard.dashboard_type
|
||||
end
|
||||
|
||||
scope.sorted.to_a
|
||||
end
|
||||
|
||||
def render_dashboard_actionlist(active_dashboard, project = nil)
|
||||
dashboards = sidebar_dashboards(active_dashboard, project)
|
||||
base_css = 'icon icon-dashboard'
|
||||
out = []
|
||||
dashboards.each do |dashboard|
|
||||
css_class = base_css
|
||||
dashboard_name = "#{l(:label_dashboard)}: #{dashboard.name}"
|
||||
out << if dashboard.id == active_dashboard.id
|
||||
link_to dashboard_name, '#',
|
||||
onclick: 'return false;',
|
||||
class: base_css + ' disabled'
|
||||
else
|
||||
dashboard_link dashboard, project,
|
||||
class: css_class,
|
||||
title: l(:label_change_to_dashboard),
|
||||
name: dashboard_name
|
||||
end
|
||||
end
|
||||
|
||||
safe_join out
|
||||
end
|
||||
|
||||
def render_sidebar_dashboards(dashboard, project = nil)
|
||||
dashboards = sidebar_dashboards(dashboard, project)
|
||||
out = [dashboard_links(l(:label_my_dashboard_plural),
|
||||
dashboard,
|
||||
dashboards.select(&:private?),
|
||||
project),
|
||||
dashboard_links(l(:label_shared_dashboard_plural),
|
||||
dashboard,
|
||||
dashboards.select(&:public?),
|
||||
project),
|
||||
dashboard_info(dashboard)]
|
||||
|
||||
safe_join out
|
||||
end
|
||||
|
||||
def dashboard_info(dashboard)
|
||||
tag.div class: 'active-dashboards' do
|
||||
out = [tag.h3(l(:label_active_dashboard)),
|
||||
tag.ul do
|
||||
concat tag.ul "#{l(:field_name)}: #{h dashboard.name}"
|
||||
concat tag.ul safe_join([l(:field_author), link_to_user(dashboard.author)], ': ')
|
||||
concat tag.ul "#{l(:field_created_on)}: #{format_time dashboard.created_at}"
|
||||
concat tag.ul "#{l(:field_updated_on)}: #{format_time dashboard.updated_at}"
|
||||
end]
|
||||
|
||||
out << tag.div(textilizable(dashboard, :description), class: 'dashboard-description') if dashboard.description.present?
|
||||
|
||||
safe_join out
|
||||
end
|
||||
end
|
||||
|
||||
def dashboard_links(title, active_dashboard, dashboards, project)
|
||||
return '' unless dashboards.any?
|
||||
|
||||
tag.h3(title, class: 'dashboards') +
|
||||
tag.ul do
|
||||
dashboards.each do |dashboard|
|
||||
selected = dashboard.id == if params[:dashboard_id].present?
|
||||
params[:dashboard_id].to_i
|
||||
else
|
||||
active_dashboard.id
|
||||
end
|
||||
|
||||
css = 'dashboard'
|
||||
css << ' selected' if selected
|
||||
link = [dashboard_link(dashboard, project, class: css)]
|
||||
if dashboard.system_default?
|
||||
link << if dashboard.project.present?
|
||||
font_awesome_icon('fas_cube',
|
||||
title: l(:field_project_system_default),
|
||||
class: 'dashboard-system-default project')
|
||||
else
|
||||
font_awesome_icon('fas_cube',
|
||||
title: l(:field_system_default),
|
||||
class: 'dashboard-system-default global')
|
||||
end
|
||||
end
|
||||
concat tag.li safe_join(link)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def dashboard_link(dashboard, project, options = {})
|
||||
if options[:title].blank? && dashboard.public?
|
||||
author = if dashboard.author_id == User.current.id
|
||||
l :label_me
|
||||
else
|
||||
dashboard.author
|
||||
end
|
||||
options[:title] = l(:label_dashboard_author, name: author)
|
||||
end
|
||||
|
||||
name = options.delete(:name) || dashboard.name
|
||||
link_to name, dashboard_link_path(project, dashboard), options
|
||||
end
|
||||
|
||||
def sidebar_action_toggle(enabled, dashboard, project = nil)
|
||||
return if dashboard.nil?
|
||||
|
||||
if enabled
|
||||
link_to l(:label_disable_sidebar),
|
||||
dashboard_link_path(project, dashboard, enable_sidebar: 0),
|
||||
class: 'icon icon-sidebar'
|
||||
else
|
||||
link_to l(:label_enable_sidebar),
|
||||
dashboard_link_path(project, dashboard, enable_sidebar: 1),
|
||||
class: 'icon icon-sidebar'
|
||||
end
|
||||
end
|
||||
|
||||
def delete_dashboard_link(url, options = {})
|
||||
options = { method: :delete,
|
||||
data: { confirm: l(:text_are_you_sure) },
|
||||
class: 'icon icon-del' }.merge(options)
|
||||
|
||||
link_to l(:button_dashboard_delete), url, options
|
||||
end
|
||||
|
||||
# Returns the select tag used to add or remove a block
|
||||
def dashboard_block_select_tag(dashboard)
|
||||
blocks_in_use = dashboard.layout.values.flatten
|
||||
options = tag.option "<< #{l(:label_add_dashboard_block)} >>", value: ''
|
||||
dashboard.content.block_options(blocks_in_use).each do |label, block|
|
||||
options << tag.option(label, value: block, disabled: block.blank?)
|
||||
end
|
||||
select_tag 'block',
|
||||
options,
|
||||
id: 'block-select',
|
||||
class: 'dashboard-block-select',
|
||||
onchange: "$('#block-form').submit();"
|
||||
end
|
||||
|
||||
# Renders the blocks
|
||||
def render_dashboard_blocks(blocks, dashboard, _options = {})
|
||||
s = ''.html_safe
|
||||
|
||||
if blocks.present?
|
||||
blocks.each do |block|
|
||||
s << render_dashboard_block(block, dashboard).to_s
|
||||
end
|
||||
end
|
||||
s
|
||||
end
|
||||
|
||||
# Renders a single block
|
||||
def render_dashboard_block(block, dashboard)
|
||||
content = render_dashboard_block_content block, dashboard
|
||||
return if content.blank?
|
||||
|
||||
if dashboard.editable?
|
||||
icons = []
|
||||
blocks = dashboard.content.available_blocks
|
||||
unless blocks[block].present? && blocks[block][:no_settings]
|
||||
icons << link_to_function(l(:label_options),
|
||||
"$('##{block}-settings').toggle();",
|
||||
class: 'icon-only icon-settings',
|
||||
title: l(:label_options))
|
||||
end
|
||||
icons << tag.span('', class: 'icon-only icon-sort-handle sort-handle', title: l(:button_move))
|
||||
icons << link_to(l(:button_delete),
|
||||
_remove_block_dashboard_path(@project, @dashboard, block: block),
|
||||
remote: true, method: 'post',
|
||||
class: 'icon-only icon-close', title: l(:button_delete))
|
||||
|
||||
content = tag.div(safe_join(icons), class: 'contextual') + content
|
||||
end
|
||||
|
||||
tag.div content, class: 'mypage-box', id: "block-#{block}"
|
||||
end
|
||||
|
||||
def build_dashboard_partial_locals(block, block_definition, settings, dashboard)
|
||||
partial_locals = { dashboard: dashboard,
|
||||
settings: settings,
|
||||
block: block,
|
||||
block_definition: block_definition,
|
||||
user: User.current }
|
||||
|
||||
if block_definition[:query_block]
|
||||
partial_locals[:query_block] = block_definition[:query_block]
|
||||
partial_locals[:klass] = block_definition[:query_block][:class]
|
||||
partial_locals[:async] = { required_settings: %i[query_id],
|
||||
partial: 'dashboards/blocks/query_list' }
|
||||
partial_locals[:async] = partial_locals[:async].merge(block_definition[:async]) if block_definition[:async]
|
||||
elsif block_definition[:async]
|
||||
partial_locals[:async] = block_definition[:async]
|
||||
end
|
||||
|
||||
partial_locals
|
||||
end
|
||||
|
||||
# Renders a single block content
|
||||
def render_dashboard_block_content(block, dashboard)
|
||||
block_definition = dashboard.content.find_block block
|
||||
|
||||
unless block_definition
|
||||
Rails.logger.warn "Unknown block \"#{block}\" found in #{dashboard.name} (id=#{dashboard.id})"
|
||||
return
|
||||
end
|
||||
|
||||
settings = dashboard.layout_settings block
|
||||
partial = block_definition[:partial]
|
||||
partial_locals = build_dashboard_partial_locals block, block_definition, settings, dashboard
|
||||
|
||||
if block_definition[:query_block] || block_definition[:async]
|
||||
render partial: 'dashboards/blocks/async', locals: partial_locals
|
||||
elsif partial
|
||||
begin
|
||||
render partial: partial, locals: partial_locals
|
||||
rescue ActionView::MissingTemplate
|
||||
Rails.logger.warn("Partial \"#{partial}\" missing for block \"#{block}\" found in #{dashboard.name} (id=#{dashboard.id})")
|
||||
nil
|
||||
end
|
||||
else
|
||||
send "render_#{block_definition[:name]}_block",
|
||||
block,
|
||||
block_definition,
|
||||
settings,
|
||||
dashboard
|
||||
end
|
||||
end
|
||||
|
||||
def dashboard_async_required_settings?(settings, async)
|
||||
return true if async[:required_settings].blank?
|
||||
return false if settings.blank?
|
||||
|
||||
async[:required_settings].each do |required_setting|
|
||||
return false if settings.exclude?(required_setting) || settings[required_setting].blank?
|
||||
end
|
||||
|
||||
true
|
||||
end
|
||||
|
||||
def dashboard_query_list_block_title(query, query_block, project)
|
||||
title = []
|
||||
title << query.project if project.nil? && query.project
|
||||
title << query_block[:label]
|
||||
|
||||
title << if query_block[:with_project]
|
||||
link_to(query.name, send(query_block[:link_helper], project, query.as_params))
|
||||
else
|
||||
link_to(query.name, send(query_block[:link_helper], query.as_params))
|
||||
end
|
||||
|
||||
safe_join title, Additionals::LIST_SEPARATOR
|
||||
end
|
||||
|
||||
def dashboard_query_list_block_alerts(dashboard, query, block_definition)
|
||||
return if dashboard.visibility == Dashboard::VISIBILITY_PRIVATE
|
||||
|
||||
title = if query.visibility == Query::VISIBILITY_PRIVATE
|
||||
l(:alert_only_visible_by_yourself)
|
||||
elsif block_definition.key?(:admin_only) && block_definition[:admin_only]
|
||||
l(:alert_only_visible_by_admins)
|
||||
end
|
||||
|
||||
return if title.nil?
|
||||
|
||||
font_awesome_icon('fas_info-circle',
|
||||
title: title,
|
||||
class: 'dashboard-block-alert')
|
||||
end
|
||||
|
||||
def render_legacy_left_block(_block, _block_definition, _settings, _dashboard)
|
||||
if @project
|
||||
call_hook :view_projects_show_left, project: @project
|
||||
else
|
||||
call_hook :view_welcome_index_left
|
||||
end
|
||||
end
|
||||
|
||||
def render_legacy_right_block(_block, _block_definition, _settings, _dashboard)
|
||||
if @project
|
||||
call_hook :view_projects_show_right, project: @project
|
||||
else
|
||||
call_hook :view_welcome_index_right
|
||||
end
|
||||
end
|
||||
|
||||
# copied from my_helper
|
||||
def render_documents_block(block, _block_definition, settings, dashboard)
|
||||
max_entries = settings[:max_entries] || DashboardContent::DEFAULT_MAX_ENTRIES
|
||||
|
||||
scope = Document.visible
|
||||
scope = scope.where(project: dashboard.project) if dashboard.project
|
||||
|
||||
documents = scope.order(created_on: :desc)
|
||||
.limit(max_entries)
|
||||
.to_a
|
||||
|
||||
render partial: 'dashboards/blocks/documents', locals: { block: block,
|
||||
max_entries: max_entries,
|
||||
documents: documents }
|
||||
end
|
||||
|
||||
def render_news_block(block, _block_definition, settings, dashboard)
|
||||
max_entries = settings[:max_entries] || DashboardContent::DEFAULT_MAX_ENTRIES
|
||||
news = News.visible
|
||||
.where(project: dashboard.project.nil? ? User.current.projects : dashboard.project)
|
||||
.order(created_on: :desc)
|
||||
.limit(max_entries)
|
||||
.includes(:project, :author)
|
||||
.references(:project, :author)
|
||||
.to_a
|
||||
|
||||
render partial: 'dashboards/blocks/news', locals: { block: block,
|
||||
max_entries: max_entries,
|
||||
news: news }
|
||||
end
|
||||
|
||||
def render_timelog_block(block, _block_definition, settings, _dashboard)
|
||||
days = settings[:days].to_i
|
||||
days = 7 if days < 1 || days > 365
|
||||
|
||||
entries = TimeEntry
|
||||
.where("#{TimeEntry.table_name}.user_id = ? AND #{TimeEntry.table_name}.spent_on BETWEEN ? AND ?",
|
||||
User.current.id, User.current.today - (days - 1), User.current.today)
|
||||
.joins(:activity, :project)
|
||||
.references(issue: %i[tracker status])
|
||||
.includes(issue: %i[tracker status])
|
||||
.order("#{TimeEntry.table_name}.spent_on DESC, #{Project.table_name}.name ASC, #{Tracker.table_name}.position ASC, #{Issue.table_name}.id ASC")
|
||||
.to_a
|
||||
entries_by_day = entries.group_by(&:spent_on)
|
||||
|
||||
render partial: 'dashboards/blocks/timelog', locals: { block: block, entries: entries, entries_by_day: entries_by_day, days: days }
|
||||
end
|
||||
|
||||
def activity_dashboard_data(settings, dashboard)
|
||||
max_entries = (settings[:max_entries] || DashboardContent::DEFAULT_MAX_ENTRIES).to_i
|
||||
user = User.current
|
||||
options = {}
|
||||
options[:author] = user if Additionals.true? settings[:me_only]
|
||||
options[:project] = dashboard.content_project if dashboard.content_project.present?
|
||||
|
||||
Redmine::Activity::Fetcher.new(user, options)
|
||||
.events(nil, nil, limit: max_entries)
|
||||
.group_by { |event| user.time_to_date(event.event_datetime) }
|
||||
end
|
||||
|
||||
def dashboard_feed_catcher(url, max_entries)
|
||||
feed = { items: [], valid: false }
|
||||
return feed if url.blank?
|
||||
|
||||
cnt = 0
|
||||
max_entries = max_entries.present? ? max_entries.to_i : 10
|
||||
|
||||
begin
|
||||
URI.open(url) do |rss_feed|
|
||||
rss = RSS::Parser.parse(rss_feed)
|
||||
rss.items.each do |item|
|
||||
cnt += 1
|
||||
feed[:items] << { title: item.title.try(:content)&.presence || item.title,
|
||||
link: item.link.try(:href)&.presence || item.link }
|
||||
break if cnt >= max_entries
|
||||
end
|
||||
end
|
||||
rescue StandardError => e
|
||||
Rails.logger.info "dashboard_feed_catcher error for #{url}: #{e}"
|
||||
return feed
|
||||
end
|
||||
|
||||
feed[:valid] = true
|
||||
|
||||
feed
|
||||
end
|
||||
|
||||
def dashboard_feed_title(title, block_definition)
|
||||
title.presence || block_definition[:label]
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def resently_used_dashboard_save(dashboard, project = nil)
|
||||
user = User.current
|
||||
dashboard_type = dashboard.dashboard_type
|
||||
recently_id = user.pref.recently_used_dashboard dashboard_type, project
|
||||
return if recently_id == dashboard.id || user.anonymous?
|
||||
|
||||
if dashboard_type == DashboardContentProject::TYPE_NAME
|
||||
user.pref.recently_used_dashboards[dashboard_type] = {} if user.pref.recently_used_dashboards[dashboard_type].nil?
|
||||
user.pref.recently_used_dashboards[dashboard_type][project.id] = dashboard.id
|
||||
else
|
||||
user.pref.recently_used_dashboards[dashboard_type] = dashboard.id
|
||||
end
|
||||
|
||||
user.pref.save
|
||||
end
|
||||
end
|
@ -3,7 +3,6 @@ class AdditionalsChart < ActiveRecord::Base
|
||||
|
||||
CHART_DEFAULT_HEIGHT = 350
|
||||
CHART_DEFAULT_WIDTH = 400
|
||||
MAX_ALLOWED_ELEMENTS = 200
|
||||
|
||||
class << self
|
||||
def color_schema
|
||||
@ -23,12 +22,7 @@ class AdditionalsChart < ActiveRecord::Base
|
||||
|
||||
required_labels = options.key?(:required_labels) ? options.delete(:required_labels) : 2
|
||||
|
||||
unless options.key?(:valid)
|
||||
data[:valid] = cached_labels.any? &&
|
||||
cached_labels.count >= required_labels &&
|
||||
cached_labels.count < self::MAX_ALLOWED_ELEMENTS
|
||||
end
|
||||
|
||||
data[:valid] = cached_labels.any? && cached_labels.count >= required_labels unless options.key?(:valid)
|
||||
data[:width] = self::CHART_DEFAULT_WIDTH unless options.key?(:width)
|
||||
data[:height] = self::CHART_DEFAULT_HEIGHT unless options.key?(:height)
|
||||
data[:value_link_method] = '_project_issues_path' unless options.key?(:value_link_method)
|
||||
|
@ -1,7 +1,7 @@
|
||||
class AdditionalsFontAwesome
|
||||
include Redmine::I18n
|
||||
|
||||
FORMAT_REGEXP = /\Afa[rsb]\_[a-zA-Z0-9]+[a-zA-Z0-9\-]*\z/.freeze
|
||||
FORMAT_REGEXP = /\Afa[rsb]_[a-zA-Z0-9]+[a-zA-Z0-9\-]*\z/.freeze
|
||||
SEARCH_LIMIT = 50
|
||||
|
||||
class << self
|
||||
|
@ -63,7 +63,7 @@ module AdditionalsQuery
|
||||
end
|
||||
|
||||
def initialize_project_filter(options = {})
|
||||
if project.nil?
|
||||
if project.nil? || options[:always]
|
||||
add_available_filter('project_id', order: options[:position],
|
||||
type: :list,
|
||||
values: -> { project_values })
|
||||
|
@ -49,9 +49,9 @@ class AdditionalsTag
|
||||
|
||||
def tag_access(permission)
|
||||
projects_allowed = if permission.nil?
|
||||
Project.visible.pluck(:id)
|
||||
Project.visible.ids
|
||||
else
|
||||
Project.where(Project.allowed_to_condition(User.current, permission)).pluck(:id)
|
||||
Project.where(Project.allowed_to_condition(User.current, permission)).ids
|
||||
end
|
||||
|
||||
if projects_allowed.present?
|
||||
|
388
app/models/dashboard.rb
Normal file
388
app/models/dashboard.rb
Normal file
@ -0,0 +1,388 @@
|
||||
class Dashboard < ActiveRecord::Base
|
||||
include Redmine::I18n
|
||||
include Redmine::SafeAttributes
|
||||
include Additionals::EntityMethods
|
||||
|
||||
belongs_to :project
|
||||
belongs_to :author, class_name: 'User'
|
||||
|
||||
# current active project (belongs_to :project can be nil, because this is system default)
|
||||
attr_accessor :content_project
|
||||
|
||||
serialize :options
|
||||
|
||||
has_many :dashboard_roles,
|
||||
dependent: :destroy
|
||||
has_many :roles, through: :dashboard_roles
|
||||
has_many :users, through: :dashboard_defaults
|
||||
|
||||
VISIBILITY_PRIVATE = 0
|
||||
VISIBILITY_ROLES = 1
|
||||
VISIBILITY_PUBLIC = 2
|
||||
|
||||
scope :by_project, (->(project_id) { where(project_id: project_id) if project_id.present? })
|
||||
scope :sorted, (-> { order("#{Dashboard.table_name}.name") })
|
||||
scope :welcome_only, (-> { where(dashboard_type: DashboardContentWelcome::TYPE_NAME) })
|
||||
scope :project_only, (-> { where(dashboard_type: DashboardContentProject::TYPE_NAME) })
|
||||
|
||||
safe_attributes 'name', 'description', 'visibility', 'enable_sidebar',
|
||||
'always_expose', 'project_id', 'author_id',
|
||||
if: (lambda do |dashboard, user|
|
||||
dashboard.new_record? ||
|
||||
user.allowed_to?(:save_dashboards, dashboard.project, global: true) ||
|
||||
user.allowed_to?(:manage_shared_dashboards, dashboard.project, global: true)
|
||||
end)
|
||||
|
||||
safe_attributes 'dashboard_type',
|
||||
if: (lambda do |dashboard, _user|
|
||||
dashboard.new_record?
|
||||
end)
|
||||
|
||||
safe_attributes 'system_default',
|
||||
if: (lambda do |dashboard, user|
|
||||
dashboard.new_record? ||
|
||||
user.allowed_to?(:set_system_dashboards, dashboard.project, global: true)
|
||||
end)
|
||||
|
||||
before_save :dashboard_type_check, :set_options_hash, :clear_unused_block_settings
|
||||
|
||||
before_destroy :check_destroy_system_default
|
||||
after_save :update_system_defaults
|
||||
after_save :remove_unused_role_relations
|
||||
|
||||
validates :name, :dashboard_type, :author, :visibility, presence: true
|
||||
validates :visibility, inclusion: { in: [VISIBILITY_PUBLIC, VISIBILITY_ROLES, VISIBILITY_PRIVATE] }
|
||||
validate :validate_roles
|
||||
validate :validate_visibility
|
||||
validate :validate_name
|
||||
validate :validate_system_default
|
||||
|
||||
class << self
|
||||
def system_default(dashboard_type)
|
||||
select(:id).find_by(dashboard_type: dashboard_type, system_default: true)
|
||||
.try(:id)
|
||||
end
|
||||
|
||||
def default(dashboard_type, project = nil, user = User.current)
|
||||
recently_id = User.current.pref.recently_used_dashboard dashboard_type, project
|
||||
|
||||
scope = where(dashboard_type: dashboard_type)
|
||||
scope = scope.where(project_id: project.id).or(scope.where(project_id: nil)) if project.present?
|
||||
|
||||
dashboard = scope.find_by(id: recently_id) if recently_id.present?
|
||||
|
||||
if dashboard.blank?
|
||||
scope = scope.where(system_default: true).or(scope.where(author_id: user.id))
|
||||
dashboard = scope.order(system_default: :desc, project_id: :desc, id: :asc).first
|
||||
|
||||
if recently_id.present?
|
||||
Rails.logger.debug 'default cleanup required'
|
||||
# Remove invalid recently_id
|
||||
if project.present?
|
||||
User.current.pref.recently_used_dashboards[dashboard_type].delete(project.id)
|
||||
else
|
||||
User.current.pref.recently_used_dashboards[dashboard_type] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
dashboard
|
||||
end
|
||||
|
||||
def fields_for_order_statement(table = nil)
|
||||
table ||= table_name
|
||||
["#{table}.name"]
|
||||
end
|
||||
|
||||
def visible(user = User.current, options = {})
|
||||
scope = Dashboard.left_outer_joins(:project)
|
||||
.where("#{Project.table_name}.id IS NULL OR (#{Project.allowed_to_condition(user, :view_project, options)})")
|
||||
|
||||
if user.admin?
|
||||
scope.where("#{table_name}.visibility <> ? OR #{table_name}.author_id = ?", VISIBILITY_PRIVATE, user.id)
|
||||
elsif user.memberships.any?
|
||||
scope.where("#{table_name}.visibility = ?" \
|
||||
" OR (#{table_name}.visibility = ? AND #{table_name}.id IN (" \
|
||||
"SELECT DISTINCT d.id FROM #{table_name} d" \
|
||||
" INNER JOIN #{table_name_prefix}dashboard_roles#{table_name_suffix} dr ON dr.dashboard_id = d.id" \
|
||||
" INNER JOIN #{MemberRole.table_name} mr ON mr.role_id = dr.role_id" \
|
||||
" INNER JOIN #{Member.table_name} m ON m.id = mr.member_id AND m.user_id = ?" \
|
||||
" INNER JOIN #{Project.table_name} p ON p.id = m.project_id AND p.status <> ?" \
|
||||
' WHERE d.project_id IS NULL OR d.project_id = m.project_id))' \
|
||||
" OR #{table_name}.author_id = ?",
|
||||
VISIBILITY_PUBLIC,
|
||||
VISIBILITY_ROLES,
|
||||
user.id,
|
||||
Project::STATUS_ARCHIVED,
|
||||
user.id)
|
||||
elsif user.logged?
|
||||
scope.where("#{table_name}.visibility = ? OR #{table_name}.author_id = ?", VISIBILITY_PUBLIC, user.id)
|
||||
else
|
||||
scope.where(visibility: VISIBILITY_PUBLIC)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def initialize(attributes = nil, *args)
|
||||
super
|
||||
set_options_hash
|
||||
end
|
||||
|
||||
def set_options_hash
|
||||
self.options ||= {}
|
||||
end
|
||||
|
||||
def [](attr_name)
|
||||
if has_attribute? attr_name
|
||||
super
|
||||
else
|
||||
options ? options[attr_name] : nil
|
||||
end
|
||||
end
|
||||
|
||||
def []=(attr_name, value)
|
||||
if has_attribute? attr_name
|
||||
super
|
||||
else
|
||||
h = (self[:options] || {}).dup
|
||||
h.update(attr_name => value)
|
||||
self[:options] = h
|
||||
value
|
||||
end
|
||||
end
|
||||
|
||||
# Returns true if the dashboard is visible to +user+ or the current user.
|
||||
def visible?(user = User.current)
|
||||
return true if user.admin?
|
||||
return false unless project.nil? || user.allowed_to?(:view_project, project)
|
||||
|
||||
case visibility
|
||||
when VISIBILITY_PUBLIC
|
||||
true
|
||||
when VISIBILITY_ROLES
|
||||
if project
|
||||
(user.roles_for_project(project) & roles).any?
|
||||
else
|
||||
user.memberships.joins(:member_roles).where(member_roles: { role_id: roles.map(&:id) }).any?
|
||||
end
|
||||
else
|
||||
user == self.user
|
||||
end
|
||||
end
|
||||
|
||||
def content
|
||||
@content ||= "DashboardContent#{dashboard_type[0..-10]}".constantize.new(project: content_project.presence || project)
|
||||
end
|
||||
|
||||
def available_groups
|
||||
content.groups
|
||||
end
|
||||
|
||||
def layout
|
||||
self[:layout] ||= content.default_layout.deep_dup
|
||||
end
|
||||
|
||||
def layout=(arg)
|
||||
self[:layout] = arg
|
||||
end
|
||||
|
||||
def layout_settings(block = nil)
|
||||
s = self[:layout_settings] ||= {}
|
||||
if block
|
||||
s[block] ||= {}
|
||||
else
|
||||
s
|
||||
end
|
||||
end
|
||||
|
||||
def layout_settings=(arg)
|
||||
self[:layout_settings] = arg
|
||||
end
|
||||
|
||||
def remove_block(block)
|
||||
block = block.to_s.underscore
|
||||
layout.each_key do |group|
|
||||
layout[group].delete(block)
|
||||
end
|
||||
layout
|
||||
end
|
||||
|
||||
# Adds block to the user page layout
|
||||
# Returns nil if block is not valid or if it's already
|
||||
# present in the user page layout
|
||||
def add_block(block)
|
||||
block = block.to_s.underscore
|
||||
return unless content.valid_block?(block, layout.values.flatten)
|
||||
|
||||
remove_block block
|
||||
# add it to the first group
|
||||
# add it to the first group
|
||||
group = available_groups.first
|
||||
layout[group] ||= []
|
||||
layout[group].unshift(block)
|
||||
end
|
||||
|
||||
# Sets the block order for the given group.
|
||||
# Example:
|
||||
# preferences.order_blocks('left', ['issueswatched', 'news'])
|
||||
def order_blocks(group, blocks)
|
||||
group = group.to_s
|
||||
return if content.groups.exclude?(group) || blocks.blank?
|
||||
|
||||
blocks = blocks.map(&:underscore) & layout.values.flatten
|
||||
blocks.each { |block| remove_block(block) }
|
||||
layout[group] = blocks
|
||||
end
|
||||
|
||||
def update_block_settings(block, settings)
|
||||
block = block.to_s
|
||||
block_settings = layout_settings(block).merge(settings.symbolize_keys)
|
||||
layout_settings[block] = block_settings
|
||||
end
|
||||
|
||||
def private?(user = User.current)
|
||||
author_id == user.id && visibility == VISIBILITY_PRIVATE
|
||||
end
|
||||
|
||||
def public?
|
||||
visibility != VISIBILITY_PRIVATE
|
||||
end
|
||||
|
||||
# Returns true if the query is available for all projects
|
||||
def global?
|
||||
new_record? ? project_id.nil? : project_id_in_database.nil?
|
||||
end
|
||||
|
||||
def dashboard_type_name
|
||||
test = 'dd'
|
||||
l("label_dashboard_#{test}")
|
||||
end
|
||||
|
||||
def editable_by?(usr = User.current, prj = nil)
|
||||
prj ||= project
|
||||
usr && (usr.allowed_to?(:manage_dashboards, prj, global: true) ||
|
||||
(author == usr && usr.allowed_to?(:save_dashboards, prj, global: true)))
|
||||
end
|
||||
|
||||
def editable?(usr = User.current)
|
||||
@editable ||= editable_by?(usr)
|
||||
end
|
||||
|
||||
def destroyable_by?(usr = User.current, prj = nil)
|
||||
!system_default && editable_by?(usr, prj)
|
||||
end
|
||||
|
||||
def destroyable?(usr = User.current)
|
||||
@destroyable ||= destroyable_by?(usr)
|
||||
end
|
||||
|
||||
def to_s
|
||||
name
|
||||
end
|
||||
|
||||
# Returns a string of css classes that apply to the entry
|
||||
def css_classes(user = User.current)
|
||||
s = ['dashboard']
|
||||
s << 'created-by-me' if author_id == user.id
|
||||
s.join(' ')
|
||||
end
|
||||
|
||||
def allowed_target_projects(user = User.current)
|
||||
Project.where(Project.allowed_to_condition(user, :save_dashboards))
|
||||
end
|
||||
|
||||
# this is used to get unique cache for blocks
|
||||
def async_params(block, options, settings = {})
|
||||
if block.blank?
|
||||
msg = 'block is missing for dashboard_async'
|
||||
Rails.log.error msg
|
||||
raise msg
|
||||
end
|
||||
|
||||
config = { dashboard_id: id,
|
||||
block: block }
|
||||
|
||||
settings[:user_id] = User.current.id if !options.key?(:skip_user_id) || !options[:skip_user_id]
|
||||
|
||||
if settings.present?
|
||||
settings.each do |key, setting|
|
||||
settings[key] = setting.reject(&:blank?).join(',') if setting.is_a? Array
|
||||
end
|
||||
|
||||
unique_params = settings.flatten
|
||||
unique_params += options[:unique_params] if options[:unique_params].present?
|
||||
|
||||
Rails.logger.debug "debug async_params for #{block}: unique_params=#{unique_params.inspect}"
|
||||
config[:unique_key] = Digest::SHA256.hexdigest(unique_params.join('_'))
|
||||
end
|
||||
|
||||
Rails.logger.debug "debug async_params for #{block}: config=#{config.inspect}"
|
||||
|
||||
config
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def clear_unused_block_settings
|
||||
blocks = layout.values.flatten
|
||||
layout_settings.keep_if { |block, _settings| blocks.include?(block) }
|
||||
end
|
||||
|
||||
def remove_unused_role_relations
|
||||
return unless saved_change_to_visibility? && visibility == VISIBILITY_ROLES
|
||||
|
||||
roles.clear
|
||||
end
|
||||
|
||||
def validate_roles
|
||||
return if visibility != VISIBILITY_ROLES || roles.present?
|
||||
|
||||
errors.add(:base, l(:label_role_plural) + ' ' + l('activerecord.errors.messages.blank'))
|
||||
end
|
||||
|
||||
def validate_system_default
|
||||
return if !system_default? || User.current.allowed_to?(:set_system_dashboards, project, global: true)
|
||||
|
||||
raise 'no permission to set system default'
|
||||
end
|
||||
|
||||
def check_destroy_system_default
|
||||
raise 'It is not allowed to delete dashboard, which is system default' unless destroyable?
|
||||
end
|
||||
|
||||
def dashboard_type_check
|
||||
self.project_id = nil if dashboard_type == DashboardContentWelcome::TYPE_NAME
|
||||
end
|
||||
|
||||
def update_system_defaults
|
||||
return unless system_default? && User.current.allowed_to?(:set_system_dashboards, project, global: true)
|
||||
|
||||
scope = self.class
|
||||
.where(dashboard_type: dashboard_type)
|
||||
.where.not(id: id)
|
||||
|
||||
scope = scope.where(project: project) if dashboard_type == DashboardContentProject::TYPE_NAME
|
||||
|
||||
scope.update_all(system_default: false)
|
||||
end
|
||||
|
||||
def validate_visibility
|
||||
errors.add(:visibility, :must_be_for_everyone) if system_default? && visibility != VISIBILITY_PUBLIC
|
||||
end
|
||||
|
||||
def validate_name
|
||||
return if name.blank?
|
||||
|
||||
scope = self.class.visible.where(name: name)
|
||||
if dashboard_type == DashboardContentProject::TYPE_NAME
|
||||
scope = scope.project_only
|
||||
scope = scope.where(project_id: project_id)
|
||||
scope = scope.or(scope.where(project_id: nil)) if project_id.present?
|
||||
else
|
||||
scope = scope.welcome_only
|
||||
end
|
||||
|
||||
scope = scope.where.not(id: id) unless new_record?
|
||||
errors.add(:name, :name_not_unique) if scope.count.positive?
|
||||
end
|
||||
end
|
111
app/models/dashboard_content.rb
Normal file
111
app/models/dashboard_content.rb
Normal file
@ -0,0 +1,111 @@
|
||||
class DashboardContent
|
||||
include Redmine::I18n
|
||||
|
||||
attr_accessor :user, :project
|
||||
|
||||
MAX_MULTIPLE_OCCURS = 5
|
||||
DEFAULT_MAX_ENTRIES = 10
|
||||
RENDER_ASYNC_CACHE_EXPIRES_IN = 30
|
||||
|
||||
class << self
|
||||
def types
|
||||
descendants.map { |dc| dc::TYPE_NAME }
|
||||
end
|
||||
end
|
||||
|
||||
def with_chartjs?
|
||||
false
|
||||
end
|
||||
|
||||
def initialize(attr = {})
|
||||
self.user = attr[:user].presence || User.current
|
||||
self.project = attr[:project].presence
|
||||
end
|
||||
|
||||
def groups
|
||||
%w[top left right bottom]
|
||||
end
|
||||
|
||||
def block_definitions
|
||||
{
|
||||
'issuequery' => { label: l(:label_query_with_name, l(:label_issue_plural)),
|
||||
permission: :view_issues,
|
||||
query_block: {
|
||||
label: l(:label_issue_plural),
|
||||
list_partial: 'issues/list',
|
||||
class: IssueQuery,
|
||||
link_helper: '_project_issues_path',
|
||||
count_method: 'issue_count',
|
||||
entries_method: 'issues',
|
||||
entities_var: :issues,
|
||||
with_project: true
|
||||
},
|
||||
max_occurs: DashboardContent::MAX_MULTIPLE_OCCURS },
|
||||
'text' => { label: l(:label_text),
|
||||
max_occurs: MAX_MULTIPLE_OCCURS,
|
||||
partial: 'dashboards/blocks/text' },
|
||||
'news' => { label: l(:label_news_latest),
|
||||
permission: :view_news },
|
||||
'documents' => { label: l(:label_document_plural),
|
||||
permission: :view_documents },
|
||||
'timelog' => { label: l(:label_spent_time_static),
|
||||
permission: :view_time_entries },
|
||||
'feed' => { label: l(:label_additionals_feed),
|
||||
max_occurs: DashboardContent::MAX_MULTIPLE_OCCURS,
|
||||
async: { required_settings: %i[url],
|
||||
cache_expires_in: 360,
|
||||
skip_user_id: true,
|
||||
partial: 'dashboards/blocks/feed' } }
|
||||
}
|
||||
end
|
||||
|
||||
# Returns the available blocks
|
||||
def available_blocks
|
||||
return @available_blocks if defined? @available_blocks
|
||||
|
||||
available_blocks = begin block_definitions.reject do |_block_name, block_specs|
|
||||
block_specs.key?(:permission) && !user.allowed_to?(block_specs[:permission], project, global: true) ||
|
||||
block_specs.key?(:admin_only) && block_specs[:admin_only] && !user.admin? ||
|
||||
block_specs.key?(:if) && !block_specs[:if].call(self)
|
||||
end
|
||||
end
|
||||
|
||||
@available_blocks = available_blocks.sort_by { |_k, v| v[:label] }.to_h
|
||||
end
|
||||
|
||||
def block_options(blocks_in_use = [])
|
||||
options = []
|
||||
available_blocks.each do |block, block_options|
|
||||
indexes = blocks_in_use.map do |n|
|
||||
Regexp.last_match(2).to_i if n =~ /\A#{block}(__(\d+))?\z/
|
||||
end
|
||||
indexes.compact!
|
||||
|
||||
occurs = indexes.size
|
||||
block_id = indexes.any? ? "#{block}__#{indexes.max + 1}" : block
|
||||
disabled = (occurs >= (available_blocks[block][:max_occurs] || 1))
|
||||
block_id = nil if disabled
|
||||
|
||||
options << [block_options[:label], block_id]
|
||||
end
|
||||
options
|
||||
end
|
||||
|
||||
def valid_block?(block, blocks_in_use = [])
|
||||
block.present? && block_options(blocks_in_use).map(&:last).include?(block)
|
||||
end
|
||||
|
||||
def find_block(block)
|
||||
block.to_s =~ /\A(.*?)(__\d+)?\z/
|
||||
name = Regexp.last_match(1)
|
||||
available_blocks.key?(name) ? available_blocks[name].merge(name: name) : nil
|
||||
end
|
||||
|
||||
# Returns the default layout for a new dashboard
|
||||
def default_layout
|
||||
{
|
||||
'left' => ['legacy_left'],
|
||||
'right' => ['legacy_right']
|
||||
}
|
||||
end
|
||||
end
|
47
app/models/dashboard_content_project.rb
Normal file
47
app/models/dashboard_content_project.rb
Normal file
@ -0,0 +1,47 @@
|
||||
class DashboardContentProject < DashboardContent
|
||||
TYPE_NAME = 'ProjectDashboard'.freeze
|
||||
|
||||
def block_definitions
|
||||
blocks = super
|
||||
|
||||
# legacy_left or legacy_right should not be moved to DashboardContent,
|
||||
# because DashboardContent is used for areas in other plugins
|
||||
blocks['legacy_left'] = { label: l(:label_dashboard_legacy_left),
|
||||
no_settings: true }
|
||||
|
||||
blocks['legacy_right'] = { label: l(:label_dashboard_legacy_right),
|
||||
no_settings: true }
|
||||
|
||||
blocks['projectinformation'] = { label: l(:label_project_information),
|
||||
no_settings: true,
|
||||
partial: 'dashboards/blocks/project_information' }
|
||||
|
||||
blocks['projectissues'] = { label: l(:label_issues_summary),
|
||||
no_settings: true,
|
||||
permission: :view_issues,
|
||||
partial: 'dashboards/blocks/project_issues' }
|
||||
|
||||
blocks['projecttimeentries'] = { label: l(:label_time_tracking),
|
||||
no_settings: true,
|
||||
permission: :view_time_entries,
|
||||
partial: 'dashboards/blocks/project_time_entries' }
|
||||
|
||||
blocks['projectmembers'] = { label: l(:label_member_plural),
|
||||
no_settings: true,
|
||||
partial: 'projects/members_box' }
|
||||
|
||||
blocks['projectsubprojects'] = { label: l(:label_subproject_plural),
|
||||
no_settings: true,
|
||||
partial: 'dashboards/blocks/project_subprojects' }
|
||||
|
||||
blocks
|
||||
end
|
||||
|
||||
# Returns the default layout for a new dashboard
|
||||
def default_layout
|
||||
{
|
||||
'left' => %w[projectinformation projectissues projecttimeentries],
|
||||
'right' => %w[projectmembers projectsubprojects]
|
||||
}
|
||||
end
|
||||
end
|
33
app/models/dashboard_content_welcome.rb
Normal file
33
app/models/dashboard_content_welcome.rb
Normal file
@ -0,0 +1,33 @@
|
||||
class DashboardContentWelcome < DashboardContent
|
||||
TYPE_NAME = 'WelcomeDashboard'.freeze
|
||||
|
||||
def block_definitions
|
||||
blocks = super
|
||||
|
||||
# legacy_left or legacy_right should not be moved to DashboardContent,
|
||||
# because DashboardContent is used for areas in other plugins
|
||||
blocks['legacy_left'] = { label: l(:label_dashboard_legacy_left),
|
||||
no_settings: true }
|
||||
|
||||
blocks['legacy_right'] = { label: l(:label_dashboard_legacy_right),
|
||||
no_settings: true }
|
||||
|
||||
blocks['welcome'] = { label: l(:setting_welcome_text),
|
||||
no_settings: true,
|
||||
partial: 'dashboards/blocks/welcome' }
|
||||
|
||||
blocks['activity'] = { label: l(:label_activity),
|
||||
async: { data_method: 'activity_dashboard_data',
|
||||
partial: 'dashboards/blocks/activity' } }
|
||||
|
||||
blocks
|
||||
end
|
||||
|
||||
# Returns the default layout for a new dashboard
|
||||
def default_layout
|
||||
{
|
||||
'left' => %w[welcome legacy_left],
|
||||
'right' => ['legacy_right']
|
||||
}
|
||||
end
|
||||
end
|
6
app/models/dashboard_role.rb
Normal file
6
app/models/dashboard_role.rb
Normal file
@ -0,0 +1,6 @@
|
||||
class DashboardRole < ActiveRecord::Base
|
||||
include Redmine::SafeAttributes
|
||||
|
||||
belongs_to :dashboard
|
||||
belongs_to :role
|
||||
end
|
@ -1,7 +1,5 @@
|
||||
Deface::Override.new(
|
||||
virtual_path: 'account/register',
|
||||
name: 'add-invisble-captcha',
|
||||
insert_top: 'div.box',
|
||||
original: Redmine::VERSION.to_s >= '4.1' ? 'a9c303821376a8d83cba32654629d71cc3926a1d' : 'e64d82c46cc3322e4d953aa119d1e71e81854158',
|
||||
partial: 'account/invisible_captcha'
|
||||
)
|
||||
Deface::Override.new virtual_path: 'account/register',
|
||||
name: 'add-invisble-captcha',
|
||||
insert_top: 'div.box',
|
||||
original: 'a9c303821376a8d83cba32654629d71cc3926a1d',
|
||||
partial: 'account/invisible_captcha'
|
||||
|
@ -1,18 +0,0 @@
|
||||
if Redmine::VERSION.to_s >= '4.1'
|
||||
Deface::Override.new virtual_path: 'projects/show',
|
||||
name: 'view-projects-actions-dropdown-hook',
|
||||
insert_before: 'erb[loud]:contains("link_to_if_authorized l(:label_settings)")',
|
||||
original: 'da5a3461fab48e7198701c3e7e5a8e98295d9e3a',
|
||||
text: '<%= call_hook(:view_projects_show_actions_dropdown, project: @project) %>'
|
||||
Deface::Override.new virtual_path: 'projects/show',
|
||||
name: 'view-projects-show-bottom-hook',
|
||||
insert_after: 'div.splitcontent',
|
||||
original: '626f6ed11aca41d7d9cad307d433ec433c450962',
|
||||
text: '<%= call_hook(:view_projects_show_bottom, project: @project) %>'
|
||||
else
|
||||
Deface::Override.new virtual_path: 'projects/show',
|
||||
name: 'view-projects-show-bottom-hook',
|
||||
insert_after: 'div.splitcontentright',
|
||||
original: '8cd4d1b38e8afcb4665dbfea661b7048fbd92cf7',
|
||||
text: '<%= call_hook(:view_projects_show_bottom, project: @project) %>'
|
||||
end
|
@ -2,9 +2,9 @@ Deface::Override.new virtual_path: 'users/show',
|
||||
name: 'user-show-info-hook',
|
||||
insert_top: 'div.splitcontentleft ul:first-child',
|
||||
original: 'aff8d775275e3f33cc45d72b8e2896144be4beff',
|
||||
text: '<%= call_hook(:view_users_show_info, user: @user) %>'
|
||||
partial: 'hooks/view_users_show_info'
|
||||
Deface::Override.new virtual_path: 'users/show',
|
||||
name: 'user-contextual-hook',
|
||||
insert_bottom: 'div.contextual',
|
||||
original: 'a01f2e6431910bf692e4208a769abeb2fe4215e8',
|
||||
text: '<%= call_hook(:view_users_show_contextual, user: @user) %>'
|
||||
partial: 'hooks/view_users_show_contextual'
|
||||
|
@ -1,23 +0,0 @@
|
||||
if Redmine::VERSION.to_s >= '4.1'
|
||||
Deface::Override.new virtual_path: 'welcome/index',
|
||||
name: 'add-welcome-top-content',
|
||||
insert_before: 'div.splitcontent',
|
||||
original: '977b0ccc97c05ab90e4c81eed269c5a03bac4f91',
|
||||
partial: 'welcome/overview_top'
|
||||
Deface::Override.new virtual_path: 'welcome/index',
|
||||
name: 'view-welcome-index-bottom-hook',
|
||||
insert_after: 'div.splitcontent',
|
||||
original: '977b0ccc97c05ab90e4c81eed269c5a03bac4f91',
|
||||
text: '<%= call_hook(:view_welcome_index_bottom) %>'
|
||||
else
|
||||
Deface::Override.new virtual_path: 'welcome/index',
|
||||
name: 'add-welcome-top-content',
|
||||
insert_before: 'div.splitcontentleft',
|
||||
original: 'e7de0a2e88c5ccb4d1feb7abac239e4b669babed',
|
||||
partial: 'welcome/overview_top'
|
||||
Deface::Override.new virtual_path: 'welcome/index',
|
||||
name: 'view-welcome-index-bottom-hook',
|
||||
insert_after: 'div.splitcontentright',
|
||||
original: 'dd470844bcaa4d7c9dc66e70e6c0c843d42969bf',
|
||||
text: '<%= call_hook(:view_welcome_index_bottom) %>'
|
||||
end
|
@ -1,5 +0,0 @@
|
||||
Deface::Override.new virtual_path: 'wiki/_sidebar',
|
||||
name: 'addto-wiki-sidebar',
|
||||
insert_after: 'ul',
|
||||
original: '07a5375c015a7d96826c9977c4d8889c4a98bb49',
|
||||
partial: 'wiki/global_sidebar'
|
@ -1,5 +1,5 @@
|
||||
- login_text = Additionals.setting(:account_login_bottom)
|
||||
- login_text = Additionals.setting :account_login_bottom
|
||||
- if login_text.present?
|
||||
br
|
||||
.login-additionals
|
||||
= textilizable(login_text)
|
||||
= textilizable login_text
|
||||
|
@ -1,5 +0,0 @@
|
||||
- sidebar = Additionals.setting(:global_sidebar)
|
||||
- if sidebar.present?
|
||||
br
|
||||
.sidebar-additionals
|
||||
= textilizable(sidebar)
|
@ -1,6 +1,6 @@
|
||||
- additionals_top_menu_setup
|
||||
= additionals_library_load(:font_awesome)
|
||||
= additionals_library_load :font_awesome
|
||||
= stylesheet_link_tag 'additionals', plugin: 'additionals'
|
||||
= javascript_include_tag('additionals', plugin: 'additionals')
|
||||
= javascript_include_tag 'additionals', plugin: 'additionals'
|
||||
- if User.current.try(:hrm_user_type_id).nil?
|
||||
- render_custom_top_menu_item
|
||||
|
@ -1,30 +1,47 @@
|
||||
h3 = l(:label_content_plural)
|
||||
fieldset.settings
|
||||
legend = l(:label_content_plural)
|
||||
|
||||
p
|
||||
= additionals_settings_textarea :account_login_bottom
|
||||
em.info
|
||||
= l(:account_login_info)
|
||||
p
|
||||
= additionals_settings_textarea :global_sidebar
|
||||
em.info
|
||||
= l(:global_sidebar_info)
|
||||
p
|
||||
= additionals_settings_textarea :global_footer
|
||||
em.info
|
||||
= l(:global_footer_info)
|
||||
p
|
||||
= additionals_settings_textarea :account_login_bottom
|
||||
em.info
|
||||
= l(:account_login_info)
|
||||
p
|
||||
= additionals_settings_textarea :global_sidebar
|
||||
em.info
|
||||
= l(:global_sidebar_info)
|
||||
p
|
||||
= additionals_settings_textarea :global_footer
|
||||
em.info
|
||||
= l(:global_footer_info)
|
||||
|
||||
br
|
||||
h3 = l(:label_settings)
|
||||
fieldset.settings
|
||||
legend = l(:label_settings)
|
||||
|
||||
p
|
||||
= additionals_settings_checkbox :open_external_urls
|
||||
em.info
|
||||
= t(:open_external_urls_info)
|
||||
p
|
||||
= additionals_settings_checkbox :add_go_to_top
|
||||
em.info
|
||||
= t(:add_go_to_top_info)
|
||||
p
|
||||
= additionals_settings_checkbox :legacy_smiley_support
|
||||
em.info
|
||||
= t(:legacy_smiley_support_info_html)
|
||||
p
|
||||
= additionals_settings_checkbox :open_external_urls
|
||||
em.info
|
||||
= t(:open_external_urls_info)
|
||||
p
|
||||
= additionals_settings_checkbox :add_go_to_top
|
||||
em.info
|
||||
= t(:add_go_to_top_info)
|
||||
p
|
||||
= additionals_settings_checkbox :legacy_smiley_support
|
||||
em.info
|
||||
= t(:legacy_smiley_support_info_html)
|
||||
|
||||
fieldset.settings
|
||||
legend = l(:label_disabled_modules)
|
||||
|
||||
p
|
||||
= tag.label l(:label_disabled_modules)
|
||||
= hidden_field_tag('settings[disabled_modules][]', '')
|
||||
- Redmine::AccessControl.available_project_modules_all.sort.each do |m|
|
||||
label.block
|
||||
- value = @settings[:disabled_modules].present? ? @settings[:disabled_modules].include?(m.to_s) : false
|
||||
= check_box_tag('settings[disabled_modules][]', m, value, id: nil)
|
||||
= l_or_humanize(m, prefix: 'project_module_')
|
||||
|
||||
br
|
||||
em.info
|
||||
= l(:disabled_modules_info)
|
||||
|
@ -1,15 +1,11 @@
|
||||
h3 = l(:label_content_plural)
|
||||
em.info = t(:top_rules_help)
|
||||
|
||||
br
|
||||
|
||||
p
|
||||
= additionals_settings_textarea :new_ticket_message
|
||||
em.info = l(:new_ticket_message_info)
|
||||
|
||||
br
|
||||
hr
|
||||
|
||||
h3 = l(:label_settings)
|
||||
.info = t(:top_rules_help)
|
||||
|
||||
br
|
||||
p
|
||||
= additionals_settings_checkbox :new_issue_on_profile
|
||||
|
@ -4,7 +4,7 @@ em.info
|
||||
br
|
||||
|
||||
p
|
||||
= content_tag(:label, l(:label_hidden_macros_in_toolbar))
|
||||
= tag.label l(:label_hidden_macros_in_toolbar)
|
||||
= hidden_field_tag('settings[hidden_macros_in_toolbar][]', '')
|
||||
- @available_macros = AdditionalsMacro.all(only_names: true).each do |m|
|
||||
label.block
|
||||
|
@ -1,25 +0,0 @@
|
||||
.info = t(:top_overview_help)
|
||||
|
||||
br
|
||||
h3 = l(:label_content_plural)
|
||||
|
||||
p
|
||||
= additionals_settings_textarea :overview_right
|
||||
em.info
|
||||
= l(:overview_right_info)
|
||||
p
|
||||
= additionals_settings_textarea :overview_top
|
||||
em.info
|
||||
= l(:overview_top_info)
|
||||
p
|
||||
= additionals_settings_textarea :overview_bottom
|
||||
em.info
|
||||
= l(:overview_bottom_info)
|
||||
|
||||
br
|
||||
h3 = l(:label_settings)
|
||||
|
||||
p
|
||||
= additionals_settings_checkbox :remove_news
|
||||
em.info
|
||||
= l(:remove_news_info)
|
@ -1,23 +0,0 @@
|
||||
.info = t(:top_projects_help)
|
||||
br
|
||||
|
||||
p
|
||||
= additionals_settings_textarea :project_overview_content
|
||||
em.info
|
||||
= l(:project_overview_content_info)
|
||||
|
||||
hr
|
||||
|
||||
p
|
||||
= content_tag(:label, l(:label_disabled_modules))
|
||||
= hidden_field_tag('settings[disabled_modules][]', '')
|
||||
- Redmine::AccessControl.available_project_modules_all.sort.each do |m|
|
||||
label.block
|
||||
- value = @settings[:disabled_modules].present? ? @settings[:disabled_modules].include?(m.to_s) : false
|
||||
= check_box_tag('settings[disabled_modules][]', m, value, id: nil)
|
||||
= l_or_humanize(m, prefix: 'project_module_')
|
||||
|
||||
br
|
||||
|
||||
em.info
|
||||
= l(:disabled_modules_info)
|
@ -2,4 +2,4 @@ p
|
||||
= additionals_settings_textfield :google_maps_api_key, size: 60
|
||||
em.info = t(:google_maps_embed_api_html)
|
||||
|
||||
= call_hook(:additionals_settings_web_apis, settings: @settings)
|
||||
= call_hook :additionals_settings_web_apis, settings: @settings
|
||||
|
@ -1,29 +1,31 @@
|
||||
.info = t(:top_wiki_help)
|
||||
em.info = t(:top_wiki_help)
|
||||
|
||||
br
|
||||
h3 = l(:label_content_plural)
|
||||
|
||||
p
|
||||
= additionals_settings_textarea :global_wiki_sidebar
|
||||
em.info
|
||||
= l(:global_wiki_sidebar_info)
|
||||
p
|
||||
= additionals_settings_textarea :global_wiki_header
|
||||
em.info
|
||||
= l(:global_wiki_header_info)
|
||||
p
|
||||
= additionals_settings_textarea :global_wiki_footer
|
||||
em.info
|
||||
= l(:global_wiki_footer_info)
|
||||
fieldset.settings
|
||||
legend = l(:label_content_plural)
|
||||
|
||||
br
|
||||
h3 = l(:label_pdf_wiki_settings)
|
||||
p
|
||||
= additionals_settings_textarea :global_wiki_sidebar
|
||||
em.info
|
||||
= l(:global_wiki_sidebar_info)
|
||||
p
|
||||
= additionals_settings_textarea :global_wiki_header
|
||||
em.info
|
||||
= l(:global_wiki_header_info)
|
||||
p
|
||||
= additionals_settings_textarea :global_wiki_footer
|
||||
em.info
|
||||
= l(:global_wiki_footer_info)
|
||||
|
||||
p
|
||||
= additionals_settings_checkbox :wiki_pdf_remove_title
|
||||
em.info
|
||||
= l(:wiki_pdf_remove_title_info)
|
||||
p
|
||||
= additionals_settings_checkbox :wiki_pdf_remove_attachments
|
||||
em.info
|
||||
= l(:wiki_pdf_remove_attachments_info)
|
||||
fieldset.settings
|
||||
legend = l(:label_pdf_wiki_settings)
|
||||
|
||||
p
|
||||
= additionals_settings_checkbox :wiki_pdf_remove_title
|
||||
em.info
|
||||
= l(:wiki_pdf_remove_title_info)
|
||||
p
|
||||
= additionals_settings_checkbox :wiki_pdf_remove_attachments
|
||||
em.info
|
||||
= l(:wiki_pdf_remove_attachments_info)
|
||||
|
43
app/views/common/_dashboard.html.slim
Normal file
43
app/views/common/_dashboard.html.slim
Normal file
@ -0,0 +1,43 @@
|
||||
= call_hook :view_dashboard_top, dashboard: dashboard, project: @project
|
||||
|
||||
#my-page.splitcontent class="#{dashboard_css_classes(dashboard)}"
|
||||
- dashboard.available_groups.each do |group|
|
||||
.block-receiver id="list-#{group}" class="splitcontent#{group}"
|
||||
= render_dashboard_blocks dashboard.layout[group], dashboard
|
||||
|
||||
= call_hook :view_dashboard_bottom, dashboard: dashboard, project: @project
|
||||
|
||||
= context_menu
|
||||
|
||||
/ required for drap & drop work
|
||||
/ (this should always set, because to support new entries)
|
||||
- include_calendar_headers_tags
|
||||
|
||||
- if dashboard.content.with_chartjs?
|
||||
- content_for :header_tags do
|
||||
= additionals_library_load %i[chartjs chartjs_colorschemes chartjs_datalabels]
|
||||
|
||||
javascript:
|
||||
$(function() {
|
||||
$('#block-select').val('');
|
||||
$('.block-receiver').sortable({
|
||||
connectWith: '.block-receiver',
|
||||
tolerance: 'pointer',
|
||||
handle: '.sort-handle',
|
||||
start: function(event, ui){$(this).parent().addClass('dragging');},
|
||||
stop: function(event, ui){$(this).parent().removeClass('dragging');},
|
||||
update: function(event, ui){
|
||||
// trigger the call on the list that receives the block only
|
||||
if ($(this).find(ui.item).length > 0) {
|
||||
$.ajax({
|
||||
url: "#{escape_javascript _order_blocks_dashboard_path(@project, dashboard)}",
|
||||
type: 'post',
|
||||
data: {
|
||||
'group': $(this).attr('id').replace(/^list-/, ''),
|
||||
'blocks': $.map($(this).children(), function(el){return $(el).attr('id').replace(/^block-/, '');})
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
72
app/views/dashboards/_form.html.slim
Normal file
72
app/views/dashboards/_form.html.slim
Normal file
@ -0,0 +1,72 @@
|
||||
= error_messages_for 'dashboard'
|
||||
|
||||
.box.tabular.attributes
|
||||
p
|
||||
= f.text_field :name, size: 255, required: true
|
||||
|
||||
p
|
||||
= f.text_area :description, rows: addtionals_textarea_cols(@dashboard.description, min: 4), class: 'wiki-edit'
|
||||
|
||||
.splitcontent
|
||||
.splitcontentleft
|
||||
|
||||
- if @dashboard.new_record?
|
||||
= hidden_field_tag 'dashboard[dashboard_type]', @dashboard.dashboard_type
|
||||
|
||||
- if @project && @allowed_projects.present? && @allowed_projects.count > 1
|
||||
p = f.select(:project_id,
|
||||
project_tree_options_for_select(@allowed_projects,
|
||||
selected: @dashboard.project,
|
||||
include_blank: true))
|
||||
- else
|
||||
= hidden_field_tag 'dashboard[project_id]', @project&.id
|
||||
|
||||
- if User.current.allowed_to?(:manage_shared_dashboards, @project, global: true)
|
||||
p
|
||||
label = l(:field_visible)
|
||||
label.block
|
||||
= radio_button 'dashboard', 'visibility', Dashboard::VISIBILITY_PRIVATE
|
||||
'
|
||||
= l(:label_visibility_private)
|
||||
label.block
|
||||
= radio_button 'dashboard', 'visibility', Dashboard::VISIBILITY_PUBLIC
|
||||
'
|
||||
= l(:label_visibility_public)
|
||||
label.block
|
||||
= radio_button 'dashboard', 'visibility', Dashboard::VISIBILITY_ROLES
|
||||
'
|
||||
= l(:label_visibility_roles)
|
||||
' :
|
||||
- Role.givable.sorted.each do |role|
|
||||
label.block.role-visibility
|
||||
= check_box_tag 'dashboard[role_ids][]', role.id, @dashboard.roles.include?(role), id: nil
|
||||
'
|
||||
= role.name
|
||||
= hidden_field_tag 'dashboard[role_ids][]', ''
|
||||
|
||||
.splitcontentright
|
||||
p
|
||||
= f.check_box :enable_sidebar
|
||||
|
||||
p
|
||||
= f.check_box :always_expose
|
||||
|
||||
p
|
||||
= f.check_box :system_default
|
||||
|
||||
- if @dashboard.persisted?
|
||||
p.object-select
|
||||
= f.select :author_id,
|
||||
author_options_for_select(@dashboard.project, @dashboard),
|
||||
required: true
|
||||
|
||||
= call_hook :view_dashboard_form_details_bottom, dashboard: @dashboard, form: f
|
||||
|
||||
javascript:
|
||||
$(function() {
|
||||
$("input[name='dashboard[visibility]']").change(function(){
|
||||
var roles_checked = $('#dashboard_visibility_1').is(':checked');
|
||||
var private_checked = $('#dashboard_visibility_0').is(':checked');
|
||||
$("input[name='dashboard[role_ids][]'][type=checkbox]").attr('disabled', !roles_checked);
|
||||
}).trigger('change');
|
||||
});
|
3
app/views/dashboards/add_block.js.erb
Normal file
3
app/views/dashboards/add_block.js.erb
Normal file
@ -0,0 +1,3 @@
|
||||
$("#block-<%= escape_javascript @block %>").remove();
|
||||
$("#list-top").prepend("<%= escape_javascript render_dashboard_blocks([@block], @dashboard) %>");
|
||||
$("#block-select").replaceWith("<%= escape_javascript dashboard_block_select_tag(@dashboard) %>");
|
11
app/views/dashboards/blocks/_activity.html.slim
Normal file
11
app/views/dashboards/blocks/_activity.html.slim
Normal file
@ -0,0 +1,11 @@
|
||||
- cache render_async_cache_key(_dashboard_async_blocks_path(@project,
|
||||
dashboard.async_params(block, async, settings))),
|
||||
expires_in: async[:cache_expires_in] || DashboardContent::RENDER_ASYNC_CACHE_EXPIRES_IN,
|
||||
skip_digest: true do
|
||||
|
||||
- events_by_day = activity_dashboard_data settings, dashboard
|
||||
- title = Additionals.true?(settings[:me_only]) ? l(:label_my_activity) : l(:label_activity)
|
||||
h3 = link_to title, activity_path(user_id: User.current,
|
||||
from: events_by_day.keys.first)
|
||||
|
||||
= render partial: 'activities/activities', locals: { events_by_day: events_by_day }
|
21
app/views/dashboards/blocks/_activity_settings.html.slim
Normal file
21
app/views/dashboards/blocks/_activity_settings.html.slim
Normal file
@ -0,0 +1,21 @@
|
||||
- max_entries = settings[:max_entries].presence || DashboardContent::DEFAULT_MAX_ENTRIES
|
||||
div id="#{block}-settings" style="#{'display: none;' if hide}"
|
||||
= form_tag(_update_layout_setting_dashboard_path(@project, @dashboard), remote: true) do
|
||||
= hidden_field_tag "settings[#{block}][me_only]", '0'
|
||||
.box
|
||||
p
|
||||
label
|
||||
= l(:label_max_entries)
|
||||
' :
|
||||
= number_field_tag "settings[#{block}][max_entries]", max_entries, min: 1, max: 1000, required: true
|
||||
|
||||
p
|
||||
label
|
||||
= l(:label_only_my_activities)
|
||||
' :
|
||||
= check_box_tag "settings[#{block}][me_only]", '1', Additionals.true?(settings[:me_only])
|
||||
|
||||
p
|
||||
= submit_tag l(:button_save)
|
||||
'
|
||||
= link_to_function l(:button_cancel), "$('##{block}-settings').toggle();"
|
29
app/views/dashboards/blocks/_async.html.slim
Normal file
29
app/views/dashboards/blocks/_async.html.slim
Normal file
@ -0,0 +1,29 @@
|
||||
- with_async = dashboard_async_required_settings? settings, async
|
||||
|
||||
- unless with_async
|
||||
h3 = settings[:title].presence || block_definition[:label]
|
||||
|
||||
- if @can_edit && block_definition[:no_settings].blank?
|
||||
= render partial: block_definition[:settings_partial].presence || "#{async[:partial]}_settings",
|
||||
locals: build_dashboard_partial_locals(block,
|
||||
block_definition,
|
||||
settings,
|
||||
dashboard).merge({ hide: with_async })
|
||||
|
||||
- if with_async
|
||||
= render_async_cache _dashboard_async_blocks_path(@project,
|
||||
dashboard.async_params(block, async, settings)) do
|
||||
.clear-both
|
||||
p
|
||||
i.fas.fa-sync.fa-spin
|
||||
'
|
||||
= l(:label_loading)
|
||||
|
||||
= content_for :render_async
|
||||
|
||||
javascript:
|
||||
$(function() {
|
||||
$('#ajax-indicator').hide();
|
||||
})
|
||||
- else
|
||||
p.nodata = l(:label_no_data)
|
27
app/views/dashboards/blocks/_documents.html.slim
Normal file
27
app/views/dashboards/blocks/_documents.html.slim
Normal file
@ -0,0 +1,27 @@
|
||||
h3.icon.icon-document = l(:label_document_plural)
|
||||
|
||||
- if @can_edit
|
||||
div id="#{block}-settings" style='display: none;'
|
||||
= form_tag(_update_layout_setting_dashboard_path(@project, @dashboard), remote: true) do
|
||||
.box
|
||||
p
|
||||
label
|
||||
= l(:label_max_entries)
|
||||
' :
|
||||
= number_field_tag "settings[#{block}][max_entries]", max_entries, min: 1, max: 1000, required: true
|
||||
p
|
||||
= submit_tag l(:button_save)
|
||||
'
|
||||
= link_to_function l(:button_cancel), "$('##{block}-settings').toggle();"
|
||||
|
||||
- if documents.any?
|
||||
= render partial: 'documents/document', collection: documents
|
||||
p
|
||||
- if @project
|
||||
= link_to l(:label_document_view_all), project_documents_path(@project)
|
||||
- else
|
||||
/ no route available
|
||||
/= link_to l(:label_news_view_all), documents_path
|
||||
|
||||
- else
|
||||
p.nodata = l(:label_no_data)
|
23
app/views/dashboards/blocks/_feed.html.slim
Normal file
23
app/views/dashboards/blocks/_feed.html.slim
Normal file
@ -0,0 +1,23 @@
|
||||
- cache render_async_cache_key(_dashboard_async_blocks_path(@project,
|
||||
dashboard.async_params(block, async, settings))),
|
||||
expires_in: async[:cache_expires_in] || DashboardContent::RENDER_ASYNC_CACHE_EXPIRES_IN,
|
||||
skip_digest: true do
|
||||
|
||||
- feed = dashboard_feed_catcher settings[:url], settings[:max_entries]
|
||||
h3
|
||||
= dashboard_feed_title settings[:title], block_definition
|
||||
|
||||
- if feed[:valid]
|
||||
- if feed[:items].count.positive?
|
||||
ul.reporting-list.feed
|
||||
- feed[:items].each do |item|
|
||||
li
|
||||
= link_to item[:title],
|
||||
item[:link],
|
||||
class: 'external', rel: 'noopener noreferrer', target: '_blank'
|
||||
- else
|
||||
p.nodata = l(:label_no_data)
|
||||
- elsif settings[:url].blank?
|
||||
p.nodata = l(:label_no_data)
|
||||
- else
|
||||
p.nodata = l(:label_invalid_feed_data)
|
25
app/views/dashboards/blocks/_feed_settings.html.slim
Normal file
25
app/views/dashboards/blocks/_feed_settings.html.slim
Normal file
@ -0,0 +1,25 @@
|
||||
- max_entries = settings[:max_entries].presence || DashboardContent::DEFAULT_MAX_ENTRIES
|
||||
|
||||
div id="#{block}-settings" style="#{'display: none;' if hide}"
|
||||
= form_tag(_update_layout_setting_dashboard_path(@project, @dashboard), remote: true) do
|
||||
.box
|
||||
p
|
||||
label
|
||||
= l :field_title
|
||||
' :
|
||||
= text_field_tag "settings[#{block}][title]", dashboard_feed_title(settings[:title], block_definition)
|
||||
p
|
||||
label
|
||||
= l :field_url
|
||||
' :
|
||||
= url_field_tag "settings[#{block}][url]", settings[:url], required: true
|
||||
p
|
||||
label
|
||||
= l(:label_max_entries)
|
||||
' :
|
||||
= number_field_tag "settings[#{block}][max_entries]", max_entries, min: 1, max: 100, required: true
|
||||
|
||||
p
|
||||
= submit_tag l(:button_save)
|
||||
'
|
||||
= link_to_function l(:button_cancel), "$('##{block}-settings').toggle();"
|
25
app/views/dashboards/blocks/_news.html.slim
Normal file
25
app/views/dashboards/blocks/_news.html.slim
Normal file
@ -0,0 +1,25 @@
|
||||
h3.icon.icon-news = l(:label_news_latest)
|
||||
|
||||
- if @can_edit
|
||||
div id="#{block}-settings" style='display: none;'
|
||||
= form_tag(_update_layout_setting_dashboard_path(@project, @dashboard), remote: true) do
|
||||
.box
|
||||
p
|
||||
label
|
||||
= l(:label_max_entries)
|
||||
' :
|
||||
= number_field_tag "settings[#{block}][max_entries]", max_entries, min: 1, max: 1000, required: true
|
||||
p
|
||||
= submit_tag l(:button_save)
|
||||
'
|
||||
= link_to_function l(:button_cancel), "$('##{block}-settings').toggle();"
|
||||
|
||||
- if news.any?
|
||||
= render partial: 'news/news', collection: news
|
||||
p
|
||||
- if @project
|
||||
= link_to l(:label_news_view_all), project_news_index_path(@project)
|
||||
- else
|
||||
= link_to l(:label_news_view_all), news_index_path
|
||||
- else
|
||||
p.nodata = l(:label_no_data)
|
22
app/views/dashboards/blocks/_project_information.html.slim
Normal file
22
app/views/dashboards/blocks/_project_information.html.slim
Normal file
@ -0,0 +1,22 @@
|
||||
h3 = block_definition[:label]
|
||||
|
||||
- if @project.description.present?
|
||||
.wiki.project-description
|
||||
= textilizable @project.description
|
||||
|
||||
- if @project.homepage.present? || @project.visible_custom_field_values.any?(&:present?)
|
||||
ul.reporting-list
|
||||
- unless @project.homepage.blank?
|
||||
li
|
||||
span.label
|
||||
= l(:field_homepage)
|
||||
' :
|
||||
= link_to_if uri_with_safe_scheme?(@project.homepage), @project.homepage, @project.homepage
|
||||
- render_custom_field_values(@project) do |custom_field, formatted|
|
||||
li class="#{custom_field.css_classes}"
|
||||
span.label
|
||||
= custom_field.name
|
||||
' :
|
||||
= formatted
|
||||
|
||||
= call_hook :view_projects_show_dashboard_info_block, project: @project, dashboard: dashboard
|
40
app/views/dashboards/blocks/_project_issues.html.slim
Normal file
40
app/views/dashboards/blocks/_project_issues.html.slim
Normal file
@ -0,0 +1,40 @@
|
||||
h3.icon.icon-issue
|
||||
= l(:label_issue_tracking)
|
||||
'
|
||||
= link_to l(:label_details),
|
||||
project_issues_report_details_path(@project, detail: 'tracker'),
|
||||
class: 'icon-only icon-zoom-in',
|
||||
title: l(:label_details)
|
||||
|
||||
- if @trackers.present?
|
||||
table.list.issue-report
|
||||
thead
|
||||
tr
|
||||
th
|
||||
th
|
||||
= l(:label_open_issues_plural)
|
||||
th
|
||||
= l(:label_closed_issues_plural)
|
||||
th
|
||||
= l(:label_total)
|
||||
tbody
|
||||
- @trackers.each do |tracker|
|
||||
tr
|
||||
td.name
|
||||
= link_to tracker.name, project_issues_path(@project, set_filter: 1, tracker_id: tracker.id), title: tracker.description
|
||||
td
|
||||
= link_to @open_issues_by_tracker[tracker].to_i, project_issues_path(@project, set_filter: 1, tracker_id: tracker.id)
|
||||
td
|
||||
= link_to (@total_issues_by_tracker[tracker].to_i - @open_issues_by_tracker[tracker].to_i), project_issues_path(@project, set_filter: 1, tracker_id: tracker.id, status_id: 'c')
|
||||
td.total
|
||||
= link_to @total_issues_by_tracker[tracker].to_i, project_issues_path(@project, set_filter: 1, tracker_id: tracker.id, status_id: '*')
|
||||
p
|
||||
= link_to l(:label_issue_view_all), project_issues_path(@project, set_filter: 1)
|
||||
' |
|
||||
= link_to l(:field_summary), project_issues_report_path(@project)
|
||||
- if User.current.allowed_to? :view_calendar, @project, global: true
|
||||
' |
|
||||
= link_to l(:label_calendar), project_calendar_path(@project)
|
||||
- if User.current.allowed_to? :view_gantt, @project, global: true
|
||||
' |
|
||||
= link_to l(:label_gantt), project_gantt_path(@project)
|
@ -0,0 +1,7 @@
|
||||
- if @subprojects.any?
|
||||
h3.icon.icon-projects
|
||||
= l(:label_subproject_plural)
|
||||
ul.subprojects
|
||||
- @subprojects.each do |project|
|
||||
li
|
||||
= link_to(project.name, project_path(project), class: project.css_classes).html_safe
|
20
app/views/dashboards/blocks/_project_time_entries.html.slim
Normal file
20
app/views/dashboards/blocks/_project_time_entries.html.slim
Normal file
@ -0,0 +1,20 @@
|
||||
h3.icon.icon-time
|
||||
= block_definition[:label]
|
||||
ul
|
||||
- if @total_estimated_hours.present?
|
||||
li
|
||||
= l(:field_estimated_hours)
|
||||
' :
|
||||
= l_hours(@total_estimated_hours)
|
||||
- if @total_hours.present?
|
||||
li
|
||||
= l(:label_spent_time)
|
||||
' :
|
||||
= l_hours(@total_hours)
|
||||
p
|
||||
- if User.current.allowed_to?(:log_time, @project)
|
||||
= link_to l(:button_log_time), new_project_time_entry_path(@project)
|
||||
' |
|
||||
= link_to(l(:label_details), project_time_entries_path(@project))
|
||||
' |
|
||||
= link_to(l(:label_report), report_project_time_entries_path(@project))
|
33
app/views/dashboards/blocks/_query_list.html.slim
Normal file
33
app/views/dashboards/blocks/_query_list.html.slim
Normal file
@ -0,0 +1,33 @@
|
||||
ruby:
|
||||
query = klass.visible.find_by(id: settings[:query_id])
|
||||
project = (dashboard.content_project if query_block[:with_project])
|
||||
|
||||
- if query
|
||||
ruby:
|
||||
count = query.send query_block[:count_method]
|
||||
if query_block[:with_project]
|
||||
query.project = project
|
||||
query.column_names = settings[:columns] if settings[:columns].present?
|
||||
query.sort_criteria = settings[:sort] if settings[:sort].present?
|
||||
end
|
||||
|
||||
h3.query-list-block
|
||||
= dashboard_query_list_block_title query, query_block, @project
|
||||
= " (#{count})"
|
||||
= dashboard_query_list_block_alerts dashboard, query, block_definition
|
||||
|
||||
- if query.respond_to?(:description) && query.description.present?
|
||||
.query-description
|
||||
= textilizable query, :description
|
||||
|
||||
- if count.positive?
|
||||
= render partial: query_block[:list_partial],
|
||||
locals: { query_block[:entities_var] => query.send(query_block[:entries_method],
|
||||
limit: settings[:max_entries] || DashboardContent::DEFAULT_MAX_ENTRIES),
|
||||
query: query,
|
||||
query_options: { sort_param: "settings[#{block}][sort]",
|
||||
sort_link_options: { method: :post, remote: true } } }
|
||||
- else
|
||||
p.nodata = l(:label_no_data)
|
||||
- else
|
||||
p.nodata = l(:label_no_data)
|
26
app/views/dashboards/blocks/_query_list_settings.slim
Normal file
26
app/views/dashboards/blocks/_query_list_settings.slim
Normal file
@ -0,0 +1,26 @@
|
||||
- query = klass.visible.find_by(id: settings[:query_id])
|
||||
|
||||
div id="#{block}-settings" style="#{'display: none;' if hide}"
|
||||
= form_tag(_update_layout_setting_dashboard_path(@project, dashboard), remote: true) do
|
||||
.box
|
||||
- if query
|
||||
= render_query_columns_selection(query, name: "settings[#{block}][columns]")
|
||||
- else
|
||||
p
|
||||
label
|
||||
= block_definition[:label]
|
||||
'
|
||||
= select_tag "settings[#{block}][query_id]",
|
||||
tag.option + options_from_collection_for_select(sidebar_queries(klass, @project), :id, :name),
|
||||
required: true
|
||||
p
|
||||
label
|
||||
= l(:label_max_entries)
|
||||
' :
|
||||
= number_field_tag "settings[#{block}][max_entries]",
|
||||
settings[:max_entries].presence || DashboardContent::DEFAULT_MAX_ENTRIES,
|
||||
min: 1, max: 100, required: true
|
||||
p
|
||||
= submit_tag l(:button_save)
|
||||
'
|
||||
= link_to_function l(:button_cancel), "$('##{block}-settings').toggle();"
|
26
app/views/dashboards/blocks/_text.html.slim
Normal file
26
app/views/dashboards/blocks/_text.html.slim
Normal file
@ -0,0 +1,26 @@
|
||||
ruby:
|
||||
title = settings[:title] || l(:label_text)
|
||||
text = settings[:text]
|
||||
|
||||
- if title.present?
|
||||
h3 = title
|
||||
|
||||
- if @can_edit
|
||||
div id="#{block}-settings" style='display: none;'
|
||||
= form_tag(_update_layout_setting_dashboard_path(@project, @dashboard), remote: true) do
|
||||
.box
|
||||
p
|
||||
label
|
||||
= l :field_title
|
||||
' :
|
||||
= text_field_tag "settings[#{block}][title]", title
|
||||
p
|
||||
= text_area_tag "settings[#{block}][text]", text, rows: addtionals_textarea_cols(text), class: 'wiki-edit'
|
||||
= wikitoolbar_for "settings_#{block}_text"
|
||||
p
|
||||
= submit_tag l(:button_save)
|
||||
'
|
||||
= link_to_function l(:button_cancel), "$('##{block}-settings').toggle();"
|
||||
|
||||
.wiki
|
||||
= textilizable text
|
63
app/views/dashboards/blocks/_timelog.html.slim
Normal file
63
app/views/dashboards/blocks/_timelog.html.slim
Normal file
@ -0,0 +1,63 @@
|
||||
h3
|
||||
= link_to l(:label_spent_time), time_entries_path(user_id: 'me')
|
||||
| (
|
||||
= l(:label_last_n_days, days)
|
||||
' :
|
||||
= l_hours_short entries.sum(&:hours)
|
||||
| )
|
||||
- if User.current.allowed_to?(:log_time, nil, global: true)
|
||||
'
|
||||
= link_to l(:button_log_time), new_time_entry_path, class: 'icon-only icon-add', title: l(:button_log_time)
|
||||
|
||||
- if @can_edit
|
||||
div id="#{block}-settings" style='display: none;'
|
||||
= form_tag(_update_layout_setting_dashboard_path(@project, @dashboard), remote: true) do
|
||||
.box
|
||||
p
|
||||
label
|
||||
= l(:button_show)
|
||||
' :
|
||||
= text_field_tag 'settings[timelog][days]', days, size: 6
|
||||
= l(:label_day_plural)
|
||||
p
|
||||
= submit_tag l(:button_save)
|
||||
'
|
||||
= link_to_function l(:button_cancel), "$('#timelog-settings').toggle();"
|
||||
|
||||
- if entries.any?
|
||||
= form_tag({}, data: { cm_url: time_entries_context_menu_path }) do
|
||||
table.list.time-entries.odd-even
|
||||
thead
|
||||
tr
|
||||
th = l(:label_activity)
|
||||
th = l(:label_project)
|
||||
th = l(:field_comments)
|
||||
th = l(:field_hours)
|
||||
th
|
||||
tbody
|
||||
- entries_by_day.keys.sort.reverse_each do |day|
|
||||
tr.odd
|
||||
td
|
||||
strong
|
||||
= day == User.current.today ? l(:label_today).titleize : format_date(day)
|
||||
td[colspan='2']
|
||||
td.hours
|
||||
em
|
||||
= html_hours(format_hours(entries_by_day[day].sum(&:hours)))
|
||||
td
|
||||
- entries_by_day[day].each do |entry|
|
||||
tr.time-entry.hascontextmenu id="time-entry-#{entry.id}"
|
||||
td.activity
|
||||
= check_box_tag("ids[]", entry.id, false, style: 'display:none;', id: nil)
|
||||
= entry.activity
|
||||
td.subject
|
||||
= entry.project
|
||||
= h(' - ') + link_to_issue(entry.issue, truncate: 50) if entry.issue
|
||||
td.comments
|
||||
= entry.comments
|
||||
td.hours
|
||||
= html_hours(format_hours(entry.hours))
|
||||
td.buttons
|
||||
= link_to_context_menu
|
||||
- else
|
||||
p.nodata = l(:label_no_data)
|
2
app/views/dashboards/blocks/_welcome.html.slim
Normal file
2
app/views/dashboards/blocks/_welcome.html.slim
Normal file
@ -0,0 +1,2 @@
|
||||
.wiki
|
||||
= textilizable Setting.welcome_text
|
7
app/views/dashboards/edit.html.slim
Normal file
7
app/views/dashboards/edit.html.slim
Normal file
@ -0,0 +1,7 @@
|
||||
h2 = l(:button_dashboard_edit)
|
||||
= labelled_form_for :dashboard,
|
||||
@dashboard,
|
||||
url: { action: 'update', id: @dashboard.id },
|
||||
html: { multipart: true, method: :put, id: 'dashboard-form' } do |f|
|
||||
= render partial: 'form', locals: { f: f }
|
||||
= submit_tag l(:button_save)
|
20
app/views/dashboards/index.api.rsb
Normal file
20
app/views/dashboards/index.api.rsb
Normal file
@ -0,0 +1,20 @@
|
||||
api.array :dashboards, api_meta(total_count: @query_count, offset: @offset, limit: @limit) do
|
||||
@dashboards.each do |dashboard|
|
||||
api.dashboard do
|
||||
api.id dashboard.id
|
||||
api.name dashboard.name
|
||||
api.dashboard_type dashboard.dashboard_type
|
||||
api.description dashboard.description
|
||||
api.system_default dashboard.system_default
|
||||
api.always_expose dashboard.always_expose
|
||||
api.enable_sidebar dashboard.enable_sidebar
|
||||
api.project(id: dashboard.project_id, name: dashboard.project.name) unless dashboard.project.nil?
|
||||
api.author id: dashboard.author_id, name: dashboard.author.name
|
||||
api.visibility dashboard.visibility
|
||||
api.created_on dashboard.created_at
|
||||
api.updated_on dashboard.updated_at
|
||||
|
||||
call_hook :api_dashboard_show, dashboard: dashboard
|
||||
end
|
||||
end
|
||||
end
|
7
app/views/dashboards/new.html.slim
Normal file
7
app/views/dashboards/new.html.slim
Normal file
@ -0,0 +1,7 @@
|
||||
h2 = l(:label_new_additional_dashboard)
|
||||
= labelled_form_for :dashboard,
|
||||
@dashboard,
|
||||
url: { action: 'create', project_id: @project },
|
||||
html: { multipart: true, id: 'dashboard-form' } do |f|
|
||||
= render partial: 'form', locals: { f: f }
|
||||
= submit_tag l(:button_save)
|
2
app/views/dashboards/remove_block.js.erb
Normal file
2
app/views/dashboards/remove_block.js.erb
Normal file
@ -0,0 +1,2 @@
|
||||
$("#block-<%= escape_javascript @block %>").remove();
|
||||
$("#block-select").replaceWith("<%= escape_javascript dashboard_block_select_tag(@dashboard) %>");
|
17
app/views/dashboards/show.api.rsb
Normal file
17
app/views/dashboards/show.api.rsb
Normal file
@ -0,0 +1,17 @@
|
||||
api.dashboard do
|
||||
api.id @dashboard.id
|
||||
api.name @dashboard.name
|
||||
api.dashboard_type @dashboard.dashboard_type
|
||||
api.description @dashboard.description
|
||||
api.system_default @dashboard.system_default
|
||||
api.always_expose @dashboard.always_expose
|
||||
api.enable_sidebar @dashboard.enable_sidebar
|
||||
api.project(id: @dashboard.project_id, name: @dashboard.project.name) unless @dashboard.project.nil?
|
||||
api.author id: @dashboard.author_id, name: @dashboard.author.name
|
||||
api.visibility @dashboard.visibility
|
||||
api.options @dashboard.options
|
||||
api.created_on @dashboard.created_at
|
||||
api.updated_on @dashboard.updated_at
|
||||
|
||||
call_hook :api_dashboard_show, dashboard: @dashboard
|
||||
end
|
3
app/views/dashboards/update_layout_setting.js.erb
Normal file
3
app/views/dashboards/update_layout_setting.js.erb
Normal file
@ -0,0 +1,3 @@
|
||||
<% @updated_blocks.each do |block| %>
|
||||
$("#block-<%= block %>").replaceWith("<%= escape_javascript render_dashboard_block(block.to_s, @dashboard) %>");
|
||||
<% end %>
|
1
app/views/hooks/_view_users_show_contextual.html.slim
Normal file
1
app/views/hooks/_view_users_show_contextual.html.slim
Normal file
@ -0,0 +1 @@
|
||||
= call_hook :view_users_show_contextual, user: @user
|
1
app/views/hooks/_view_users_show_info.html.slim
Normal file
1
app/views/hooks/_view_users_show_info.html.slim
Normal file
@ -0,0 +1 @@
|
||||
= call_hook :view_users_show_info, user: @user
|
@ -1,5 +1,5 @@
|
||||
- if User.current.logged? && @issue.editable? && Additionals.setting?(:issue_assign_to_me) && \
|
||||
@issue.assigned_to_id != User.current.id && @project.assignable_users.detect { |u| u.id == User.current.id }
|
||||
= link_to(font_awesome_icon('far_user-circle', post_text: l(:button_assign_to_me)),
|
||||
= link_to font_awesome_icon('far_user-circle', post_text: l(:button_assign_to_me)),
|
||||
issue_assign_to_me_path(@issue), method: :put,
|
||||
class: 'assign-to-me')
|
||||
class: 'assign-to-me'
|
||||
|
4
app/views/issues/_additionals_sidebar_queries.html.slim
Normal file
4
app/views/issues/_additionals_sidebar_queries.html.slim
Normal file
@ -0,0 +1,4 @@
|
||||
- if Additionals.setting(:global_sidebar).present?
|
||||
br
|
||||
.sidebar-additionals
|
||||
= textilizable(Additionals.setting(:global_sidebar))
|
@ -1,9 +1,9 @@
|
||||
- if show_issue_change_author?(issue) && issue.safe_attribute?('author_id')
|
||||
- author_options = issue_author_options_for_select(issue.project, issue)
|
||||
- author_options = author_options_for_select(issue.project, issue)
|
||||
- if author_options.present?
|
||||
p#change_author
|
||||
= form.label_for_field :author_id
|
||||
= link_to_function content_tag(:span, l(:button_edit), class: 'icon icon-edit'), '$(this).hide(); $("#issue_author_id").show()'
|
||||
= link_to_function tag.span(l(:button_edit), class: 'icon icon-edit'), '$(this).hide(); $("#issue_author_id").show()'
|
||||
= form.select :author_id, author_options, { required: true, no_label: true }, style: 'display: none'
|
||||
javascript:
|
||||
$('#change_author').insertBefore($('#issue_tracker_id').parent());
|
||||
|
@ -1,7 +1,7 @@
|
||||
- if @project && User.current.allowed_to?(:edit_issue_author, @project)
|
||||
- author_options = issue_author_options_for_select(@project)
|
||||
- author_options = author_options_for_select(@project)
|
||||
- if author_options.present?
|
||||
p#change_author
|
||||
= label_tag('issue[author_id]', l(:field_author))
|
||||
= select_tag('issue[author_id]',
|
||||
content_tag('option', l(:label_no_change_option), value: '') + author_options)
|
||||
tag.option(l(:label_no_change_option), value: '') + author_options)
|
||||
|
@ -1,11 +0,0 @@
|
||||
- if User.current.admin?
|
||||
- if project.archived?
|
||||
= link_to l(:button_unarchive),
|
||||
unarchive_project_path(project, status: params[:status]),
|
||||
method: :post, class: 'icon icon-unlock'
|
||||
- else
|
||||
= link_to l(:button_archive),
|
||||
archive_project_path(project, status: params[:status]),
|
||||
data: { confirm: l(:text_are_you_sure) }, method: :post, class: 'icon icon-lock'
|
||||
= link_to l(:button_copy), copy_project_path(project), class: 'icon icon-copy'
|
||||
= link_to l(:button_delete), project_path(project), method: :delete, class: 'icon icon-del'
|
4
app/views/projects/_additionals_sidebar.html.slim
Normal file
4
app/views/projects/_additionals_sidebar.html.slim
Normal file
@ -0,0 +1,4 @@
|
||||
- if Additionals.setting(:global_sidebar).present?
|
||||
br
|
||||
.sidebar-additionals
|
||||
= textilizable Additionals.setting(:global_sidebar)
|
@ -1,4 +0,0 @@
|
||||
- project_overview_content = Additionals.setting(:project_overview_content)
|
||||
- if project_overview_content.present?
|
||||
.project-content.wiki.box
|
||||
= textilizable(project_overview_content)
|
87
app/views/projects/show.html.slim
Normal file
87
app/views/projects/show.html.slim
Normal file
@ -0,0 +1,87 @@
|
||||
.contextual
|
||||
- if User.current.allowed_to? :save_dashboards, @project
|
||||
- if @dashboard&.editable?
|
||||
= link_to l(:button_dashboard_edit),
|
||||
edit_project_dashboard_path(@project, @dashboard),
|
||||
class: 'icon icon-edit'
|
||||
|
||||
- unless Redmine::Plugin.installed?('redmine_reporting')
|
||||
= bookmark_link @project
|
||||
= call_hook :view_project_contextual_links, project: @project
|
||||
|
||||
- if @dashboard&.editable?
|
||||
= form_tag(_add_block_dashboard_path(@project, @dashboard), remote: true, id: 'block-form', authenticity_token: true) do
|
||||
= dashboard_block_select_tag @dashboard
|
||||
|
||||
= actions_dropdown do
|
||||
- if User.current.allowed_to? :add_subprojects, @project
|
||||
= link_to l(:label_subproject_new), new_project_path(parent_id: @project), class: 'icon icon-add'
|
||||
- if User.current.allowed_to?(:close_project, @project)
|
||||
- if @project.active?
|
||||
= link_to l(:button_close),
|
||||
close_project_path(@project),
|
||||
data: { confirm: l(:text_are_you_sure) }, method: :post, class: 'icon icon-lock'
|
||||
- else
|
||||
= link_to l(:button_reopen),
|
||||
reopen_project_path(@project),
|
||||
data: { confirm: l(:text_are_you_sure) }, method: :post, class: 'icon icon-unlock'
|
||||
|
||||
- if User.current.admin?
|
||||
- if @project.archived?
|
||||
= link_to l(:button_unarchive),
|
||||
unarchive_project_path(@project, status: params[:status]),
|
||||
method: :post, class: 'icon icon-unlock'
|
||||
- else
|
||||
= link_to l(:button_archive),
|
||||
archive_project_path(@project, status: params[:status]),
|
||||
data: { confirm: l(:text_are_you_sure) }, method: :post, class: 'icon icon-lock'
|
||||
= link_to l(:button_copy), copy_project_path(@project), class: 'icon icon-copy'
|
||||
= link_to l(:button_delete), project_path(@project), method: :delete, class: 'icon icon-del'
|
||||
|
||||
|
||||
- if User.current.allowed_to? :save_dashboards, @project
|
||||
= link_to l(:label_new_dashboard),
|
||||
new_project_dashboard_path(@project),
|
||||
class: 'icon icon-add new-additionals-dashboard'
|
||||
|
||||
- if @dashboard&.destroyable?
|
||||
= delete_dashboard_link project_dashboard_path(@project, @dashboard),
|
||||
class: 'icon icon-del'
|
||||
|
||||
= sidebar_action_toggle @dashboard_sidebar, @dashboard, @project
|
||||
- unless @dashboard_sidebar
|
||||
= render_dashboard_actionlist @dashboard, @project
|
||||
|
||||
= call_hook :view_projects_show_actions_dropdown, project: @project
|
||||
|
||||
- if User.current.allowed_to?(:edit_project, @project)
|
||||
= link_to_if_authorized l(:label_settings),
|
||||
{ controller: 'projects', action: 'settings', id: @project },
|
||||
class: 'icon icon-settings'
|
||||
|
||||
h2 = project_overview_name @project, @dashboard
|
||||
|
||||
- unless @project.active?
|
||||
p.warning
|
||||
span.icon.icon-lock
|
||||
= l(:text_project_closed)
|
||||
|
||||
= render partial: 'common/dashboard', locals: { dashboard: @dashboard }
|
||||
|
||||
= call_hook :view_projects_show_bottom, project: @project
|
||||
|
||||
- if @dashboard_sidebar
|
||||
- content_for :sidebar do
|
||||
- if User.current.allowed_to? :save_dashboards, @project, global: true
|
||||
= render_sidebar_dashboards @dashboard, @project
|
||||
= call_hook :view_projects_show_sidebar_bottom, project: @project
|
||||
|
||||
- content_for :header_tags do
|
||||
= auto_discovery_link_tag :atom,
|
||||
{ controller: 'activities',
|
||||
action: 'index',
|
||||
id: @project,
|
||||
format: 'atom',
|
||||
key: User.current.rss_key }
|
||||
|
||||
- html_title l(:label_overview)
|
@ -1,6 +1,6 @@
|
||||
- reset_cycle
|
||||
tr.group.open
|
||||
td colspan="#{@query.inline_columns.size + 2}"
|
||||
td colspan="#{query.inline_columns.size + 2}"
|
||||
span.expander.icon.icon-expended[onclick="toggleRowGroup(this);"]
|
||||
'
|
||||
span.name = group_name
|
||||
|
@ -1,5 +0,0 @@
|
||||
- overview_bottom = Additionals.setting(:overview_bottom)
|
||||
- if overview_bottom.present?
|
||||
.clear-both
|
||||
.overview-bottom.wiki.box
|
||||
= textilizable(overview_bottom)
|
@ -1,4 +0,0 @@
|
||||
- overview_right = Additionals.setting(:overview_right)
|
||||
- if overview_right.present?
|
||||
.overview-right.wiki.box
|
||||
= textilizable(overview_right)
|
@ -1,5 +0,0 @@
|
||||
- @news = [] if Additionals.setting?(:remove_news)
|
||||
- overview_top = Additionals.setting(:overview_top)
|
||||
- if overview_top.present?
|
||||
.overview-top.wiki.box
|
||||
= textilizable(overview_top)
|
7
app/views/welcome/_sidebar.html.slim
Normal file
7
app/views/welcome/_sidebar.html.slim
Normal file
@ -0,0 +1,7 @@
|
||||
- if Additionals.setting(:global_sidebar).present?
|
||||
br
|
||||
.sidebar-additionals
|
||||
= textilizable Additionals.setting(:global_sidebar)
|
||||
|
||||
- if User.current.allowed_to? :save_dashboards, nil, global: true
|
||||
= render_sidebar_dashboards @dashboard
|
53
app/views/welcome/index.html.slim
Normal file
53
app/views/welcome/index.html.slim
Normal file
@ -0,0 +1,53 @@
|
||||
.contextual
|
||||
- if User.current.allowed_to? :save_dashboards, nil, global: true
|
||||
- if @dashboard&.editable?
|
||||
= link_to l(:button_dashboard_edit),
|
||||
edit_dashboard_path(@dashboard),
|
||||
class: 'icon icon-edit'
|
||||
|
||||
= call_hook :view_welcome_contextual_links
|
||||
|
||||
- if @dashboard&.editable?
|
||||
= form_tag(add_block_dashboard_path(@dashboard), remote: true, id: 'block-form', authenticity_token: true) do
|
||||
= dashboard_block_select_tag @dashboard
|
||||
|
||||
= actions_dropdown do
|
||||
- if User.current.allowed_to? :save_dashboards, nil, global: true
|
||||
= link_to l(:label_new_dashboard),
|
||||
new_dashboard_path,
|
||||
class: 'icon icon-add new-additionals-dashboard'
|
||||
- if @dashboard&.destroyable?
|
||||
= delete_dashboard_link dashboard_path(@dashboard),
|
||||
class: 'icon icon-del'
|
||||
= sidebar_action_toggle @dashboard_sidebar, @dashboard
|
||||
- unless @dashboard_sidebar
|
||||
= render_dashboard_actionlist @dashboard
|
||||
|
||||
= call_hook :view_welcome_show_actions_dropdown
|
||||
|
||||
h2 = welcome_overview_name @dashboard
|
||||
|
||||
= call_hook :view_welcome_index_top
|
||||
|
||||
= render partial: 'common/dashboard', locals: { dashboard: @dashboard }
|
||||
|
||||
= call_hook :view_welcome_index_bottom
|
||||
|
||||
- if @dashboard_sidebar
|
||||
- content_for :sidebar do
|
||||
= render partial: 'sidebar'
|
||||
= call_hook :view_welcome_show_sidebar_bottom
|
||||
|
||||
- content_for :header_tags do
|
||||
= auto_discovery_link_tag :atom,
|
||||
{ controller: 'news',
|
||||
action: 'index',
|
||||
key: User.current.rss_key,
|
||||
format: 'atom' },
|
||||
title: "#{Setting.app_title}: #{l(:label_news_latest)}"
|
||||
= auto_discovery_link_tag :atom,
|
||||
{ controller: 'activities',
|
||||
action: 'index',
|
||||
key: User.current.rss_key,
|
||||
format: 'atom' },
|
||||
title: "#{Setting.app_title}: #{l(:label_activity)}"
|
4
app/views/wiki/_additionals_sidebar.html.slim
Normal file
4
app/views/wiki/_additionals_sidebar.html.slim
Normal file
@ -0,0 +1,4 @@
|
||||
- if Additionals.setting(:global_sidebar).present?
|
||||
.sidebar-additionals
|
||||
= textilizable Additionals.setting(:global_sidebar)
|
||||
br
|
@ -1,5 +0,0 @@
|
||||
- sidebar = Additionals.setting(:global_sidebar)
|
||||
- if sidebar.present?
|
||||
.sidebar-additionals
|
||||
= textilizable(sidebar)
|
||||
br
|
@ -2,7 +2,7 @@
|
||||
function openExternalLink() {
|
||||
var handleNewWindow = function() {
|
||||
this.target = '_blank';
|
||||
this.rel = 'noopener';
|
||||
this.rel = 'noopener noreferrer';
|
||||
};
|
||||
$('div.attachments a, a.external').each(handleNewWindow);
|
||||
}
|
||||
|
@ -12,7 +12,8 @@
|
||||
padding-left: 0;
|
||||
}
|
||||
|
||||
.query-description {
|
||||
.query-description,
|
||||
.dashboard-description {
|
||||
color: #666;
|
||||
margin-bottom: 15px;
|
||||
font-size: 95%;
|
||||
@ -184,6 +185,7 @@ span.additionals-tag-label-color {
|
||||
|
||||
td.tags span.additionals-tag-label-color {
|
||||
display: inline-block;
|
||||
line-height: normal;
|
||||
margin: 2px !important;
|
||||
}
|
||||
|
||||
@ -376,8 +378,40 @@ div.relation-list-header {
|
||||
padding-bottom: 2px;
|
||||
}
|
||||
|
||||
div.splitcontent.dashboard {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
span.dashboard-block-alert,
|
||||
span.dashboard-system-default {
|
||||
padding-left: 4px;
|
||||
}
|
||||
|
||||
span.dashboard-system-default.global {
|
||||
color: #d80000;
|
||||
}
|
||||
|
||||
.splitcontentbottom {
|
||||
flex: 1;
|
||||
flex-basis: 100%;
|
||||
}
|
||||
|
||||
select.dashboard-block-select {
|
||||
min-width: 200px;
|
||||
}
|
||||
|
||||
div.drdn-items a.disabled,
|
||||
div.drdn-items a.disabled:hover { color: #aaa; }
|
||||
|
||||
@media screen and (max-width: 899px) {
|
||||
.gototop { display: none; }
|
||||
|
||||
.splitcontentbottom {
|
||||
width: 100%;
|
||||
flex: auto;
|
||||
margin-right: 0;
|
||||
margin-left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@media print {
|
||||
|
4
assets/stylesheets/fontawesome-all.min.css
vendored
4
assets/stylesheets/fontawesome-all.min.css
vendored
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Before Width: | Height: | Size: 699 KiB After Width: | Height: | Size: 713 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,12 +1,12 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!--
|
||||
Font Awesome Free 5.13.0 by @fontawesome - https://fontawesome.com
|
||||
Font Awesome Free 5.14.0 by @fontawesome - https://fontawesome.com
|
||||
License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
-->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
|
||||
<metadata>
|
||||
Created by FontForge 20190801 at Mon Mar 23 10:45:51 2020
|
||||
Created by FontForge 20200314 at Wed Jul 15 11:59:40 2020
|
||||
By Robert Madole
|
||||
Copyright (c) Font Awesome
|
||||
</metadata>
|
||||
@ -20,7 +20,7 @@ Copyright (c) Font Awesome
|
||||
panose-1="2 0 5 3 0 0 0 0 0 0"
|
||||
ascent="448"
|
||||
descent="-64"
|
||||
bbox="-0.0663408 -64.0662 640.01 448.1"
|
||||
bbox="-0.0663408 -64.0662 640.004 448.1"
|
||||
underline-thickness="25"
|
||||
underline-position="-50"
|
||||
unicode-range="U+0020-F5C8"
|
||||
@ -50,7 +50,7 @@ s-36 16.1182 -36 36s16.1182 36 36 36s36 -16.1182 36 -36zM164 192c0 -19.8818 -16.
|
||||
<glyph glyph-name="flag" unicode=""
|
||||
d="M336.174 368c35.4668 0 73.0195 12.6914 108.922 28.1797c31.6406 13.6514 66.9043 -9.65723 66.9043 -44.1162v-239.919c0 -16.1953 -8.1543 -31.3057 -21.7129 -40.1631c-26.5762 -17.3643 -70.0693 -39.9814 -128.548 -39.9814c-68.6084 0 -112.781 32 -161.913 32
|
||||
c-56.5674 0 -89.957 -11.2803 -127.826 -28.5566v-83.4434c0 -8.83691 -7.16309 -16 -16 -16h-16c-8.83691 0 -16 7.16309 -16 16v406.438c-14.3428 8.2998 -24 23.7979 -24 41.5615c0 27.5693 23.2422 49.71 51.2012 47.8965
|
||||
c22.9658 -1.49023 41.8662 -19.4717 44.4805 -42.3379c0.177734 -1.52441 0.321289 -4.00781 0.321289 -5.54199c0 -4.30176 -1.10352 -11.1035 -2.46289 -15.1846c22.418 8.68555 49.4199 15.168 80.7207 15.168c68.6084 0 112.781 -32 161.913 -32zM464 112v240
|
||||
c22.9658 -1.49023 41.8662 -19.4717 44.4805 -42.3379c0.213867 -1.83398 0.308594 -3.65918 0.308594 -5.5498c0 -5.30273 -0.860352 -10.4053 -2.4502 -15.1768c22.418 8.68555 49.4199 15.168 80.7207 15.168c68.6084 0 112.781 -32 161.913 -32zM464 112v240
|
||||
c-31.5059 -14.6338 -84.5547 -32 -127.826 -32c-59.9111 0 -101.968 32 -161.913 32c-41.4365 0 -80.4766 -16.5879 -102.261 -32v-232c31.4473 14.5967 84.4648 24 127.826 24c59.9111 0 101.968 -32 161.913 -32c41.4365 0 80.4775 16.5879 102.261 32z" />
|
||||
<glyph glyph-name="bookmark" unicode="" horiz-adv-x="384"
|
||||
d="M336 448c26.5098 0 48 -21.4902 48 -48v-464l-192 112l-192 -112v464c0 26.5098 21.4902 48 48 48h288zM336 19.5703v374.434c0 3.31348 -2.68555 5.99609 -6 5.99609h-276c-3.31152 0 -6 -2.68848 -6 -6v-374.43l144 84z" />
|
||||
@ -77,17 +77,17 @@ c0 -110.569 89.4678 -200 200 -200zM363.244 247.2c0 -67.0518 -72.4209 -68.084 -72
|
||||
c17.5615 9.84473 28.3242 16.541 28.3242 29.5791c0 17.2461 -21.999 28.6934 -39.7842 28.6934c-23.1885 0 -33.8936 -10.9775 -48.9424 -29.9697c-4.05664 -5.11914 -11.46 -6.07031 -16.666 -2.12402l-27.8232 21.0986
|
||||
c-5.10742 3.87207 -6.25098 11.0654 -2.64453 16.3633c23.627 34.6934 53.7217 54.1846 100.575 54.1846c49.0713 0 101.45 -38.3037 101.45 -88.7998zM298 80c0 -23.1592 -18.8408 -42 -42 -42s-42 18.8408 -42 42s18.8408 42 42 42s42 -18.8408 42 -42z" />
|
||||
<glyph glyph-name="eye" unicode="" horiz-adv-x="576"
|
||||
d="M288 304c0.0927734 0 0.244141 0.000976562 0.336914 0.000976562c61.6641 0 111.71 -50.0469 111.71 -111.711c0 -61.6631 -50.0459 -111.71 -111.71 -111.71s-111.71 50.0469 -111.71 111.71c0 8.71289 1.95898 22.5781 4.37305 30.9502
|
||||
c6.93066 -3.94141 19.0273 -7.18457 27 -7.24023c30.9121 0 56 25.0879 56 56c-0.0556641 7.97266 -3.29883 20.0693 -7.24023 27c8.42383 2.62207 22.4189 4.8623 31.2402 5zM572.52 206.6c1.9209 -3.79883 3.47949 -10.3379 3.47949 -14.5947
|
||||
s-1.55859 -10.7959 -3.47949 -14.5947c-54.1992 -105.771 -161.59 -177.41 -284.52 -177.41s-230.29 71.5898 -284.52 177.4c-1.9209 3.79883 -3.47949 10.3379 -3.47949 14.5947s1.55859 10.7959 3.47949 14.5947c54.1992 105.771 161.59 177.41 284.52 177.41
|
||||
s230.29 -71.5898 284.52 -177.4zM288 48c98.6602 0 189.1 55 237.93 144c-48.8398 89 -139.27 144 -237.93 144s-189.09 -55 -237.93 -144c48.8398 -89 139.279 -144 237.93 -144z" />
|
||||
d="M288 304c0.114258 0 0.240234 -0.0175781 0.354492 -0.0175781c61.6543 0 111.71 -50.0557 111.71 -111.71s-50.0557 -111.71 -111.71 -111.71s-111.71 50.0557 -111.71 111.71c0 10.7422 1.51953 21.1328 4.35547 30.9678
|
||||
c7.95898 -4.52637 17.2129 -7.17188 27 -7.24023c30.9072 0 56 25.0928 56 56c-0.0683594 9.78711 -2.71387 19.041 -7.24023 27c9.88379 3.07617 20.3896 4.83008 31.2402 5zM572.52 206.6c2.21387 -4.37793 3.46094 -9.38965 3.46094 -14.626
|
||||
c0 -5.2373 -1.24707 -10.1855 -3.46094 -14.5635c-54.1992 -105.771 -161.59 -177.41 -284.52 -177.41s-230.29 71.5898 -284.52 177.4c-2.21387 4.37793 -3.46094 9.38965 -3.46094 14.626c0 5.2373 1.24707 10.1855 3.46094 14.5635
|
||||
c54.1992 105.771 161.59 177.41 284.52 177.41s230.29 -71.5898 284.52 -177.4zM288 48c98.6602 0 189.1 55 237.93 144c-48.8398 89 -139.27 144 -237.93 144s-189.09 -55 -237.93 -144c48.8398 -89 139.279 -144 237.93 -144z" />
|
||||
<glyph glyph-name="eye-slash" unicode="" horiz-adv-x="640"
|
||||
d="M634 -23c3.31738 -2.65137 6.00977 -8.25098 6.00977 -12.498c0 -3.10449 -1.57715 -7.58984 -3.51953 -10.0117l-10 -12.4902c-2.65234 -3.31152 -8.24707 -6 -12.4902 -6c-3.09961 0 -7.58008 1.57227 -10 3.50977l-598 467.49
|
||||
c-3.31738 2.65137 -6.00977 8.25098 -6.00977 12.498c0 3.10449 1.57715 7.58984 3.51953 10.0117l10 12.4902c2.65234 3.31152 8.24707 6 12.4902 6c3.09961 0 7.58008 -1.57227 10 -3.50977zM296.79 301.53c6.33496 1.35059 16.7324 2.45801 23.21 2.46973
|
||||
c60.4805 0 109.36 -47.9102 111.58 -107.85zM343.21 82.46c-6.33496 -1.34375 -16.7334 -2.44629 -23.21 -2.45996c-60.4697 0 -109.35 47.9102 -111.58 107.84zM320 336c-19.8799 0 -39.2803 -2.7998 -58.2197 -7.09961l-46.4102 36.29
|
||||
c32.9199 11.8096 67.9297 18.8096 104.63 18.8096c122.93 0 230.29 -71.5898 284.57 -177.4c1.91992 -3.79883 3.47949 -10.3379 3.47949 -14.5947s-1.55957 -10.7959 -3.47949 -14.5947c-11.7197 -22.7598 -35.4189 -56.4092 -52.9004 -75.1104l-37.7402 29.5
|
||||
c14.333 15.0156 34.0449 41.9854 44 60.2002c-48.8398 89 -139.279 144 -237.93 144zM320 48c19.8896 0 39.2803 2.7998 58.2197 7.08984l46.4102 -36.2803c-32.9199 -11.7598 -67.9297 -18.8096 -104.63 -18.8096c-122.92 0 -230.28 71.5898 -284.51 177.4
|
||||
c-1.9209 3.79883 -3.47949 10.3379 -3.47949 14.5947s1.55859 10.7959 3.47949 14.5947c11.7168 22.7568 35.4111 56.4014 52.8896 75.1006l37.7402 -29.5c-14.3467 -15.0107 -34.0811 -41.9756 -44.0498 -60.1904c48.8496 -89 139.279 -144 237.93 -144z" />
|
||||
d="M634 -23c3.66895 -2.93262 6.00391 -7.45117 6.00391 -12.5088c0 -3.7832 -1.31543 -7.26074 -3.51367 -10.001l-10 -12.4902c-2.93359 -3.66309 -7.44824 -5.99414 -12.502 -5.99414c-3.77637 0 -7.25 1.31152 -9.98828 3.50391l-598 467.49
|
||||
c-3.66895 2.93262 -6.00391 7.45117 -6.00391 12.5088c0 3.7832 1.31543 7.26074 3.51367 10.001l10 12.4902c2.93359 3.66309 7.44824 5.99414 12.502 5.99414c3.77637 0 7.25 -1.31152 9.98828 -3.50391zM296.79 301.53c7.51172 1.60254 15.2266 2.45508 23.21 2.46973
|
||||
c60.4805 0 109.36 -47.9102 111.58 -107.85zM343.21 82.46c-7.51367 -1.59375 -15.2285 -2.44336 -23.21 -2.45996c-60.4697 0 -109.35 47.9102 -111.58 107.84zM320 336c-19.8799 0 -39.2803 -2.7998 -58.2197 -7.09961l-46.4102 36.29
|
||||
c32.9199 11.8096 67.9297 18.8096 104.63 18.8096c122.93 0 230.29 -71.5898 284.57 -177.4c2.21289 -4.37793 3.45996 -9.38965 3.45996 -14.626c0 -5.2373 -1.24707 -10.1855 -3.45996 -14.5635c-14.1924 -27.5625 -31.9229 -52.6689 -52.9004 -75.1104l-37.7402 29.5
|
||||
c17.2305 18.0527 31.9385 38.1318 44 60.2002c-48.8398 89 -139.279 144 -237.93 144zM320 48c19.8896 0 39.2803 2.7998 58.2197 7.08984l46.4102 -36.2803c-32.9199 -11.7598 -67.9297 -18.8096 -104.63 -18.8096c-122.92 0 -230.28 71.5898 -284.51 177.4
|
||||
c-2.21387 4.37793 -3.46094 9.38965 -3.46094 14.626c0 5.2373 1.24707 10.1855 3.46094 14.5635c14.1885 27.5586 31.916 52.6621 52.8896 75.1006l37.7402 -29.5c-17.249 -18.0469 -31.9727 -38.1221 -44.0498 -60.1904c48.8496 -89 139.279 -144 237.93 -144z" />
|
||||
<glyph glyph-name="calendar-alt" unicode="" horiz-adv-x="448"
|
||||
d="M148 160h-40c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12zM256 172c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h40
|
||||
c6.59961 0 12 -5.40039 12 -12v-40zM352 172c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-40zM256 76c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12v40
|
||||
@ -131,47 +131,47 @@ d="M527.9 416c26.5996 0 48.0996 -21.5 48.0996 -48v-352c0 -26.5 -21.5 -48 -48.099
|
||||
h-467.801zM521.9 16c3.2998 0 6 2.7002 6 6v170h-479.801v-170c0 -3.2998 2.7002 -6 6 -6h467.801zM192 116v-40c0 -6.59961 -5.40039 -12 -12 -12h-72c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h72c6.59961 0 12 -5.40039 12 -12zM384 116v-40
|
||||
c0 -6.59961 -5.40039 -12 -12 -12h-136c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h136c6.59961 0 12 -5.40039 12 -12z" />
|
||||
<glyph glyph-name="hdd" unicode="" horiz-adv-x="576"
|
||||
d="M567.403 212.358c5.59668 -8.04688 8.59668 -17.6113 8.59668 -27.4121v-136.946c0 -26.5098 -21.4902 -48 -48 -48h-480c-26.5098 0 -48 21.4902 -48 48v136.946c0 8.30957 3.85156 20.5898 8.59668 27.4121l105.08 151.053
|
||||
c7.90625 11.3652 25.5596 20.5889 39.4033 20.5889h0.000976562h269.838h0.000976562c13.8438 0 31.4971 -9.22363 39.4033 -20.5889zM153.081 336l-77.9131 -112h425.664l-77.9131 112h-269.838zM528 48v128h-480v-128h480zM496 112c0 -17.6729 -14.3271 -32 -32 -32
|
||||
s-32 14.3271 -32 32s14.3271 32 32 32s32 -14.3271 32 -32zM400 112c0 -17.6729 -14.3271 -32 -32 -32s-32 14.3271 -32 32s14.3271 32 32 32s32 -14.3271 32 -32z" />
|
||||
d="M567.403 212.358c5.59668 -8.04688 8.59668 -17.6113 8.59668 -27.4121v-136.946c0 -26.5098 -21.4902 -48 -48 -48h-480c-26.5098 0 -48 21.4902 -48 48v136.946c0 10.167 3.19531 19.6465 8.59668 27.4121l105.08 151.053
|
||||
c8.67383 12.4678 23.0791 20.5889 39.4043 20.5889h269.838c16.3252 0 30.7305 -8.12109 39.4043 -20.5889zM153.081 336l-77.9131 -112h425.664l-77.9131 112h-269.838zM528 48v128h-480v-128h480zM496 112c0 -17.6729 -14.3271 -32 -32 -32s-32 14.3271 -32 32
|
||||
s14.3271 32 32 32s32 -14.3271 32 -32zM400 112c0 -17.6729 -14.3271 -32 -32 -32s-32 14.3271 -32 32s14.3271 32 32 32s32 -14.3271 32 -32z" />
|
||||
<glyph glyph-name="hand-point-right" unicode=""
|
||||
d="M428.8 310.4c45.0996 0 83.2002 -38.1016 83.2002 -83.2002c0 -45.6162 -37.7646 -83.2002 -83.2002 -83.2002h-35.6475c-1.41602 -6.36719 -4.96875 -16.252 -7.92969 -22.0645c2.50586 -22.0059 -3.50293 -44.9775 -15.9844 -62.791
|
||||
d="M428.8 310.4c45.0996 0 83.2002 -38.1016 83.2002 -83.2002c0 -45.6162 -37.7646 -83.2002 -83.2002 -83.2002h-35.6475c-1.71387 -7.70605 -4.43555 -15.2051 -7.92969 -22.0645c2.50586 -22.0059 -3.50293 -44.9775 -15.9844 -62.791
|
||||
c-1.14062 -52.4863 -37.3984 -91.1445 -99.9404 -91.1445h-21.2988c-60.0635 0 -98.5117 40 -127.2 40h-2.67871c-5.74707 -4.95215 -13.5361 -8 -22.1201 -8h-64c-17.6729 0 -32 12.8936 -32 28.7998v230.4c0 15.9062 14.3271 28.7998 32 28.7998h64.001
|
||||
c8.58398 0 16.373 -3.04785 22.1201 -8h2.67871c6.96387 0 14.8623 6.19336 30.1816 23.6689l0.128906 0.148438l0.130859 0.145508c8.85645 9.93652 18.1162 20.8398 25.8506 33.2529c18.7051 30.2471 30.3936 78.7842 75.707 78.7842c56.9277 0 92 -35.2861 92 -83.2002
|
||||
v-0.0839844c0 -6.21777 -0.974609 -16.2148 -2.17578 -22.3154h86.1768zM428.8 192c18.9756 0 35.2002 16.2246 35.2002 35.2002c0 18.7002 -16.7754 35.2002 -35.2002 35.2002h-158.399c0 17.3242 26.3994 35.1992 26.3994 70.3994c0 26.4004 -20.625 35.2002 -44 35.2002
|
||||
c-8.79395 0 -20.4443 -32.7119 -34.9258 -56.0996c-9.07422 -14.5752 -19.5244 -27.2256 -30.7988 -39.875c-16.1094 -18.374 -33.8359 -36.6328 -59.0752 -39.5967v-176.753c42.79 -3.7627 74.5088 -39.6758 120 -39.6758h21.2988
|
||||
c0 -0.0283203 0 0.0361328 0 0.0078125c0 -7.66602 -0.748047 -15.1582 -2.17578 -22.4072h86.1768zM428.8 192c18.9756 0 35.2002 16.2246 35.2002 35.2002c0 18.7002 -16.7754 35.2002 -35.2002 35.2002h-158.399c0 17.3242 26.3994 35.1992 26.3994 70.3994
|
||||
c0 26.4004 -20.625 35.2002 -44 35.2002c-8.79395 0 -20.4443 -32.7119 -34.9258 -56.0996c-9.07422 -14.5752 -19.5244 -27.2256 -30.7988 -39.875c-16.1094 -18.374 -33.8359 -36.6328 -59.0752 -39.5967v-176.753c42.79 -3.7627 74.5088 -39.6758 120 -39.6758h21.2988
|
||||
c40.5244 0 57.124 22.1973 50.6006 61.3252c14.6113 8.00098 24.1514 33.9785 12.9248 53.625c19.3652 18.2246 17.7871 46.3809 4.9502 61.0498h91.0254zM88 64c0 13.2549 -10.7451 24 -24 24s-24 -10.7451 -24 -24s10.7451 -24 24 -24s24 10.7451 24 24z" />
|
||||
<glyph glyph-name="hand-point-left" unicode=""
|
||||
d="M0 227.2c0 45.0986 38.1006 83.2002 83.2002 83.2002h86.1758c-1.3623 6.91016 -2.17578 14.374 -2.17578 22.3994c0 47.9141 35.0723 83.2002 92 83.2002c45.3135 0 57.002 -48.5371 75.7061 -78.7852c7.73438 -12.4121 16.9951 -23.3154 25.8506 -33.2529
|
||||
l0.130859 -0.145508l0.128906 -0.148438c15.3213 -17.4746 23.2197 -23.668 30.1836 -23.668h2.67871c5.74707 4.95215 13.5361 8 22.1201 8h64c17.6729 0 32 -12.8936 32 -28.7998v-230.4c0 -15.9062 -14.3271 -28.7998 -32 -28.7998h-64
|
||||
c-8.58398 0 -16.373 3.04785 -22.1201 8h-2.67871c-28.6885 0 -67.1367 -40 -127.2 -40h-21.2988c-62.542 0 -98.8008 38.6582 -99.9404 91.1445c-12.4814 17.8135 -18.4922 40.7852 -15.9844 62.791c-2.96094 5.8125 -6.51367 15.6973 -7.92969 22.0645h-35.6465
|
||||
c-8.58398 0 -16.373 3.04785 -22.1201 8h-2.67871c-28.6885 0 -67.1367 -40 -127.2 -40h-21.2988c-62.542 0 -98.8008 38.6582 -99.9404 91.1445c-12.4814 17.8135 -18.4922 40.7852 -15.9844 62.791c-3.49414 6.85938 -6.21582 14.3584 -7.92969 22.0645h-35.6465
|
||||
c-45.4355 0 -83.2002 37.584 -83.2002 83.2002zM48 227.2c0 -18.9756 16.2246 -35.2002 35.2002 -35.2002h91.0244c-12.8369 -14.6689 -14.415 -42.8252 4.9502 -61.0498c-11.2256 -19.6465 -1.68652 -45.624 12.9248 -53.625
|
||||
c-6.52246 -39.1279 10.0771 -61.3252 50.6016 -61.3252h21.2988c45.4912 0 77.21 35.9131 120 39.6768v176.752c-25.2393 2.96289 -42.9658 21.2227 -59.0752 39.5967c-11.2744 12.6494 -21.7246 25.2998 -30.7988 39.875
|
||||
c-14.4814 23.3877 -26.1318 56.0996 -34.9258 56.0996c-23.375 0 -44 -8.7998 -44 -35.2002c0 -35.2002 26.3994 -53.0752 26.3994 -70.3994h-158.399c-18.4248 0 -35.2002 -16.5 -35.2002 -35.2002zM448 88c-13.2549 0 -24 -10.7451 -24 -24s10.7451 -24 24 -24
|
||||
s24 10.7451 24 24s-10.7451 24 -24 24z" />
|
||||
<glyph glyph-name="hand-point-up" unicode="" horiz-adv-x="448"
|
||||
d="M105.6 364.8c0 45.0996 38.1016 83.2002 83.2002 83.2002c45.6162 0 83.2002 -37.7646 83.2002 -83.2002v-35.6465c6.36719 -1.41602 16.252 -4.96875 22.0645 -7.92969c22.0059 2.50684 44.9775 -3.50293 62.791 -15.9844
|
||||
d="M105.6 364.8c0 45.0996 38.1016 83.2002 83.2002 83.2002c45.6162 0 83.2002 -37.7646 83.2002 -83.2002v-35.6465c7.70605 -1.71387 15.2051 -4.43555 22.0645 -7.92969c22.0059 2.50684 44.9775 -3.50293 62.791 -15.9844
|
||||
c52.4863 -1.14062 91.1445 -37.3984 91.1445 -99.9404v-21.2988c0 -60.0635 -40 -98.5117 -40 -127.2v-2.67871c4.95215 -5.74707 8 -13.5361 8 -22.1201v-64c0 -17.6729 -12.8936 -32 -28.7998 -32h-230.4c-15.9062 0 -28.7998 14.3271 -28.7998 32v64
|
||||
c0 8.58398 3.04785 16.373 8 22.1201v2.67871c0 6.96387 -6.19336 14.8623 -23.6689 30.1816l-0.148438 0.128906l-0.145508 0.130859c-9.93652 8.85645 -20.8398 18.1162 -33.2529 25.8506c-30.2471 18.7051 -78.7842 30.3936 -78.7842 75.707
|
||||
c0 56.9277 35.2861 92 83.2002 92h0.0839844c6.21777 0 16.2148 -0.974609 22.3154 -2.17578v86.1768zM224 364.8c0 18.9756 -16.2246 35.2002 -35.2002 35.2002c-18.7002 0 -35.2002 -16.7754 -35.2002 -35.2002v-158.399c-17.3242 0 -35.1992 26.3994 -70.3994 26.3994
|
||||
c-26.4004 0 -35.2002 -20.625 -35.2002 -44c0 -8.79395 32.7119 -20.4443 56.0996 -34.9258c14.5752 -9.07422 27.2256 -19.5244 39.875 -30.7988c18.374 -16.1094 36.6328 -33.8359 39.5967 -59.0752h176.753c3.7627 42.79 39.6758 74.5088 39.6758 120v21.2988
|
||||
c0 40.5244 -22.1973 57.124 -61.3252 50.6006c-8.00098 14.6113 -33.9785 24.1514 -53.625 12.9248c-18.2246 19.3652 -46.3809 17.7871 -61.0498 4.9502v91.0254zM352 24c-13.2549 0 -24 -10.7451 -24 -24s10.7451 -24 24 -24s24 10.7451 24 24s-10.7451 24 -24 24z" />
|
||||
c0 56.9277 35.2861 92 83.2002 92c0.0283203 0 -0.0361328 0 -0.0078125 0c7.66602 0 15.1582 -0.748047 22.4072 -2.17578v86.1768zM224 364.8c0 18.9756 -16.2246 35.2002 -35.2002 35.2002c-18.7002 0 -35.2002 -16.7754 -35.2002 -35.2002v-158.399
|
||||
c-17.3242 0 -35.1992 26.3994 -70.3994 26.3994c-26.4004 0 -35.2002 -20.625 -35.2002 -44c0 -8.79395 32.7119 -20.4443 56.0996 -34.9258c14.5752 -9.07422 27.2256 -19.5244 39.875 -30.7988c18.374 -16.1094 36.6328 -33.8359 39.5967 -59.0752h176.753
|
||||
c3.7627 42.79 39.6758 74.5088 39.6758 120v21.2988c0 40.5244 -22.1973 57.124 -61.3252 50.6006c-8.00098 14.6113 -33.9785 24.1514 -53.625 12.9248c-18.2246 19.3652 -46.3809 17.7871 -61.0498 4.9502v91.0254zM352 24c-13.2549 0 -24 -10.7451 -24 -24
|
||||
s10.7451 -24 24 -24s24 10.7451 24 24s-10.7451 24 -24 24z" />
|
||||
<glyph glyph-name="hand-point-down" unicode="" horiz-adv-x="448"
|
||||
d="M188.8 -64c-45.0986 0 -83.2002 38.1006 -83.2002 83.2002v86.1758c-6.91016 -1.3623 -14.374 -2.17578 -22.3994 -2.17578c-47.9141 0 -83.2002 35.0723 -83.2002 92c0 45.3135 48.5371 57.002 78.7852 75.707c12.4121 7.73438 23.3154 16.9951 33.2529 25.8506
|
||||
l0.145508 0.130859l0.148438 0.128906c17.4746 15.3213 23.668 23.2197 23.668 30.1836v2.67871c-4.95215 5.74707 -8 13.5361 -8 22.1201v64c0 17.6729 12.8936 32 28.7998 32h230.4c15.9062 0 28.7998 -14.3271 28.7998 -32v-64.001
|
||||
c0 -8.58398 -3.04785 -16.373 -8 -22.1201v-2.67871c0 -28.6885 40 -67.1367 40 -127.2v-21.2988c0 -62.542 -38.6582 -98.8008 -91.1445 -99.9404c-17.8135 -12.4814 -40.7852 -18.4922 -62.791 -15.9844c-5.8125 -2.96094 -15.6973 -6.51367 -22.0645 -7.92969v-35.6465
|
||||
c0 -8.58398 -3.04785 -16.373 -8 -22.1201v-2.67871c0 -28.6885 40 -67.1367 40 -127.2v-21.2988c0 -62.542 -38.6582 -98.8008 -91.1445 -99.9404c-17.8135 -12.4814 -40.7852 -18.4922 -62.791 -15.9844c-6.85938 -3.49414 -14.3584 -6.21582 -22.0645 -7.92969v-35.6465
|
||||
c0 -45.4355 -37.584 -83.2002 -83.2002 -83.2002zM188.8 -16c18.9756 0 35.2002 16.2246 35.2002 35.2002v91.0244c14.6689 -12.8369 42.8252 -14.415 61.0498 4.9502c19.6465 -11.2256 45.624 -1.68652 53.625 12.9248c39.1279 -6.52246 61.3252 10.0771 61.3252 50.6016
|
||||
v21.2988c0 45.4912 -35.9131 77.21 -39.6768 120h-176.752c-2.96289 -25.2393 -21.2227 -42.9658 -39.5967 -59.0752c-12.6494 -11.2744 -25.2998 -21.7246 -39.875 -30.7988c-23.3877 -14.4814 -56.0996 -26.1318 -56.0996 -34.9258c0 -23.375 8.7998 -44 35.2002 -44
|
||||
c35.2002 0 53.0752 26.3994 70.3994 26.3994v-158.399c0 -18.4248 16.5 -35.2002 35.2002 -35.2002zM328 384c0 -13.2549 10.7451 -24 24 -24s24 10.7451 24 24s-10.7451 24 -24 24s-24 -10.7451 -24 -24z" />
|
||||
<glyph glyph-name="copy" unicode="" horiz-adv-x="448"
|
||||
d="M433.941 382.059c7.75977 -7.75977 14.0586 -22.9658 14.0586 -33.9404v-268.118c0 -26.5098 -21.4902 -48 -48 -48h-80v-48c0 -26.5098 -21.4902 -48 -48 -48h-224c-26.5098 0 -48 21.4902 -48 48v320c0 26.5098 21.4902 48 48 48h80v48c0 26.5098 21.4902 48 48 48
|
||||
h172.118c10.9746 0 26.1807 -6.29883 33.9404 -14.0586zM266 -16c3.31152 0 6 2.68848 6 6v42h-96c-26.5098 0 -48 21.4902 -48 48v224h-74c-3.31152 0 -6 -2.68848 -6 -6v-308c0 -3.31152 2.68848 -6 6 -6h212zM394 80c3.31152 0 6 2.68848 6 6v202h-88
|
||||
c-13.2549 0 -24 10.7451 -24 24v88h-106c-3.31152 0 -6 -2.68848 -6 -6v-308c0 -3.31152 2.68848 -6 6 -6h212zM400 336v9.63184v0.000976562c0 1.37207 -0.787109 3.27246 -1.75684 4.24219l-48.3682 48.3682c-1.12598 1.125 -2.65234 1.75684 -4.24316 1.75684h-9.63184
|
||||
v-64h64z" />
|
||||
d="M433.941 382.059c8.68848 -8.68848 14.0586 -20.6943 14.0586 -33.9404v-268.118c0 -26.5098 -21.4902 -48 -48 -48h-80v-48c0 -26.5098 -21.4902 -48 -48 -48h-224c-26.5098 0 -48 21.4902 -48 48v320c0 26.5098 21.4902 48 48 48h80v48c0 26.5098 21.4902 48 48 48
|
||||
h172.118c13.2461 0 25.252 -5.37012 33.9404 -14.0586zM266 -16c3.31152 0 6 2.68848 6 6v42h-96c-26.5098 0 -48 21.4902 -48 48v224h-74c-3.31152 0 -6 -2.68848 -6 -6v-308c0 -3.31152 2.68848 -6 6 -6h212zM394 80c3.31152 0 6 2.68848 6 6v202h-88
|
||||
c-13.2549 0 -24 10.7451 -24 24v88h-106c-3.31152 0 -6 -2.68848 -6 -6v-308c0 -3.31152 2.68848 -6 6 -6h212zM400 336v9.63184c0 1.65527 -0.670898 3.15723 -1.75684 4.24316l-48.3682 48.3682c-1.12598 1.125 -2.65234 1.75684 -4.24316 1.75684h-9.63184v-64h64z" />
|
||||
<glyph glyph-name="save" unicode="" horiz-adv-x="448"
|
||||
d="M433.941 318.059c7.75977 -7.75977 14.0586 -22.9658 14.0586 -33.9404v-268.118c0 -26.5098 -21.4902 -48 -48 -48h-352c-26.5098 0 -48 21.4902 -48 48v352c0 26.5098 21.4902 48 48 48h268.118c10.9746 0 26.1807 -6.29883 33.9404 -14.0586zM272 368h-128v-80h128v80
|
||||
zM394 16c3.31152 0 6 2.68848 6 6v259.632v0.000976562c0 1.37207 -0.787109 3.27246 -1.75684 4.24219l-78.2432 78.2432v-100.118c0 -13.2549 -10.7451 -24 -24 -24h-176c-13.2549 0 -24 10.7451 -24 24v104h-42c-3.31152 0 -6 -2.68848 -6 -6v-340
|
||||
c0 -3.31152 2.68848 -6 6 -6h340zM224 216c48.5234 0 88 -39.4766 88 -88s-39.4766 -88 -88 -88s-88 39.4766 -88 88s39.4766 88 88 88zM224 88c22.0557 0 40 17.9443 40 40s-17.9443 40 -40 40s-40 -17.9443 -40 -40s17.9443 -40 40 -40z" />
|
||||
d="M433.941 318.059c8.68848 -8.68848 14.0586 -20.6943 14.0586 -33.9404v-268.118c0 -26.5098 -21.4902 -48 -48 -48h-352c-26.5098 0 -48 21.4902 -48 48v352c0 26.5098 21.4902 48 48 48h268.118c13.2461 0 25.252 -5.37012 33.9404 -14.0586zM272 368h-128v-80h128v80z
|
||||
M394 16c3.31152 0 6 2.68848 6 6v259.632c0 1.65527 -0.670898 3.15723 -1.75684 4.24316l-78.2432 78.2432v-100.118c0 -13.2549 -10.7451 -24 -24 -24h-176c-13.2549 0 -24 10.7451 -24 24v104h-42c-3.31152 0 -6 -2.68848 -6 -6v-340c0 -3.31152 2.68848 -6 6 -6h340z
|
||||
M224 216c48.5234 0 88 -39.4766 88 -88s-39.4766 -88 -88 -88s-88 39.4766 -88 88s39.4766 88 88 88zM224 88c22.0557 0 40 17.9443 40 40s-17.9443 40 -40 40s-40 -17.9443 -40 -40s17.9443 -40 40 -40z" />
|
||||
<glyph glyph-name="square" unicode="" horiz-adv-x="448"
|
||||
d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352zM394 16c3.2998 0 6 2.7002 6 6v340c0 3.2998 -2.7002 6 -6 6h-340c-3.2998 0 -6 -2.7002 -6 -6v-340c0 -3.2998 2.7002 -6 6 -6h340z" />
|
||||
<glyph glyph-name="envelope" unicode=""
|
||||
@ -181,7 +181,7 @@ c-22.5439 -17.748 -60.3359 -55.1787 -103.053 -54.9473c-42.9277 -0.231445 -81.205
|
||||
<glyph glyph-name="lightbulb" unicode="" horiz-adv-x="352"
|
||||
d="M176 368c8.83984 0 16 -7.16016 16 -16s-7.16016 -16 -16 -16c-35.2803 0 -64 -28.7002 -64 -64c0 -8.83984 -7.16016 -16 -16 -16s-16 7.16016 -16 16c0 52.9404 43.0596 96 96 96zM96.0596 -11.1699l-0.0400391 43.1797h159.961l-0.0507812 -43.1797
|
||||
c-0.00976562 -3.13965 -0.939453 -6.21973 -2.67969 -8.83984l-24.5098 -36.8398c-2.95996 -4.45996 -7.95996 -7.14062 -13.3203 -7.14062h-78.8496c-5.35059 0 -10.3506 2.68066 -13.3203 7.14062l-24.5098 36.8398c-1.75 2.62012 -2.68066 5.68945 -2.68066 8.83984z
|
||||
M176 448c97.2002 0 176 -78.7998 176 -176c0 -44.3701 -16.4502 -84.8496 -43.5498 -115.79c-16.6406 -18.9795 -42.7402 -58.79 -52.4199 -92.1602v-0.0498047h-48v0.0996094c0.00390625 4.04199 0.999023 10.4482 2.21973 14.3008
|
||||
M176 448c97.2002 0 176 -78.7998 176 -176c0 -44.3701 -16.4502 -84.8496 -43.5498 -115.79c-16.6406 -18.9795 -42.7402 -58.79 -52.4199 -92.1602v-0.0498047h-48v0.0996094c0.00488281 4.98145 0.790039 9.78809 2.21973 14.3008
|
||||
c5.67969 17.9893 22.9902 64.8496 62.0996 109.46c20.4102 23.29 31.6504 53.1699 31.6504 84.1396c0 70.5801 -57.4199 128 -128 128c-68.2803 0 -128.15 -54.3604 -127.95 -128c0.0898438 -30.9902 11.0703 -60.71 31.6104 -84.1396
|
||||
c39.3496 -44.9004 56.5801 -91.8604 62.1699 -109.67c1.42969 -4.56055 2.13965 -9.30078 2.15039 -14.0703v-0.120117h-48v0.0595703c-9.68066 33.3604 -35.7803 73.1709 -52.4209 92.1602c-27.1094 30.9307 -43.5596 71.4102 -43.5596 115.78
|
||||
c0 93.0303 73.7197 176 176 176z" />
|
||||
@ -241,13 +241,13 @@ c4.70508 4.66699 12.3027 4.63672 16.9697 -0.0683594l22.5361 -22.7178c4.66699 -4.
|
||||
<glyph glyph-name="share-square" unicode="" horiz-adv-x="576"
|
||||
d="M561.938 289.94c18.75 -18.7402 18.75 -49.1406 0 -67.8809l-143.998 -144c-29.9727 -29.9727 -81.9404 -9.05273 -81.9404 33.9404v53.7998c-101.266 -7.83691 -99.625 -31.6406 -84.1104 -78.7598c14.2285 -43.0889 -33.4736 -79.248 -71.0195 -55.7402
|
||||
c-51.6924 32.3057 -84.8701 83.0635 -84.8701 144.76c0 39.3408 12.2197 72.7402 36.3301 99.3008c19.8398 21.8398 47.7402 38.4697 82.9102 49.4199c36.7295 11.4395 78.3096 16.1094 120.76 17.9893v57.1982c0 42.9355 51.9258 63.9541 81.9404 33.9404zM384 112l144 144
|
||||
l-144 144v-104.09c-110.86 -0.90332 -240 -10.5166 -240 -119.851c0 -52.1396 32.79 -85.6094 62.3096 -104.06c-39.8174 120.65 48.999 141.918 177.69 143.84v-103.84zM408.74 27.5068c6.14844 1.75684 15.5449 5.92383 20.9736 9.30273
|
||||
l-144 144v-104.09c-110.86 -0.90332 -240 -10.5166 -240 -119.851c0 -52.1396 32.79 -85.6094 62.3096 -104.06c-39.8174 120.65 48.999 141.918 177.69 143.84v-103.84zM408.74 27.5068c7.4375 2.125 14.5508 5.30566 20.9736 9.30273
|
||||
c7.97656 4.95215 18.2861 -0.825195 18.2861 -10.2139v-42.5957c0 -26.5098 -21.4902 -48 -48 -48h-352c-26.5098 0 -48 21.4902 -48 48v352c0 26.5098 21.4902 48 48 48h132c6.62695 0 12 -5.37305 12 -12v-4.48633c0 -4.91699 -2.9873 -9.36914 -7.56934 -11.1514
|
||||
c-13.7021 -5.33105 -26.3955 -11.5371 -38.0498 -18.585c-1.59668 -0.974609 -4.41016 -1.77051 -6.28027 -1.77734h-86.1006c-3.31152 0 -6 -2.68848 -6 -6v-340c0 -3.31152 2.68848 -6 6 -6h340c3.31152 0 6 2.68848 6 6v25.9658c0 5.37012 3.5791 10.0596 8.74023 11.541
|
||||
z" />
|
||||
c-13.7021 -5.33105 -26.3955 -11.5371 -38.0498 -18.585c-1.82715 -1.11523 -3.98633 -1.76953 -6.28027 -1.77734h-86.1006c-3.31152 0 -6 -2.68848 -6 -6v-340c0 -3.31152 2.68848 -6 6 -6h340c3.31152 0 6 2.68848 6 6v25.9658c0 5.37012 3.5791 10.0596 8.74023 11.541z
|
||||
" />
|
||||
<glyph glyph-name="compass" unicode="" horiz-adv-x="496"
|
||||
d="M347.94 318.14c16.6592 7.61035 33.8096 -9.54004 26.1992 -26.1992l-65.9697 -144.341c-2.73047 -5.97363 -9.7959 -13.0391 -15.7695 -15.7695l-144.341 -65.9697c-16.6592 -7.61035 -33.8096 9.5498 -26.1992 26.1992l65.9697 144.341
|
||||
c2.73047 5.97363 9.7959 13.0391 15.7695 15.7695zM270.58 169.42c12.4697 12.4697 12.4697 32.6904 0 45.1602s-32.6904 12.4697 -45.1602 0s-12.4697 -32.6904 0 -45.1602s32.6904 -12.4697 45.1602 0zM248 440c136.97 0 248 -111.03 248 -248s-111.03 -248 -248 -248
|
||||
d="M347.94 318.14c16.6592 7.61035 33.8096 -9.54004 26.1992 -26.1992l-65.9697 -144.341c-3.19238 -6.9834 -8.78613 -12.5771 -15.7695 -15.7695l-144.341 -65.9697c-16.6592 -7.61035 -33.8096 9.5498 -26.1992 26.1992l65.9697 144.341
|
||||
c3.19238 6.9834 8.78613 12.5771 15.7695 15.7695zM270.58 169.42c12.4697 12.4697 12.4697 32.6904 0 45.1602s-32.6904 12.4697 -45.1602 0s-12.4697 -32.6904 0 -45.1602s32.6904 -12.4697 45.1602 0zM248 440c136.97 0 248 -111.03 248 -248s-111.03 -248 -248 -248
|
||||
s-248 111.03 -248 248s111.03 248 248 248zM248 -8c110.28 0 200 89.7197 200 200s-89.7197 200 -200 200s-200 -89.7197 -200 -200s89.7197 -200 200 -200z" />
|
||||
<glyph glyph-name="caret-square-down" unicode="" horiz-adv-x="448"
|
||||
d="M125.1 240h197.801c10.6992 0 16.0996 -13 8.5 -20.5l-98.9004 -98.2998c-4.7002 -4.7002 -12.2002 -4.7002 -16.9004 0l-98.8994 98.2998c-7.7002 7.5 -2.2998 20.5 8.39941 20.5zM448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352
|
||||
@ -287,7 +287,7 @@ l40.4004 -59.8994l70.8994 13.6992c13 2.60059 26.6006 -1.59961 36.2002 -11.0996c9
|
||||
l-91 17.5996l17.5996 -91.2002l-76.7998 -52l76.7998 -52l-17.5996 -91.1992l90.8994 17.5996l51.9004 -77l51.9004 76.9004l91 -17.6006zM256 296c57.2998 0 104 -46.7002 104 -104s-46.7002 -104 -104 -104s-104 46.7002 -104 104s46.7002 104 104 104zM256 136
|
||||
c30.9004 0 56 25.0996 56 56s-25.0996 56 -56 56s-56 -25.0996 -56 -56s25.0996 -56 56 -56z" />
|
||||
<glyph glyph-name="moon" unicode=""
|
||||
d="M279.135 -64c-141.424 0 -256 114.64 -256 256c0 141.425 114.641 256 256 256c13.0068 -0.00195312 33.9443 -1.91797 46.7354 -4.27734c44.0205 -8.13086 53.7666 -66.8691 15.0215 -88.9189c-41.374 -23.5439 -67.4336 -67.4121 -67.4336 -115.836
|
||||
d="M279.135 -64c-141.424 0 -256 114.64 -256 256c0 141.425 114.641 256 256 256c16.0342 -0.00292969 31.5078 -1.46875 46.7354 -4.27734c44.0205 -8.13086 53.7666 -66.8691 15.0215 -88.9189c-41.374 -23.5439 -67.4336 -67.4121 -67.4336 -115.836
|
||||
c0 -83.5234 75.9238 -146.475 158.272 -130.792c43.6904 8.32129 74.5186 -42.5693 46.248 -77.4004c-47.8613 -58.9717 -120.088 -94.7754 -198.844 -94.7754zM279.135 400c-114.875 0 -208 -93.125 -208 -208s93.125 -208 208 -208
|
||||
c65.2314 0 123.439 30.0361 161.575 77.0244c-111.611 -21.2568 -215.252 64.0957 -215.252 177.943c0 67.5127 36.9326 126.392 91.6934 157.555c-12.3271 2.27637 -25.0312 3.47754 -38.0166 3.47754z" />
|
||||
<glyph glyph-name="caret-square-left" unicode="" horiz-adv-x="448"
|
||||
@ -334,12 +334,12 @@ c12.7002 0 24.9004 -5.09961 33.9004 -14.0996zM256 396.1v-76.0996h76.0996zM336 -1
|
||||
c-33.2002 0 -58 30.4004 -51.4004 62.9004l19.7002 97.0996v32h32v-32h22.1006c5.7998 0 10.6992 -4.09961 11.7998 -9.7002zM160.3 57.9004c17.9004 0 32.4004 12.0996 32.4004 27c0 14.8994 -14.5 27 -32.4004 27c-17.8994 0 -32.3994 -12.1006 -32.3994 -27
|
||||
c0 -14.9004 14.5 -27 32.3994 -27zM192.3 256v-32h-32v32h32z" />
|
||||
<glyph glyph-name="file-audio" unicode="" horiz-adv-x="384"
|
||||
d="M369.941 350.059c7.75977 -7.75977 14.0586 -22.9658 14.0586 -33.9404v-332.118c0 -26.5098 -21.4902 -48 -48 -48h-288c-26.5098 0 -48 21.4902 -48 48v416c0 26.5098 21.4902 48 48 48h204.118c10.9746 0 26.1807 -6.29883 33.9404 -14.0586zM332.118 320
|
||||
d="M369.941 350.059c8.68848 -8.68848 14.0586 -20.6943 14.0586 -33.9404v-332.118c0 -26.5098 -21.4902 -48 -48 -48h-288c-26.5098 0 -48 21.4902 -48 48v416c0 26.5098 21.4902 48 48 48h204.118c13.2461 0 25.252 -5.37012 33.9404 -14.0586zM332.118 320
|
||||
l-76.1182 76.1182v-76.1182h76.1182zM48 -16h288v288h-104c-13.2549 0 -24 10.7451 -24 24v104h-160v-416zM192 60.0244c0 -10.6914 -12.9258 -16.0459 -20.4854 -8.48535l-35.5146 35.9746h-28c-6.62695 0 -12 5.37305 -12 12v56c0 6.62695 5.37305 12 12 12h28
|
||||
l35.5146 36.9473c7.56055 7.56055 20.4854 2.20605 20.4854 -8.48535v-135.951zM233.201 107.154c9.05078 9.29688 9.05957 24.1328 0.000976562 33.4385c-22.1494 22.752 12.2344 56.2461 34.3945 33.4814c27.1982 -27.9404 27.2119 -72.4443 0.000976562 -100.401
|
||||
c-21.793 -22.3857 -56.9463 10.3154 -34.3965 33.4814z" />
|
||||
<glyph glyph-name="file-video" unicode="" horiz-adv-x="384"
|
||||
d="M369.941 350.059c7.75977 -7.75977 14.0586 -22.9658 14.0586 -33.9404v-332.118c0 -26.5098 -21.4902 -48 -48 -48h-288c-26.5098 0 -48 21.4902 -48 48v416c0 26.5098 21.4902 48 48 48h204.118c10.9746 0 26.1807 -6.29883 33.9404 -14.0586zM332.118 320
|
||||
d="M369.941 350.059c8.68848 -8.68848 14.0586 -20.6943 14.0586 -33.9404v-332.118c0 -26.5098 -21.4902 -48 -48 -48h-288c-26.5098 0 -48 21.4902 -48 48v416c0 26.5098 21.4902 48 48 48h204.118c13.2461 0 25.252 -5.37012 33.9404 -14.0586zM332.118 320
|
||||
l-76.1182 76.1182v-76.1182h76.1182zM48 -16h288v288h-104c-13.2549 0 -24 10.7451 -24 24v104h-160v-416zM276.687 195.303c10.0049 10.0049 27.3135 2.99707 27.3135 -11.3135v-111.976c0 -14.2939 -17.2959 -21.332 -27.3135 -11.3135l-52.6865 52.6738v-37.374
|
||||
c0 -11.0459 -8.9541 -20 -20 -20h-104c-11.0459 0 -20 8.9541 -20 20v104c0 11.0459 8.9541 20 20 20h104c11.0459 0 20 -8.9541 20 -20v-37.374z" />
|
||||
<glyph glyph-name="file-code" unicode="" horiz-adv-x="384"
|
||||
@ -376,9 +376,9 @@ c73.46 -15.2598 127.939 -77.46 127.939 -155.16c0 -41.3604 6.03027 -70.7197 14.33
|
||||
c-35.3203 0 -63.9697 28.6504 -63.9697 64h127.939c0 -35.3496 -28.6494 -64 -63.9697 -64z" />
|
||||
<glyph glyph-name="copyright" unicode=""
|
||||
d="M256 440c136.967 0 248 -111.033 248 -248s-111.033 -248 -248 -248s-248 111.033 -248 248s111.033 248 248 248zM256 -8c110.549 0 200 89.4678 200 200c0 110.549 -89.4678 200 -200 200c-110.549 0 -200 -89.4688 -200 -200c0 -110.549 89.4678 -200 200 -200z
|
||||
M363.351 93.0645c-9.61328 -9.71289 -45.5293 -41.3965 -104.064 -41.3965c-82.4297 0 -140.484 61.4248 -140.484 141.567c0 79.1514 60.2754 139.4 139.763 139.4c55.5303 0 88.7373 -26.6201 97.5928 -34.7783c2.13379 -1.96289 3.86523 -5.9082 3.86523 -8.80762
|
||||
c0 -1.95508 -0.864258 -4.87402 -1.92969 -6.51465l-18.1543 -28.1133c-3.8418 -5.9502 -11.9668 -7.28223 -17.499 -2.9209c-8.5957 6.77637 -31.8145 22.5381 -61.708 22.5381c-48.3037 0 -77.916 -35.3301 -77.916 -80.082c0 -41.5889 26.8877 -83.6924 78.2764 -83.6924
|
||||
c32.6572 0 56.8428 19.0391 65.7266 27.2256c5.26953 4.85645 13.5957 4.03906 17.8193 -1.73828l19.8652 -27.1699c1.28613 -1.74512 2.33008 -4.91992 2.33008 -7.08789c0 -2.72363 -1.56055 -6.5 -3.48242 -8.42969z" />
|
||||
M363.351 93.0645c-9.61328 -9.71289 -45.5293 -41.3965 -104.064 -41.3965c-82.4297 0 -140.484 61.4248 -140.484 141.567c0 79.1514 60.2754 139.4 139.763 139.4c55.5303 0 88.7373 -26.6201 97.5928 -34.7783c2.37793 -2.1875 3.86914 -5.3252 3.86914 -8.80762
|
||||
c0 -2.39746 -0.717773 -4.64258 -1.93359 -6.51465l-18.1543 -28.1133c-3.8418 -5.9502 -11.9668 -7.28223 -17.499 -2.9209c-8.5957 6.77637 -31.8145 22.5381 -61.708 22.5381c-48.3037 0 -77.916 -35.3301 -77.916 -80.082c0 -41.5889 26.8877 -83.6924 78.2764 -83.6924
|
||||
c32.6572 0 56.8428 19.0391 65.7266 27.2256c5.26953 4.85645 13.5957 4.03906 17.8193 -1.73828l19.8652 -27.1699c1.45996 -1.98145 2.32422 -4.42969 2.32422 -7.07715c0 -3.28809 -1.32422 -6.2793 -3.47656 -8.44043z" />
|
||||
<glyph glyph-name="closed-captioning" unicode=""
|
||||
d="M464 384c26.5 0 48 -21.5 48 -48v-288c0 -26.5 -21.5 -48 -48 -48h-416c-26.5 0 -48 21.5 -48 48v288c0 26.5 21.5 48 48 48h416zM458 48c3.2998 0 6 2.7002 6 6v276c0 3.2998 -2.7002 6 -6 6h-404c-3.2998 0 -6 -2.7002 -6 -6v-276c0 -3.2998 2.7002 -6 6 -6h404z
|
||||
M246.9 133.7c1.69922 -2.40039 1.5 -5.60059 -0.5 -7.7002c-53.6006 -56.7998 -172.801 -32.0996 -172.801 67.9004c0 97.2998 121.7 119.5 172.5 70.0996c2.10059 -2 2.5 -3.2002 1 -5.7002l-17.5 -30.5c-1.89941 -3.09961 -6.19922 -4 -9.09961 -1.7002
|
||||
@ -398,7 +398,7 @@ c6.62695 0 12 -5.37305 12 -12v-72c0 -6.62695 -5.37305 -12 -12 -12h-12v-24h88v12c
|
||||
h-32v-32h32zM96 136h224v12c0 6.62695 5.37305 12 12 12h12v160h-12c-6.62695 0 -12 5.37305 -12 12v12h-224v-12c0 -6.62695 -5.37305 -12 -12 -12h-12v-160h12c6.62695 0 12 -5.37305 12 -12v-12zM224 0v32h-32v-32h32zM504 64v160h-12c-6.62695 0 -12 5.37305 -12 12v12
|
||||
h-88v-88h12c6.62695 0 12 -5.37305 12 -12v-72c0 -6.62695 -5.37305 -12 -12 -12h-72c-6.62695 0 -12 5.37305 -12 12v12h-88v-24h12c6.62695 0 12 -5.37305 12 -12v-12h224v12c0 6.62695 5.37305 12 12 12h12zM544 0v32h-32v-32h32zM544 256v32h-32v-32h32z" />
|
||||
<glyph glyph-name="sticky-note" unicode="" horiz-adv-x="448"
|
||||
d="M448 99.8936c0 -10.9746 -6.29883 -26.1797 -14.0586 -33.9404l-83.8828 -83.8818c-7.75977 -7.76074 -22.9658 -14.0596 -33.9404 -14.0596h-268.118c-26.5098 0 -48 21.4902 -48 48v351.988c0 26.5098 21.4902 48 48 48h352c26.5098 0 48 -21.4902 48 -48v-268.106z
|
||||
d="M448 99.8936c0 -13.2451 -5.37012 -25.252 -14.0586 -33.9404l-83.8828 -83.8818c-8.68848 -8.68848 -20.6943 -14.0596 -33.9404 -14.0596h-268.118c-26.5098 0 -48 21.4902 -48 48v351.988c0 26.5098 21.4902 48 48 48h352c26.5098 0 48 -21.4902 48 -48v-268.106z
|
||||
M320 19.8936l76.1182 76.1182h-76.1182v-76.1182zM400 368h-352v-351.988h224v104c0 13.2549 10.7451 24 24 24h104v223.988z" />
|
||||
<glyph glyph-name="clone" unicode=""
|
||||
d="M464 448c26.5098 0 48 -21.4902 48 -48v-320c0 -26.5098 -21.4902 -48 -48 -48h-48v-48c0 -26.5098 -21.4902 -48 -48 -48h-320c-26.5098 0 -48 21.4902 -48 48v320c0 26.5098 21.4902 48 48 48h48v48c0 26.5098 21.4902 48 48 48h320zM362 -16c3.31152 0 6 2.68848 6 6
|
||||
@ -412,11 +412,11 @@ d="M408.864 368.948c48.8213 20.751 103.136 -15.0723 103.136 -67.9111v-114.443c0
|
||||
c-17.6729 0 -32 14.3271 -32 32c0 27.3301 1.1416 29.2012 -3.11035 32.9033l-97.71 85.0811c-24.8994 21.6797 -39.1797 52.8926 -39.1797 85.6338v56.9531c0 47.4277 44.8457 82.0215 91.0459 71.1807c1.96094 55.751 63.5107 87.8262 110.671 60.8057
|
||||
c29.1895 31.0713 78.8604 31.4473 108.334 -0.0214844c32.7051 18.6846 76.4121 10.3096 98.8135 -23.5879zM464 186.594v114.445c0 34.29 -52 33.8232 -52 0.676758c0 -8.83594 -7.16309 -16 -16 -16h-7c-8.83691 0 -16 7.16406 -16 16v26.751
|
||||
c0 34.457 -52 33.707 -52 0.676758v-27.4287c0 -8.83594 -7.16309 -16 -16 -16h-7c-8.83691 0 -16 7.16406 -16 16v40.4658c0 34.3525 -52 33.8115 -52 0.677734v-41.1436c0 -8.83594 -7.16406 -16 -16 -16h-7c-8.83594 0 -16 7.16406 -16 16v26.751
|
||||
c0 34.4023 -52 33.7744 -52 0.676758v-116.571c0 -8.83203 -7.16797 -16 -16 -16c-3.30664 0 -8.01367 1.7627 -10.5068 3.93359l-7 6.09473c-3.03223 2.64062 -5.49316 8.04688 -5.49316 12.0674v0v41.2275c0 34.2148 -52 33.8857 -52 0.677734v-56.9531
|
||||
c0 -18.8555 8.27441 -36.874 22.7002 -49.4365l97.71 -85.0801c12.4502 -10.8398 19.5898 -26.4463 19.5898 -42.8164v-10.2861h220v7.07617c0 13.21 2.65332 26.0791 7.88281 38.25l42.835 99.6553c2.91602 6.75391 5.28223 18.207 5.28223 25.5635v0.0488281z" />
|
||||
c0 34.4023 -52 33.7744 -52 0.676758v-116.571c0 -8.83105 -7.17773 -15.9961 -16.0078 -15.9961c-4.0166 0 -7.68848 1.48242 -10.499 3.92969l-7 6.09473c-3.37012 2.93457 -5.49316 7.25293 -5.49316 12.0674v41.2275c0 34.2148 -52 33.8857 -52 0.677734v-56.9531
|
||||
c0 -18.8555 8.27441 -36.874 22.7002 -49.4365l97.71 -85.0801c12.4502 -10.8398 19.5898 -26.4463 19.5898 -42.8164v-10.2861h220v7.07617c0 13.21 2.65332 26.0791 7.88281 38.25l42.835 99.6553c3.37891 7.82715 5.28223 16.501 5.28223 25.5625v0.0498047z" />
|
||||
<glyph glyph-name="hand-paper" unicode="" horiz-adv-x="448"
|
||||
d="M372.57 335.359c39.9062 5.63281 75.4297 -25.7393 75.4297 -66.3594v-131.564c-0.00195312 -12.7666 -2.33008 -33.2246 -5.19531 -45.666l-30.1836 -130.958c-3.34668 -14.5234 -16.2783 -24.8125 -31.1816 -24.8125h-222.897
|
||||
c-9.10352 0 -20.7793 6.01758 -26.0615 13.4316l-119.97 168.415c-21.2441 29.8203 -14.8047 71.3574 14.5498 93.1533c18.7754 13.9395 42.1309 16.2979 62.083 8.87109v126.13c0 44.0547 41.125 75.5439 82.4053 64.9834c23.8926 48.1963 92.3535 50.2471 117.982 0.74707
|
||||
d="M372.57 335.359c39.9062 5.63281 75.4297 -25.7393 75.4297 -66.3594v-131.564c-0.00292969 -15.7393 -1.80566 -30.9482 -5.19531 -45.666l-30.1836 -130.958c-3.34668 -14.5234 -16.2783 -24.8125 -31.1816 -24.8125h-222.897
|
||||
c-10.7539 0 -20.2588 5.28613 -26.0615 13.4316l-119.97 168.415c-21.2441 29.8203 -14.8047 71.3574 14.5498 93.1533c18.7754 13.9395 42.1309 16.2979 62.083 8.87109v126.13c0 44.0547 41.125 75.5439 82.4053 64.9834c23.8926 48.1963 92.3535 50.2471 117.982 0.74707
|
||||
c42.5186 11.1445 83.0391 -21.9346 83.0391 -65.5469v-10.8242zM399.997 137.437l-0.00195312 131.563c0 24.9492 -36.5703 25.5508 -36.5703 -0.691406v-76.3086c0 -8.83691 -7.16309 -16 -16 -16h-6.85645c-8.83691 0 -16 7.16309 -16 16v154.184
|
||||
c0 25.501 -36.5703 26.3633 -36.5703 0.691406v-154.875c0 -8.83691 -7.16309 -16 -16 -16h-6.85645c-8.83691 0 -16 7.16309 -16 16v188.309c0 25.501 -36.5703 26.3545 -36.5703 0.691406v-189c0 -8.83691 -7.16309 -16 -16 -16h-6.85645c-8.83691 0 -16 7.16309 -16 16
|
||||
v153.309c0 25.501 -36.5713 26.3359 -36.5713 0.691406v-206.494c0 -15.5703 -20.0352 -21.9092 -29.0303 -9.2832l-27.1279 38.0791c-14.3711 20.1709 -43.833 -2.33496 -29.3945 -22.6045l115.196 -161.697h201.92l27.3252 118.551
|
||||
@ -424,45 +424,46 @@ c2.63086 11.417 3.96484 23.1553 3.96484 34.8857z" />
|
||||
<glyph glyph-name="hand-scissors" unicode=""
|
||||
d="M256 -32c-44.9561 0 -77.3428 43.2627 -64.0244 85.8535c-21.6484 13.71 -34.0156 38.7617 -30.3408 65.0068h-87.6348c-40.8037 0 -74 32.8105 -74 73.1406c0 40.3291 33.1963 73.1396 74 73.1396l94 -9.14062l-78.8496 18.6787
|
||||
c-38.3076 14.7422 -57.04 57.4707 -41.9424 95.1123c15.0303 37.4736 57.7549 55.7803 95.6416 41.2012l144.929 -55.7568c24.9551 30.5566 57.8086 43.9932 92.2178 24.7324l97.999 -54.8525c20.9746 -11.7393 34.0049 -33.8457 34.0049 -57.6904v-205.702
|
||||
c0 -30.7422 -21.4404 -57.5576 -51.7979 -64.5537l-118.999 -27.4268c-4.97168 -1.14648 -10.0889 -1.72949 -15.2031 -1.72949zM256 16.0127l70 -0.000976562c1.23633 0 3.21777 0.225586 4.42285 0.501953l119.001 27.4277
|
||||
c8.58203 1.97754 14.5762 9.29102 14.5762 17.7812v205.701c0 6.4873 -3.62109 12.542 -9.44922 15.8047l-98 54.8545c-8.13965 4.55566 -18.668 2.61914 -24.4873 -4.50781l-21.7646 -26.6475c-2.65039 -3.24512 -8.20215 -5.87891 -12.3926 -5.87891
|
||||
c-1.64062 0 -4.21484 0.477539 -5.74609 1.06738l-166.549 64.0908c-32.6543 12.5664 -50.7744 -34.5771 -19.2227 -46.7168l155.357 -59.7852c5.66016 -2.17773 10.2539 -8.86816 10.2539 -14.9326v0v-11.6328c0 -8.83691 -7.16309 -16 -16 -16h-182
|
||||
c0 -30.7422 -21.4404 -57.5576 -51.7979 -64.5537l-118.999 -27.4268c-4.97168 -1.14648 -10.0889 -1.72949 -15.2031 -1.72949zM256 16.0127l70 -0.000976562c1.52441 0 2.99707 0.174805 4.42285 0.501953l119.001 27.4277
|
||||
c8.58203 1.97754 14.5762 9.29102 14.5762 17.7812v205.701c0 6.4873 -3.62109 12.542 -9.44922 15.8047l-98 54.8545c-8.13965 4.55566 -18.668 2.61914 -24.4873 -4.50781l-21.7646 -26.6475c-2.93457 -3.59375 -7.40332 -5.87305 -12.4004 -5.87305
|
||||
c-2.02246 0 -3.95703 0.375977 -5.73828 1.06152l-166.549 64.0908c-32.6543 12.5664 -50.7744 -34.5771 -19.2227 -46.7168l155.357 -59.7852c6 -2.30859 10.2539 -8.12402 10.2539 -14.9326v-11.6328c0 -8.83691 -7.16309 -16 -16 -16h-182
|
||||
c-34.375 0 -34.4297 -50.2803 0 -50.2803h182c8.83691 0 16 -7.16309 16 -16v-6.85645c0 -8.83691 -7.16309 -16 -16 -16h-28c-25.1221 0 -25.1592 -36.5674 0 -36.5674h28c8.83691 0 16 -7.16211 16 -16v-6.85547c0 -8.83691 -7.16309 -16 -16 -16
|
||||
c-25.1201 0 -25.1602 -36.5674 0 -36.5674z" />
|
||||
<glyph glyph-name="hand-lizard" unicode="" horiz-adv-x="576"
|
||||
d="M556.686 157.458c12.6357 -19.4863 19.3145 -42.0615 19.3145 -65.2871v-124.171h-224v71.582l-99.751 38.7871c-2.7832 1.08203 -5.70996 1.63086 -8.69727 1.63086h-131.552c-30.8789 0 -56 25.1211 -56 56c0 48.5234 39.4766 88 88 88h113.709l18.333 48h-196.042
|
||||
c-44.1123 0 -80 35.8877 -80 80v8c0 30.8779 25.1211 56 56 56h293.917c24.5 0 47.084 -12.2725 60.4111 -32.8291zM528 16v76.1709v0.0478516c0 11.7461 -5.19141 29.2734 -11.5879 39.124l-146.358 225.715c-4.44336 6.85254 -11.9707 10.9424 -20.1367 10.9424h-293.917
|
||||
c-4.41113 0 -8 -3.58887 -8 -8v-8c0 -17.6445 14.3555 -32 32 -32h213.471c25.2021 0 42.626 -25.293 33.6299 -48.8457l-24.5518 -64.2812c-7.05371 -18.4658 -25.0732 -30.873 -44.8398 -30.873h-113.709c-22.0557 0 -40 -17.9443 -40 -40c0 -4.41113 3.58887 -8 8 -8
|
||||
h131.552h0.0517578c7.44141 0 19.1074 -2.19238 26.041 -4.89355l99.752 -38.7881c18.5898 -7.22852 30.6035 -24.7881 30.6035 -44.7363v-23.582h128z" />
|
||||
c-44.1123 0 -80 35.8877 -80 80v8c0 30.8779 25.1211 56 56 56h293.917c24.5 0 47.084 -12.2725 60.4111 -32.8291zM528 16v76.1709c0 0.0166016 -0.0439453 0.106445 -0.0439453 0.12207c0 14.3945 -4.24219 27.8057 -11.5439 39.0498l-146.358 225.715
|
||||
c-4.44336 6.85254 -11.9707 10.9424 -20.1367 10.9424h-293.917c-4.41113 0 -8 -3.58887 -8 -8v-8c0 -17.6445 14.3555 -32 32 -32h213.471c25.2021 0 42.626 -25.293 33.6299 -48.8457l-24.5518 -64.2812c-7.05371 -18.4658 -25.0732 -30.873 -44.8398 -30.873h-113.709
|
||||
c-22.0557 0 -40 -17.9443 -40 -40c0 -4.41113 3.58887 -8 8 -8h131.552c0.0175781 0 0.0712891 -0.0273438 0.0888672 -0.0273438c9.16992 0 17.9404 -1.72461 26.0039 -4.86621l99.752 -38.7881c18.5898 -7.22852 30.6035 -24.7881 30.6035 -44.7363v-23.582h128z" />
|
||||
<glyph glyph-name="hand-spock" unicode=""
|
||||
d="M501.03 331.824c6.05762 -9.77832 10.9746 -27.0498 10.9746 -38.5518c0 -4.80664 -0.915039 -12.499 -2.04297 -17.1709l-57.623 -241.963c-12.748 -54.1729 -68.2627 -98.1387 -123.915 -98.1387h-0.345703h-107.455h-0.224609
|
||||
c-33.8135 0 -81.2148 18.834 -105.807 42.041l-91.3652 85.9766c-12.8213 12.0469 -23.2266 36.1016 -23.2266 53.6943c0 16.1299 8.97266 38.7529 20.0273 50.499c5.31836 5.66406 29.875 29.3926 68.1152 21.8477l-24.3594 82.1973
|
||||
c-1.68164 5.66406 -3.0459 15.0576 -3.0459 20.9668c0 37.5938 30.417 70.502 67.8955 73.4551c-0.204102 2.03125 -0.369141 5.33691 -0.369141 7.37891c0 31.627 24.8594 63.6895 55.4902 71.5684c43.248 10.9785 80.5645 -17.7012 89.6602 -53.0723l13.6836 -53.207
|
||||
l4.64648 22.6602c6.76074 32.417 39.123 58.8115 72.2373 58.916c8.73438 0 56.625 -3.26953 70.7383 -54.0801c15.0664 0.710938 46.9199 -3.50977 66.3105 -35.0176zM463.271 287.219c7.86914 32.9844 -42.1211 45.2695 -50.0859 11.9219l-24.8008 -104.146
|
||||
c-4.38867 -18.4141 -31.7783 -11.8926 -28.0557 6.2168l28.5479 139.166c7.39844 36.0703 -43.3076 45.0703 -50.1182 11.9629l-31.791 -154.971c-3.54883 -17.3086 -28.2832 -18.0469 -32.7109 -0.804688l-47.3262 184.035
|
||||
c-8.43359 32.8105 -58.3691 20.2676 -49.8652 -12.8359l42.4414 -165.039c4.81641 -18.7207 -23.3711 -26.9121 -28.9648 -8.00781l-31.3438 105.779c-9.6875 32.6465 -59.1191 18.2578 -49.3867 -14.625l36.0137 -121.539
|
||||
c5.61816 -18.9521 10.1777 -50.377 10.1777 -70.1436v-0.00878906c0 -6.54297 -8.05664 -10.9355 -13.4824 -5.82617l-51.123 48.1074c-24.7852 23.4082 -60.0527 -14.1875 -35.2793 -37.4902l91.3691 -85.9805c16.9629 -16.0068 49.6592 -28.998 72.9824 -28.998h0.154297
|
||||
h107.455h0.216797c34.7402 0 69.3936 27.4443 77.3525 61.2598z" />
|
||||
d="M501.03 331.824c6.92773 -11.1826 10.9697 -24.4053 10.9697 -38.5146c0 -5.92676 -0.706055 -11.6885 -2.03809 -17.208l-57.623 -241.963c-13.2236 -56.1904 -63.707 -98.1387 -123.908 -98.1387h-0.352539h-107.455
|
||||
c-0.0761719 0 -0.193359 0.00195312 -0.270508 0.00195312c-40.9248 0 -78.1475 15.9814 -105.761 42.0391l-91.3652 85.9766c-14.3076 13.4434 -23.2246 32.5547 -23.2246 53.7168c0 19.5254 7.61035 37.2861 20.0254 50.4766
|
||||
c5.31836 5.66406 29.875 29.3926 68.1152 21.8477l-24.3594 82.1973c-1.97363 6.64844 -2.97656 13.6836 -2.97656 20.9688c0 38.6953 29.8926 70.4639 67.8262 73.4531c-0.246094 2.45117 -0.34082 4.85547 -0.34082 7.37207c0 34.4199 23.585 63.376 55.4619 71.5752
|
||||
c43.248 10.9785 80.5645 -17.7012 89.6602 -53.0723l13.6836 -53.207l4.64648 22.6602c6.99023 33.5186 36.6826 58.8037 72.2373 58.916c8.73438 0 56.625 -3.26953 70.7383 -54.0801c15.0664 0.710938 46.9199 -3.50977 66.3105 -35.0176zM463.271 287.219
|
||||
c7.86914 32.9844 -42.1211 45.2695 -50.0859 11.9219l-24.8008 -104.146c-4.38867 -18.4141 -31.7783 -11.8926 -28.0557 6.2168l28.5479 139.166c7.39844 36.0703 -43.3076 45.0703 -50.1182 11.9629l-31.791 -154.971
|
||||
c-3.54883 -17.3086 -28.2832 -18.0469 -32.7109 -0.804688l-47.3262 184.035c-8.43359 32.8105 -58.3691 20.2676 -49.8652 -12.8359l42.4414 -165.039c4.81641 -18.7207 -23.3711 -26.9121 -28.9648 -8.00781l-31.3438 105.779
|
||||
c-9.6875 32.6465 -59.1191 18.2578 -49.3867 -14.625l36.0137 -121.539c6.59375 -22.2441 10.1777 -45.7803 10.1777 -70.1523c0 -6.54297 -8.05664 -10.9355 -13.4824 -5.82617l-51.123 48.1074c-24.7852 23.4082 -60.0527 -14.1875 -35.2793 -37.4902l91.3691 -85.9805
|
||||
c19.0469 -17.9736 44.75 -28.998 72.9795 -28.998h0.157227h107.455c0.0732422 0 0.138672 0.0429688 0.212891 0.0429688c37.5791 0 69.1016 26.1416 77.3564 61.2168z" />
|
||||
<glyph glyph-name="hand-pointer" unicode="" horiz-adv-x="448"
|
||||
d="M358.182 268.639c43.1934 16.6348 89.8184 -15.7949 89.8184 -62.6387v-84c-0.000976562 -4.25 -0.775391 -11.0615 -1.72754 -15.2041l-27.4297 -118.999c-6.98242 -30.2969 -33.7549 -51.7969 -64.5566 -51.7969h-178.286c-21.2588 0 -41.3682 10.4102 -53.791 27.8457
|
||||
l-109.699 154.001c-21.2432 29.8193 -14.8047 71.3574 14.5498 93.1523c18.8115 13.9658 42.1748 16.2822 62.083 8.87207v161.129c0 36.9443 29.7363 67 66.2861 67s66.2861 -30.0557 66.2861 -67v-73.6338c20.4131 2.85742 41.4678 -3.94238 56.5947 -19.6289
|
||||
c27.1934 12.8467 60.3799 5.66992 79.8721 -19.0986zM80.9854 168.303c-14.4004 20.2119 -43.8008 -2.38281 -29.3945 -22.6055l109.712 -154c3.43457 -4.81934 8.92871 -7.69727 14.6973 -7.69727h178.285c8.49219 0 15.8037 5.99414 17.7822 14.5762l27.4297 119.001
|
||||
c0.333008 1.44629 0.501953 2.93457 0.501953 4.42285v84c0 25.1602 -36.5713 25.1211 -36.5713 0c0 -8.83594 -7.16309 -16 -16 -16h-6.85645c-8.83691 0 -16 7.16406 -16 16v21c0 25.1602 -36.5713 25.1201 -36.5713 0v-21c0 -8.83594 -7.16309 -16 -16 -16h-6.85938
|
||||
c-8.83691 0 -16 7.16406 -16 16v35c0 25.1602 -36.5703 25.1201 -36.5703 0v-35c0 -8.83594 -7.16309 -16 -16 -16h-6.85742c-8.83691 0 -16 7.16406 -16 16v175c0 25.1602 -36.5713 25.1201 -36.5713 0v-241.493c0 -15.5703 -20.0352 -21.9092 -29.0303 -9.2832z
|
||||
M176.143 48v96c0 8.83691 6.26855 16 14 16h6c7.73242 0 14 -7.16309 14 -16v-96c0 -8.83691 -6.26758 -16 -14 -16h-6c-7.73242 0 -14 7.16309 -14 16zM251.571 48v96c0 8.83691 6.26758 16 14 16h6c7.73145 0 14 -7.16309 14 -16v-96c0 -8.83691 -6.26855 -16 -14 -16h-6
|
||||
c-7.73242 0 -14 7.16309 -14 16zM327 48v96c0 8.83691 6.26758 16 14 16h6c7.73242 0 14 -7.16309 14 -16v-96c0 -8.83691 -6.26758 -16 -14 -16h-6c-7.73242 0 -14 7.16309 -14 16z" />
|
||||
d="M358.182 268.639c43.1934 16.6348 89.8184 -15.7949 89.8184 -62.6387v-84c-0.000976562 -5.24023 -0.600586 -10.3037 -1.72754 -15.2041l-27.4297 -118.999c-6.98242 -30.2969 -33.7549 -51.7969 -64.5566 -51.7969h-178.286
|
||||
c-21.2588 0 -41.3682 10.4102 -53.791 27.8457l-109.699 154.001c-21.2432 29.8193 -14.8047 71.3574 14.5498 93.1523c18.8115 13.9658 42.1748 16.2822 62.083 8.87207v161.129c0 36.9443 29.7363 67 66.2861 67s66.2861 -30.0557 66.2861 -67v-73.6338
|
||||
c20.4131 2.85742 41.4678 -3.94238 56.5947 -19.6289c27.1934 12.8467 60.3799 5.66992 79.8721 -19.0986zM80.9854 168.303c-14.4004 20.2119 -43.8008 -2.38281 -29.3945 -22.6055l109.712 -154c3.43457 -4.81934 8.92871 -7.69727 14.6973 -7.69727h178.285
|
||||
c8.49219 0 15.8037 5.99414 17.7822 14.5762l27.4297 119.001c0.333008 1.44629 0.501953 2.93457 0.501953 4.42285v84c0 25.1602 -36.5713 25.1211 -36.5713 0c0 -8.83594 -7.16309 -16 -16 -16h-6.85645c-8.83691 0 -16 7.16406 -16 16v21
|
||||
c0 25.1602 -36.5713 25.1201 -36.5713 0v-21c0 -8.83594 -7.16309 -16 -16 -16h-6.85938c-8.83691 0 -16 7.16406 -16 16v35c0 25.1602 -36.5703 25.1201 -36.5703 0v-35c0 -8.83594 -7.16309 -16 -16 -16h-6.85742c-8.83691 0 -16 7.16406 -16 16v175
|
||||
c0 25.1602 -36.5713 25.1201 -36.5713 0v-241.493c0 -15.5703 -20.0352 -21.9092 -29.0303 -9.2832zM176.143 48v96c0 8.83691 6.26855 16 14 16h6c7.73242 0 14 -7.16309 14 -16v-96c0 -8.83691 -6.26758 -16 -14 -16h-6c-7.73242 0 -14 7.16309 -14 16zM251.571 48v96
|
||||
c0 8.83691 6.26758 16 14 16h6c7.73145 0 14 -7.16309 14 -16v-96c0 -8.83691 -6.26855 -16 -14 -16h-6c-7.73242 0 -14 7.16309 -14 16zM327 48v96c0 8.83691 6.26758 16 14 16h6c7.73242 0 14 -7.16309 14 -16v-96c0 -8.83691 -6.26758 -16 -14 -16h-6
|
||||
c-7.73242 0 -14 7.16309 -14 16z" />
|
||||
<glyph glyph-name="hand-peace" unicode="" horiz-adv-x="448"
|
||||
d="M362.146 256.024c42.5908 13.3184 85.8535 -19.0684 85.8535 -64.0244l-0.0117188 -70.001c-0.000976562 -4.25 -0.775391 -11.0615 -1.72949 -15.2031l-27.4268 -118.999c-6.99707 -30.3564 -33.8105 -51.7969 -64.5547 -51.7969h-205.702
|
||||
d="M362.146 256.024c42.5908 13.3184 85.8535 -19.0684 85.8535 -64.0244l-0.0117188 -70.001c-0.000976562 -5.24023 -0.600586 -10.3027 -1.72949 -15.2031l-27.4268 -118.999c-6.99707 -30.3564 -33.8105 -51.7969 -64.5547 -51.7969h-205.702
|
||||
c-23.8447 0 -45.9502 13.0303 -57.6904 34.0059l-54.8525 97.999c-19.2607 34.4092 -5.82422 67.2617 24.7324 92.2178l-55.7568 144.928c-14.5791 37.8867 3.72754 80.6113 41.2012 95.6416c37.6406 15.0977 80.3691 -3.63477 95.1123 -41.9424l18.6787 -78.8496
|
||||
l-9.14062 94c0 40.8037 32.8096 74 73.1396 74s73.1406 -33.1963 73.1406 -74v-87.6348c26.2451 3.6748 51.2959 -8.69238 65.0068 -30.3408zM399.987 122l-0.000976562 70c0 25.1602 -36.5674 25.1201 -36.5674 0c0 -8.83691 -7.16309 -16 -16 -16h-6.85547
|
||||
c-8.83789 0 -16 7.16309 -16 16v28c0 25.1592 -36.5674 25.1221 -36.5674 0v-28c0 -8.83691 -7.16309 -16 -16 -16h-6.85645c-8.83691 0 -16 7.16309 -16 16v182c0 34.4297 -50.2803 34.375 -50.2803 0v-182c0 -8.83691 -7.16309 -16 -16 -16h-11.6328v0
|
||||
c-6.06445 0 -12.7549 4.59375 -14.9326 10.2539l-59.7842 155.357c-12.1396 31.5518 -59.2842 13.4326 -46.7168 -19.2227l64.0898 -166.549c0.589844 -1.53125 1.06738 -4.10547 1.06738 -5.74609c0 -4.19043 -2.63379 -9.74219 -5.87891 -12.3926l-26.6475 -21.7646
|
||||
c-8.83789 0 -16 7.16309 -16 16v28c0 25.1592 -36.5674 25.1221 -36.5674 0v-28c0 -8.83691 -7.16309 -16 -16 -16h-6.85645c-8.83691 0 -16 7.16309 -16 16v182c0 34.4297 -50.2803 34.375 -50.2803 0v-182c0 -8.83691 -7.16309 -16 -16 -16h-11.6328
|
||||
c-6.80859 0 -12.624 4.25391 -14.9326 10.2539l-59.7842 155.357c-12.1396 31.5518 -59.2842 13.4326 -46.7168 -19.2227l64.0898 -166.549c0.685547 -1.78125 1.07812 -3.71875 1.07812 -5.74121c0 -4.99707 -2.2959 -9.46289 -5.88965 -12.3975l-26.6475 -21.7646
|
||||
c-7.12695 -5.81934 -9.06445 -16.3467 -4.50781 -24.4873l54.8535 -98c3.26367 -5.82812 9.31934 -9.44922 15.8057 -9.44922h205.701c8.49121 0 15.8037 5.99414 17.7812 14.5762l27.4277 119.001c0.333008 1.44629 0.501953 2.93457 0.501953 4.42285z" />
|
||||
<glyph glyph-name="registered" unicode=""
|
||||
d="M256 440c136.967 0 248 -111.033 248 -248s-111.033 -248 -248 -248s-248 111.033 -248 248s111.033 248 248 248zM256 -8c110.549 0 200 89.4678 200 200c0 110.549 -89.4678 200 -200 200c-110.549 0 -200 -89.4688 -200 -200c0 -110.549 89.4678 -200 200 -200z
|
||||
M366.442 73.791c4.40332 -7.99219 -1.37012 -17.791 -10.5107 -17.791h-42.8096h-0.0126953c-3.97559 0 -8.71582 2.84961 -10.5801 6.36035l-47.5156 89.3027h-31.958v-83.6631c0 -6.61719 -5.38281 -12 -12 -12h-38.5674c-6.61719 0 -12 5.38281 -12 12v248.304
|
||||
c0 6.61719 5.38281 12 12 12h78.667c71.251 0 101.498 -32.749 101.498 -85.252c0 -31.6123 -15.2148 -59.2969 -39.4824 -73.1758c3.02148 -4.61719 0.225586 0.199219 53.2715 -96.085zM256.933 208.094c20.9131 0 32.4307 11.5186 32.4316 32.4316
|
||||
c0 19.5752 -6.5127 31.709 -38.9297 31.709h-27.377v-64.1406h33.875z" />
|
||||
M366.442 73.791c4.40332 -7.99219 -1.37012 -17.791 -10.5107 -17.791h-42.8096c-0.00488281 0 -0.000976562 -0.0126953 -0.00585938 -0.0126953c-4.58594 0 -8.57422 2.58301 -10.5869 6.37305l-47.5156 89.3027h-31.958v-83.6631c0 -6.61719 -5.38281 -12 -12 -12
|
||||
h-38.5674c-6.61719 0 -12 5.38281 -12 12v248.304c0 6.61719 5.38281 12 12 12h78.667c71.251 0 101.498 -32.749 101.498 -85.252c0 -31.6123 -15.2148 -59.2969 -39.4824 -73.1758c3.02148 -4.61719 0.225586 0.199219 53.2715 -96.085zM256.933 208.094
|
||||
c20.9131 0 32.4307 11.5186 32.4316 32.4316c0 19.5752 -6.5127 31.709 -38.9297 31.709h-27.377v-64.1406h33.875z" />
|
||||
<glyph glyph-name="calendar-plus" unicode="" horiz-adv-x="448"
|
||||
d="M336 156v-24c0 -6.59961 -5.40039 -12 -12 -12h-76v-76c0 -6.59961 -5.40039 -12 -12 -12h-24c-6.59961 0 -12 5.40039 -12 12v76h-76c-6.59961 0 -12 5.40039 -12 12v24c0 6.59961 5.40039 12 12 12h76v76c0 6.59961 5.40039 12 12 12h24c6.59961 0 12 -5.40039 12 -12
|
||||
v-76h76c6.59961 0 12 -5.40039 12 -12zM448 336v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h48v52c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-52h128v52c0 6.59961 5.40039 12 12 12h40
|
||||
@ -481,9 +482,9 @@ c6.62695 0 12 -5.37305 12 -12v-52h48zM394 -16c3.31152 0 6 2.68848 6 6v298h-352v-
|
||||
c-4.66699 4.70508 -4.6377 12.3027 0.0673828 16.9707l22.7197 22.5361c4.70508 4.66699 12.3027 4.63672 16.9697 -0.0693359l44.1035 -44.4609l111.072 110.182c4.70508 4.66699 12.3027 4.63672 16.9707 -0.0683594l22.5361 -22.7178
|
||||
c4.66699 -4.70508 4.63672 -12.3027 -0.0683594 -16.9697z" />
|
||||
<glyph glyph-name="map" unicode="" horiz-adv-x="576"
|
||||
d="M560.02 416c8.4502 0 15.9805 -6.83008 15.9805 -16.0195v-346.32c0 -11.9609 -9.01367 -25.2705 -20.1201 -29.71l-151.83 -52.8105c-5.32617 -1.7334 -14.1953 -3.13965 -19.7969 -3.13965c-5.7373 0 -14.8105 1.47363 -20.2529 3.29004l-172 60.71l-170.05 -62.8398
|
||||
c-1.99023 -0.790039 -4 -1.16016 -5.95996 -1.16016c-8.45996 0 -15.9902 6.83008 -15.9902 16.0195v346.32c0.00292969 11.959 9.0166 25.2686 20.1201 29.71l151.83 52.8105c6.43945 2.08984 13.1201 3.13965 19.8096 3.13965
|
||||
c5.73242 -0.00195312 14.8008 -1.47168 20.2402 -3.28027l172 -60.7197h0.00976562l170.05 62.8398c1.98047 0.790039 4 1.16016 5.95996 1.16016zM224 357.58v-285.97l128 -45.1904v285.97zM48 29.9502l127.36 47.0801l0.639648 0.229492v286.2l-128 -44.5303v-288.979z
|
||||
d="M560.02 416c8.4502 0 15.9805 -6.83008 15.9805 -16.0195v-346.32c0 -13.4707 -8.32422 -24.9951 -20.1201 -29.71l-151.83 -52.8105c-6.23242 -2.02832 -12.9023 -3.12305 -19.8076 -3.12305c-7.07324 0 -13.8799 1.15039 -20.2422 3.27344l-172 60.71l-170.05 -62.8398
|
||||
c-1.99023 -0.790039 -4 -1.16016 -5.95996 -1.16016c-8.45996 0 -15.9902 6.83008 -15.9902 16.0195v346.32c0.00292969 13.4697 8.32617 24.9932 20.1201 29.71l151.83 52.8105c6.43945 2.08984 13.1201 3.13965 19.8096 3.13965
|
||||
c7.06641 -0.00292969 13.8789 -1.16602 20.2402 -3.28027l172 -60.7197h0.00976562l170.05 62.8398c1.98047 0.790039 4 1.16016 5.95996 1.16016zM224 357.58v-285.97l128 -45.1904v285.97zM48 29.9502l127.36 47.0801l0.639648 0.229492v286.2l-128 -44.5303v-288.979z
|
||||
M528 65.0801v288.97l-127.36 -47.0693l-0.639648 -0.240234v-286.19z" />
|
||||
<glyph glyph-name="comment-alt" unicode=""
|
||||
d="M448 448c35.2998 0 64 -28.7002 64 -64v-288c0 -35.2998 -28.7002 -64 -64 -64h-144l-124.9 -93.5996c-2.19922 -1.7002 -4.69922 -2.40039 -7.09961 -2.40039c-6.2002 0 -12 4.90039 -12 12v84h-96c-35.2998 0 -64 28.7002 -64 64v288c0 35.2998 28.7002 64 64 64h384z
|
||||
@ -497,16 +498,16 @@ c-8.7998 0 -16 7.2002 -16 16v160c0 8.7998 7.2002 16 16 16h160c8.7998 0 16 -7.200
|
||||
<glyph glyph-name="handshake" unicode="" horiz-adv-x="640"
|
||||
d="M519.2 320.1h120.8v-255.699h-64c-17.5 0 -31.7998 14.1992 -31.9004 31.6992h-57.8994c-1.7998 -8.19922 -5.2998 -16.0996 -10.9004 -23l-26.2002 -32.2998c-15.7998 -19.3994 -41.8994 -25.5 -64 -16.7998c-13.5 -16.5996 -30.5996 -24 -48.7998 -24
|
||||
c-15.0996 0 -28.5996 5.09961 -41.0996 15.9004c-31.7998 -21.9004 -74.7002 -21.3008 -105.601 3.7998l-84.5996 76.3994h-9.09961c-0.100586 -17.5 -14.3008 -31.6992 -31.9004 -31.6992h-64v255.699h118l47.5996 47.6006c10.5 10.3994 24.8008 16.2998 39.6006 16.2998
|
||||
h226.8v0c12.7812 0 30.5225 -7.30273 39.5996 -16.2998zM48 96.4004c8.7998 0 16 7.09961 16 16c0 8.7998 -7.2002 16 -16 16s-16 -7.2002 -16 -16c0 -8.80078 7.2002 -16 16 -16zM438 103.3c2.7002 3.40039 2.2002 8.5 -1.2002 11.2998l-108.2 87.8008l-8.19922 -7.5
|
||||
h226.8c15.4326 0 29.4326 -6.22168 39.5996 -16.2998zM48 96.4004c8.7998 0 16 7.09961 16 16c0 8.7998 -7.2002 16 -16 16s-16 -7.2002 -16 -16c0 -8.80078 7.2002 -16 16 -16zM438 103.3c2.7002 3.40039 2.2002 8.5 -1.2002 11.2998l-108.2 87.8008l-8.19922 -7.5
|
||||
c-40.3008 -36.8008 -86.7002 -11.8008 -101.5 4.39941c-26.7002 29 -25 74.4004 4.39941 101.3l38.7002 35.5h-56.7002c-2 -0.799805 -3.7002 -1.5 -5.7002 -2.2998l-61.6992 -61.5996h-41.9004v-128.101h27.7002l97.2998 -88
|
||||
c16.0996 -13.0996 41.4004 -10.5 55.2998 6.60059l15.6006 19.2002l36.7998 -31.5c3 -2.40039 12 -4.90039 18 2.39941l30 36.5l23.8994 -19.3994c3.5 -2.80078 8.5 -2.2002 11.3008 1.19922zM544 144.1v128h-44.7002l-61.7002 61.6006
|
||||
c-1.39941 1.5 -3.39941 2.2998 -5.5 2.2998l-83.6992 -0.200195c-10 0 -19.6006 -3.7002 -27 -10.5l-65.6006 -60.0996c-9.7002 -8.7998 -10.5 -24 -1.2002 -33.9004c8.90039 -9.39941 25.1006 -8.7002 34.6006 0l55.2002 50.6006c6.5 5.89941 16.5996 5.5 22.5996 -1
|
||||
l10.9004 -11.7002c6 -6.5 5.5 -16.6006 -1 -22.6006l-12.5 -11.3994l102.699 -83.4004c2.80078 -2.2998 5.40039 -4.89941 7.7002 -7.7002h69.2002zM592 96.4004c8.7998 0 16 7.09961 16 16c0 8.7998 -7.2002 16 -16 16s-16 -7.2002 -16 -16c0 -8.80078 7.2002 -16 16 -16z
|
||||
" />
|
||||
<glyph glyph-name="envelope-open" unicode=""
|
||||
d="M494.586 283.484c9.6123 -7.94824 17.4141 -24.5205 17.4141 -36.9932v-262.491c0 -26.5098 -21.4902 -48 -48 -48h-416c-26.5098 0 -48 21.4902 -48 48v262.515c0 12.5166 7.84668 29.1279 17.5146 37.0771c4.08008 3.35449 110.688 89.0996 135.15 108.549
|
||||
c22.6992 18.1426 60.1299 55.8594 103.335 55.8594c43.4365 0 81.2314 -38.1914 103.335 -55.8594c23.5283 -18.707 130.554 -104.773 135.251 -108.656zM464 -10v253.632v0.00488281c0 1.5791 -0.996094 3.66602 -2.22363 4.6582
|
||||
c-15.8633 12.8232 -108.793 87.5752 -132.366 106.316c-17.5527 14.0195 -49.7168 45.3887 -73.4102 45.3887c-23.6016 0 -55.2451 -30.8799 -73.4102 -45.3887c-23.5713 -18.7393 -116.494 -93.4795 -132.364 -106.293
|
||||
d="M494.586 283.484c10.6523 -8.80762 17.4141 -22.1064 17.4141 -36.9932v-262.491c0 -26.5098 -21.4902 -48 -48 -48h-416c-26.5098 0 -48 21.4902 -48 48v262.515c0 14.9355 6.80469 28.2705 17.5146 37.0771c4.08008 3.35449 110.688 89.0996 135.15 108.549
|
||||
c22.6992 18.1426 60.1299 55.8594 103.335 55.8594c43.4365 0 81.2314 -38.1914 103.335 -55.8594c23.5283 -18.707 130.554 -104.773 135.251 -108.656zM464 -10v253.632c0 0.00195312 0.00390625 0.000976562 0.00390625 0.00292969
|
||||
c0 1.88184 -0.869141 3.56152 -2.22754 4.66016c-15.8633 12.8232 -108.793 87.5752 -132.366 106.316c-17.5527 14.0195 -49.7168 45.3887 -73.4102 45.3887c-23.6016 0 -55.2451 -30.8799 -73.4102 -45.3887c-23.5713 -18.7393 -116.494 -93.4795 -132.364 -106.293
|
||||
c-1.40918 -1.13965 -2.22559 -2.85254 -2.22559 -4.66504v-253.653c0 -3.31152 2.68848 -6 6 -6h404c3.31152 0 6 2.68848 6 6zM432.009 177.704c4.24902 -5.15918 3.46484 -12.7949 -1.74512 -16.9814c-28.9746 -23.2822 -59.2734 -47.5967 -70.9287 -56.8623
|
||||
c-22.6992 -18.1436 -60.1299 -55.8604 -103.335 -55.8604c-43.4521 0 -81.2871 38.2373 -103.335 55.8604c-11.2793 8.9668 -41.7441 33.4131 -70.9268 56.8643c-5.20996 4.1875 -5.99316 11.8223 -1.74512 16.9814l15.2578 18.5283
|
||||
c4.17773 5.07227 11.6572 5.84277 16.7793 1.72559c28.6182 -23.001 58.5654 -47.0352 70.5596 -56.5713c17.5527 -14.0195 49.7168 -45.3887 73.4102 -45.3887c23.6016 0 55.2461 30.8799 73.4102 45.3887c11.9941 9.53516 41.9434 33.5703 70.5625 56.5684
|
||||
@ -555,10 +556,11 @@ c6.09961 -6.2002 6.09961 -16.4004 0 -22.6006l-58.2998 -59.2998v-84.5l71.8994 42.
|
||||
c7.5 4.39941 17.2002 1.7998 21.5 -5.90039l7.90039 -13.9004c4.2998 -7.69922 1.7002 -17.5 -5.7998 -21.8994l-39.2002 -23l34.0996 -9.2998c8.40039 -2.30078 13.3008 -11.1006 11.1006 -19.6006l-4.10059 -15.5c-2.2998 -8.5 -10.8994 -13.5996 -19.2998 -11.2998
|
||||
l-79.7002 21.7002l-71.8994 -42.2002l71.7998 -42.2002l79.7002 21.7002c8.39941 2.2998 17.0996 -2.7998 19.2998 -11.2998l4.09961 -15.5c2.30078 -8.5 -2.69922 -17.2998 -11.0996 -19.6006l-34.0996 -9.2998z" />
|
||||
<glyph glyph-name="trash-alt" unicode="" horiz-adv-x="448"
|
||||
d="M268 32c-6.62402 0 -12 5.37598 -12 12v216c0 6.62402 5.37598 12 12 12h24c6.62402 0 12 -5.37598 12 -12v-216c0 -6.62402 -5.37598 -12 -12 -12h-24zM432 368c8.83203 0 16 -7.16797 16 -16v-16c0 -8.83203 -7.16797 -16 -16 -16h-16v-336
|
||||
c0 -26.4961 -21.5039 -48 -48 -48h-288c-26.4961 0 -48 21.5039 -48 48v336h-16c-8.83203 0 -16 7.16797 -16 16v16c0 8.83203 7.16797 16 16 16h82.4102l34.0195 56.7002c7.71875 12.8613 26.1572 23.2998 41.1572 23.2998h0.00292969h100.82h0.0224609
|
||||
c15 0 33.4385 -10.4385 41.1572 -23.2998l34 -56.7002h82.4102zM171.84 397.09l-17.4502 -29.0898h139.221l-17.46 29.0898c-0.96582 1.60645 -3.26953 2.91016 -5.14355 2.91016h-0.00683594h-94h-0.0166016c-1.87402 0 -4.17871 -1.30371 -5.14355 -2.91016zM368 -16v336
|
||||
h-288v-336h288zM156 32c-6.62402 0 -12 5.37598 -12 12v216c0 6.62402 5.37598 12 12 12h24c6.62402 0 12 -5.37598 12 -12v-216c0 -6.62402 -5.37598 -12 -12 -12h-24z" />
|
||||
d="M268 32c-6.62305 0 -12 5.37695 -12 12v216c0 6.62305 5.37695 12 12 12h24c6.62305 0 12 -5.37695 12 -12v-216c0 -6.62305 -5.37695 -12 -12 -12h-24zM432 368c8.83105 0 16 -7.16895 16 -16v-16c0 -8.83105 -7.16895 -16 -16 -16h-16v-336
|
||||
c0 -26.4922 -21.5078 -48 -48 -48h-288c-26.4922 0 -48 21.5078 -48 48v336h-16c-8.83105 0 -16 7.16895 -16 16v16c0 8.83105 7.16895 16 16 16h82.4102l34.0195 56.7002c8.39258 13.9844 23.6777 23.2998 41.1602 23.2998h100.82
|
||||
c0.0078125 0 -0.015625 0.0517578 -0.0078125 0.0517578c17.4824 0 32.7949 -9.36719 41.1875 -23.3516l34 -56.7002h82.4102zM171.84 397.09l-17.4502 -29.0898h139.221l-17.46 29.0898c-1.0498 1.74707 -2.95898 2.91016 -5.14355 2.91016h-0.00683594h-94
|
||||
c-0.00585938 0 -0.00683594 0.00683594 -0.0126953 0.00683594c-2.18457 0 -4.09766 -1.16992 -5.14746 -2.91699zM368 -16v336h-288v-336h288zM156 32c-6.62305 0 -12 5.37695 -12 12v216c0 6.62305 5.37695 12 12 12h24c6.62305 0 12 -5.37695 12 -12v-216
|
||||
c0 -6.62305 -5.37695 -12 -12 -12h-24z" />
|
||||
<glyph glyph-name="images" unicode="" horiz-adv-x="576"
|
||||
d="M480 32v-16c0 -26.5098 -21.4902 -48 -48 -48h-384c-26.5098 0 -48 21.4902 -48 48v256c0 26.5098 21.4902 48 48 48h16v-48h-10c-3.31152 0 -6 -2.68848 -6 -6v-244c0 -3.31152 2.68848 -6 6 -6h372c3.31152 0 6 2.68848 6 6v10h48zM522 368h-372
|
||||
c-3.31152 0 -6 -2.68848 -6 -6v-244c0 -3.31152 2.68848 -6 6 -6h372c3.31152 0 6 2.68848 6 6v244c0 3.31152 -2.68848 6 -6 6zM528 416c26.5098 0 48 -21.4902 48 -48v-256c0 -26.5098 -21.4902 -48 -48 -48h-384c-26.5098 0 -48 21.4902 -48 48v256
|
||||
@ -584,9 +586,9 @@ d="M464 448c4.09961 0 7.7998 -2 10.0996 -5.40039l99.9004 -147.199c2.90039 -4.400
|
||||
c2.2002 3.40039 6 5.40039 10 5.40039h352zM444.7 400h-56.7998l51.6992 -96h68.4004zM242.6 400l-51.5996 -96h194l-51.7002 96h-90.7002zM131.3 400l-63.2998 -96h68.4004l51.6992 96h-56.7998zM88.2998 256l119.7 -160l-68.2998 160h-51.4004zM191.2 256l96.7998 -243.3
|
||||
l96.7998 243.3h-193.6zM368 96l119.6 160h-51.3994z" />
|
||||
<glyph glyph-name="money-bill-alt" unicode="" horiz-adv-x="640"
|
||||
d="M320 304c53.0195 0 96 -50.1396 96 -112c0 -61.8701 -43 -112 -96 -112c-53.0195 0 -96 50.1504 -96 112c0 61.8604 42.9805 112 96 112zM360 136v16c0 4.41992 -3.58008 8 -8 8h-16v88c0 4.41992 -3.58008 8 -8 8h-13.5801h-0.000976562
|
||||
c-4.01074 0 -9.97266 -1.80566 -13.3086 -4.03027l-15.3301 -10.2197c-1.96777 -1.30957 -3.56445 -4.29004 -3.56445 -6.65332c0 -1.33691 0.601562 -3.32422 1.34375 -4.43652l8.88086 -13.3105c1.30859 -1.9668 4.29004 -3.56445 6.65332 -3.56445
|
||||
c1.33691 0 3.32422 0.602539 4.43652 1.34473l0.469727 0.310547v-55.4404h-16c-4.41992 0 -8 -3.58008 -8 -8v-16c0 -4.41992 3.58008 -8 8 -8h64c4.41992 0 8 3.58008 8 8zM608 384c17.6699 0 32 -14.3301 32 -32v-320c0 -17.6699 -14.3301 -32 -32 -32h-576
|
||||
d="M320 304c53.0195 0 96 -50.1396 96 -112c0 -61.8701 -43 -112 -96 -112c-53.0195 0 -96 50.1504 -96 112c0 61.8604 42.9805 112 96 112zM360 136v16c0 4.41992 -3.58008 8 -8 8h-16v88c0 4.41992 -3.58008 8 -8 8h-13.5801
|
||||
c-4.91113 0 -9.50586 -1.49316 -13.3096 -4.03027l-15.3301 -10.2197c-2.15332 -1.43262 -3.55957 -3.88379 -3.55957 -6.66113c0 -1.6377 0.493164 -3.16113 1.33887 -4.42871l8.88086 -13.3105c1.43164 -2.15234 3.88379 -3.55957 6.66113 -3.55957
|
||||
c1.6377 0 3.16016 0.494141 4.42871 1.33984l0.469727 0.310547v-55.4404h-16c-4.41992 0 -8 -3.58008 -8 -8v-16c0 -4.41992 3.58008 -8 8 -8h64c4.41992 0 8 3.58008 8 8zM608 384c17.6699 0 32 -14.3301 32 -32v-320c0 -17.6699 -14.3301 -32 -32 -32h-576
|
||||
c-17.6699 0 -32 14.3301 -32 32v320c0 17.6699 14.3301 32 32 32h576zM592 112v160c-35.3496 0 -64 28.6504 -64 64h-416c0 -35.3496 -28.6504 -64 -64 -64v-160c35.3496 0 64 -28.6504 64 -64h416c0 35.3496 28.6504 64 64 64z" />
|
||||
<glyph glyph-name="window-close" unicode=""
|
||||
d="M464 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-416c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h416zM464 22v340c0 3.2998 -2.7002 6 -6 6h-404c-3.2998 0 -6 -2.7002 -6 -6v-340c0 -3.2998 2.7002 -6 6 -6h404c3.2998 0 6 2.7002 6 6z
|
||||
|
Before Width: | Height: | Size: 141 KiB After Width: | Height: | Size: 141 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Before Width: | Height: | Size: 876 KiB After Width: | Height: | Size: 893 KiB |
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user