Merge branch 'develop' into features/shareable-links

This commit is contained in:
Oleksii Kriuchykhin 2023-07-25 09:47:47 +02:00
commit de69b1b100
68 changed files with 319 additions and 454 deletions

View file

@ -73,7 +73,7 @@ gem 'nested_form_fields'
gem 'nokogiri', '~> 1.14.3' # HTML/XML parser
gem 'rails_autolink', '~> 1.1', '>= 1.1.6'
gem 'rgl' # Graph framework for project diagram calculations
gem 'roo', '~> 2.8.2' # Spreadsheet parser
gem 'roo', '~> 2.10.0' # Spreadsheet parser
gem 'rotp'
gem 'rqrcode', '~> 2.0' # QR code generator
gem 'rubyzip', '>= 2.3.0' # will load new rubyzip version

View file

@ -60,47 +60,47 @@ GIT
GEM
remote: http://rubygems.org/
specs:
actioncable (7.0.5)
actionpack (= 7.0.5)
activesupport (= 7.0.5)
actioncable (7.0.5.1)
actionpack (= 7.0.5.1)
activesupport (= 7.0.5.1)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
actionmailbox (7.0.5)
actionpack (= 7.0.5)
activejob (= 7.0.5)
activerecord (= 7.0.5)
activestorage (= 7.0.5)
activesupport (= 7.0.5)
actionmailbox (7.0.5.1)
actionpack (= 7.0.5.1)
activejob (= 7.0.5.1)
activerecord (= 7.0.5.1)
activestorage (= 7.0.5.1)
activesupport (= 7.0.5.1)
mail (>= 2.7.1)
net-imap
net-pop
net-smtp
actionmailer (7.0.5)
actionpack (= 7.0.5)
actionview (= 7.0.5)
activejob (= 7.0.5)
activesupport (= 7.0.5)
actionmailer (7.0.5.1)
actionpack (= 7.0.5.1)
actionview (= 7.0.5.1)
activejob (= 7.0.5.1)
activesupport (= 7.0.5.1)
mail (~> 2.5, >= 2.5.4)
net-imap
net-pop
net-smtp
rails-dom-testing (~> 2.0)
actionpack (7.0.5)
actionview (= 7.0.5)
activesupport (= 7.0.5)
actionpack (7.0.5.1)
actionview (= 7.0.5.1)
activesupport (= 7.0.5.1)
rack (~> 2.0, >= 2.2.4)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.2.0)
actiontext (7.0.5)
actionpack (= 7.0.5)
activerecord (= 7.0.5)
activestorage (= 7.0.5)
activesupport (= 7.0.5)
actiontext (7.0.5.1)
actionpack (= 7.0.5.1)
activerecord (= 7.0.5.1)
activestorage (= 7.0.5.1)
activesupport (= 7.0.5.1)
globalid (>= 0.6.0)
nokogiri (>= 1.8.5)
actionview (7.0.5)
activesupport (= 7.0.5)
actionview (7.0.5.1)
activesupport (= 7.0.5.1)
builder (~> 3.1)
erubi (~> 1.4)
rails-dom-testing (~> 2.0)
@ -110,24 +110,24 @@ GEM
activemodel (>= 4.1, < 7.1)
case_transform (>= 0.2)
jsonapi-renderer (>= 0.1.1.beta1, < 0.3)
activejob (7.0.5)
activesupport (= 7.0.5)
activejob (7.0.5.1)
activesupport (= 7.0.5.1)
globalid (>= 0.3.6)
activemodel (7.0.5)
activesupport (= 7.0.5)
activerecord (7.0.5)
activemodel (= 7.0.5)
activesupport (= 7.0.5)
activemodel (7.0.5.1)
activesupport (= 7.0.5.1)
activerecord (7.0.5.1)
activemodel (= 7.0.5.1)
activesupport (= 7.0.5.1)
activerecord-import (1.4.1)
activerecord (>= 4.2)
activestorage (7.0.5)
actionpack (= 7.0.5)
activejob (= 7.0.5)
activerecord (= 7.0.5)
activesupport (= 7.0.5)
activestorage (7.0.5.1)
actionpack (= 7.0.5.1)
activejob (= 7.0.5.1)
activerecord (= 7.0.5.1)
activesupport (= 7.0.5.1)
marcel (~> 1.0)
mini_mime (>= 1.1.0)
activesupport (7.0.5)
activesupport (7.0.5.1)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 1.6, < 2)
minitest (>= 5.1)
@ -412,8 +412,8 @@ GEM
mime-types-data (3.2023.0218.1)
mini_magick (4.12.0)
mini_mime (1.1.2)
mini_portile2 (2.8.2)
minitest (5.18.0)
mini_portile2 (2.8.4)
minitest (5.18.1)
momentjs-rails (2.17.1)
railties (>= 3.1)
msgpack (1.7.1)
@ -505,26 +505,27 @@ GEM
rack
rack-test (2.1.0)
rack (>= 1.3)
rails (7.0.5)
actioncable (= 7.0.5)
actionmailbox (= 7.0.5)
actionmailer (= 7.0.5)
actionpack (= 7.0.5)
actiontext (= 7.0.5)
actionview (= 7.0.5)
activejob (= 7.0.5)
activemodel (= 7.0.5)
activerecord (= 7.0.5)
activestorage (= 7.0.5)
activesupport (= 7.0.5)
rails (7.0.5.1)
actioncable (= 7.0.5.1)
actionmailbox (= 7.0.5.1)
actionmailer (= 7.0.5.1)
actionpack (= 7.0.5.1)
actiontext (= 7.0.5.1)
actionview (= 7.0.5.1)
activejob (= 7.0.5.1)
activemodel (= 7.0.5.1)
activerecord (= 7.0.5.1)
activestorage (= 7.0.5.1)
activesupport (= 7.0.5.1)
bundler (>= 1.15.0)
railties (= 7.0.5)
railties (= 7.0.5.1)
rails-controller-testing (1.0.5)
actionpack (>= 5.0.1.rc1)
actionview (>= 5.0.1.rc1)
activesupport (>= 5.0.1.rc1)
rails-dom-testing (2.0.3)
activesupport (>= 4.2.0)
rails-dom-testing (2.1.1)
activesupport (>= 5.0.0)
minitest
nokogiri (>= 1.6)
rails-html-sanitizer (1.6.0)
loofah (~> 2.21)
@ -538,9 +539,9 @@ GEM
railties (> 3.1)
rails_serve_static_assets (0.0.5)
rails_stdout_logging (0.0.5)
railties (7.0.5)
actionpack (= 7.0.5)
activesupport (= 7.0.5)
railties (7.0.5.1)
actionpack (= 7.0.5.1)
activesupport (= 7.0.5.1)
method_source
rake (>= 12.2)
thor (~> 1.0)
@ -561,7 +562,7 @@ GEM
pairing_heap (>= 0.3.0)
rexml (~> 3.2, >= 3.2.4)
stream (~> 0.5.3)
roo (2.8.3)
roo (2.10.0)
nokogiri (~> 1)
rubyzip (>= 1.3.0, < 3.0.0)
rotp (6.2.2)
@ -664,7 +665,7 @@ GEM
thor (1.2.2)
tilt (2.2.0)
timecop (0.9.6)
timeout (0.3.2)
timeout (0.4.0)
turbolinks (5.1.1)
turbolinks-source (~> 5.1)
turbolinks-source (5.2.0)
@ -772,7 +773,7 @@ DEPENDENCIES
omniauth-okta!
omniauth-rails_csrf_protection (~> 1.0)
overcommit
pg (~> 1.1)
pg (~> 1.5)
pg_search
pry
pry-byebug
@ -781,13 +782,13 @@ DEPENDENCIES
puma
rack-attack
rack-cors
rails (~> 7.0.5)
rails (~> 7.0.5.1)
rails-controller-testing
rails_12factor
rails_autolink (~> 1.1, >= 1.1.6)
recaptcha
rgl
roo (~> 2.8.2)
roo (~> 2.10.0)
rotp
rqrcode (~> 2.0)
rspec-rails

View file

@ -1,7 +0,0 @@
/* global ActiveStoragePreviews */
(function() {
$('.attachment-preview, .asset-inline-image')
.on('load', (event) => ActiveStoragePreviews.showPreview(event))
.on('error', (event) => ActiveStoragePreviews.reCheckPreview(event));
}());

View file

@ -1,7 +0,0 @@
/* global ActiveStoragePreviews */
(function() {
$('.attachment-preview .asset-thumbnail-image')
.on('load', (event) => ActiveStoragePreviews.showPreview(event))
.on('error', (event) => ActiveStoragePreviews.reCheckPreview(event));
}());

View file

@ -37,6 +37,7 @@ var ProjectsIndex = (function() {
// Arrays with selected project and folder IDs shared between both views
var selectedProjects = [];
var selectedProjectFolders = [];
var singleSelectedProject;
var destinationFolder;
// Init new project folder modal function
@ -163,6 +164,7 @@ var ProjectsIndex = (function() {
ev.preventDefault();
const projectId = $(this).data('projectId');
singleSelectedProject = projectId;
// Load HTML to refresh users list
$.ajax({
@ -223,7 +225,7 @@ var ProjectsIndex = (function() {
type: 'POST',
dataType: 'json',
data: {
project_ids: selectedProjects,
project_ids: selectedProjects.length > 0 ? selectedProjects : [singleSelectedProject],
project_folder_ids: selectedProjectFolders
},
success: function(data) {
@ -232,7 +234,7 @@ var ProjectsIndex = (function() {
HelperModule.flashAlertMsg(data.flash, 'success');
},
error: function() {
// TODO
HelperModule.flashAlertMsg(I18n.t('projects.export_projects.error_flash'), 'danger');
}
});
});

View file

@ -64,7 +64,7 @@
el.handsontable('getInstance').getPlugin('columnSorting').sort(3, order);
} else {
metadata = JSON.parse(metadataJson.val() || '{}');
metadata = metadataJson.val() || {};
el.handsontable({
disableVisualSelection: true,
rowHeaders: tableRowHeaders(metadata.plateTemplate),

View file

@ -503,7 +503,7 @@ var RepositoryDatatable = (function(global) {
TABLE.ColSizes = state.ColSizes;
restoreColumnSizes();
setTimeout(restoreColumnSizes, 100);
}
function dataTableInit() {
@ -547,6 +547,15 @@ var RepositoryDatatable = (function(global) {
// force width of checkbox column
data[0] = 30;
// perserve widths of invisible columns or enforce min width
for (let i = 0; i < data.length; i++) {
if (data[i] === 0) {
let minWidth = parseInt($(TABLE.column(i).header()).css('min-width'), 10);
data[i] = colSizeMap[i] || minWidth;
}
}
state.ColSizes = data;
$(TABLE_WRAPPER_ID).find('.table').addClass('table--resizable-columns');
@ -744,8 +753,8 @@ var RepositoryDatatable = (function(global) {
}
});
},
stateSaveCallback: function(settings, data) {
if (Object.keys(colSizeMap).length === 0) return;
stateSaveCallback: function(_, data) {
if (Object.keys(colSizeMap).length === 0) return true;
let colSizes = [];

View file

@ -237,24 +237,22 @@ var RepositoryColumns = (function() {
}
function toggleColumnVisibility() {
var lis = $(columnsList).find('.vis');
lis.on('click', function(event) {
var self = $(this);
var li = self.closest('li');
var column = TABLE.column(li.attr('data-position'));
$(columnsList).find('.vis').on('click', function(event) {
const $this = $(this);
const li = $this.closest('li');
const column = TABLE.column(li.attr('data-position'));
event.stopPropagation();
if (column.header.id !== 'row-name') {
if (!['row-name', 'archived-by', 'archived-on'].includes(column.header().id)) {
if (column.visible()) {
self.addClass('sn-icon-visibility-hide');
self.removeClass('sn-icon-visibility-show');
$this.addClass('sn-icon-visibility-hide');
$this.removeClass('sn-icon-visibility-show');
li.addClass('col-invisible');
column.visible(false);
TABLE.setColumnSearchable(column.index(), false);
} else {
self.addClass('sn-icon-visibility-show');
self.removeClass('sn-icon-visibility-hide');
$this.addClass('sn-icon-visibility-show');
$this.removeClass('sn-icon-visibility-hide');
li.removeClass('col-invisible');
column.visible(true);
TABLE.setColumnSearchable(column.index(), true);

View file

@ -30,3 +30,16 @@ var ActiveStoragePreviews = (function() {
}
});
}());
$(document).on('turbolinks:load', function() {
$('.asset-preview-image')
.one('load', (event) => ActiveStoragePreviews.showPreview(event))
.one('error', (event) => ActiveStoragePreviews.reCheckPreview(event))
.each(function() {
if (this.complete) {
$(this).load();
} else if (this.error) {
$(this).error();
}
});
});

View file

@ -386,7 +386,6 @@ path, ._jsPlumb_endpoint {
div {
font-size: 20px;
width: 4px;
height: 0px;
display: inline-block;
& .fas {

View file

@ -34,6 +34,8 @@
}
.control {
align-items: center;
display: flex;
margin-left: auto;
}
@ -51,7 +53,7 @@
}
}
.fas-check {
.sn-icon-check {
margin-left: .25em;
}
}
@ -62,3 +64,14 @@
}
}
}
.panel.panel-default {
.pull-right {
align-items: center;
display: flex;
.sn-icon-check {
margin-left: .25em;
}
}
}

View file

@ -125,6 +125,10 @@
padding: 5px 0;
}
.filter-table input {
width: auto !important;
}
.filter-table,
.display-limit {
flex-shrink: 0;

View file

@ -2,6 +2,7 @@
.sci-input-container {
.help-block {
color: $brand-danger;
font-size: 12px;
}
}

View file

@ -22,6 +22,9 @@
}
.view-text-element {
overflow-x: scroll;
pointer-events: initial;
a {
pointer-events: initial;
}

View file

@ -58,7 +58,7 @@ module ActiveStorage
current_user.permission_team = asset.team || current_team
return true if !asset.saved && can_read_team?(asset.team)
return true if asset.object.nil? && can_read_team?(asset.team)
case asset.object_type
when 'MyModule'

View file

@ -41,10 +41,6 @@ class GlobalActivitiesController < ApplicationController
@teams.order(name: :asc)
end
@activity_types = Activity.activity_types_list
@user_list = User.where(id: UserTeam.where(team: current_user.teams).select(:user_id))
.distinct
.order(full_name: :asc)
.pluck(:full_name, :id)
activities = ActivitiesService.load_activities(current_user, selected_teams, activity_filters)

View file

@ -21,7 +21,8 @@ class MyModuleTagsController < ApplicationController
render json: {
html_module_header: render_to_string(
partial: 'my_modules/tags',
locals: { my_module: @my_module, editable: can_manage_my_module?(@my_module) }
locals: { my_module: @my_module, editable: can_manage_my_module?(@my_module) },
formats: :html
)
}
end
@ -36,7 +37,8 @@ class MyModuleTagsController < ApplicationController
id: my_module.id,
tags_html: render_to_string(
partial: 'canvas/tags',
locals: { my_module: my_module }
locals: { my_module: my_module },
formats: :html
)
}
end

View file

@ -115,9 +115,7 @@ class MyModulesController < ApplicationController
MyModule: [@my_module.id]
}
@activity_types = Activity.activity_types_list
@user_list = User.where(id: UserTeam.where(team: current_user.teams).select(:user_id))
.distinct
.pluck(:full_name, :id)
activities = ActivitiesService.load_activities(current_user, current_team, activity_filters)
@grouped_activities = activities.group_by do |activity|

View file

@ -109,20 +109,21 @@ module Navigator
else
object&.project_folder
end
has_children_sql = 'SUM(CASE WHEN viewable_projects.id IS NOT NULL OR project_folders_project_folders.id IS NOT NULL
THEN 1 ELSE 0 END) > 0'
current_team.project_folders.where(parent_folder: folder)
.where(project_folders: { archived: archived })
.left_outer_joins(:projects, project_folders: {})
.joins(
"LEFT OUTER JOIN (#{Project.viewable_by_user(current_user, current_team).to_sql}) " \
"LEFT OUTER JOIN (#{Project.viewable_by_user(current_user, current_team).where(archived: archived).to_sql}) " \
"viewable_projects ON viewable_projects.project_folder_id = project_folders.id"
)
.select(
'project_folders.id',
'project_folders.name',
'project_folders.archived',
'SUM(CASE WHEN viewable_projects.id IS NOT NULL OR project_folders_project_folders.id IS NOT NULL
THEN 1 ELSE 0 END) > 0 AS has_children'
"#{has_children_sql} AS has_children"
).group('project_folders.id')
.having("project_folders.archived = :archived OR #{has_children_sql}", archived: archived)
end
def fetch_experiments(object, archived = false)

View file

@ -175,9 +175,7 @@ class RepositoriesController < ApplicationController
def rename_modal
render json: {
html: render_to_string(
partial: 'rename_repository_modal'
)
html: render_to_string(partial: 'rename_repository_modal', formats: :html)
}
end
@ -200,7 +198,7 @@ class RepositoriesController < ApplicationController
name: @repository.name
)
render json: {
html: render_to_string(partial: 'copy_repository_modal')
html: render_to_string(partial: 'copy_repository_modal', formats: :html)
}
end
@ -288,7 +286,7 @@ class RepositoriesController < ApplicationController
if (@temp_file = parsed_file.generate_temp_file)
render json: {
html: render_to_string(partial: 'repositories/parse_records_modal')
html: render_to_string(partial: 'repositories/parse_records_modal', formats: :html)
}
else
repository_response(t('repositories.parse_sheet.errors.temp_file_failure'))

View file

@ -103,9 +103,9 @@ class ResultAssetsController < ApplicationController
format.json do
render json: {
html: render_to_string(
partial: 'my_modules/result', locals: { result: @result }
partial: 'my_modules/result', locals: { result: @result }, formats: :html
)
}, status: :ok
}
end
else
format.json do

View file

@ -54,7 +54,7 @@ class UserMyModulesController < ApplicationController
render json: {
user: {
id: @um.user.id,
full_name: @um.user.full_name,
full_name: escape_input(@um.user.full_name),
avatar_url: avatar_path(@um.user, :icon_small),
user_module_id: @um.id
}

View file

@ -150,8 +150,7 @@ module Users
.distinct
teams = teams.where_attributes_like('teams.name', params[:query]) if params[:query].present?
teams.select { |team| can_invite_team_users?(team) }
teams = teams.select { |team| can_invite_team_users?(team) }
render json: teams.map { |t| { value: t.id, label: escape_input(t.name) } }.to_json
end

View file

@ -57,9 +57,7 @@ module Users
end
end
def show
@user_team = UserTeam.find_by(user: @user, team: @team)
end
def show; end
def users_datatable
render json: ::TeamUsersDatatable.new(view_context, @team, @user)

View file

@ -100,15 +100,15 @@ class WopiController < ActionController::Base
if @asset.lock == lock
@asset.refresh_lock
response.headers['X-WOPI-ItemVersion'] = @asset.version
return render body: nil, status: :ok
render body: nil, status: :ok
else
response.headers['X-WOPI-Lock'] = @asset.lock
return render body: nil, status: :conflict
render body: nil, status: :conflict
end
else
@asset.lock_asset(lock)
response.headers['X-WOPI-ItemVersion'] = @asset.version
return render body: nil, status: :ok
render body: nil, status: :ok
end
end
end
@ -126,14 +126,14 @@ class WopiController < ActionController::Base
@asset.unlock
@asset.lock_asset(lock)
response.headers['X-WOPI-ItemVersion'] = @asset.version
return render body: nil, status: :ok
render body: nil, status: :ok
else
response.headers['X-WOPI-Lock'] = @asset.lock
return render body: nil, status: :conflict
render body: nil, status: :conflict
end
else
response.headers['X-WOPI-Lock'] = ' '
return render body: nil, status: :conflict
render body: nil, status: :conflict
end
end
end
@ -151,15 +151,15 @@ class WopiController < ActionController::Base
create_wopi_file_activity(@user, false)
response.headers['X-WOPI-ItemVersion'] = @asset.version
return render body: nil, status: :ok
render body: nil, status: :ok
else
response.headers['X-WOPI-Lock'] = @asset.lock
return render body: nil, status: :conflict
render body: nil, status: :conflict
end
else
logger.warn 'WOPI: tried to unlock non-locked file'
response.headers['X-WOPI-Lock'] = ' '
return render body: nil, status: :conflict
render body: nil, status: :conflict
end
end
end
@ -174,14 +174,14 @@ class WopiController < ActionController::Base
@asset.refresh_lock
response.headers['X-WOPI-ItemVersion'] = @asset.version
response.headers['X-WOPI-ItemVersion'] = @asset.version
return render body: nil, status: :ok
render body: nil, status: :ok
else
response.headers['X-WOPI-Lock'] = @asset.lock
return render body: nil, status: :conflict
render body: nil, status: :conflict
end
else
response.headers['X-WOPI-Lock'] = ' '
return render body: nil, status: :conflict
render body: nil, status: :conflict
end
end
end
@ -189,7 +189,7 @@ class WopiController < ActionController::Base
def get_lock
@asset.with_lock do
response.headers['X-WOPI-Lock'] = @asset.locked? ? @asset.lock : ' '
return render body: nil, status: :ok
render body: nil, status: :ok
end
end
@ -211,11 +211,11 @@ class WopiController < ActionController::Base
@protocol&.update(updated_at: Time.now.utc)
response.headers['X-WOPI-ItemVersion'] = @asset.version
return render body: nil, status: :ok
render body: nil, status: :ok
else
logger.warn 'WOPI: wrong lock used to try and modify file'
response.headers['X-WOPI-Lock'] = @asset.lock
return render body: nil, status: :conflict
render body: nil, status: :conflict
end
elsif !@asset.file_size.nil? && @asset.file_size.zero?
logger.warn 'WOPI: initializing empty file'
@ -227,11 +227,11 @@ class WopiController < ActionController::Base
@team.save
response.headers['X-WOPI-ItemVersion'] = @asset.version
return render body: nil, status: :ok
render body: nil, status: :ok
else
logger.warn 'WOPI: trying to modify unlocked file'
response.headers['X-WOPI-Lock'] = ' '
return render body: nil, status: :conflict
render body: nil, status: :conflict
end
end
end
@ -249,13 +249,13 @@ class WopiController < ActionController::Base
@assoc = result_assoc unless result_assoc.nil?
@assoc = repository_cell_assoc unless repository_cell_assoc.nil?
if @assoc.class == Step
if @assoc.instance_of?(Step)
@protocol = @asset.step.protocol
@team = @protocol.team
elsif @assoc.class == Result
elsif @assoc.instance_of?(Result)
@my_module = @assoc.my_module
@team = @my_module.experiment.project.team
elsif @assoc.class == RepositoryCell
elsif @assoc.instance_of?(RepositoryCell)
@repository = @assoc.repository_column.repository
@team = @repository.team
end
@ -278,8 +278,9 @@ class WopiController < ActionController::Base
# This is what we get for settings permission methods with
# current_user
@user.permission_team = @team
@current_user = @user
if @assoc.class == Step
if @assoc.instance_of?(Step)
if @protocol.in_module?
@can_read = can_read_protocol_in_module?(@protocol)
@can_write = can_manage_step?(@assoc)
@ -299,7 +300,7 @@ class WopiController < ActionController::Base
@breadcrumb_folder_name = 'Protocol managament'
end
@breadcrumb_folder_url = @close_url
elsif @assoc.class == Result
elsif @assoc.instance_of?(Result)
@can_read = can_read_experiment?(@my_module.experiment)
@can_write = can_manage_my_module?(@my_module)
@ -311,7 +312,7 @@ class WopiController < ActionController::Base
host: ENV['WOPI_USER_HOST'])
@breadcrumb_folder_name = @my_module.name
@breadcrumb_folder_url = @close_url
elsif @assoc.class == RepositoryCell
elsif @assoc.instance_of?(RepositoryCell)
@can_read = can_read_repository?(@repository)
@can_write = !@repository.is_a?(RepositorySnapshot) && can_edit_wopi_file_in_repository_rows?

View file

@ -60,7 +60,7 @@ class ProtocolLinkedChildrenDatatable < CustomDatatable
res += "<li><span class='sn-icon sn-icon-projects'></span>&nbsp;"
res += @controller.render_to_string(
partial: 'search/results/partials/project_text',
locals: { project: record.my_module.experiment.project },
locals: { project: record.my_module.experiment.project, link_to_page: :show },
formats: :html
)
res += '</li>'

View file

@ -178,7 +178,7 @@ window.TinyMCE = (() => {
// Hide element containing HTML view of RTE field
const tinyMceContainer = $(selector).closest('form').find('.tinymce-view');
const tinyMceInitSize = tinyMceContainer.height();
$(selector).closest('.form-group')
$(selector).closest('.form-group, .tinymce-editor-container')
.before(`<div class="tinymce-placeholder" style="height:${tinyMceInitSize}px"></div>`);
tinyMceContainer.addClass('hidden');
const plugins = `

View file

@ -1,5 +1,7 @@
/* global HelperModule */
const FILENAME_MAX_LENGTH = 100;
export default {
methods: {
initWopiFileModal(step, requestCallback) {
@ -10,6 +12,13 @@ export default {
$wopiModal.modal('show');
$($wopiModal).find('#new-wopi-file-name').focus();
// Clear filename input error on input change if appropriate
$wopiModal.on('input', '#new-wopi-file-name', (e) => {
if (e.currentTarget.value.length <= FILENAME_MAX_LENGTH) {
$wopiModal.clearFormErrors();
}
});
$wopiModal.find('form').on(
'ajax:success',
(e, data, status) => {

View file

@ -130,12 +130,11 @@
})
$(this.$refs.modal).on('hidden.bs.modal', () => {
if (this.zebraEnabled) {
this.zebraPrinters = null;
}
this.$emit('close');
});
if (this.zebraEnabled) {
this.initZebraPrinter();
}
},
computed: {
availableTemplates() {
@ -167,6 +166,9 @@
watch: {
showModal() {
if (this.showModal) {
if (this.zebraEnabled) {
this.initZebraPrinter();
}
$(this.$refs.modal).modal('show');
this.validateTemplate();
}

View file

@ -27,7 +27,7 @@
:data-placeholder="placeholder"
:data-tinymce-init="`tinymce-${objectType}-description-${objectId}`">
</div>
<div class="flex">
<div class="flex tinymce-editor-container">
<textarea :id="`${objectType}_textarea_${objectId}`"
class="form-control hidden"
autocomplete="off"

View file

@ -172,19 +172,6 @@ class Project < ApplicationRecord
ProjectComment.from(comments, :comments).order(created_at: :asc)
end
def unassigned_users
User.joins(:user_teams)
.joins(
"LEFT OUTER JOIN user_assignments ON user_assignments.user_id = users.id "\
"AND user_assignments.assignable_id = #{id} "\
"AND user_assignments.assignable_type = 'Project'"
)
.where(user_teams: { team_id: team_id })
.where(user_assignments: { id: nil })
.where.not(confirmed_at: nil)
.distinct
end
def user_role(user)
user_assignments.includes(:user_role).references(:user_role).find_by(user: user)&.user_role&.name
end
@ -289,7 +276,7 @@ class Project < ApplicationRecord
tables = parsed_html.css('.hot-table-contents')
.zip(parsed_html.css('.hot-table-container'), parsed_html.css('.hot-table-metadata'))
tables.each do |table_input, table_container, metadata|
is_plate_template = JSON.parse(metadata['value'])['plateTemplate'] if metadata.present?
is_plate_template = JSON.parse(metadata['value'])['plateTemplate'] if metadata && metadata['value'].present?
table_vals = JSON.parse(table_input['value'])
table_data = table_vals['data']
table_headers = table_vals['headers']

View file

@ -122,7 +122,7 @@ class Report < ApplicationRecord
)
end
report = Report.new
report = Report.new(skip_user_assignments: true)
report.name = loop do
dummy_name = SecureRandom.hex(10)
break dummy_name unless Report.exists?(name: dummy_name)

View file

@ -105,6 +105,10 @@ class Table < ApplicationRecord
end
end
def metadata
attributes['metadata'].is_a?(String) ? JSON.parse(attributes['metadata']) : attributes['metadata']
end
def contents_utf_8
contents.present? ? contents.force_encoding(Encoding::UTF_8) : nil
end

View file

@ -32,7 +32,6 @@ class Team < ApplicationRecord
foreign_key: 'last_modified_by_id',
class_name: 'User',
optional: true
has_many :user_teams, inverse_of: :team, dependent: :destroy
has_many :users, through: :user_assignments
has_many :projects, inverse_of: :team
has_many :project_folders, inverse_of: :team, dependent: :destroy
@ -173,8 +172,8 @@ class Team < ApplicationRecord
def self.global_activity_filter(filters, search_query)
query = where('name ILIKE ?', "%#{search_query}%")
if filters[:users]
users_team = User.where(id: filters[:users]).joins(:user_teams).group(:team_id).pluck(:team_id)
query = query.where(id: users_team)
user_teams = User.where(id: filters[:users]).joins(:teams).group(:team_id).select(:team_id)
query = query.where(id: user_teams)
end
query = query.where(id: team_by_subject(filters[:subjects])) if filters[:subjects]
query.select(:id, :name).map { |i| { value: i[:id], label: ApplicationController.helpers.escape_input(i[:name]) } }

View file

@ -58,7 +58,6 @@ class User < ApplicationRecord
# Relations
has_many :user_identities, inverse_of: :user
has_many :user_teams, inverse_of: :user
has_many :user_assignments, dependent: :destroy
has_many :user_projects, inverse_of: :user
has_many :teams, through: :user_assignments, source: :assignable, source_type: 'Team'
@ -157,8 +156,8 @@ class User < ApplicationRecord
has_many :tokens,
class_name: 'Token',
foreign_key: 'user_id',
inverse_of: :user
inverse_of: :user,
dependent: :destroy
has_many :modified_tags,
class_name: 'Tag',
@ -166,9 +165,6 @@ class User < ApplicationRecord
has_many :assigned_user_my_modules,
class_name: 'UserMyModule',
foreign_key: 'assigned_by_id'
has_many :assigned_user_teams,
class_name: 'UserTeam',
foreign_key: 'assigned_by_id'
has_many :assigned_user_projects,
class_name: 'UserProject',
foreign_key: 'assigned_by_id'
@ -314,7 +310,6 @@ class User < ApplicationRecord
has_many :user_system_notifications, dependent: :destroy
has_many :system_notifications, through: :user_system_notifications
has_many :zip_exports, inverse_of: :user, dependent: :destroy
has_many :datatables_teams, class_name: '::Views::Datatables::DatatablesTeam'
has_many :view_states, dependent: :destroy
has_many :access_grants, class_name: 'Doorkeeper::AccessGrant',
@ -437,46 +432,6 @@ class User < ApplicationRecord
end
end
def projects_by_teams(team_id = 0, sort_by = nil, archived = false)
archived = archived ? true : false
query = Project.all.joins(:user_projects)
sql = 'projects.team_id IN (SELECT DISTINCT team_id ' \
'FROM user_teams WHERE user_teams.user_id = :user_id)'
if team_id.zero? || !user_teams.find_by(team_id: team_id).try(:admin?)
# Admins see all projects of team
sql += ' AND (projects.visibility=1 OR user_projects.user_id=:user_id)'
end
sql += ' AND projects.archived = :archived '
sort =
case sort_by
when 'old'
{ created_at: :asc }
when 'atoz'
{ name: :asc }
when 'ztoa'
{ name: :desc }
else
{ created_at: :desc }
end
if team_id > 0
result = query
.where('projects.team_id = ?', team_id)
.where(sql, user_id: id, archived: archived)
.order(sort)
.distinct
.group_by(&:team)
else
result = query
.where(sql, user_id: id, archived: archived)
.order(sort)
.distinct
.group_by(&:team)
end
result || []
end
# Finds all activities of user that is assigned to project. If user
# is not an owner of the project, user must be also assigned to
# module.
@ -502,11 +457,9 @@ class User < ApplicationRecord
def self.find_by_valid_wopi_token(token)
Rails.logger.warn "WOPI: searching by token #{token}"
User
.joins('LEFT OUTER JOIN tokens ON user_id = users.id')
.where(tokens: { token: token })
.where('tokens.ttl = 0 OR tokens.ttl > ?', Time.now.to_i)
.first
User.joins(:tokens)
.where(tokens: { token: token })
.find_by('tokens.ttl = 0 OR tokens.ttl > ?', Time.now.to_i)
end
def get_wopi_token

View file

@ -1,67 +0,0 @@
# frozen_string_literal: true
class UserTeam < ApplicationRecord
enum role: { guest: 0, normal_user: 1, admin: 2 }
validates :role, :user, :team, presence: true
belongs_to :user, inverse_of: :user_teams, touch: true
belongs_to :assigned_by, foreign_key: 'assigned_by_id', class_name: 'User', optional: true
belongs_to :team, inverse_of: :user_teams
after_create :assign_user_to_visible_projects
before_destroy :destroy_associations
def role_str
I18n.t("user_teams.enums.role.#{role}")
end
def destroy_associations
# Destroy the user from all team's projects
user.user_projects.joins(:project).where(project: team.projects).destroy_all
# destroy all assignments
UserAssignments::RemoveUserAssignmentJob.perform_now(user, team)
end
# returns user_teams where the user is in team
def self.user_in_team(user, team)
where(user: user, team: team)
end
def destroy(new_owner)
return super() unless new_owner
# Also, make new owner author of all protocols that belong
# to the departing user and belong to this team.
p_ids = user.added_protocols.where(team: team).pluck(:id)
Protocol.find(p_ids).each do |protocol|
protocol.record_timestamps = false
protocol.added_by = new_owner
if protocol.archived_by != nil
protocol.archived_by = new_owner
end
if protocol.restored_by != nil
protocol.restored_by = new_owner
end
protocol.save
end
# Make new owner author of all inventory items that were added
# by departing user and belong to this team.
RepositoryRow.change_owner(team, user, new_owner)
super()
end
private
def assign_user_to_visible_projects
team.projects.visible.each do |project|
UserAssignments::ProjectGroupAssignmentJob.perform_later(
team,
project,
assigned_by
)
end
end
end

View file

@ -8,7 +8,7 @@ module Api
has_many :checklist_items, serializer: ChecklistItemSerializer
def position
object.step_orderable_element.position
object&.step_orderable_element&.position
end
include TimestampableModel

View file

@ -13,7 +13,7 @@ module Api
end
def position
object.step_orderable_element.position
object&.step_orderable_element&.position
end
end
end

View file

@ -13,7 +13,7 @@ module Api
end
def position
object.step_table&.step_orderable_element&.position
object&.step_table&.step_orderable_element&.position
end
end
end

View file

@ -86,7 +86,7 @@ class ProjectsOverviewService
def fetch_project_records
@team.projects
.includes(user_assignments: %i(user user_role), team: :user_teams)
.includes(:team, user_assignments: %i(user user_role))
.includes(:project_comments, experiments: { my_modules: { my_module_status: :my_module_status_implications } })
.visible_to(@user, @team)
.left_outer_joins(:project_comments)
@ -97,7 +97,7 @@ class ProjectsOverviewService
def fetch_project_folder_records
project_folders = @team.project_folders
.includes(team: :user_teams)
.includes(:team)
.joins('LEFT OUTER JOIN project_folders child_folders
ON child_folders.parent_folder_id = project_folders.id')
.left_outer_joins(:projects)

View file

@ -14,7 +14,7 @@ module Reports::Docx::DrawResultTable
cell_style cols[0], bold: true, background: color[:concrete]
if table.metadata.present?
JSON.parse(table.metadata)['cells']&.each do |cell|
table.metadata['cells']&.each do |cell|
next unless cell.present? && cell['row'].present? && cell['col'].present? && cell['className'].present?
cell_style rows.dig(cell['row'].to_i + 1, cell['col'].to_i + 1),

View file

@ -43,9 +43,9 @@ module SmartAnnotations
def parse_users_annotations(user, team, text)
@text = text.gsub(USER_REGEX) do |el|
match = el.match(USER_REGEX)
user = User.find_by_id(match[2].base62_decode)
user = team.users.find_by(id: match[2].base62_decode)
next unless user
next if UserTeam.where(user: user, team: team).blank?
user.full_name
end
end

View file

@ -79,7 +79,7 @@ module Toolbars
{
name: 'assign',
label: I18n.t('repositories.assign_record'),
icon: 'sn-icon sn-icon-files',
icon: 'sn-icon sn-icon-assign-to-task',
button_class: 'assign-repository-rows-btn',
button_id: 'assignRepositoryRecords',
type: :legacy

View file

@ -74,7 +74,6 @@ class UserDataDeletion
destroy_protocol(protocol)
end
team.protocol_keywords.destroy_all
team.user_teams.delete_all
User.where(current_team_id: team).each do |user|
user.update(current_team_id: nil)
end

View file

@ -43,10 +43,9 @@
<% elsif asset.previewable? %>
<div class="image-container">
<%= image_tag asset.large_preview,
class: 'asset-inline-image',
class: 'asset-preview-image',
style: 'opacity: 0' %>
</div>
<%= javascript_include_tag 'assets/asset_inline' %>
<% else %>
<div class="general-file-container">
<i class="fas <%= file_fa_icon_class(asset) if asset.file_name %>"></i>

View file

@ -16,9 +16,8 @@
<div class="attachment-preview <%= asset.file.attached? ? asset.file.metadata['asset_type'] : '' %>">
<% if asset.previewable? %>
<%= image_tag asset.medium_preview,
class: 'asset-thumbnail-image',
class: 'asset-preview-image',
style: 'opacity: 0' %>
<%= javascript_include_tag 'assets/asset_thumbnail' %>
<% else %>
<i class="fas <%= file_fa_icon_class(asset) if asset.file_name %>"></i>
<% end %>

View file

@ -23,7 +23,7 @@
<% if @my_module.completed? %>
<div class="flex-block date-block" >
<div class="flex-block-label">
<span class="fas block-icon fa-calendar-day"></span>
<span class="sn-icon sn-icon-calendar mr-2.5"></span>
<span class="hidden-xs hidden-sm hidden-md"><%= t('my_modules.details.completed_date') %></span>
</div>
<div class="datetime-container">

View file

@ -25,7 +25,7 @@
</div>
<div class="report-element-body">
<input type="hidden" class="hot-table-contents" value="<%= table.contents_utf_8 %>" />
<input type="hidden" class="hot-table-metadata" value="<%= table.metadata %>" />
<input type="hidden" class="hot-table-metadata" value="<%= table.metadata.to_json %>" />
<div class="hot-table-container"></div>
<table class="report-common-table-format"></table>
</div>

View file

@ -14,10 +14,10 @@
</span>
<div class="move-buttons sci-btn-group">
<button class="btn btn-light icon-btn move-up">
<i class="sn-icon sn-icon-sort-up"></i>
<i class="sn-icon sn-icon-arrow-up"></i>
</button>
<button class="btn btn-light icon-btn move-down">
<i class="sn-icon sn-icon-sort-down"></i>
<i class="sn-icon sn-icon-arrow-down"></i>
</button>
</div>
</div>

View file

@ -7,10 +7,10 @@
</div>
<div class="items">
<% experiment_group[:experiments].each do |experiment| %>
<li class="item" data-name="<%= experiment.name %>" data-id="<%= experiment.id.base62_encode %>" data-type="exp">
<li class="item" data-name="<%= sanitize_input(experiment.name) %>" data-id="<%= experiment.id.base62_encode %>" data-type="exp">
<span class='sa-type'><%= experiment.code %></span>
<span class="dot">&middot;</span>
<span class="item-text"><%= experiment.name %></span>
<span class="item-text"><%= sanitize_input(experiment.name) %></span>
<%= render partial: 'shared/smart_annotation/atwho_control_buttons' %>
</li>
<% end %>

View file

@ -9,10 +9,10 @@
</div>
<div class="items">
<% task_group[:tasks].each do |task| %>
<li class="item" data-name="<%= task.name %>" data-id="<%= task.id.base62_encode %>" data-type="tsk">
<li class="item" data-name="<%= sanitize_input(task.name) %>" data-id="<%= task.id.base62_encode %>" data-type="tsk">
<span class='sa-type'><%= task.code %></span>
<span class="dot">&middot;</span>
<span class="item-text"><%= task.name %></span>
<span class="item-text"><%= sanitize_input(task.name) %></span>
<%= render partial: 'shared/smart_annotation/atwho_control_buttons' %>
</li>
<% end %>

View file

@ -1,10 +1,10 @@
<% limit_reached = projects.length == Constants::ATWHO_SEARCH_LIMIT + 1 %>
<div class="atwho-scroll-container">
<% projects.limit(Constants::ATWHO_SEARCH_LIMIT).each do |project| %>
<li class="item" data-name="<%= project.name %>" data-id="<%= project.id.base62_encode %>" data-type="prj">
<li class="item" data-name="<%= sanitize_input(project.name) %>" data-id="<%= project.id.base62_encode %>" data-type="prj">
<span class='sa-type'><%= project.code %></span>
<span class="dot">&middot;</span>
<span class="item-text"><%= project.name %></span>
<span class="item-text"><%= sanitize_input(project.name) %></span>
<%= render partial: 'shared/smart_annotation/atwho_control_buttons' %>
</li>
<% end %>

View file

@ -1,10 +1,10 @@
<% limit_reached = repository_rows.length == Constants::ATWHO_SEARCH_LIMIT + 1 %>
<div class="atwho-scroll-container">
<% repository_rows.take(Constants::ATWHO_SEARCH_LIMIT).each do |row| %>
<li class="item" data-name="<%= row[:name] %>" data-id="<%= row[:id_encoded] %>" data-type="rep_item">
<li class="item" data-name="<%= sanitize_input(row[:name]) %>" data-id="<%= row[:id_encoded] %>" data-type="rep_item">
<span class='sa-type'><%= row[:code] %></span>
<span class="dot">&middot;</span>
<span class="item-text"><%= row[:name] %></span>
<span class="item-text"><%= sanitize_input(row[:name]) %></span>
<%= render partial: 'shared/smart_annotation/atwho_control_buttons', locals: { row: row, repository: repository } %>
</li>
<% end %>

View file

@ -5,10 +5,10 @@
</div>
<div class="atwho-scroll-container">
<% users.limit(Constants::ATWHO_SEARCH_LIMIT).each do |user| %>
<li class="atwho-user" data-full-name="<%= user.full_name %>" data-id="<%= user.id.base62_encode %>" data-type="rep_item">
<li class="atwho-user" data-full-name="<%= sanitize_input(user.full_name) %>" data-id="<%= user.id.base62_encode %>" data-type="rep_item">
<img src="<%= avatar_path(user, :icon_small) %>" class="avatar" />
<div class="user-info">
<div class="user-name item-text"><%= user.full_name %></div>
<div class="user-name item-text"><%= sanitize_input(user.full_name) %></div>
<div class="user-email item-text"><%= user.email %></div>
</div>
</li>

View file

@ -1,7 +1,7 @@
# frozen_string_literal: true
require 'active_storage/previewer/libreoffice_previewer'
require 'active_storage/analyzer/custom_image_analyzer'
require 'active_storage/analyzer/image_analyzer/custom_image_magick'
require 'active_storage/downloader'
# Enable PDF previews for files
@ -10,7 +10,7 @@ Rails.application.config.x.enable_pdf_previews = ENV['ACTIVESTORAGE_ENABLE_PDF_P
Rails.application.config.active_storage.previewers = [ActiveStorage::Previewer::PopplerPDFPreviewer,
ActiveStorage::Previewer::LibreofficePreviewer]
Rails.application.config.active_storage.analyzers.prepend(ActiveStorage::Analyzer::CustomImageAnalyzer)
Rails.application.config.active_storage.analyzers.prepend(ActiveStorage::Analyzer::ImageAnalyzer::CustomImageMagick)
Rails.application.config.active_storage.variable_content_types << 'image/svg+xml'

View file

@ -112,8 +112,6 @@ Rails.application.config.assets.precompile += %w(users/registrations/new_with_pr
Rails.application.config.assets.precompile += %w(team_zip_exports/load_handson.js)
Rails.application.config.assets.precompile += %w(repository_columns/manage_column_partials/number.js)
Rails.application.config.assets.precompile += %w(repository_columns/manage_column_partials/stock.js)
Rails.application.config.assets.precompile += %w(assets/asset_inline.js)
Rails.application.config.assets.precompile += %w(assets/asset_thumbnail.js)
Rails.application.config.assets.precompile += %w(results/result_assets/new.js)
Rails.application.config.assets.precompile += %w(results/result_assets/edit.js)
Rails.application.config.assets.precompile += %w(results/result_tables/new.js)

View file

@ -2506,8 +2506,8 @@ en:
head_title: "Settings | Add-ons"
title: "Add-ons"
no_addons: "You have no SciNote Add-ons."
scinote_addons: "Scinote add-ons"
label_printers: "Label Printers"
scinote_addons: "SciNote add-ons"
label_printers: "Label printers"
printers:
ready: "Ready"
not_ready: "Not ready"
@ -3628,9 +3628,9 @@ en:
protocols: "Protocol"
labels: "Label"
teams: "All Teams"
addons: "Add-Ons"
label_printer: "Label Printer"
fluics_printer: "Fluics Printer"
addons: "Add-ons"
label_printer: "Label printer"
fluics_printer: "Fluics printer"
Add: "Add"
Asset: "File"

View file

@ -1,44 +0,0 @@
class MigrateOrganizationsStructure < ActiveRecord::Migration[4.2]
def up
# Update estimated size of all assets
Asset.includes(:asset_text_datum).find_each do |asset|
asset.update_estimated_size
asset.update(file_present: true)
end
# Calculate teams' taken space
Team.find_each do |team|
team.calculate_space_taken
team.save
end
# Finally, the trickiest task: Re-define teams
demo_team = Team.find_by(name: "Demo team")
if demo_team
demo_team.user_teams.each do |uo|
uo.destroy
end
end
Team.find_each do |team|
user = team.users.first
team.update(created_by: user)
end
UserTeam.find_each do |uo|
uo.update(role: 2)
end
end
def down
# We cannot re-assign users to demo team or re-update
# their previous user-team roles
# But we can remove created_by field from teams
Team.find_each do |team|
team.update(created_by: nil)
end
# Resetting calculated assets & teams' space
# to 0 doesn't make much sense even when downgrading migration
end
end

View file

@ -71,10 +71,6 @@ class AddTeamLevelPermissions < ActiveRecord::Migration[6.1]
@normal_user_role.save(validate: false)
@viewer_role.permissions = @viewer_role.permissions | VIEWER_PERMISSIONS
@viewer_role.save(validate: false)
create_user_assignments(UserTeam.admin, @owner_role)
create_user_assignments(UserTeam.normal_user, @normal_user_role)
create_user_assignments(UserTeam.guest, @viewer_role)
end
dir.down do
@ -104,31 +100,4 @@ class AddTeamLevelPermissions < ActiveRecord::Migration[6.1]
user_role: user_role
)
end
def create_user_assignments(user_teams, user_role)
user_teams.includes(:user, team: %i(reports repositories repository_protocols))
.find_in_batches(batch_size: 100) do |user_team_batch|
user_assignments = []
user_team_batch.each do |user_team|
team_user_assignment = new_user_assignment(user_team.user, user_team.team, user_role, :manually)
team_user_assignment.assign_attributes(created_at: user_team.created_at,
updated_at: user_team.updated_at)
user_assignments << team_user_assignment
user_team.team.repositories.each do |repository|
user_assignments << new_user_assignment(user_team.user, repository, user_role, :automatically)
end
user_team.team.repository_protocols.each do |protocol|
if user_team.user_id == protocol.added_by_id
user_assignments << new_user_assignment(user_team.user, protocol, @owner_role, :automatically)
elsif (protocol.in_repository_archived? && protocol.published_on.present?) || protocol.in_repository_public?
user_assignments << new_user_assignment(user_team.user, protocol, @viewer_role, :automatically)
end
end
user_team.team.reports.each do |report|
user_assignments << new_user_assignment(user_team.user, report, user_role, :automatically)
end
end
UserAssignment.import(user_assignments)
end
end
end

View file

@ -0,0 +1,5 @@
class DropDatatablesTeamsView < ActiveRecord::Migration[7.0]
def change
drop_view :datatables_teams
end
end

View file

@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[7.0].define(version: 2023_06_16_140951) do
ActiveRecord::Schema[7.0].define(version: 2023_07_20_070830) do
# These are extensions that must be enabled in order to support this database
enable_extension "btree_gist"
enable_extension "pg_trgm"
@ -106,15 +106,6 @@ ActiveRecord::Schema[7.0].define(version: 2023_06_16_140951) do
t.index ["team_id"], name: "index_assets_on_team_id"
end
create_table "bmt_filters", force: :cascade do |t|
t.string "name", null: false
t.json "filters", null: false
t.bigint "created_by_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["created_by_id"], name: "index_bmt_filters_on_created_by_id"
end
create_table "checklist_items", force: :cascade do |t|
t.string "text", null: false
t.boolean "checked", default: false, null: false
@ -1315,7 +1306,6 @@ ActiveRecord::Schema[7.0].define(version: 2023_06_16_140951) do
add_foreign_key "asset_text_data", "assets"
add_foreign_key "assets", "users", column: "created_by_id"
add_foreign_key "assets", "users", column: "last_modified_by_id"
add_foreign_key "bmt_filters", "users", column: "created_by_id"
add_foreign_key "checklist_items", "checklists"
add_foreign_key "checklist_items", "users", column: "created_by_id"
add_foreign_key "checklist_items", "users", column: "last_modified_by_id"
@ -1491,21 +1481,4 @@ ActiveRecord::Schema[7.0].define(version: 2023_06_16_140951) do
add_foreign_key "wopi_actions", "wopi_apps"
add_foreign_key "wopi_apps", "wopi_discoveries"
add_foreign_key "zip_exports", "users"
create_view "datatables_teams", sql_definition: <<-SQL
SELECT teams.id,
teams.name,
user_teams.role,
( SELECT count(*) AS count
FROM user_teams user_teams_1
WHERE (user_teams_1.team_id = teams.id)) AS members,
CASE
WHEN (teams.created_by_id = user_teams.user_id) THEN false
ELSE true
END AS can_be_left,
user_teams.id AS user_team_id,
user_teams.user_id
FROM (teams
JOIN user_teams ON ((teams.id = user_teams.team_id)));
SQL
end

View file

@ -1,7 +1,7 @@
# frozen_string_literal: true
module ActiveStorage
class Analyzer::CustomImageAnalyzer < Analyzer::ImageAnalyzer
class Analyzer::ImageAnalyzer::CustomImageMagick < Analyzer::ImageAnalyzer::ImageMagick
JPEG_MIME_TYPES = ['image/jpeg', 'image/pjpeg'].freeze
def self.accept?(blob)

Binary file not shown.

View file

@ -6,12 +6,13 @@
<![CDATA[
{
"fontFamily": "SN-icon-font",
"majorVersion": 1,
"minorVersion": 8,
"designer": "David Praznik",
"description": "SN icon font\nFont generated by IcoMoon.",
"copyright": "SciNote LLC",
"designer": "David Praznik",
"version": "Version 1.8",
"majorVersion": 1,
"minorVersion": 12,
"fontURL": "https://www.scinote.net",
"version": "Version 1.12",
"fontId": "SN-icon-font",
"psName": "SN-icon-font",
"subFamily": "Regular",
@ -63,19 +64,19 @@
<glyph unicode="&#xe923;" glyph-name="resize" data-tags="resize" d="M725.76 618.24l-29.867-29.867 140.373-140.373h-648.533l140.8 140.8-29.867 29.867-192-192 192-192 29.867 29.867-140.8 140.8h648.533l-140.8-140.8 29.867-29.867 192 192-191.573 191.573z" />
<glyph unicode="&#xe924;" glyph-name="reset-password" data-tags="reset-password" d="M512 768c-128.853 0-240.64-71.68-298.667-176.64v91.307h-42.667v-170.667h170.667v42.667h-98.987c48.213 100.693 150.613 170.667 269.653 170.667 164.693 0 298.667-133.973 298.667-298.667s-133.973-298.667-298.667-298.667c-134.827 0-249.173 90.027-286.293 213.333h-43.947c37.973-147.2 171.093-256 330.24-256 188.587 0 341.333 152.747 341.333 341.333s-152.747 341.333-341.333 341.333zM597.333 469.334v42.667c0 46.933-38.4 85.333-85.333 85.333s-85.333-38.4-85.333-85.333v-42.667c-23.467 0-42.667-19.2-42.667-42.667v-128c0-23.467 19.2-42.667 42.667-42.667h170.667c23.467 0 42.667 19.2 42.667 42.667v128c0 23.467-19.2 42.667-42.667 42.667zM512 554.667c23.467 0 42.667-19.2 42.667-42.667v-42.667h-85.333v42.667c0 23.467 19.2 42.667 42.667 42.667z" />
<glyph unicode="&#xe925;" glyph-name="reports" data-tags="reports" d="M762.027 725.334c29.013 0 48.213-21.76 48.213-42.667v-512c0-20.907-18.773-42.667-48.213-42.667h-500.48c-29.013 0-48.213 21.76-48.213 42.667v512c0 20.907 18.773 42.667 48.213 42.667h500.907zM261.973 768c-50.347 0-90.88-38.4-90.88-85.333v-512c0-46.933 40.96-85.333 90.88-85.333h500.48c50.347 0 90.88 38.4 90.88 85.333v512c0 46.933-40.96 85.333-90.88 85.333h-500.907zM682.667 618.667c0 11.947 9.387 21.333 21.333 21.333s21.333-9.387 21.333-21.333v-384c0-11.947-9.387-21.333-21.333-21.333s-21.333 9.387-21.333 21.333v384zM554.667 362.667c0 11.947 9.387 21.333 21.333 21.333s21.333-9.387 21.333-21.333v-128c0-11.947-9.387-21.333-21.333-21.333s-21.333 9.387-21.333 21.333v128zM426.667 533.334c0 11.947 9.387 21.333 21.333 21.333s21.333-9.387 21.333-21.333v-298.667c0-11.947-9.387-21.333-21.333-21.333s-21.333 9.387-21.333 21.333v298.667zM298.667 448c0 11.947 9.387 21.333 21.333 21.333s21.333-9.387 21.333-21.333v-213.333c0-11.947-9.387-21.333-21.333-21.333s-21.333 9.387-21.333 21.333v213.333z" />
<glyph unicode="&#xe926;" glyph-name="navigator-light" data-tags="relationships" d="M810.667 490.667v298.667h-298.667v-128h-256v128h-42.667v-597.333h298.667v-128h298.667v298.667h-298.667v-128h-256v384h256v-128h298.667zM554.667 320h213.333v-213.333h-213.333v213.333zM554.667 746.667h213.333v-213.333h-213.333v213.333z" />
<glyph unicode="&#xe927;" glyph-name="navigator" data-tags="relationships-solid" d="M810.667 490.667v298.667h-298.667v-128h-256v128h-42.667v-597.333h298.667v-128h298.667v298.667h-298.667v-128h-256v384h256v-128h298.667z" />
<glyph unicode="&#xe926;" glyph-name="relationships" data-tags="relationships" d="M810.667 490.667v298.667h-298.667v-128h-256v128h-42.667v-597.333h298.667v-128h298.667v298.667h-298.667v-128h-256v384h256v-128h298.667zM554.667 320h213.333v-213.333h-213.333v213.333zM554.667 746.667h213.333v-213.333h-213.333v213.333z" />
<glyph unicode="&#xe927;" glyph-name="relationships-solid" data-tags="relationships-solid" d="M810.667 490.667v298.667h-298.667v-128h-256v128h-42.667v-597.333h298.667v-128h298.667v298.667h-298.667v-128h-256v384h256v-128h298.667z" />
<glyph unicode="&#xe928;" glyph-name="read-more" data-tags="read-more" d="M432.213 570.454c-4.267-4.267-6.4-9.813-5.547-16.213s3.84-12.373 9.387-17.92l88.32-88.32h-353.707v-42.667h353.707l-87.893-87.893c-5.547-5.547-8.533-11.52-9.387-17.92s0.853-11.947 5.547-16.213c4.267-4.267 9.813-6.4 16.213-5.547s12.373 3.84 17.92 9.387l125.44 125.44s2.987 4.267 3.84 6.4c0.853 2.133 1.28 4.693 1.28 7.68s0 5.12-1.28 7.253c-0.853 2.56-2.133 4.693-3.84 6.4l-125.867 125.867c-5.547 5.547-11.52 8.533-17.92 9.387s-11.947-0.853-16.213-5.547v0zM640 576h213.333v-42.667h-213.333v42.667zM725.333 448h128v-42.667h-128v42.667zM640 320h213.333v-42.667h-213.333v42.667z" />
<glyph unicode="&#xe929;" glyph-name="protocols-templates" data-tags="protocols-templates" d="M512 45.227c-86.187 24.747-157.44 76.8-213.76 155.307s-84.907 166.827-84.907 264.96v230.4l298.667 112.213 298.667-112.213v-230.4c0-98.133-28.16-186.453-84.907-264.96-56.32-78.507-128-130.133-213.76-155.307zM512 90.027c73.813 23.467 135.253 70.4 183.467 140.8s72.533 148.48 72.533 234.667v201.813l-256 94.72-256-94.72v-201.813c0-86.187 24.32-164.267 72.533-234.667s109.653-117.333 183.467-140.8zM640 555.094h-256v42.667h256v-42.667zM640 427.094h-256v42.667h256v-42.667zM640 299.094h-256v42.667h256v-42.667z" />
<glyph unicode="&#xe92a;" glyph-name="projects" data-tags="projects" d="M853.333 42.667h-256c-23.467 0-42.667 19.2-42.667 42.667v256c0 23.467 19.2 42.667 42.667 42.667h256c23.467 0 42.667-19.2 42.667-42.667v-256c0-23.467-19.2-42.667-42.667-42.667zM597.333 341.334v-256h256v256h-256zM299.093 42.667c-94.293 0-170.667 76.373-170.667 170.667s76.373 170.667 170.667 170.667 170.667-76.373 170.667-170.667-76.373-170.667-170.667-170.667zM299.093 341.334c-70.4 0-128-57.6-128-128s57.6-128 128-128 128 57.6 128 128-57.6 128-128 128zM725.76 469.334c-94.293 0-170.667 76.373-170.667 170.667s76.373 170.667 170.667 170.667 170.667-76.373 170.667-170.667-76.373-170.667-170.667-170.667zM725.76 768c-70.4 0-128-57.6-128-128s57.6-128 128-128 128 57.6 128 128-57.6 128-128 128zM427.093 469.334h-256c-23.467 0-42.667 19.2-42.667 42.667v256c0 23.467 19.2 42.667 42.667 42.667h256c23.467 0 42.667-19.2 42.667-42.667v-256c0-23.467-19.2-42.667-42.667-42.667zM171.093 768v-256h256v256h-256z" />
<glyph unicode="&#xe92b;" glyph-name="project-member-access" data-tags="project-member-access" d="M170.667 85.334v42.667h85.333v570.88c0 20.053 6.4 36.267 19.627 49.493s29.867 19.627 49.493 19.627h373.333c20.053 0 36.267-6.4 49.493-19.627s19.627-29.867 19.627-49.493v-570.88h85.333v-42.667h-682.24zM298.667 128h426.667v570.88c0 7.253-2.56 13.227-8.107 18.773-5.12 5.547-11.52 8.107-18.773 8.107h-373.333c-7.253 0-13.227-2.56-18.773-8.107-5.547-5.12-8.107-11.52-8.107-18.773v-570.88zM456.107 397.227c-8.533-8.533-18.347-13.227-29.44-13.227-11.947 0-22.187 4.267-30.293 13.227-8.107 8.533-12.373 18.347-12.373 29.44s4.267 20.907 12.373 29.44c8.107 8.533 18.347 13.227 30.293 13.227 11.093 0 20.907-4.267 29.44-13.227 8.533-8.533 13.227-18.773 13.227-29.44s-4.267-20.907-13.227-29.44z" />
<glyph unicode="&#xe92c;" glyph-name="printer" data-tags="printer" d="M874.667 533.334c0 23.467-19.2 42.667-42.667 42.667h-85.333v170.667h-469.333v-170.667h-85.333c-23.467 0-42.667-19.2-42.667-42.667v-256h128v-170.667h469.333v170.667h128v256zM320 149.334v213.333h384v-213.333h-384zM277.333 405.334v-85.333h-85.333v213.333h640v-213.333h-85.333v85.333h-469.333zM320 704h384v-128h-384v128z" />
<glyph unicode="&#xe92d;" glyph-name="down" data-tags="open-show" d="M512 298.667l-213.333 225.28 28.16 30.72 185.173-195.413 185.173 195.413 28.16-30.72-213.333-225.28z" />
<glyph unicode="&#xe92d;" glyph-name="open-show" data-tags="open-show" d="M512 298.667l-213.333 225.28 28.16 30.72 185.173-195.413 185.173 195.413 28.16-30.72-213.333-225.28z" />
<glyph unicode="&#xe92e;" glyph-name="notifications" data-tags="notifications" d="M512 768c-35.413 0-64-28.587-64-64v-21.333h128v21.333c0 35.413-28.587 64-64 64zM746.667 213.334v281.173c0 55.467-17.92 104.107-54.613 145.92-34.133 39.68-77.653 64.427-128.853 75.947-41.387 8.533-78.507 4.693-100.693 0.427-52.48-11.093-96-36.267-130.987-76.373-36.267-41.813-54.613-90.453-54.613-145.92v-281.173h-84.907v-42.667h640v42.667h-85.333zM704 213.334h-384v281.173c0 52.053 18.773 96 55.893 132.267 37.547 36.267 82.773 54.613 136.107 54.613s98.56-18.347 136.107-54.613c37.12-36.267 55.893-80.64 55.893-132.267v-281.173zM467.2 97.28c12.8-8.107 27.733-11.947 44.8-11.947 18.347 0 33.707 3.84 45.653 11.947s18.347 18.347 18.347 30.72h-128c0-12.373 6.4-22.613 19.2-30.72z" />
<glyph unicode="&#xe92f;" glyph-name="notes" data-tags="notes" d="M282.453 42.667c-20.053 0-36.267 6.4-49.493 19.627s-19.627 29.867-19.627 49.493v629.76c0 20.053 6.4 36.267 19.627 49.493s29.867 19.627 49.493 19.627h336.213l192-192v-506.88c0-20.053-6.4-36.267-19.627-49.493s-29.867-19.627-49.493-19.627h-459.093zM597.333 597.334v170.667h-314.88c-7.253 0-13.227-2.56-18.773-8.107-5.547-5.12-8.107-11.52-8.107-18.773v-629.333c0-7.253 2.56-13.227 8.107-18.773 5.12-5.547 11.52-8.107 18.773-8.107h458.667c7.253 0 13.227 2.56 18.773 8.107 5.547 5.12 8.107 11.52 8.107 18.773v485.547h-170.667zM682.667 256v-42.667h-341.333v42.667h341.333zM682.667 384v-42.667h-341.333v42.667h341.333zM512 554.667v-42.667h-170.667v42.667h170.667z" />
<glyph unicode="&#xe930;" glyph-name="new-task" data-tags="new-task" d="M490.667 149.334v554.667h42.667v-554.667h-42.667zM789.333 405.334h-554.667v42.667h554.667v-42.667z" />
<glyph unicode="&#xe931;" glyph-name="right" data-tags="navigate-next" d="M406.187 667.734l-29.867-29.867 211.627-211.627-211.627-211.2 29.867-29.867 241.493 241.067-241.493 241.493z" />
<glyph unicode="&#xe932;" glyph-name="left" data-tags="navigate-before" d="M617.813 667.734l29.867-29.867-211.627-211.627 211.627-211.2-29.867-29.867-241.493 241.067 241.493 241.493z" />
<glyph unicode="&#xe931;" glyph-name="navigate-next" data-tags="navigate-next" d="M406.187 667.734l-29.867-29.867 211.627-211.627-211.627-211.2 29.867-29.867 241.493 241.067-241.493 241.493z" />
<glyph unicode="&#xe932;" glyph-name="navigate-before" data-tags="navigate-before" d="M617.813 667.734l29.867-29.867-211.627-211.627 211.627-211.2-29.867-29.867-241.493 241.067 241.493 241.493z" />
<glyph unicode="&#xe933;" glyph-name="move" data-tags="move" d="M309.333 106.667l-29.44 29.44 84.053 84.053c-76.8 1.28-142.507 26.453-197.12 75.947-54.187 49.493-81.493 111.787-81.493 187.307s25.6 135.68 76.373 186.88c51.2 50.773 113.493 76.373 186.88 76.373h101.547v-40.533h-101.547c-61.44 0-113.92-21.76-157.44-65.28s-65.28-96-65.28-157.44 22.187-114.773 66.56-155.307c44.373-40.96 101.547-63.147 171.947-67.413l-84.053 84.053 29.44 29.44 132.693-133.547-132.693-133.547zM896 704v-170.667h-256v170.667h256zM640 746.667c-23.467 0-42.667-19.2-42.667-42.667v-170.667c0-23.467 19.2-42.667 42.667-42.667h256c23.467 0 42.667 19.2 42.667 42.667v170.667c0 23.467-19.2 42.667-42.667 42.667h-256zM597.333 362.667c0 23.467 19.2 42.667 42.667 42.667h256c23.467 0 42.667-19.2 42.667-42.667v-170.667c0-23.467-19.2-42.667-42.667-42.667h-256c-23.467 0-42.667 19.2-42.667 42.667v170.667z" />
<glyph unicode="&#xe934;" glyph-name="more-vert" data-tags="more-vert" d="M542.293 140.8c8.107 8.533 12.373 18.347 12.373 29.867 0 11.947-4.267 22.187-12.373 30.293s-18.347 12.373-30.293 12.373-22.187-4.267-30.293-12.373c-8.107-8.107-12.373-18.347-12.373-30.293 0-11.52 4.267-21.333 12.373-29.867s18.347-12.8 30.293-12.8 22.187 4.267 30.293 12.8zM542.293 396.8c8.107 8.533 12.373 18.347 12.373 29.867 0 11.947-4.267 22.187-12.373 30.293s-18.347 12.373-30.293 12.373-22.187-4.267-30.293-12.373-12.373-18.347-12.373-30.293c0-11.52 4.267-21.333 12.373-29.867s18.347-12.8 30.293-12.8 22.187 4.267 30.293 12.8zM542.293 652.8c8.107 8.533 12.373 18.347 12.373 29.867 0 11.947-4.267 22.187-12.373 30.293s-18.347 12.373-30.293 12.373-22.187-4.267-30.293-12.373c-8.107-8.107-12.373-18.347-12.373-30.293 0-11.52 4.267-21.333 12.373-29.867s18.347-12.8 30.293-12.8 22.187 4.267 30.293 12.8z" />
<glyph unicode="&#xe935;" glyph-name="more-hori" data-tags="more-hori" d="M226.133 396.374c8.533-8.107 18.347-12.373 29.867-12.373 11.947 0 22.187 4.267 30.293 12.373s12.373 18.347 12.373 30.293-4.267 22.187-12.373 30.293c-8.107 8.107-18.347 12.373-30.293 12.373-11.52 0-21.333-4.267-29.867-12.373s-12.8-18.347-12.8-30.293 4.267-22.187 12.8-30.293zM482.133 396.374c8.533-8.107 18.347-12.373 29.867-12.373 11.947 0 22.187 4.267 30.293 12.373s12.373 18.347 12.373 30.293-4.267 22.187-12.373 30.293-18.347 12.373-30.293 12.373c-11.52 0-21.333-4.267-29.867-12.373s-12.8-18.347-12.8-30.293 4.267-22.187 12.8-30.293zM738.133 396.374c8.533-8.107 18.347-12.373 29.867-12.373 11.947 0 22.187 4.267 30.293 12.373s12.373 18.347 12.373 30.293-4.267 22.187-12.373 30.293c-8.107 8.107-18.347 12.373-30.293 12.373-11.52 0-21.333-4.267-29.867-12.373s-12.8-18.347-12.8-30.293 4.267-22.187 12.8-30.293z" />
@ -92,7 +93,7 @@
<glyph unicode="&#xe940;" glyph-name="import" data-tags="import" d="M533.333 21.334v472.747l89.6-89.6 29.867 30.72-140.8 140.8-140.8-140.8 29.867-30.72 89.6 89.6v-472.747h42.667zM789.333 277.334h-128v42.667h117.333c5.973 0 10.667 4.693 10.667 10.667v448c0 5.973-4.693 10.667-10.667 10.667h-533.333c-5.973 0-10.667-4.693-10.667-10.667v-448c0-5.973 4.693-10.667 10.667-10.667h117.333v-42.667h-128c-23.467 0-42.667 19.2-42.667 42.667v469.333c0 23.467 19.2 42.667 42.667 42.667h554.667c23.467 0 42.667-19.2 42.667-42.667v-469.333c0-23.467-19.2-42.667-42.667-42.667z" />
<glyph unicode="&#xe941;" glyph-name="help" data-tags="help" d="M512 42.667c-53.333 0-103.253 10.24-149.76 30.293-46.507 20.48-87.040 47.787-121.6 82.347s-61.867 75.093-82.347 121.6c-20.053 46.507-30.293 96.427-30.293 149.76s10.24 103.253 30.293 149.76c20.48 46.507 47.787 87.040 82.347 121.6s75.093 61.867 121.6 82.347c46.507 20.053 96.427 30.293 149.76 30.293s103.253-10.24 149.76-30.293c46.507-20.48 87.040-47.787 121.6-82.347s61.867-75.093 81.92-121.6c20.053-46.507 30.293-96.427 30.293-149.76s-10.24-103.253-30.293-149.76c-20.48-46.507-47.787-87.040-81.92-121.6s-75.093-61.867-121.6-82.347c-46.507-20.053-96.427-30.293-149.76-30.293zM512 85.334c95.147 0 175.787 32.853 241.92 99.413 66.133 66.133 99.413 146.773 99.413 241.92s-32.853 175.787-99.413 242.347c-66.133 66.133-146.773 98.987-241.92 98.987s-175.787-33.28-242.347-98.987c-66.133-66.133-98.987-146.773-98.987-242.347s33.28-175.787 98.987-241.92c66.133-66.133 146.773-99.413 242.347-99.413zM512 341.334h-42.667c3.413 25.173 9.387 32.427 13.653 42.667 7.68 15.787 36.267 45.653 61.013 68.267 12.8 11.947 23.040 23.893 31.147 34.987s11.52 24.32 11.52 39.68c0 18.347-6.4 34.987-19.2 49.92s-33.28 22.613-61.013 22.613c-23.467 0-41.813-5.973-54.187-17.493-12.8-11.947-22.613-25.6-29.867-40.96l-38.4 16.213c9.813 22.187 25.6 41.387 46.933 58.027s47.36 25.173 77.653 25.173 59.733-9.813 83.627-29.867c23.893-20.053 35.84-46.933 35.84-81.067 0-20.053-4.693-37.547-14.080-52.053-9.387-14.933-23.467-32-42.667-51.2-18.347-17.92-30.72-31.573-40.533-41.813-8.107-9.813-18.347-20.48-19.2-42.667zM520.533 225.707c-8.533-8.107-18.773-12.373-30.293-12.373s-21.76 4.267-29.867 12.373-12.373 17.92-12.373 29.867c0 12.8 4.267 23.040 12.373 31.147s17.92 12.373 29.867 12.373 21.76-4.267 30.293-12.373c8.533-8.107 12.8-18.347 12.8-31.147 0-11.947-4.267-21.76-12.8-29.867z" />
<glyph unicode="&#xe942;" glyph-name="help-s" data-tags="help-s" d="M514.987 240.64c7.253 0 13.653 2.56 18.773 7.68s7.68 11.52 7.68 18.773-2.56 13.653-7.68 18.773c-5.12 5.12-11.52 7.68-18.773 7.68s-13.653-2.56-18.773-7.68c-5.12-5.12-7.68-11.52-7.68-18.773s2.56-13.653 7.68-18.773c5.12-5.12 11.52-7.68 18.773-7.68zM496.64 357.547h33.28c0.853 17.92 3.413 30.72 7.68 37.973 4.267 7.68 11.093 16.213 20.48 26.027 21.333 20.48 35.413 37.547 42.24 50.347s10.24 26.453 10.24 40.533c0 27.307-8.96 50.773-26.453 69.973s-40.533 29.013-68.693 29.013c-22.187 0-42.667-5.973-61.44-18.347-19.2-11.947-32.853-28.587-41.813-48.64l32-14.507c8.107 18.773 17.92 31.573 29.867 38.4s24.747 9.813 38.827 9.813c20.48 0 37.12-5.973 48.64-17.493 11.947-11.947 17.92-26.88 17.92-44.8 0-14.080-4.267-26.027-13.227-36.267-8.533-9.813-18.773-20.48-29.867-31.573-15.36-14.933-25.6-29.013-31.147-42.667s-8.107-29.44-8.107-48.213zM512.427 120.747c-41.813 0-81.493 8.107-118.613 23.893s-69.547 37.973-97.707 65.707c-27.733 27.733-49.92 60.587-65.707 97.707s-23.893 76.8-23.893 118.613 8.107 82.347 23.893 119.040c15.787 36.693 37.973 69.12 65.707 97.28 27.733 27.733 60.587 49.92 97.707 65.707s76.8 23.893 118.613 23.893 82.347-8.107 119.040-23.893 69.12-37.973 97.28-65.707c27.733-27.733 49.92-60.16 65.707-97.28 15.787-36.693 23.893-76.373 23.893-119.040s-8.107-81.493-23.893-118.613c-15.787-37.12-37.973-69.547-65.707-97.707-27.733-27.733-60.16-49.92-97.28-65.707-36.693-15.787-76.373-23.893-119.040-23.893zM512.427 149.334c77.227 0 142.507 26.88 196.267 81.067 53.76 53.76 81.067 119.467 81.067 196.267s-26.88 142.507-81.067 196.267c-53.76 53.76-119.467 81.067-196.267 81.067s-142.507-26.88-196.267-81.067c-53.76-53.76-81.067-119.467-81.067-196.267s26.88-142.507 81.067-196.267c53.76-53.76 119.467-81.067 196.267-81.067z" />
<glyph unicode="&#xe943;" glyph-name="hamburger" data-tags="hamburger-menu" d="M853.333 597.334h-682.667v-42.667h682.667v42.667zM853.333 298.667h-682.667v-42.667h682.667v42.667z" />
<glyph unicode="&#xe943;" glyph-name="hamburger-menu" data-tags="hamburger-menu" d="M853.333 597.334h-682.667v-42.667h682.667v42.667zM853.333 298.667h-682.667v-42.667h682.667v42.667z" />
<glyph unicode="&#xe944;" glyph-name="hamburger-big" data-tags="hamburger-big" d="M597.333 661.334h-426.667v-42.667h426.667v42.667zM853.333 447.574h-682.667v-42.667h682.667v42.667zM597.333 234.667h-426.667v-42.667h426.667v42.667z" />
<glyph unicode="&#xe945;" glyph-name="grid-view" data-tags="grid-view" d="M170.667 469.334v256c0 23.467 19.2 42.667 42.667 42.667h256v-298.667h-298.667zM213.333 85.334c-23.467 0-42.667 19.2-42.667 42.667v256h298.667v-298.667h-256zM554.667 469.334v298.667h256c23.467 0 42.667-19.2 42.667-42.667v-256h-298.667zM554.667 85.334v298.667h298.667v-256c0-23.467-19.2-42.667-42.667-42.667h-256zM213.333 512h213.333v213.333h-213.333v-213.333zM597.333 512h213.333v213.333h-213.333v-213.333zM597.333 128h213.333v213.333h-213.333v-213.333zM213.333 128h213.333v213.333h-213.333v-213.333z" />
<glyph unicode="&#xe946;" glyph-name="folder" data-tags="folder" d="M876.8 641.707c-13.227 13.227-29.867 19.627-49.493 19.627h-314.027l-42.667 42.667h-273.067c-19.627 0-36.267-6.4-49.493-19.627s-19.627-29.44-19.627-48.64v-417.28c0-20.053 6.4-36.267 19.627-49.493s29.867-19.627 49.493-19.627h629.333c20.053 0 36.267 6.4 49.493 19.627s19.627 29.867 19.627 49.493v373.76c0 20.053-6.4 36.267-19.627 49.493h0.427zM853.76 218.88c0-7.68-2.56-14.080-7.253-19.2s-11.52-7.253-19.2-7.253h-630.187c-7.68 0-14.080 2.56-19.2 7.253-5.12 5.12-7.253 11.52-7.253 19.2v416.853c0 7.253 2.56 13.227 7.253 17.92s11.52 7.68 19.2 7.68h255.147l42.667-42.667h331.947c7.68 0 14.080-2.56 19.2-7.253s7.253-11.52 7.253-19.2v-373.76z" />
@ -107,8 +108,8 @@
<glyph unicode="&#xe94f;" glyph-name="edit" data-tags="edit" d="M214.187 129.707h46.933l432.64 439.467-46.933 47.787-432.64-439.467v-47.787zM787.627 601.6l-109.227 110.080 34.987 35.413c13.227 14.080 29.44 20.907 49.067 20.907s35.84-6.827 49.067-20.907l28.587-29.013c8.533-8.107 13.227-18.347 13.227-31.147s-3.84-23.040-11.947-31.147l-53.333-54.187zM756.053 569.6l-476.16-483.84h-109.227v110.933l476.16 483.413 109.227-110.933z" />
<glyph unicode="&#xe950;" glyph-name="duplicate" data-tags="duplicate" d="M618.667 682.24h-42.667v-85.333h-85.333v-42.667h85.333v-85.333h42.667v85.333h85.333v42.667h-85.333v85.333zM704 383.574h-213.333v-42.667h213.333v42.667zM200.107 50.347c-5.547 5.12-8.107 11.52-8.107 18.773v527.787h-42.667v-528.213c0-20.053 6.4-36.267 19.627-49.493s29.867-19.627 49.493-19.627h400.213v42.667h-400.213c-7.253 0-13.227 2.56-18.773 8.107h0.427zM832 239.36c0-7.253-2.56-13.227-8.107-18.773-5.12-5.547-11.52-8.107-18.773-8.107h-416c-7.253 0-13.227 2.56-18.773 8.107-5.547 5.12-8.107 11.52-8.107 18.773v544.853c0 7.253 2.56 13.227 8.107 18.773 5.12 5.547 11.52 8.107 18.773 8.107h296.96l-42.667 42.667h-254.293c-20.053 0-36.267-6.4-49.493-19.627s-19.627-29.867-19.627-49.493v-544.853c0-20.053 6.4-36.267 19.627-49.493s29.867-19.627 49.493-19.627h416.427c20.053 0 36.267 6.4 49.493 19.627s19.627 29.867 19.627 49.493v382.72l-42.667 42.667v-425.387zM704 853.334h-60.16l230.827-230.827v60.16l-170.667 170.667z" />
<glyph unicode="&#xe951;" glyph-name="drag" data-tags="drag" d="M384 640c-11.52 0-21.76 4.267-29.867 12.8-8.533 8.533-12.8 18.347-12.8 29.867s4.267 21.76 12.8 29.867c8.533 8.533 18.347 12.8 29.867 12.8s21.76-4.267 29.867-12.8c8.533-8.533 12.8-18.347 12.8-29.867s-4.267-21.76-12.8-29.867c-8.533-8.533-18.347-12.8-29.867-12.8zM640 640c-11.52 0-21.76 4.267-29.867 12.8-8.533 8.533-12.8 18.347-12.8 29.867s4.267 21.76 12.8 29.867c8.533 8.533 18.347 12.8 29.867 12.8s21.76-4.267 29.867-12.8c8.533-8.533 12.8-18.347 12.8-29.867s-4.267-21.76-12.8-29.867c-8.533-8.533-18.347-12.8-29.867-12.8zM384 384c-11.52 0-21.76 4.267-29.867 12.8-8.533 8.533-12.8 18.347-12.8 29.867s4.267 21.76 12.8 29.867c8.533 8.533 18.347 12.8 29.867 12.8s21.76-4.267 29.867-12.8c8.533-8.533 12.8-18.347 12.8-29.867s-4.267-21.76-12.8-29.867c-8.533-8.533-18.347-12.8-29.867-12.8zM640 384c-11.52 0-21.76 4.267-29.867 12.8-8.533 8.533-12.8 18.347-12.8 29.867s4.267 21.76 12.8 29.867c8.533 8.533 18.347 12.8 29.867 12.8s21.76-4.267 29.867-12.8c8.533-8.533 12.8-18.347 12.8-29.867s-4.267-21.76-12.8-29.867c-8.533-8.533-18.347-12.8-29.867-12.8zM384 128c-11.52 0-21.76 4.267-29.867 12.8-8.533 8.533-12.8 18.347-12.8 29.867s4.267 21.76 12.8 29.867c8.533 8.533 18.347 12.8 29.867 12.8s21.76-4.267 29.867-12.8c8.533-8.533 12.8-18.347 12.8-29.867s-4.267-21.76-12.8-29.867c-8.533-8.533-18.347-12.8-29.867-12.8zM640 128c-11.52 0-21.76 4.267-29.867 12.8-8.533 8.533-12.8 18.347-12.8 29.867s4.267 21.76 12.8 29.867c8.533 8.533 18.347 12.8 29.867 12.8s21.76-4.267 29.867-12.8c8.533-8.533 12.8-18.347 12.8-29.867s-4.267-21.76-12.8-29.867c-8.533-8.533-18.347-12.8-29.867-12.8z" />
<glyph unicode="&#xe952;" glyph-name="double-left" data-tags="double-navigate-before" d="M503.467 200.534l-226.133 226.133 226.133 226.133 29.867-29.867-196.267-196.267 196.267-196.267-29.867-29.867zM716.8 200.534l-226.133 226.133 226.133 226.133 29.867-29.867-196.267-196.267 196.267-196.267-29.867-29.867z" />
<glyph unicode="&#xe953;" glyph-name="double-right" data-tags="double-navigate-after" d="M520.533 652.8l226.133-226.133-226.133-226.133-29.867 29.867 196.267 196.267-196.267 196.267 29.867 29.867zM307.2 652.8l226.133-226.133-226.133-226.133-29.867 29.867 196.267 196.267-196.267 196.267 29.867 29.867z" />
<glyph unicode="&#xe952;" glyph-name="double-navigate-before" data-tags="double-navigate-before" d="M503.467 200.534l-226.133 226.133 226.133 226.133 29.867-29.867-196.267-196.267 196.267-196.267-29.867-29.867zM716.8 200.534l-226.133 226.133 226.133 226.133 29.867-29.867-196.267-196.267 196.267-196.267-29.867-29.867z" />
<glyph unicode="&#xe953;" glyph-name="double-navigate-after" data-tags="double-navigate-after" d="M520.533 652.8l226.133-226.133-226.133-226.133-29.867 29.867 196.267 196.267-196.267 196.267 29.867 29.867zM307.2 652.8l226.133-226.133-226.133-226.133-29.867 29.867 196.267 196.267-196.267 196.267 29.867 29.867z" />
<glyph unicode="&#xe954;" glyph-name="dot-small" data-tags="dot-small" d="M512.427 490.667c-35.413 0-64.427-29.013-64.427-63.573s29.013-64.427 64.427-64.427 63.573 29.013 63.573 64.427-29.013 63.573-63.573 63.573z" />
<glyph unicode="&#xe955;" glyph-name="delete" data-tags="delete" d="M325.12 85.334c-19.2 0-35.413 6.827-49.067 20.053s-20.053 29.867-20.053 49.067v528.213h-42.667v42.667h170.667v42.667h256v-42.667h170.667v-42.667h-42.667v-527.787c0-20.053-6.4-36.267-19.627-49.493s-29.867-19.627-49.493-19.627h-373.76zM725.333 682.667h-426.667v-527.787c0-7.68 2.56-14.080 7.68-19.2s11.52-7.253 19.2-7.253h373.333c7.253 0 13.227 2.56 18.773 8.107 5.547 5.12 8.107 11.52 8.107 18.773v527.36zM298.667 682.667v0zM426.667 597.334h42.667v-384h-42.667v384zM554.667 597.334h42.667v-384h-42.667v384z" />
<glyph unicode="&#xe956;" glyph-name="dashboard" data-tags="dashboard" d="M256 90.027c-23.467 0-42.667 19.2-42.667 42.667v404.907c0 13.653 6.827 26.88 17.92 34.56l256 183.040c14.933 10.667 34.56 10.667 49.493 0l256-183.040c11.093-8.107 17.92-20.907 17.92-34.56v-404.907c0-23.467-19.2-42.667-42.667-42.667h-128c-23.467 0-42.667 19.2-42.667 42.667v256h-170.667v-256c0-23.467-19.2-42.667-42.667-42.667h-128zM256 132.694h128v256c0 23.467 19.2 42.667 42.667 42.667h170.667c23.467 0 42.667-19.2 42.667-42.667v-256h128v405.333l-256 180.053-256-180.053v-405.333z" />
@ -116,9 +117,9 @@
<glyph unicode="&#xe958;" glyph-name="courses" data-tags="courses" d="M506.027 745.387c2.987 1.707 6.827 1.707 9.813 0l368.64-214.613c7.253-3.84 10.667-11.093 10.667-18.773v-170.667c0-11.947-8.96-21.333-20.053-21.333s-20.053 9.387-20.053 21.333v134.4l-80.64-46.933v-172.8c0-8.107-4.267-15.787-11.093-19.2l-242.347-128c-5.547-2.987-12.373-2.987-17.92 0l-242.347 128c-6.827 3.84-11.093 11.093-11.093 19.2v172.8l-110.933 64.427c-14.080 8.107-14.080 29.44 0 37.547l368.64 214.613zM190.72 512l321.707-187.307 321.707 187.307-321.707 187.307-321.707-187.307zM734.72 405.334l-217.6-126.72c-2.987-1.707-6.827-1.707-9.813 0l-217.6 126.72v-136.107l222.293-117.333 222.293 117.333v136.107z" />
<glyph unicode="&#xe959;" glyph-name="comments" data-tags="comments" d="M128 62.294v659.2c0 20.053 6.4 36.267 19.627 49.493s29.867 19.627 49.493 19.627h629.333c20.053 0 36.267-6.4 49.493-19.627s19.627-29.867 19.627-49.493v-458.667c0-20.053-6.4-36.267-19.627-49.493s-29.867-19.627-49.493-19.627h-567.467l-130.987-131.413zM170.667 165.974l70.4 70.4h585.387c7.68 0 14.080 2.56 19.2 7.68s7.253 11.52 7.253 19.2v458.24c0 7.68-2.56 14.080-7.253 19.2-5.12 5.12-11.52 7.68-19.2 7.68h-629.333c-7.68 0-14.080-2.56-19.2-7.68s-7.68-11.52-7.68-19.2v-555.52zM170.667 721.494v0zM725.333 535.040h-426.667v42.667h426.667v-42.667zM725.333 407.040h-426.667v42.667h426.667v-42.667z" />
<glyph unicode="&#xe95a;" glyph-name="collapse" data-tags="collapse" d="M810.667 426.667v42.667h-256v256h-42.667v-298.667h298.667zM823.040 768l-283.733-283.733 30.293-30.293 283.733 283.733-30.293 30.293zM213.333 426.667v-42.667h256v-256h42.667v298.667h-298.667zM453.973 399.36l-283.733-283.733 30.293-30.293 283.733 283.733-30.293 30.293z" />
<glyph unicode="&#xe95b;" glyph-name="close" data-tags="close-remove" d="M273.067 157.867l-29.867 29.867 238.933 238.933-238.933 238.933 29.867 29.867 238.933-238.933 238.933 238.933 29.867-29.867-238.933-238.933 238.933-238.933-29.867-29.867-238.933 238.933-238.933-238.933z" />
<glyph unicode="&#xe95c;" glyph-name="close-small" data-tags="close-remove-small" d="M331.093 637.867l-30.293-30.293 392.107-392.107 30.293 30.293-392.107 392.107zM300.8 245.76l30.293-30.293 392.107 392.107-30.293 30.293-392.107-392.107z" />
<glyph unicode="&#xe95d;" glyph-name="up" data-tags="close-hide" d="M512 554.667l213.333-225.28-28.16-30.72-185.173 195.413-185.173-195.413-28.16 30.72 213.333 225.28z" />
<glyph unicode="&#xe95b;" glyph-name="close-remove" data-tags="close-remove" d="M273.067 157.867l-29.867 29.867 238.933 238.933-238.933 238.933 29.867 29.867 238.933-238.933 238.933 238.933 29.867-29.867-238.933-238.933 238.933-238.933-29.867-29.867-238.933 238.933-238.933-238.933z" />
<glyph unicode="&#xe95c;" glyph-name="close-remove-small" data-tags="close-remove-small" d="M331.093 637.867l-30.293-30.293 392.107-392.107 30.293 30.293-392.107 392.107zM300.8 245.76l30.293-30.293 392.107 392.107-30.293 30.293-392.107-392.107z" />
<glyph unicode="&#xe95d;" glyph-name="close-hide" data-tags="close-hide" d="M512 554.667l213.333-225.28-28.16-30.72-185.173 195.413-185.173-195.413-28.16 30.72 213.333 225.28z" />
<glyph unicode="&#xe95e;" glyph-name="checkllist" data-tags="checkllist" d="M281.6 541.44l-68.267 68.267 30.293 30.293 37.973-38.4 123.733 123.733 30.293-30.293-154.027-153.6zM810.667 640h-298.667v-42.667h298.667v42.667zM810.667 256h-298.667v-42.667h298.667v42.667zM324.267 298.667c35.413 0 64-28.587 64-64s-28.587-64-64-64-64 28.587-64 64 28.587 64 64 64zM324.267 341.334c-58.88 0-106.667-47.787-106.667-106.667s47.787-106.667 106.667-106.667 106.667 47.787 106.667 106.667-47.787 106.667-106.667 106.667z" />
<glyph unicode="&#xe95f;" glyph-name="check" data-tags="check" d="M407.467 200.96l-212.053 211.2 30.72 31.147 181.333-181.333 390.4 390.4 30.72-30.72-421.547-420.267z" />
<glyph unicode="&#xe960;" glyph-name="card-view" data-tags="card-view" d="M832 704h-640c-23.467 0-42.667-19.2-42.667-42.667v-469.333c0-23.467 19.2-42.667 42.667-42.667h640c23.467 0 42.667 19.2 42.667 42.667v469.333c0 23.467-19.2 42.667-42.667 42.667zM661.333 661.334v-128h-128v128h128zM533.333 490.667h128v-128h-128v128zM490.667 362.667h-128v128h128v-128zM490.667 661.334v-128h-128v128h128zM192 661.334h128v-128h-128v128zM192 490.667h128v-128h-128v128zM192 192v128h128v-128h-128zM362.667 192v128h128v-128h-128zM533.333 192v128h128v-128h-128zM832 192h-128v128h128v-128zM832 362.667h-128v128h128v-128zM832 533.334h-128v128h128v-128z" />
@ -131,4 +132,18 @@
<glyph unicode="&#xe967;" glyph-name="approval-small" data-tags="approval-small" d="M316.16 446.294l-29.867 30.293-30.293-30.293 151.040-150.613 29.867 30.293-29.867 29.867-90.88 90.453zM648.107 597.334l-151.040-151.040 30.293-30.293 151.040 151.040-30.293 30.293zM768.853 597.334l-241.493-241.493-120.32 120.747-30.293-30.293 150.613-150.613 271.787 271.36-30.293 30.293z" />
<glyph unicode="&#xe968;" glyph-name="add-user" data-tags="add-user" d="M768 384v128h-128v42.667h128v128h42.667v-128h128v-42.667h-128v-128h-42.667zM85.333 170.667v59.733c0 20.053 5.12 37.12 15.36 51.2s23.893 25.6 40.96 34.133c37.12 17.92 73.813 32 110.507 42.24s80.64 15.36 131.84 15.36 95.147-5.12 131.84-15.36c36.693-10.24 73.387-24.32 110.507-42.24 17.067-8.533 30.72-20.053 40.96-34.133s15.36-31.147 15.36-51.2v-59.733h-597.333zM384 469.334c-35.413 0-65.707 12.373-90.453 37.547s-37.547 55.040-37.547 90.453 12.373 64.853 37.547 90.027c24.747 25.173 55.040 37.973 90.453 37.973s64.853-12.8 90.027-37.973c25.173-25.173 37.973-55.467 37.973-90.027s-12.8-65.707-37.973-90.453c-25.173-24.747-55.467-37.547-90.027-37.547zM128 213.334h512v17.067c0 9.813-2.56 18.773-7.68 26.027-5.12 7.68-13.653 14.933-26.453 21.76-32 17.067-65.707 29.867-100.693 38.827-35.413 8.96-75.52 13.227-121.173 13.227s-85.76-4.267-121.173-13.227c-35.413-8.96-68.693-21.76-100.693-38.827-12.8-7.253-21.76-14.507-26.453-21.76-5.12-7.253-7.253-16.213-7.253-26.027v-17.067zM384 512c23.467 0 43.52 8.533 60.16 25.173s25.173 36.693 25.173 60.16-8.533 43.52-25.173 60.16c-16.64 16.64-36.693 25.173-60.16 25.173s-43.52-8.533-60.16-25.173c-16.64-16.64-25.173-36.693-25.173-60.16s8.533-43.52 25.173-60.16c16.64-16.64 36.693-25.173 60.16-25.173z" />
<glyph unicode="&#xe969;" glyph-name="activities" data-tags="activities" d="M448 170.667c-8.96 0-17.493 5.973-20.053 14.507l-80.64 241.493h-155.307c-11.947 0-21.333 9.387-21.333 21.333s9.387 21.333 21.333 21.333h170.667c8.96 0 17.493-5.973 20.053-14.507l58.88-177.067 70.827 387.413c1.707 9.387 9.387 16.64 19.2 17.493 10.24 0.427 18.347-4.693 21.76-13.653l100.267-266.667 8.107 49.493c1.707 10.24 10.667 17.92 20.907 17.92h149.333c11.947 0 21.333-9.387 21.333-21.333s-9.387-21.333-21.333-21.333h-131.413l-18.347-110.080c-1.707-9.387-9.387-16.64-19.2-17.92-9.813-0.427-18.773 4.693-22.187 13.653l-100.693 268.8-71.68-393.387c-1.707-9.387-9.813-16.64-19.627-17.493h-0.853z" />
<glyph unicode="&#xe96a;" glyph-name="send-comment" data-tags="send-comment" d="M512 746.667c164.693 0 298.667-133.973 298.667-298.667s-133.973-298.667-298.667-298.667c-164.693 0-298.667 133.973-298.667 298.667s133.973 298.667 298.667 298.667zM512 789.333c-188.587 0-341.333-152.747-341.333-341.333s152.747-341.333 341.333-341.333c188.587 0 341.333 152.747 341.333 341.333s-152.747 341.333-341.333 341.333zM620.8 450.133l29.867 29.867-108.8 108.373-29.867 30.293-138.667-138.667 30.293-29.867 87.040 87.040v-259.84h42.667v259.84l87.467-87.040z" />
<glyph unicode="&#xe96b;" glyph-name="assign-to-task" data-tags="assign-to-task" d="M282.453 64c-20.053 0-36.267 6.4-49.493 19.627s-19.627 29.867-19.627 49.493v629.76c0 20.053 6.4 36.267 19.627 49.493s29.867 19.627 49.493 19.627h336.213l192-192v-506.88c0-20.053-6.4-36.267-19.627-49.493s-29.867-19.627-49.493-19.627h-459.093zM597.333 618.667v170.667h-314.88c-7.253 0-13.227-2.56-18.773-8.107-5.547-5.12-8.107-11.52-8.107-18.773v-629.333c0-7.253 2.56-13.227 8.107-18.773 5.12-5.547 11.52-8.107 18.773-8.107h458.667c7.253 0 13.227 2.56 18.773 8.107 5.547 5.12 8.107 11.52 8.107 18.773v485.547h-170.667zM607.573 377.173l-6.4 6.827h-259.84v-42.667h259.84l21.333 21.333-14.933 14.507zM561.92 483.413l-14.933-15.36-15.36-14.933 69.547-69.12 6.4-6.827 14.933-14.507-90.453-90.453h-0.427l15.36-14.933 14.933-15.36 120.747 120.747-120.747 120.747z" />
<glyph unicode="&#xe96c;" glyph-name="arrow-down" data-tags="arrow-down" d="M733.15 350.929l-30.293 29.867-189.867-189.867v558.508h-42.667v-558.508l-189.868 189.867-29.867-29.867 211.201-211.2 29.867-30.293 241.493 241.493z" />
<glyph unicode="&#xe96d;" glyph-name="arrow-up" data-tags="arrow-up" d="M250.589 507.934l30.293-29.867 189.868 189.867v-558.507h42.667v558.507l189.867-189.867 29.867 29.867-211.2 211.2-29.867 30.293-241.495-241.493z" />
<glyph unicode="&#xe96e;" glyph-name="signature" data-tags="signature" d="M202.874 577.568l46.080 32.853c7.253 4.693 15.36 7.253 23.040 7.253 8.96 0 18.347-3.413 26.027-10.24 13.653-12.373 18.773-31.573 11.52-49.493l-111.36-294.398c-2.133-5.12-1.707-13.227 2.133-19.627 6.4-10.24 22.613-12.8 31.147-2.987 53.76 56.747 179.627 183.893 241.491 236.373l22.187 18.773 5.973 5.12-2.56-37.12c-2.133-32.427-2.133-63.147 20.053-88.747 13.653-16.64 34.56-24.747 62.293-24.747 36.267 0 68.693 14.507 110.933 34.56 11.947 5.12 29.013 15.787 46.933 26.88 31.147 18.773 65.707 40.107 95.573 48.64 10.667 2.987 19.2 12.8 19.2 24.32 0 13.227-10.667 23.467-23.040 20.053-35.84-10.667-78.080-35.413-110.933-55.040-17.067-10.24-32.427-19.2-44.373-25.173-34.987-16.64-66.133-30.293-93.013-30.293-13.653 0-24.32 4.267-31.573 12.8-11.947 14.080-12.373 36.267-8.96 67.84 4.267 31.147 0.853 54.187-8.533 65.278-5.12 5.547-12.8 8.533-22.613 7.253-29.867-2.56-83.2-44.798-183.465-146.345l-53.333-53.76 75.947 195.412c13.227 35.84 3.84 75.093-25.173 99.413-23.040 18.773-61.013 29.44-100.693 2.987l-43.947-31.573c-9.387-6.827-12.373-20.053-5.973-29.867 6.4-10.24 19.627-13.227 29.013-6.4z" />
<glyph unicode="&#xe96f;" glyph-name="industry" data-tags="industry" d="M341.333 384h-42.667v-170.667h42.667v170.667zM512 384h-42.667v-170.667h42.667v170.667zM859.733 810.667h-50.773l-40.96-298.667h-213.333v107.52l-213.333-85.333v83.627l-213.333-90.88v-441.6h768v426.667l-36.267 298.667zM853.333 128h-682.667v369.92l128 56.747v-83.2l213.333 85.333v-87.467h341.333v-341.333zM682.667 384h-42.667v-170.667h42.667v170.667z" />
<glyph unicode="&#xe970;" glyph-name="alert-success" data-tags="alert-success" d="M450.628 281.271l272.9 272.902-30.195 30.195-242.705-242.707-121.602 121.6-30.195-30.195 151.797-151.795zM512.145 64c-53.103 0-103.026 10.078-149.773 30.229s-87.409 47.501-121.99 82.048c-34.579 34.547-61.954 75.174-82.126 121.877s-30.257 96.602-30.257 149.7c0 53.103 10.076 103.026 30.228 149.773s47.503 87.409 82.050 121.989c34.547 34.579 75.172 61.955 121.874 82.126s96.604 30.257 149.702 30.257c53.103 0 103.027-10.076 149.773-30.228s87.411-47.503 121.988-82.050c34.581-34.547 61.956-75.172 82.125-121.874 20.173-46.703 30.259-96.604 30.259-149.702 0-53.103-10.078-103.027-30.229-149.773s-47.501-87.411-82.048-121.988c-34.547-34.581-75.174-61.956-121.877-82.129-46.703-20.169-96.602-30.255-149.7-30.255zM512 106.667c95.287 0 176 33.067 242.133 99.2s99.2 146.846 99.2 242.133c0 95.289-33.067 176-99.2 242.133s-146.846 99.2-242.133 99.2c-95.289 0-176-33.067-242.133-99.2s-99.2-146.845-99.2-242.133c0-95.287 33.067-176 99.2-242.133s146.845-99.2 242.133-99.2z" />
<glyph unicode="&#xe971;" glyph-name="alert-warning" data-tags="alert-warning" d="M116.513 106.667l395.487 682.667 395.49-682.667h-790.977zM189.868 149.333h644.266l-322.133 554.667-322.132-554.667zM512 208.41c7.441 0 13.675 2.517 18.709 7.548 5.030 5.035 7.548 11.268 7.548 18.709s-2.517 13.675-7.548 18.709c-5.035 5.030-11.268 7.548-18.709 7.548-7.437 0-13.675-2.517-18.709-7.548-5.030-5.035-7.548-11.268-7.548-18.709s2.517-13.675 7.548-18.709c5.035-5.030 11.273-7.548 18.709-7.548zM490.667 303.59h42.667v213.333h-42.667v-213.333z" />
<glyph unicode="&#xe972;" glyph-name="alert-destructive" data-tags="alert-destructive" d="M512 259.281c7.441 0 13.675 2.517 18.709 7.548 5.030 5.035 7.548 11.273 7.548 18.709 0 7.441-2.517 13.675-7.548 18.709-5.035 5.030-11.268 7.548-18.709 7.548s-13.675-2.517-18.709-7.548c-5.030-5.035-7.548-11.268-7.548-18.709 0-7.437 2.517-13.675 7.548-18.709 5.035-5.030 11.268-7.548 18.709-7.548zM490.667 385.643h42.667v259.28h-42.667v-259.28zM370.051 106.667l-199.385 198.997v284.285l198.999 199.384h284.282l199.386-198.998v-284.283l-198.997-199.386h-284.285zM388.267 149.333h247.467l174.933 174.933v247.467l-174.933 174.933h-247.467l-174.933-174.933v-247.467l174.933-174.933z" />
<glyph unicode="&#xe973;" glyph-name="txt-t" data-tags="txt-t" d="M338.698 595.364v65.969h346.606v-65.969h-134.272v-360.697h-78.063v360.697h-134.271z" />
<glyph unicode="&#xe974;" glyph-name="txt-a" data-tags="txt-a" d="M394.378 230.784h-84l152.94 434.424h97.152l153.152-434.424h-84.002l-116.028 345.333h-3.396l-115.817-345.333zM397.135 401.118h229.092v-63.211h-229.092v63.211z" />
<glyph unicode="&#xe975;" glyph-name="file-pdf" data-tags="file-pdf" d="M234.667 64c-29.867 0-55.111 10.313-75.733 30.933s-30.933 45.867-30.933 75.733v554.667c0 29.867 10.311 55.111 30.933 75.733s45.867 30.933 75.733 30.933h554.667c29.867 0 55.113-10.311 75.733-30.933s30.933-45.867 30.933-75.733v-554.667c0-29.867-10.313-55.113-30.933-75.733s-45.867-30.933-75.733-30.933h-554.667zM234.667 106.667h554.667c17.779 0 32.883 6.229 45.312 18.688 12.459 12.429 18.688 27.533 18.688 45.312v554.667c0 17.778-6.229 32.882-18.688 45.312-12.429 12.459-27.533 18.688-45.312 18.688h-554.667c-17.778 0-32.882-6.229-45.312-18.688-12.459-12.43-18.688-27.534-18.688-45.312v-554.667c0-17.779 6.229-32.883 18.688-45.312 12.43-12.459 27.534-18.688 45.312-18.688zM256 330.308v203.025h76.134c15.597 0 28.683-2.91 39.257-8.725 10.64-5.815 18.67-13.811 24.089-23.987 5.486-10.112 8.228-21.611 8.228-34.5 0-13.018-2.743-24.585-8.228-34.697s-13.581-18.074-24.288-23.889c-10.706-5.751-23.891-8.627-39.554-8.627h-50.459v30.238h45.502c9.12 0 16.588 1.583 22.404 4.757 5.816 3.17 10.112 7.535 12.887 13.086 2.842 5.551 4.263 11.93 4.263 19.132s-1.421 13.547-4.263 19.034c-2.776 5.487-7.104 9.749-12.986 12.787-5.816 3.106-13.317 4.659-22.503 4.659h-33.705v-172.292h-36.779zM504.452 330.308h-68.796v203.025h70.187c20.156 0 37.47-4.066 51.942-12.194 14.541-8.064 25.711-19.661 33.51-34.795 7.795-15.134 11.695-33.242 11.695-54.327 0-21.146-3.93-39.322-11.797-54.524-7.795-15.198-19.063-26.863-33.805-34.991-14.669-8.128-32.316-12.194-52.937-12.194zM472.435 362.129h30.234c14.144 0 25.941 2.577 35.392 7.731 9.451 5.222 16.555 12.988 21.312 23.3 4.757 10.372 7.138 23.326 7.138 38.857s-2.381 28.42-7.138 38.665c-4.757 10.308-11.797 18.010-21.116 23.095-9.25 5.158-20.753 7.735-34.496 7.735h-31.326v-139.383zM637.935 330.308v203.025h130.065v-30.831h-93.286v-55.117h84.365v-30.831h-84.365v-86.246h-36.779z" />
<glyph unicode="&#xe976;" glyph-name="save" data-tags="save" d="M707.2 789.125h-467.627c-19.627 0-35.84-6.4-49.067-19.627s-19.627-29.44-19.627-49.067v-544.854c0-19.627 6.4-35.84 19.627-49.067s29.44-19.627 49.067-19.627h544.853c19.627 0 35.84 6.4 49.067 19.627s19.627 29.44 19.627 49.067v467.628l-145.92 145.92zM298.453 746.458h298.667v-106.667c0-11.947-9.387-21.333-21.333-21.333h-256c-11.947 0-21.333 9.387-21.333 21.333v106.667zM810.453 175.578c0-7.68-2.56-14.080-7.253-18.773-5.12-5.12-11.093-7.253-18.773-7.253h-544.853c-7.68 0-14.080 2.56-18.773 7.253-5.12 5.12-7.253 11.093-7.253 18.773v544.428c0 7.68 2.56 14.080 7.253 18.773 5.12 5.12 11.093 7.253 18.773 7.253h16.213v-127.573c0-23.467 19.2-42.667 42.667-42.667h298.667c23.467 0 42.667 19.2 42.667 42.667v128h49.067l121.6-121.6v-449.281zM511.787 447.791c-23.467 0-43.52-8.533-60.16-25.173s-25.173-36.693-25.173-60.16c0-23.467 8.533-43.52 25.173-60.16s36.693-25.173 60.16-25.173c23.467 0 43.52 8.533 60.16 25.173s25.173 36.693 25.173 60.16c0 23.467-8.533 43.52-25.173 60.16s-36.693 25.173-60.16 25.173z" />
<glyph unicode="&#xe977;" glyph-name="archived" data-tags="archived" d="M240 106.667c-19.911 0-36.437 6.571-49.579 19.712-13.17 13.171-19.755 29.709-19.755 49.621v457.6c0 7.111 0.882 13.696 2.645 19.755 1.792 6.030 4.466 11.534 8.021 16.512l53.333 62.933c4.978 4.978 10.667 8.533 17.067 10.667s13.155 3.2 20.267 3.2h480c7.113 0 13.867-0.711 20.267-2.133s12.087-5.333 17.067-11.733l51.2-62.933c4.979-4.978 8.363-10.482 10.155-16.512 1.762-6.059 2.645-12.643 2.645-19.755v-457.6c0-19.913-6.571-36.45-19.712-49.621-13.171-13.141-29.709-19.712-49.621-19.712h-544zM230.4 661.333h563.2l-36.267 42.667h-490.667l-36.267-42.667zM213.333 618.667v-442.667c0-7.113 2.674-13.325 8.021-18.645 5.319-5.346 11.534-8.021 18.645-8.021h544c7.113 0 13.325 2.675 18.645 8.021 5.346 5.321 8.021 11.533 8.021 18.645v442.667h-597.333zM298.667 277.333h426.667v-42.667h-426.667v42.667z" />
</font></defs></svg>

Before

Width:  |  Height:  |  Size: 81 KiB

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Binary file not shown.

View file

@ -1,15 +1,16 @@
@font-face {
font-family: 'SN-icon-font';
src:
url('fonts/SN-icon-font.ttf?cnjgbu') format('truetype'),
url('fonts/SN-icon-font.woff?cnjgbu') format('woff'),
url('fonts/SN-icon-font.svg?cnjgbu#SN-icon-font') format('svg');
src: url('fonts/SN-icon-font.eot?n7qhkp');
src: url('fonts/SN-icon-font.eot?n7qhkp#iefix') format('embedded-opentype'),
url('fonts/SN-icon-font.ttf?n7qhkp') format('truetype'),
url('fonts/SN-icon-font.woff?n7qhkp') format('woff'),
url('fonts/SN-icon-font.svg?n7qhkp#SN-icon-font') format('svg');
font-weight: normal;
font-style: normal;
font-display: block;
}
.sn-icon {
[class^="sn-icon-"], [class*=" sn-icon-"] {
/* use !important to prevent issues with browser extensions that change fonts */
font-family: 'SN-icon-font' !important;
speak: never;
@ -350,3 +351,45 @@
.sn-icon-activities:before {
content: "\e969";
}
.sn-icon-send-comment:before {
content: "\e96a";
}
.sn-icon-assign-to-task:before {
content: "\e96b";
}
.sn-icon-arrow-down:before {
content: "\e96c";
}
.sn-icon-arrow-up:before {
content: "\e96d";
}
.sn-icon-signature:before {
content: "\e96e";
}
.sn-icon-industry:before {
content: "\e96f";
}
.sn-icon-alert-success:before {
content: "\e970";
}
.sn-icon-alert-warning:before {
content: "\e971";
}
.sn-icon-alert-destructive:before {
content: "\e972";
}
.sn-icon-txt-t:before {
content: "\e973";
}
.sn-icon-txt-a:before {
content: "\e974";
}
.sn-icon-file-pdf:before {
content: "\e975";
}
.sn-icon-save:before {
content: "\e976";
}
.sn-icon-archived:before {
content: "\e977";
}

View file

@ -7239,9 +7239,9 @@ wildcard@^2.0.0:
integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==
word-wrap@^1.2.3, word-wrap@~1.2.3:
version "1.2.3"
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
version "1.2.4"
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.4.tgz#cb4b50ec9aca570abd1f52f33cd45b6c61739a9f"
integrity sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==
wrap-ansi@^6.2.0:
version "6.2.0"