Restructure omni services and add Chatwoot research snapshot

This commit is contained in:
Ruslan Bakiev
2026-02-21 11:11:27 +07:00
parent edea7a0034
commit b73babbbf6
7732 changed files with 978203 additions and 32 deletions

View File

@@ -0,0 +1,9 @@
<section class="main-content__body">
<hr/>
<%= form_for([:reset_cache, namespace, page.resource], method: :post, html: { class: "form" }) do |f| %>
<div class="form-actions">
<p class="pb-3">This will clear the IndexedDB cache keys from redis. <br>The next load will fetch the data from backend.</p>
<%= f.submit 'Reset Frontend Cache' %>
</div>
<% end %>
</section>

View File

@@ -0,0 +1,15 @@
<% if ENV.fetch('ENABLE_ACCOUNT_SEEDING', !Rails.env.production?) %>
<section class="main-content__body">
<hr/>
<%= form_for([:seed, namespace, page.resource], method: :post, html: { class: "form" }) do |f| %>
<div class="form-actions">
<div class="pb-3">
<p>Click the button to generate seed data into this account for demos.</p>
<p class="text-color-red">Note: This will clear all the existing data in this account.</p>
</div>
<%= f.submit 'Generate Seed Data' %>
</div>
<% end %>
</section>
<% end %>

View File

@@ -0,0 +1,98 @@
<%#
# Show
This view is the template for the show page.
It renders the attributes of a resource,
as well as a link to its edit page.
## Local variables:
- `page`:
An instance of [Administrate::Page::Show][1].
Contains methods for accessing the resource to be displayed on the page,
as well as helpers for describing how each attribute of the resource
should be displayed.
[1]: http://www.rubydoc.info/gems/administrate/Administrate/Page/Show %>
<% content_for(:title) do
t("administrate.actions.show_resource", name: page.page_title)
end %>
<header class="main-content__header" role="banner">
<h1 class="main-content__page-title">
<%= content_for(:title) %>
</h1>
<div>
<%= if accessible_action?(page.resource, :edit)
link_to("Edit", [:edit, namespace, page.resource], class: "button")
end %>
</div>
</header>
<section class="main-content__body">
<div class="pr-16">
<% page.attributes.each do |title, attributes| %>
<% if title.present? && title == 'all_features' %>
<% regular_features, premium_features =
attributes.partition do |attr|
!SuperAdmin::AccountFeaturesHelper.account_premium_features.include?(
attr.data.keys.first,
)
end %>
<div class="space-y-4">
<% regular_features.each do |attribute| %>
<div class="attribute-label" id="<%= attribute.name %>">
<%= t(
"helpers.label.#{resource_name}.#{attribute.name}",
default: page.resource.class.human_attribute_name(attribute.name),
) %>
</div>
<div class="attribute-data attribute-data--<%=attribute.html_class%>"><%= render_field attribute, page: page %></div>
<% end %>
</div>
<hr class="my-8 border-n-weak">
<div class="space-y-4">
<% premium_features.each do |attribute| %>
<div class="attribute-label" id="<%= attribute.name %>">
<%= t(
"helpers.label.#{resource_name}.#{attribute.name}",
default: page.resource.class.human_attribute_name(attribute.name),
) %>
</div>
<div class="attribute-data attribute-data--<%=attribute.html_class%>"><%= render_field attribute, page: page %></div>
<% end %>
</div>
<% else %>
<fieldset class="<%= "field-unit--nested" if title.present? %>">
<% if title.present? %>
<legend><%= t "helpers.label.#{page.resource_name}.#{title}", default: title %></legend>
<% end %>
<% attributes.each do |attribute| %>
<div class="attribute-label" id="<%= attribute.name %>">
<%= t(
"helpers.label.#{resource_name}.#{attribute.name}",
default: page.resource.class.human_attribute_name(attribute.name),
) %>
</div>
<div class="attribute-data attribute-data--<%=attribute.html_class%>"><%= render_field attribute, page: page %></div>
<% end %>
</fieldset>
<% end %>
<% end %>
</div>
</section>
<%= render 'super_admin/shared/account_user_form', page: page, namespace: namespace, resource_type: 'account' %>
<%= render partial: "seed_data", locals: { page: page } %>
<%= render partial: "reset_cache", locals: { page: page } %>

View File

@@ -0,0 +1,100 @@
<% content_for(:title) do %>
Configure Settings - <%= @config.titleize %>
<% end %>
<header class="main-content__header" role="banner">
<h1 class="main-content__page-title" id="page-title">
<%= content_for(:title) %>
</h1>
</header>
<style>
.eye-icon.eye-hide path {
d: path('M3 3l18 18M10.5 10.677a2 2 0 002.823 2.823M7.362 7.561C5.68 8.74 4.279 10.42 3 12c1.889 2.991 5.282 6 9 6 1.55 0 3.043-.523 4.395-1.35M12 6c4.008 0 6.701 3.009 9 6a15.66 15.66 0 01-1.078 1.5');
}
</style>
<section class="main-content__body">
<%= form_with url: super_admin_app_config_url(config: @config) , method: :post do |form| %>
<% @allowed_configs.each do |key| %>
<div class="flex mb-8">
<div class="field-unit__label">
<%= form.label "app_config[#{key}]", @installation_configs[key]&.dig('display_title') || key %>
</div>
<div class="-mt-2 field-unit__field ">
<% if @installation_configs[key]&.dig('type') == 'boolean' %>
<%= form.select "app_config[#{key}]",
[["True", true], ["False", false]],
{ selected: ActiveModel::Type::Boolean.new.cast(@app_config[key]) },
class: "mt-2 border border-slate-100 p-1 rounded-md"
%>
<% elsif @installation_configs[key]&.dig('type') == 'code' %>
<%= form.text_area "app_config[#{key}]",
value: @app_config[key],
rows: 12,
wrap: 'off',
class: "mt-2 border font-mono text-xs border-slate-100 p-1 rounded-md overflow-scroll"
%>
<% elsif @installation_configs[key]&.dig('type') == 'secret' %>
<div class="relative">
<%= form.password_field "app_config[#{key}]",
id: "app_config_#{key}",
value: @app_config[key],
class: "mt-2 border border-slate-100 p-1.5 pr-8 rounded-md w-full"
%>
<button
type="button"
class="absolute reset-base !bg-white top-1/2 !outline-0 !text-n-slate-11 -translate-y-1/2 right-2 p-1 hover:!bg-n-slate-5 rounded-sm toggle-password"
data-target="app_config_<%= key %>"
>
<svg class="eye-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
<path d="M12 5C5.63636 5 2 12 2 12C2 12 5.63636 19 12 19C18.3636 19 22 12 22 12C22 12 18.3636 5 12 5Z"/>
<path d="M12 15C13.6569 15 15 13.6569 15 12C15 10.3431 13.6569 9 12 9C10.3431 9 9 10.3431 9 12C9 13.6569 10.3431 15 12 15Z"/>
</svg>
</button>
</div>
<% elsif @installation_configs[key]&.dig('type') == 'select' && @installation_configs[key]&.dig('options').present? %>
<%= form.select "app_config[#{key}]",
@installation_configs[key]['options'].map { |val, label| [label, val] },
{ selected: @app_config[key] },
class: "mt-2 border border-slate-100 p-1 rounded-md"
%>
<% else %>
<%= form.text_field "app_config[#{key}]", value: @app_config[key] %>
<% end %>
<%if @installation_configs[key]&.dig('description').present? %>
<p class="pt-2 text-xs italic text-slate-400">
<%= @installation_configs[key]&.dig('description') %>
</p>
<% end %>
</div>
</div>
<% end %>
<div class="form-actions">
<%= form.submit "Submit" %>
</div>
<% end %>
</section>
<% content_for :javascript do %>
<script>
document.addEventListener('DOMContentLoaded', () => {
document.querySelectorAll('.toggle-password').forEach(button => {
button.addEventListener('click', () => {
const targetId = button.dataset.target;
const input = document.getElementById(targetId);
const type = input.type === 'password' ? 'text' : 'password';
input.type = type;
// Toggle icon
const svg = button.querySelector('.eye-icon');
if (type === 'password') {
svg.classList.remove('eye-hide')
} else {
svg.classList.add('eye-hide')
}
});
});
});
</script>
<% end %>

View File

@@ -0,0 +1,95 @@
<%#
# Collection
This partial is used on the `index` and `show` pages
to display a collection of resources in an HTML table.
## Local variables:
- `collection_presenter`:
An instance of [Administrate::Page::Collection][1].
The table presenter uses `ResourceDashboard::COLLECTION_ATTRIBUTES` to determine
the columns displayed in the table
- `resources`:
An ActiveModel::Relation collection of resources to be displayed in the table.
By default, the number of resources is limited by pagination
or by a hard limit to prevent excessive page load times
[1]: http://www.rubydoc.info/gems/administrate/Administrate/Page/Collection
%>
<table aria-labelledby="<%= table_title %>">
<thead>
<tr>
<% collection_presenter.attribute_types.each do |attr_name, attr_type| %>
<th class="cell-label
cell-label--<%= attr_type.html_class %>
cell-label--<%= collection_presenter.ordered_html_class(attr_name) %>"
scope="col"
role="columnheader"
aria-sort="<%= sort_order(collection_presenter.ordered_html_class(attr_name)) %>">
<%= link_to(sanitized_order_params(page, collection_field_name).merge(
collection_presenter.order_params_for(attr_name, key: collection_field_name)
)) do %>
<%= t(
"helpers.label.#{collection_presenter.resource_name}.#{attr_name}",
default: attr_name.to_s,
).titleize %>
<% if collection_presenter.ordered_by?(attr_name) %>
<span class="cell-label__sort-indicator cell-label__sort-indicator--<%= collection_presenter.ordered_html_class(attr_name) %>">
<svg aria-hidden="true">
<use xlink:href="#icon-up-caret" />
</svg>
</span>
<% end %>
<% end %>
</th>
<% end %>
<% [existing_action?(collection_presenter.resource_name, :edit),
existing_action?(collection_presenter.resource_name, :destroy)].count(true).times do %>
<th scope="col"></th>
<% end %>
</tr>
</thead>
<tbody>
<% resources.each do |resource| %>
<tr class="js-table-row"
tabindex="0"
<% if existing_action? collection_presenter.resource_name, :show %>
<%= %(role=link data-url=#{polymorphic_path([namespace, resource])}) %>
<% end %>
>
<% collection_presenter.attributes_for(resource).each do |attribute| %>
<td class="cell-data cell-data--<%= attribute.html_class %>">
<% if authorized_action? resource, :show -%>
<a href="<%= polymorphic_path([namespace, resource]) -%>"
class="action-show"
>
<%= render_field attribute %>
</a>
<% end -%>
</td>
<% end %>
<% if existing_action? collection_presenter.resource_name, :edit %>
<td><%= link_to(
t("administrate.actions.edit"),
[:edit, namespace, resource],
class: "action-edit",
) if authorized_action? resource, :edit%></td>
<% end %>
<% if existing_action? collection_presenter.resource_name, :destroy %>
<td><%= link_to(
t("administrate.actions.destroy"),
[namespace, resource],
class: "text-color-red",
method: :delete,
data: { confirm: t("administrate.actions.confirm") }
) if authorized_action? resource, :destroy %></td>
<% end %>
</tr>
<% end %>
</tbody>
</table>

View File

@@ -0,0 +1,63 @@
<%#
# Filters
This partial is used on the `index` page to display available filters
for a collection of resources.
## Local variables:
- `page`:
An instance of [Administrate::Page::Collection][1].
Contains helper methods to help display a table,
and knows which attributes should be displayed in the resource's table.
[1]: http://www.rubydoc.info/gems/administrate/Administrate/Page/Collection
%>
<%
# Get the dashboard class name from the resource name
resource_name = page.resource_name.classify
dashboard_class_name = "#{resource_name}Dashboard"
dashboard_class = dashboard_class_name.constantize
# Get the current filter if any
current_filter = nil
if params[:search] && params[:search].include?(':')
current_filter = params[:search].split(':').first
end
%>
<% if dashboard_class.const_defined?(:COLLECTION_FILTERS) && !dashboard_class::COLLECTION_FILTERS.empty? %>
<div class="flex items-center bg-gray-100 border-0 rounded-md shadow-none relative w-[260px]">
<div class="flex items-center h-10 px-2 w-full">
<div class="flex items-center justify-center flex-shrink-0 mr-2 text-gray-500" title="Filter by">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<polygon points="22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3"></polygon>
</svg>
</div>
<div class="flex-1 h-full min-w-0 relative">
<select id="filter-select" class="appearance-none bg-transparent border-0 text-gray-700 cursor-pointer text-sm h-full overflow-hidden truncate whitespace-nowrap w-full pr-7 pl-0 py-2 focus:outline-none bg-[url('data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2712%27 height=%2712%27 viewBox=%270 0 12 12%27%3E%3Cpath fill=%27%23293f54%27 d=%27M6 9L1 4h10z%27/%3E%3C/svg%3E')] bg-[right_0.25rem_center] bg-no-repeat bg-[length:0.75rem]" onchange="applyFilter(this.value)">
<option value="">All records</option>
<% dashboard_class::COLLECTION_FILTERS.each do |filter_name, _| %>
<option value="<%= filter_name %>" <%= 'selected' if filter_name.to_s == current_filter %>>
<%= filter_name.to_s.titleize %>
</option>
<% end %>
</select>
<% if current_filter %>
<a href="?" class="flex items-center justify-center rounded-full text-gray-500 text-xl font-bold h-[18px] w-[18px] leading-none absolute right-5 top-1/2 -translate-y-1/2 no-underline z-2 hover:text-gray-900" title="Clear filter">×</a>
<% end %>
</div>
</div>
</div>
<script>
function applyFilter(filterName) {
if (filterName) {
window.location.href = "?search=" + encodeURIComponent(filterName) + "%3A";
} else {
window.location.href = "?";
}
}
</script>
<% end %>

View File

@@ -0,0 +1,20 @@
<%#
# Flash Partial
This partial renders flash messages on every page.
## Relevant Helpers:
- `flash`:
Returns a hash,
where the keys are the type of flash (alert, error, notice, etc)
and the values are the message to be displayed.
%>
<% if flash.any? %>
<div class="flashes">
<% flash.each do |key, value| -%>
<div class="flash flash-<%= key %>"><%= value.to_s.html_safe %></div>
<% end -%>
</div>
<% end %>

View File

@@ -0,0 +1,180 @@
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<symbol id="icon-microsoft" viewBox="0 0 24 24">
<path fill="currentColor" d="M2 3h9v9H2zm9 19H2v-9h9zM21 3v9h-9V3zm0 19h-9v-9h9z"/>
</symbol>
<symbol id="icon-google" viewBox="0 0 24 24">
<path fill="currentColor" d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z"/>
<path fill="currentColor" d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"/>
<path fill="currentColor" d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z"/>
<path fill="currentColor" d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z"/>
</symbol>
<symbol id="icon-cancel" viewBox="0 0 48 48">
<path fill-rule="evenodd" d="M24 19.757l-8.485-8.485c-.784-.783-2.047-.782-2.827 0l-1.417 1.416c-.777.777-.78 2.046.002 2.827L19.757 24l-8.485 8.485c-.783.784-.782 2.047 0 2.827l1.416 1.417c.777.777 2.046.78 2.827-.002L24 28.243l8.485 8.485c.784.783 2.047.782 2.827 0l1.417-1.416c.777-.777.78-2.046-.002-2.827L28.243 24l8.485-8.485c.783-.784.782-2.047 0-2.827l-1.416-1.417c-.777-.777-2.046-.78-2.827.002L24 19.757zM24 47c12.703 0 23-10.297 23-23S36.703 1 24 1 1 11.297 1 24s10.297 23 23 23z" />
</symbol>
<symbol id="icon-grid-line" viewBox="0 0 20 20">
<path d="M16.75 3.25C16.9489 3.25 17.1397 3.32902 17.2803 3.46967C17.421 3.61032 17.5 3.80109 17.5 4V16C17.5 16.1989 17.421 16.3897 17.2803 16.5303C17.1397 16.671 16.9489 16.75 16.75 16.75H3.25C3.05109 16.75 2.86032 16.671 2.71967 16.5303C2.57902 16.3897 2.5 16.1989 2.5 16V4C2.5 3.80109 2.57902 3.61032 2.71967 3.46967C2.86032 3.32902 3.05109 3.25 3.25 3.25H16.75ZM9.25 10.75H4V15.25H9.25V10.75ZM16 10.75H10.75V15.25H16V10.75ZM9.25 4.75H4V9.25H9.25V4.75ZM16 4.75H10.75V9.25H16V4.75Z" fill="currentColor"/>
</symbol>
<symbol id="icon-user-follow-line" viewBox="0 0 20 20">
<path d="M11.5 11.689V13.2565C10.8212 13.0165 10.0947 12.9429 9.38155 13.0418C8.6684 13.1408 7.9894 13.4094 7.40157 13.8252C6.81375 14.2409 6.33426 14.7916 6.00337 15.4311C5.67249 16.0705 5.49986 16.78 5.5 17.5L4 17.4993C3.99977 16.5834 4.20919 15.6797 4.61222 14.8573C5.01526 14.0349 5.6012 13.3157 6.32516 12.7548C7.04912 12.1939 7.89188 11.8061 8.78887 11.6212C9.68585 11.4364 10.6132 11.4593 11.5 11.6883V11.689ZM10 10.75C7.51375 10.75 5.5 8.73625 5.5 6.25C5.5 3.76375 7.51375 1.75 10 1.75C12.4863 1.75 14.5 3.76375 14.5 6.25C14.5 8.73625 12.4863 10.75 10 10.75ZM10 9.25C11.6575 9.25 13 7.9075 13 6.25C13 4.5925 11.6575 3.25 10 3.25C8.3425 3.25 7 4.5925 7 6.25C7 7.9075 8.3425 9.25 10 9.25ZM14.3448 15.9355L16.996 13.2843L18.0573 14.3448L14.3448 18.0573L11.6928 15.4053L12.754 14.3448L14.344 15.9355H14.3448Z" fill="currentColor"/>
</symbol>
<symbol id="icon-mist-fill" viewBox="0 0 20 20">
<path d="M4 4H7V5.5H4V4ZM13 15.25H16V16.75H13V15.25ZM2.5 7.75H10V9.25H2.5V7.75ZM11.5 7.75H16V9.25H11.5V7.75ZM4 11.5H8.5V13H4V11.5ZM10 11.5H17.5V13H10V11.5ZM8.5 4H17.5V5.5H8.5V4ZM2.5 15.25H11.5V16.75H2.5V15.25Z" fill="currentColor"/>
</symbol>
<symbol id="icon-settings-2-line" viewBox="0 0 20 20">
<path d="M7.51453 4L9.46979 2.04475C9.61043 1.90415 9.80116 1.82516 10 1.82516C10.1989 1.82516 10.3896 1.90415 10.5303 2.04475L12.4855 4H15.25C15.4489 4 15.6397 4.07902 15.7804 4.21967C15.921 4.36033 16 4.55109 16 4.75V7.5145L17.9553 9.46975C18.0959 9.6104 18.1749 9.80113 18.1749 10C18.1749 10.1989 18.0959 10.3896 17.9553 10.5303L16 12.4855V15.25C16 15.4489 15.921 15.6397 15.7804 15.7803C15.6397 15.921 15.4489 16 15.25 16H12.4855L10.5303 17.9553C10.3896 18.0959 10.1989 18.1748 10 18.1748C9.80116 18.1748 9.61043 18.0959 9.46979 17.9553L7.51453 16H4.75003C4.55112 16 4.36036 15.921 4.21971 15.7803C4.07905 15.6397 4.00003 15.4489 4.00003 15.25V12.4855L2.04479 10.5303C1.90418 10.3896 1.8252 10.1989 1.8252 10C1.8252 9.80113 1.90418 9.6104 2.04479 9.46975L4.00003 7.5145V4.75C4.00003 4.55109 4.07905 4.36033 4.21971 4.21967C4.36036 4.07902 4.55112 4 4.75003 4H7.51453ZM5.50003 5.5V8.13625L3.63629 10L5.50003 11.8638V14.5H8.13629L10 16.3638L11.8638 14.5H14.5V11.8638L16.3638 10L14.5 8.13625V5.5H11.8638L10 3.63625L8.13629 5.5H5.50003ZM10 13C9.20438 13 8.44132 12.6839 7.87871 12.1213C7.31611 11.5587 7.00003 10.7957 7.00003 10C7.00003 9.20435 7.31611 8.44129 7.87871 7.87868C8.44132 7.31607 9.20438 7 10 7C10.7957 7 11.5587 7.31607 12.1214 7.87868C12.684 8.44129 13 9.20435 13 10C13 10.7957 12.684 11.5587 12.1214 12.1213C11.5587 12.6839 10.7957 13 10 13ZM10 11.5C10.3979 11.5 10.7794 11.342 11.0607 11.0607C11.342 10.7794 11.5 10.3978 11.5 10C11.5 9.60218 11.342 9.22065 11.0607 8.93934C10.7794 8.65804 10.3979 8.5 10 8.5C9.60221 8.5 9.22068 8.65804 8.93937 8.93934C8.65807 9.22065 8.50003 9.60218 8.50003 10C8.50003 10.3978 8.65807 10.7794 8.93937 11.0607C9.22068 11.342 9.60221 11.5 10 11.5Z" fill="currentColor"/>
</symbol>
<symbol id="icon-health-book-line" viewBox="0 0 20 20">
<path d="M16 2.5C16.414 2.5 16.75 2.836 16.75 3.25V16.75C16.75 17.164 16.414 17.5 16 17.5H5.5C5.086 17.5 4.75 17.164 4.75 16.75V15.25H3.25V13.75H4.75V12.25H3.25V10.75H4.75V9.25H3.25V7.75H4.75V6.25H3.25V4.75H4.75V3.25C4.75 2.836 5.086 2.5 5.5 2.5H16ZM15.25 4H6.25V16H15.25V4ZM11.5 7V9.25H13.75V10.75H11.4992L11.5 13H10L9.99925 10.75H7.75V9.25H10V7H11.5Z" fill="currentColor"/>
</symbol>
<symbol id="icon-building-4-line" viewBox="0 0 20 20">
<path d="M16.75 16H18.25V17.5H1.75V16H3.25V3.25C3.25 3.05109 3.32902 2.86032 3.46967 2.71967C3.61032 2.57902 3.80109 2.5 4 2.5H16C16.1989 2.5 16.3897 2.57902 16.5303 2.71967C16.671 2.86032 16.75 3.05109 16.75 3.25V16ZM15.25 16V4H4.75V16H15.25ZM7 9.25H9.25V10.75H7V9.25ZM7 6.25H9.25V7.75H7V6.25ZM7 12.25H9.25V13.75H7V12.25ZM10.75 12.25H13V13.75H10.75V12.25ZM10.75 9.25H13V10.75H10.75V9.25ZM10.75 6.25H13V7.75H10.75V6.25Z" fill="currentColor"/>
</symbol>
<symbol id="icon-robot-line" viewBox="0 0 20 20">
<path d="M10.75 4.04125C14.125 4.414 16.75 7.27525 16.75 10.75V17.5H3.25V10.75C3.25 7.27525 5.875 4.414 9.25 4.04125V1.75H10.75V4.04125ZM15.25 16V10.75C15.25 9.35761 14.6969 8.02226 13.7123 7.03769C12.7277 6.05312 11.3924 5.5 10 5.5C8.60761 5.5 7.27226 6.05312 6.28769 7.03769C5.30312 8.02226 4.75 9.35761 4.75 10.75V16H15.25ZM10 14.5C9.00544 14.5 8.05161 14.1049 7.34835 13.4017C6.64509 12.6984 6.25 11.7446 6.25 10.75C6.25 9.75544 6.64509 8.80161 7.34835 8.09835C8.05161 7.39509 9.00544 7 10 7C10.9946 7 11.9484 7.39509 12.6517 8.09835C13.3549 8.80161 13.75 9.75544 13.75 10.75C13.75 11.7446 13.3549 12.6984 12.6517 13.4017C11.9484 14.1049 10.9946 14.5 10 14.5V14.5ZM10 13C10.5967 13 11.169 12.7629 11.591 12.341C12.0129 11.919 12.25 11.3467 12.25 10.75C12.25 10.1533 12.0129 9.58097 11.591 9.15901C11.169 8.73705 10.5967 8.5 10 8.5C9.40326 8.5 8.83097 8.73705 8.40901 9.15901C7.98705 9.58097 7.75 10.1533 7.75 10.75C7.75 11.3467 7.98705 11.919 8.40901 12.341C8.83097 12.7629 9.40326 13 10 13V13ZM10 11.5C9.80109 11.5 9.61032 11.421 9.46967 11.2803C9.32902 11.1397 9.25 10.9489 9.25 10.75C9.25 10.5511 9.32902 10.3603 9.46967 10.2197C9.61032 10.079 9.80109 10 10 10C10.1989 10 10.3897 10.079 10.5303 10.2197C10.671 10.3603 10.75 10.5511 10.75 10.75C10.75 10.9489 10.671 11.1397 10.5303 11.2803C10.3897 11.421 10.1989 11.5 10 11.5Z" fill="currentColor"/>
</symbol>
<symbol id="icon-apps-2-line" viewBox="0 0 20 20">
<path d="M5.875 9.625C5.43179 9.625 4.99292 9.5377 4.58344 9.36809C4.17397 9.19848 3.80191 8.94988 3.48851 8.63649C3.17512 8.32309 2.92652 7.95103 2.75691 7.54156C2.5873 7.13208 2.5 6.69321 2.5 6.25C2.5 5.80679 2.5873 5.36792 2.75691 4.95844C2.92652 4.54897 3.17512 4.17691 3.48851 3.86351C3.80191 3.55012 4.17397 3.30152 4.58344 3.13191C4.99292 2.9623 5.43179 2.875 5.875 2.875C6.77011 2.875 7.62855 3.23058 8.26149 3.86351C8.89442 4.49645 9.25 5.35489 9.25 6.25C9.25 7.14511 8.89442 8.00355 8.26149 8.63649C7.62855 9.26942 6.77011 9.625 5.875 9.625V9.625ZM6.25 17.125C5.35489 17.125 4.49645 16.7694 3.86351 16.1365C3.23058 15.5035 2.875 14.6451 2.875 13.75C2.875 12.8549 3.23058 11.9965 3.86351 11.3635C4.49645 10.7306 5.35489 10.375 6.25 10.375C7.14511 10.375 8.00355 10.7306 8.63649 11.3635C9.26942 11.9965 9.625 12.8549 9.625 13.75C9.625 14.6451 9.26942 15.5035 8.63649 16.1365C8.00355 16.7694 7.14511 17.125 6.25 17.125V17.125ZM13.75 9.625C13.3068 9.625 12.8679 9.5377 12.4584 9.36809C12.049 9.19848 11.6769 8.94988 11.3635 8.63649C11.0501 8.32309 10.8015 7.95103 10.6319 7.54156C10.4623 7.13208 10.375 6.69321 10.375 6.25C10.375 5.80679 10.4623 5.36792 10.6319 4.95844C10.8015 4.54897 11.0501 4.17691 11.3635 3.86351C11.6769 3.55012 12.049 3.30152 12.4584 3.13191C12.8679 2.9623 13.3068 2.875 13.75 2.875C14.6451 2.875 15.5035 3.23058 16.1365 3.86351C16.7694 4.49645 17.125 5.35489 17.125 6.25C17.125 7.14511 16.7694 8.00355 16.1365 8.63649C15.5035 9.26942 14.6451 9.625 13.75 9.625V9.625ZM13.75 17.125C12.8549 17.125 11.9965 16.7694 11.3635 16.1365C10.7306 15.5035 10.375 14.6451 10.375 13.75C10.375 12.8549 10.7306 11.9965 11.3635 11.3635C11.9965 10.7306 12.8549 10.375 13.75 10.375C14.6451 10.375 15.5035 10.7306 16.1365 11.3635C16.7694 11.9965 17.125 12.8549 17.125 13.75C17.125 14.6451 16.7694 15.5035 16.1365 16.1365C15.5035 16.7694 14.6451 17.125 13.75 17.125ZM5.875 8.125C6.37228 8.125 6.84919 7.92746 7.20083 7.57583C7.55246 7.22419 7.75 6.74728 7.75 6.25C7.75 5.75272 7.55246 5.27581 7.20083 4.92417C6.84919 4.57254 6.37228 4.375 5.875 4.375C5.37772 4.375 4.90081 4.57254 4.54917 4.92417C4.19754 5.27581 4 5.75272 4 6.25C4 6.74728 4.19754 7.22419 4.54917 7.57583C4.90081 7.92746 5.37772 8.125 5.875 8.125V8.125ZM6.25 15.625C6.74728 15.625 7.22419 15.4275 7.57583 15.0758C7.92746 14.7242 8.125 14.2473 8.125 13.75C8.125 13.2527 7.92746 12.7758 7.57583 12.4242C7.22419 12.0725 6.74728 11.875 6.25 11.875C5.75272 11.875 5.27581 12.0725 4.92417 12.4242C4.57254 12.7758 4.375 13.2527 4.375 13.75C4.375 14.2473 4.57254 14.7242 4.92417 15.0758C5.27581 15.4275 5.75272 15.625 6.25 15.625ZM13.75 8.125C14.2473 8.125 14.7242 7.92746 15.0758 7.57583C15.4275 7.22419 15.625 6.74728 15.625 6.25C15.625 5.75272 15.4275 5.27581 15.0758 4.92417C14.7242 4.57254 14.2473 4.375 13.75 4.375C13.2527 4.375 12.7758 4.57254 12.4242 4.92417C12.0725 5.27581 11.875 5.75272 11.875 6.25C11.875 6.74728 12.0725 7.22419 12.4242 7.57583C12.7758 7.92746 13.2527 8.125 13.75 8.125ZM13.75 15.625C14.2473 15.625 14.7242 15.4275 15.0758 15.0758C15.4275 14.7242 15.625 14.2473 15.625 13.75C15.625 13.2527 15.4275 12.7758 15.0758 12.4242C14.7242 12.0725 14.2473 11.875 13.75 11.875C13.2527 11.875 12.7758 12.0725 12.4242 12.4242C12.0725 12.7758 11.875 13.2527 11.875 13.75C11.875 14.2473 12.0725 14.7242 12.4242 15.0758C12.7758 15.4275 13.2527 15.625 13.75 15.625Z" fill="currentColor"/>
</symbol>
<symbol id="icon-folder-3-line" viewBox="0 0 20 20">
<path d="M10.3105 4.75H16.75C16.9489 4.75 17.1397 4.82902 17.2803 4.96967C17.421 5.11032 17.5 5.30109 17.5 5.5V16C17.5 16.1989 17.421 16.3897 17.2803 16.5303C17.1397 16.671 16.9489 16.75 16.75 16.75H3.25C3.05109 16.75 2.86032 16.671 2.71967 16.5303C2.57902 16.3897 2.5 16.1989 2.5 16V4C2.5 3.80109 2.57902 3.61032 2.71967 3.46967C2.86032 3.32902 3.05109 3.25 3.25 3.25H8.8105L10.3105 4.75ZM4 6.25V15.25H16V6.25H4Z" fill="currentColor"/>
</symbol>
<symbol id="icon-draft-line" viewBox="0 0 20 20">
<path d="M16 2.5C16.414 2.5 16.75 2.836 16.75 3.25V6.06775L15.25 7.56775V4H4.75V16H15.25V13.9315L16.75 12.4315V16.75C16.75 17.164 16.414 17.5 16 17.5H4C3.586 17.5 3.25 17.164 3.25 16.75V3.25C3.25 2.836 3.586 2.5 4 2.5H16ZM17.3335 7.606L18.394 8.6665L12.5605 14.5L11.4985 14.4985L11.5 13.4395L17.3335 7.606V7.606ZM10.75 10V11.5H7V10H10.75ZM13 7V8.5H7V7H13Z" fill="currentColor"/>
</symbol>
<symbol id="icon-reply-line" viewBox="0 0 20 20">
<path d="M9.25 16L1.75 10L9.25 4V7.75C13.3922 7.75 16.75 11.1078 16.75 15.25C16.75 15.4548 16.7425 15.6572 16.726 15.8575C15.6288 13.777 13.4785 12.3393 10.9847 12.2538L10.75 12.25H9.25V16ZM7.75 10.75H10.7755L11.0357 10.7552C11.9995 10.7875 12.9287 10.9877 13.7927 11.3297C12.6925 10.0562 11.065 9.25 9.25 9.25H7.75V7.12075L4.1515 10L7.75 12.8792V10.75Z" fill="currentColor"/>
</symbol>
<symbol id="icon-logout-circle-r-line" viewBox="0 0 20 20">
<path d="M10 17.5C5.85775 17.5 2.5 14.1423 2.5 10C2.5 5.85775 5.85775 2.5 10 2.5C11.1645 2.49913 12.3131 2.76983 13.3547 3.29061C14.3963 3.81139 15.302 4.56788 16 5.5H13.9675C13.1014 4.73632 12.0334 4.23877 10.8915 4.06705C9.74969 3.89533 8.58255 4.05674 7.53017 4.53191C6.47778 5.00708 5.58486 5.77582 4.95855 6.74589C4.33224 7.71596 3.99915 8.84615 3.99925 10.0008C3.99934 11.1555 4.33262 12.2856 4.95909 13.2556C5.58557 14.2256 6.47861 14.9942 7.53108 15.4692C8.58354 15.9442 9.75071 16.1054 10.8925 15.9335C12.0343 15.7616 13.1023 15.2638 13.9683 14.5H16.0007C15.3027 15.4322 14.3968 16.1888 13.3551 16.7096C12.3134 17.2303 11.1646 17.501 10 17.5V17.5ZM15.25 13V10.75H9.25V9.25H15.25V7L19 10L15.25 13Z" fill="currentColor"/>
</symbol>
<symbol id="icon-dashboard-line" viewBox="0 0 20 20">
<path d="M10.75 16.75V9.25H16.75V16.75H10.75ZM3.25 10.75V3.25H9.25V10.75H3.25ZM7.75 9.25V4.75H4.75V9.25H7.75ZM3.25 16.75V12.25H9.25V16.75H3.25ZM4.75 15.25H7.75V13.75H4.75V15.25ZM12.25 15.25H15.25V10.75H12.25V15.25ZM10.75 3.25H16.75V7.75H10.75V3.25ZM12.25 4.75V6.25H15.25V4.75H12.25Z" fill="currentColor"/>
</symbol>
<symbol id="icon-refresh-line" viewBox="0 0 16 16">
<path d="M4.0778 3.4598C5.16654 2.51639 6.55939 1.99799 8 2C11.3138 2 14 4.6862 14 8C14 9.2816 13.598 10.4696 12.914 11.444L11 8H12.8C12.8001 7.05897 12.5235 6.13868 12.0048 5.35355C11.486 4.56842 10.748 3.95309 9.88231 3.58407C9.01666 3.21505 8.06163 3.10862 7.13597 3.27801C6.21032 3.4474 5.35487 3.88514 4.676 4.5368L4.0778 3.4598ZM11.9222 12.5402C10.8335 13.4836 9.44061 14.002 8 14C4.6862 14 2 11.3138 2 8C2 6.7184 2.402 5.5304 3.086 4.556L5 8H3.2C3.19992 8.94102 3.47645 9.86132 3.9952 10.6464C4.51395 11.4316 5.25204 12.0469 6.11769 12.4159C6.98334 12.7849 7.93837 12.8914 8.86403 12.722C9.78968 12.5526 10.6451 12.1149 11.324 11.4632L11.9222 12.5402Z" fill="#1F93FF"/>
</symbol>
<symbol id="icon-sailbot-fill" viewBox="0 0 24 24">
<path d="M3.89995 17.4H20.1C20.1835 17.4 20.2654 17.4233 20.3365 17.4672C20.4076 17.5111 20.4651 17.574 20.5024 17.6487C20.5398 17.7235 20.5556 17.8072 20.5481 17.8904C20.5406 17.9736 20.5101 18.0531 20.46 18.12L18.57 20.64C18.4861 20.7518 18.3774 20.8425 18.2524 20.905C18.1275 20.9675 17.9897 21 17.85 21H6.14995C6.01023 21 5.87243 20.9675 5.74746 20.905C5.62249 20.8425 5.51378 20.7518 5.42995 20.64L3.53995 18.12C3.48981 18.0531 3.45927 17.9736 3.45177 17.8904C3.44426 17.8072 3.46009 17.7235 3.49746 17.6487C3.53483 17.574 3.59228 17.5111 3.66337 17.4672C3.73446 17.4233 3.81638 17.4 3.89995 17.4ZM14.7 3.38249V14.7C14.7 14.9387 14.6051 15.1676 14.4363 15.3364C14.2676 15.5052 14.0386 15.6 13.8 15.6H4.83595C4.75127 15.5999 4.66835 15.5759 4.59671 15.5307C4.52507 15.4856 4.46761 15.4211 4.43095 15.3448C4.39429 15.2685 4.37991 15.1834 4.38946 15.0992C4.39902 15.0151 4.43211 14.9354 4.48495 14.8692L13.899 3.10169C13.9572 3.02905 14.0366 2.97628 14.1261 2.95066C14.2157 2.92503 14.3109 2.92782 14.3988 2.95863C14.4867 2.98943 14.5629 3.04675 14.6168 3.12267C14.6707 3.19858 14.6998 3.28936 14.7 3.38249Z" fill="currentColor"/>
</symbol>
<symbol id="icon-menu-search-line" viewBox="0 0 24 24">
<path d="M14.625 6.75C13.1753 6.75 12 7.92525 12 9.375C12 10.8247 13.1753 12 14.625 12C16.0747 12 17.25 10.8247 17.25 9.375C17.25 7.92525 16.0747 6.75 14.625 6.75ZM10.5 9.375C10.5 7.09682 12.3468 5.25 14.625 5.25C16.9032 5.25 18.75 7.09682 18.75 9.375C18.75 10.2431 18.4818 11.0486 18.0238 11.7131L20.0303 13.7197L18.9697 14.7803L16.9631 12.7738C16.2986 13.2318 15.4931 13.5 14.625 13.5C12.3468 13.5 10.5 11.6532 10.5 9.375ZM5.25 6H9V7.5H5.25V6ZM5.25 11.25H9V12.75H5.25V11.25ZM18.75 16.5V18H5.25V16.5H18.75Z" fill="currentColor"/>
</symbol>
<symbol id="icon-hourglass-line" viewBox="0 0 24 24">
<rect width="24" height="24" fill="white"/>
<path d="M7.5 6H6V4.5H18V6H16.5V7.5C16.5 8.71157 15.8878 9.68601 15.1171 10.4825C14.5899 11.0273 13.9485 11.529 13.2982 12C13.9485 12.471 14.5899 12.9728 15.1171 13.5175C15.8878 14.314 16.5 15.2885 16.5 16.5V18H18V19.5H6V18H7.5V16.5C7.5 15.2885 8.11212 14.314 8.88293 13.5175C9.41012 12.9728 10.0515 12.471 10.7018 12C10.0515 11.529 9.41012 11.0273 8.88293 10.4825C8.11212 9.68601 7.5 8.71157 7.5 7.5V6ZM9 6V7.5C9 8.01386 9.19519 8.50124 9.57848 9H14.4215C14.8048 8.50124 15 8.01386 15 7.5V6H9ZM12 12.9164C11.2161 13.4702 10.506 13.9972 9.96083 14.5606C9.81756 14.7087 9.69005 14.8548 9.57848 15H14.4215C14.3099 14.8548 14.1824 14.7087 14.0392 14.5606C13.494 13.9972 12.7839 13.4702 12 12.9164Z" fill="currentColor"/>
</symbol>
<symbol id="icon-paint-brush-line" viewBox="0 0 24 24">
<path d="M5.6999 5.69999V8.39999H18.2999V5.69999H5.6999ZM4.7999 3.89999H19.1999C19.4386 3.89999 19.6675 3.99482 19.8363 4.1636C20.0051 4.33238 20.0999 4.5613 20.0999 4.79999V9.29999C20.0999 9.53869 20.0051 9.76761 19.8363 9.93639C19.6675 10.1052 19.4386 10.2 19.1999 10.2H4.7999C4.56121 10.2 4.33229 10.1052 4.16351 9.93639C3.99472 9.76761 3.8999 9.53869 3.8999 9.29999V4.79999C3.8999 4.5613 3.99472 4.33238 4.16351 4.1636C4.33229 3.99482 4.56121 3.89999 4.7999 3.89999V3.89999ZM6.5999 12H11.9999C12.2386 12 12.4675 12.0948 12.6363 12.2636C12.8051 12.4324 12.8999 12.6613 12.8999 12.9V15.6H13.7999V21H10.1999V15.6H11.0999V13.8H5.6999C5.46121 13.8 5.23229 13.7052 5.06351 13.5364C4.89472 13.3676 4.7999 13.1387 4.7999 12.9V11.1H6.5999V12ZM17.1587 13.5588L18.7499 11.9676L20.3411 13.5588C20.6557 13.8735 20.8699 14.2744 20.9567 14.7108C21.0435 15.1473 20.9989 15.5996 20.8286 16.0107C20.6583 16.4218 20.3699 16.7732 19.9999 17.0204C19.6299 17.2676 19.1949 17.3996 18.7499 17.3996C18.3049 17.3996 17.8699 17.2676 17.4999 17.0204C17.1299 16.7732 16.8415 16.4218 16.6712 16.0107C16.5009 15.5996 16.4563 15.1473 16.5431 14.7108C16.6299 14.2744 16.8441 13.8735 17.1587 13.5588V13.5588Z" fill="currentColor"/>
</symbol>
<symbol id="icon-whatsapp-line" viewBox="0 0 24 24">
<path d="M7.72771 17.8446L8.37931 18.2253C9.47816 18.8662 10.7279 19.2026 12 19.2C13.424 19.2 14.8161 18.7777 16.0001 17.9866C17.1842 17.1954 18.107 16.0709 18.6519 14.7553C19.1969 13.4397 19.3395 11.992 19.0617 10.5953C18.7839 9.19869 18.0981 7.91577 17.0912 6.90883C16.0842 5.90189 14.8013 5.21616 13.4047 4.93835C12.008 4.66053 10.5603 4.80312 9.24469 5.34807C7.92906 5.89302 6.80458 6.81586 6.01343 7.99989C5.22228 9.18393 4.80001 10.576 4.80001 12C4.80001 13.2924 5.13931 14.5317 5.77561 15.6216L6.15541 16.2732L5.56771 18.4341L7.72771 17.8446ZM3.00361 21L4.22041 16.5288C3.41864 15.1544 2.9974 13.5912 3.00001 12C3.00001 7.0293 7.02931 3 12 3C16.9707 3 21 7.0293 21 12C21 16.9707 16.9707 21 12 21C10.4095 21.0026 8.847 20.5817 7.47301 19.7805L3.00361 21ZM8.75191 7.7772C8.87251 7.7682 8.99401 7.7682 9.11461 7.7736C9.16321 7.7772 9.21181 7.7826 9.26041 7.788C9.40351 7.8042 9.56101 7.8915 9.61411 8.0121C9.88231 8.6205 10.1433 9.2334 10.3953 9.8481C10.4511 9.9849 10.4178 10.1604 10.3116 10.3314C10.2386 10.447 10.1596 10.5588 10.0749 10.6662C9.97321 10.7967 9.75451 11.0361 9.75451 11.0361C9.75451 11.0361 9.66541 11.1423 9.69961 11.2746C9.71221 11.325 9.75361 11.3979 9.79141 11.4591L9.84451 11.5446C10.0749 11.9289 10.3845 12.3186 10.7625 12.6858C10.8705 12.7902 10.9758 12.8973 11.0892 12.9972C11.5104 13.3689 11.9874 13.6722 12.5022 13.8972L12.5067 13.899C12.5832 13.9323 12.6219 13.9503 12.7335 13.998C12.7893 14.0214 12.8469 14.0421 12.9054 14.0574C12.9659 14.0728 13.0295 14.0699 13.0883 14.0491C13.1471 14.0282 13.1984 13.9904 13.2357 13.9404C13.8873 13.1511 13.9467 13.0998 13.9521 13.0998V13.1016C13.9974 13.0594 14.0512 13.0273 14.1098 13.0076C14.1685 12.9879 14.2307 12.981 14.2923 12.9873C14.3463 12.9909 14.4012 13.0008 14.4516 13.0233C14.9295 13.242 15.7116 13.5831 15.7116 13.5831L16.2354 13.818C16.3236 13.8603 16.4037 13.9602 16.4064 14.0565C16.41 14.1168 16.4154 14.214 16.3947 14.3922C16.3659 14.6253 16.2957 14.9052 16.2255 15.0519C16.1774 15.152 16.1136 15.2438 16.0365 15.3237C15.9457 15.4191 15.8463 15.5058 15.7395 15.5829C15.7026 15.6107 15.6651 15.6377 15.627 15.6639C15.5151 15.7349 15.4001 15.801 15.2823 15.8619C15.0506 15.985 14.7947 16.0556 14.5326 16.0689C14.3661 16.0779 14.1996 16.0905 14.0322 16.0815C14.025 16.0815 13.521 16.0032 13.521 16.0032C12.2414 15.6666 11.0581 15.0361 10.065 14.1618C9.86161 13.9827 9.67351 13.7901 9.48091 13.5984C8.67991 12.8019 8.07511 11.9424 7.70791 11.1306C7.51996 10.7322 7.41844 10.2985 7.41001 9.858C7.4063 9.31157 7.58492 8.7795 7.91761 8.346C7.98331 8.2614 8.04541 8.1732 8.15251 8.0715C8.26681 7.9635 8.33881 7.9059 8.41711 7.8663C8.52122 7.81413 8.63479 7.78352 8.75101 7.7763L8.75191 7.7772Z" fill="currentColor"/>
</symbol>
<symbol id="icon-book-2-line" viewBox="0 0 24 24">
<path d="M20.0999 17.4H6.5999C6.36121 17.4 6.13229 17.4948 5.96351 17.6636C5.79472 17.8324 5.6999 18.0613 5.6999 18.3C5.6999 18.5387 5.79472 18.7676 5.96351 18.9364C6.13229 19.1052 6.36121 19.2 6.5999 19.2H20.0999V21H6.5999C5.88382 21 5.19706 20.7155 4.69071 20.2092C4.18437 19.7028 3.8999 19.0161 3.8999 18.3V4.8C3.8999 4.32261 4.08954 3.86477 4.42711 3.52721C4.76468 3.18964 5.22251 3 5.6999 3H20.0999V17.4ZM5.6999 15.645C5.8457 15.6153 5.996 15.6 6.1499 15.6H18.2999V4.8H5.6999V15.645ZM15.5999 9.3H8.3999V7.5H15.5999V9.3Z" fill="currentColor"/>
</symbol>
<symbol id="icon-message-line" viewBox="0 0 24 24">
<path d="M7.0095 18.3L3 21.45V4.80002C3 4.56133 3.09482 4.33241 3.2636 4.16363C3.43239 3.99485 3.66131 3.90002 3.9 3.90002H20.1C20.3387 3.90002 20.5676 3.99485 20.7364 4.16363C20.9052 4.33241 21 4.56133 21 4.80002V17.4C21 17.6387 20.9052 17.8676 20.7364 18.0364C20.5676 18.2052 20.3387 18.3 20.1 18.3H7.0095ZM6.3867 16.5H19.2V5.70002H4.8V17.7465L6.3867 16.5ZM8.4 10.2H15.6V12H8.4V10.2Z" fill="#0A0D14"/>
</symbol>
<symbol id="icon-messenger-line" viewBox="0 0 24 24">
<path d="M8.1876 18.5025C8.7186 18.2685 9.3126 18.2244 9.8688 18.3774C10.5618 18.5664 11.2773 18.6618 12 18.66C16.1265 18.66 19.2 15.7017 19.2 11.73C19.2 7.7583 16.1265 4.8 12 4.8C7.8735 4.8 4.8 7.7583 4.8 11.73C4.8 13.773 5.6064 15.5748 7.0194 16.8384C7.27613 17.0658 7.48374 17.3432 7.62952 17.6537C7.7753 17.9641 7.85618 18.301 7.8672 18.6438L8.1876 18.5025ZM12 3C17.0706 3 21 6.7143 21 11.73C21 16.7457 17.0706 20.46 12 20.46C11.1199 20.4623 10.2436 20.346 9.3945 20.1144C9.23502 20.0706 9.06531 20.0829 8.9139 20.1495L7.1283 20.9379C7.02042 20.9856 6.90247 21.006 6.78484 20.9974C6.6672 20.9888 6.55347 20.9515 6.45366 20.8887C6.35384 20.8258 6.27099 20.7394 6.2124 20.637C6.1538 20.5347 6.12125 20.4195 6.1176 20.3016L6.0681 18.6996C6.06486 18.6022 6.0418 18.5065 6.00033 18.4183C5.95886 18.3301 5.89985 18.2512 5.8269 18.1866C4.0755 16.6215 3 14.3553 3 11.73C3 6.7143 6.9303 3 12 3ZM6.5955 14.2833L9.2388 10.0893C9.33825 9.9314 9.46936 9.79583 9.62385 9.69116C9.77834 9.58648 9.95286 9.51497 10.1364 9.48114C10.3199 9.44731 10.5084 9.4519 10.6901 9.49461C10.8718 9.53733 11.0426 9.61724 11.1918 9.7293L13.2942 11.3043C13.3879 11.375 13.5021 11.4133 13.6195 11.4133C13.737 11.4133 13.8512 11.375 13.9449 11.3043L16.7844 9.1479C17.1633 8.8608 17.6583 9.3144 17.4045 9.7176L14.7612 13.9116C14.6617 14.0695 14.5306 14.2051 14.3761 14.3097C14.2217 14.4144 14.0471 14.4859 13.8636 14.5198C13.6801 14.5536 13.4916 14.549 13.3099 14.5063C13.1282 14.4636 12.9574 14.3837 12.8082 14.2716L10.7058 12.6966C10.6121 12.6259 10.4979 12.5876 10.3804 12.5876C10.263 12.5876 10.1488 12.6259 10.0551 12.6966L7.2156 14.8521C6.8367 15.1392 6.3417 14.6856 6.5955 14.2824V14.2833Z" fill="#0A0D14"/>
</symbol>
<symbol id="icon-mail-send-fill" viewBox="0 0 24 24">
<path d="M2.99995 6.14999V4.79369C3.0016 4.55733 3.09616 4.33111 3.26321 4.16389C3.43026 3.99667 3.65639 3.90188 3.89275 3.89999H20.1072C20.6003 3.89999 21 4.30049 21 4.79369V19.2063C20.9983 19.4427 20.9037 19.6689 20.7367 19.8361C20.5696 20.0033 20.3435 20.0981 20.1072 20.1H3.89275C3.65588 20.0998 3.4288 20.0055 3.26139 19.8379C3.09398 19.6703 2.99995 19.4432 2.99995 19.2063V18.3H19.2V7.76999L12 14.25L2.99995 6.14999ZM1.19995 10.2H5.69995V12H1.19995V10.2ZM1.19995 14.7H8.39995V16.5H1.19995V14.7Z" fill="#0A0D14"/>
</symbol>
<symbol id="icon-chat-smile-3-line" viewBox="0 0 24 24">
<path d="M3.00001 12C3.00001 7.0293 7.02931 3 12 3C16.9707 3 21 7.0293 21 12C21 16.9707 16.9707 21 12 21H3.00001L5.63611 18.3639C4.79914 17.5291 4.13539 16.5371 3.683 15.445C3.23061 14.3529 2.9985 13.1821 3.00001 12ZM7.34521 19.2H12C13.424 19.2 14.8161 18.7777 16.0001 17.9866C17.1841 17.1954 18.107 16.0709 18.6519 14.7553C19.1969 13.4397 19.3395 11.992 19.0617 10.5953C18.7838 9.19869 18.0981 7.91577 17.0912 6.90883C16.0842 5.90189 14.8013 5.21616 13.4047 4.93835C12.008 4.66053 10.5603 4.80312 9.24469 5.34807C7.92906 5.89302 6.80457 6.81586 6.01343 7.99989C5.22228 9.18393 4.80001 10.576 4.80001 12C4.80001 13.9368 5.56591 15.7485 6.90871 17.0913L8.18131 18.3639L7.34521 19.2ZM8.40001 12.9H15.6C15.6 13.8548 15.2207 14.7705 14.5456 15.4456C13.8705 16.1207 12.9548 16.5 12 16.5C11.0452 16.5 10.1296 16.1207 9.45442 15.4456C8.77929 14.7705 8.40001 13.8548 8.40001 12.9Z" fill="#0A0D14"/>
</symbol>
<symbol id="icon-telegram-line" viewBox="0 0 24 24">
<path d="M12 19.2C13.9096 19.2 15.7409 18.4414 17.0912 17.0912C18.4414 15.7409 19.2 13.9096 19.2 12C19.2 10.0904 18.4414 8.25909 17.0912 6.90883C15.7409 5.55857 13.9096 4.8 12 4.8C10.0904 4.8 8.25909 5.55857 6.90883 6.90883C5.55857 8.25909 4.8 10.0904 4.8 12C4.8 13.9096 5.55857 15.7409 6.90883 17.0912C8.25909 18.4414 10.0904 19.2 12 19.2ZM12 21C7.0293 21 3 16.9707 3 12C3 7.0293 7.0293 3 12 3C16.9707 3 21 7.0293 21 12C21 16.9707 16.9707 21 12 21ZM9.201 13.053L6.9528 12.3519C6.4668 12.2034 6.4641 11.8686 7.0617 11.6283L15.8214 8.2443C16.3299 8.0373 16.6179 8.2992 16.4532 8.9553L14.9619 15.9933C14.8575 16.4946 14.556 16.6143 14.1375 16.383L11.8416 14.6838L10.7715 15.717C10.6617 15.8232 10.5726 15.9141 10.4034 15.9366C10.2351 15.96 10.0965 15.9096 9.9948 15.6306L9.2118 13.0467L9.201 13.0539V13.053Z" fill="#0A0D14"/>
</symbol>
<symbol id="icon-line-line" viewBox="0 0 24 24">
<path d="M21 10.821C21 12.4293 20.3817 13.881 19.0893 15.2976C17.1993 17.4702 12.9801 20.1243 12.0117 20.5284C11.0451 20.9343 11.1918 20.2701 11.2251 20.0451L11.3484 19.2801C11.379 19.0443 11.4096 18.6951 11.3196 18.4701C11.2188 18.2208 10.8192 18.0885 10.5267 18.0273C6.2022 17.4531 3 14.43 3 10.821C3 6.79347 7.0383 3.51477 12 3.51477C16.9608 3.51477 21 6.79347 21 10.821ZM17.76 14.0835C18.7617 12.9855 19.2 11.9586 19.2 10.821C19.2 7.87977 16.041 5.31477 12 5.31477C7.959 5.31477 4.8 7.87977 4.8 10.821C4.8 13.4355 7.2552 15.7773 10.7634 16.2426L10.8957 16.266C11.8659 16.4694 12.5913 16.8186 12.9918 17.8032L13.0242 17.8896C14.6496 16.8312 16.7808 15.2076 17.7591 14.0835H17.76ZM17.5242 10.4835C17.6445 10.4909 17.7574 10.5439 17.8399 10.6317C17.9225 10.7195 17.9684 10.8355 17.9684 10.956C17.9684 11.0765 17.9225 11.1924 17.8399 11.2802C17.7574 11.368 17.6445 11.421 17.5242 11.4285H16.2075V12.2727H17.5233C17.587 12.2699 17.6507 12.28 17.7104 12.3025C17.77 12.325 17.8246 12.3593 17.8707 12.4034C17.9167 12.4475 17.9534 12.5005 17.9785 12.5591C18.0035 12.6178 18.0164 12.6809 18.0164 12.7447C18.0164 12.8085 18.0035 12.8716 17.9785 12.9303C17.9534 12.989 17.9167 13.0419 17.8707 13.086C17.8246 13.1301 17.77 13.1645 17.7104 13.1869C17.6507 13.2094 17.587 13.2196 17.5233 13.2168H15.735C15.6104 13.2158 15.4912 13.1658 15.4032 13.0775C15.3153 12.9892 15.2657 12.8698 15.2652 12.7452V9.16677C15.2652 8.90847 15.4767 8.69427 15.7377 8.69427H17.5269C17.6522 8.69463 17.7723 8.74475 17.8606 8.83362C17.949 8.92248 17.9984 9.04281 17.998 9.16812C17.9977 9.29344 17.9476 9.41348 17.8587 9.50183C17.7698 9.59019 17.6495 9.63963 17.5242 9.63927H16.2084V10.4835H17.5242ZM14.6325 12.7452C14.6323 12.8071 14.6198 12.8684 14.5959 12.9255C14.572 12.9826 14.5371 13.0345 14.4931 13.0781C14.4491 13.1217 14.397 13.1563 14.3397 13.1798C14.2824 13.2032 14.221 13.2152 14.1591 13.215C14.085 13.2166 14.0116 13.2005 13.9451 13.1679C13.8785 13.1353 13.8208 13.0873 13.7766 13.0278L11.9442 10.5402V12.7452C11.9352 12.864 11.8817 12.975 11.7943 13.056C11.7069 13.137 11.5922 13.182 11.4731 13.182C11.3539 13.182 11.2392 13.137 11.1518 13.056C11.0644 12.975 11.0109 12.864 11.0019 12.7452V9.16677C11.0017 9.04233 11.0508 8.92287 11.1385 8.83462C11.2263 8.74638 11.3455 8.69655 11.4699 8.69607C11.6157 8.69607 11.7507 8.77347 11.8407 8.88597L13.6875 11.3835V9.16677C13.6875 8.90847 13.899 8.69427 14.16 8.69427C14.4183 8.69427 14.6325 8.90847 14.6325 9.16677V12.7452ZM10.3269 12.7452C10.3262 12.8703 10.276 12.9902 10.1873 13.0785C10.0987 13.1668 9.97867 13.2165 9.8535 13.2168C9.72873 13.2161 9.60928 13.1661 9.52113 13.0778C9.43299 12.9895 9.38327 12.8699 9.3828 12.7452V9.16677C9.3828 8.90847 9.5952 8.69427 9.8553 8.69427C10.1154 8.69427 10.3269 8.90847 10.3269 9.16677V12.7452ZM8.4774 13.2168H6.6873C6.56236 13.2161 6.44272 13.1662 6.35429 13.0779C6.26586 12.9897 6.21574 12.8701 6.2148 12.7452V9.16677C6.22513 9.04857 6.27938 8.93854 6.36685 8.85838C6.45432 8.77822 6.56865 8.73375 6.6873 8.73375C6.80595 8.73375 6.92028 8.77822 7.00775 8.85838C7.09522 8.93854 7.14947 9.04857 7.1598 9.16677V12.2718H8.4774C8.60272 12.2718 8.7229 12.3216 8.81151 12.4102C8.90012 12.4988 8.9499 12.619 8.9499 12.7443C8.9499 12.8696 8.90012 12.9898 8.81151 13.0784C8.7229 13.167 8.60272 13.2168 8.4774 13.2168Z" fill="#0A0D14"/>
</symbol>
<symbol id="icon-eyeglass" viewBox="0 0 48 48">
<path d="M27.885 32.515c-2.864 1.966-6.333 3.116-10.07 3.116C7.976 35.63 0 27.656 0 17.817 0 7.976 7.976 0 17.816 0S35.63 7.976 35.63 17.816c0 3.736-1.15 7.205-3.115 10.07l14.53 14.53c1.278 1.277 1.275 3.352 0 4.628-1.28 1.278-3.353 1.278-4.63 0l-14.53-14.53zm-10.07-3.736c6.056 0 10.964-4.91 10.964-10.964 0-6.055-4.91-10.964-10.964-10.964-6.055 0-10.964 4.91-10.964 10.964 0 6.055 4.91 10.963 10.964 10.963z" fill="currentColor"/>
</symbol>
<symbol id="icon-tick-line" viewBox="0 0 24 24">
<path d="M4.53 12.97a.75.75 0 0 0-1.06 1.06l4.5 4.5a.75.75 0 0 0 1.06 0l11-11a.75.75 0 0 0-1.06-1.06L8.5 16.94l-3.97-3.97Z" fill="currentColor"/>
</symbol>
<symbol id="icon-lock-line" viewBox="0 0 24 24">
<path d="M18.3 10.2H19.2C19.4387 10.2 19.6676 10.2948 19.8364 10.4636C20.0052 10.6324 20.1 10.8613 20.1 11.1V20.1C20.1 20.3387 20.0052 20.5676 19.8364 20.7364C19.6676 20.9052 19.4387 21 19.2 21H4.80002C4.56133 21 4.33241 20.9052 4.16363 20.7364C3.99485 20.5676 3.90002 20.3387 3.90002 20.1V11.1C3.90002 10.8613 3.99485 10.6324 4.16363 10.4636C4.33241 10.2948 4.56133 10.2 4.80002 10.2H5.70002V9.3C5.70002 8.47267 5.86298 7.65345 6.17958 6.88909C6.49619 6.12474 6.96024 5.43024 7.54525 4.84523C8.13026 4.26022 8.82477 3.79616 9.58912 3.47956C10.3535 3.16295 11.1727 3 12 3C12.8274 3 13.6466 3.16295 14.4109 3.47956C15.1753 3.79616 15.8698 4.26022 16.4548 4.84523C17.0398 5.43024 17.5039 6.12474 17.8205 6.88909C18.1371 7.65345 18.3 8.47267 18.3 9.3V10.2ZM5.70002 12V19.2H18.3V12H5.70002ZM11.1 13.8H12.9V17.4H11.1V13.8ZM16.5 10.2V9.3C16.5 8.10653 16.0259 6.96193 15.182 6.11802C14.3381 5.27411 13.1935 4.8 12 4.8C10.8066 4.8 9.66196 5.27411 8.81804 6.11802C7.97413 6.96193 7.50002 8.10653 7.50002 9.3V10.2H16.5Z" fill="currentColor"/>
</symbol>
<symbol id="icon-captain" viewBox="0 0 24 24">
<path d="M7.02051 9.50216C7.02051 9.01881 7.41237 8.62695 7.89571 8.62695C8.37909 8.62695 8.77091 9.01881 8.77091 9.50216V11.5248C8.77091 12.0082 8.37909 12.4 7.89571 12.4C7.41237 12.4 7.02051 12.0082 7.02051 11.5248V9.50216Z" fill="currentColor"/>
<path d="M9.82117 9.50216C9.82117 9.01881 10.213 8.62695 10.6964 8.62695C11.1798 8.62695 11.5716 9.01881 11.5716 9.50216V11.5248C11.5716 12.0082 11.1798 12.4 10.6964 12.4C10.213 12.4 9.82117 12.0082 9.82117 11.5248V9.50216Z" fill="currentColor"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M16.6162 6.22553C13.357 5.76568 10.7003 5.74756 7.36793 6.22351C6.5256 6.34382 5.96827 6.42512 5.54331 6.54928C5.14927 6.66446 4.92518 6.80177 4.73984 7.00894C4.35603 7.43786 4.30542 7.923 4.25311 9.61502C4.20172 11.2779 4.30356 12.7682 4.49645 14.445C4.59922 15.3386 4.66994 15.9416 4.78286 16.4001C4.88998 16.835 5.01955 17.0688 5.19961 17.2478C5.38111 17.4282 5.61372 17.5555 6.04062 17.6588C6.49219 17.768 7.08468 17.834 7.96525 17.9301C10.8131 18.2408 12.9449 18.2392 15.8034 17.9317C16.6946 17.8359 17.2968 17.7698 17.7551 17.6613C18.1905 17.5582 18.4247 17.4319 18.6036 17.2566C18.7789 17.085 18.9128 16.8483 19.0289 16.3917C19.15 15.9154 19.2325 15.2851 19.3518 14.3592C19.5646 12.7072 19.7179 11.2564 19.7238 9.66706C19.7302 7.96781 19.6955 7.48431 19.3073 7.03586C19.1198 6.81923 18.8919 6.67683 18.4889 6.55823C18.0537 6.43014 17.4813 6.3476 16.6162 6.22553ZM7.16446 4.79872C10.6358 4.30293 13.4288 4.32234 16.8172 4.80043L16.8668 4.8074C17.6691 4.92055 18.3469 5.01616 18.8952 5.17755C19.487 5.35169 19.9819 5.61608 20.3955 6.09398C21.1758 6.9954 21.1707 8.06494 21.1639 9.48592C21.1636 9.54745 21.1633 9.60961 21.1631 9.67247C21.1568 11.3529 20.9942 12.8746 20.7792 14.5431L20.7735 14.5873C20.6614 15.458 20.5689 16.1755 20.4237 16.7465C20.2709 17.3469 20.0427 17.8617 19.6106 18.2849C19.1823 18.7043 18.6761 18.9223 18.0866 19.0618C17.5299 19.1936 16.8372 19.2681 16.0022 19.3579L15.9573 19.3627C12.9972 19.6811 10.7615 19.6829 7.80915 19.3608L7.7636 19.3559C6.94029 19.2661 6.25475 19.1913 5.70225 19.0576C5.11489 18.9155 4.61209 18.6932 4.18492 18.2685C3.75628 17.8424 3.53115 17.336 3.38542 16.7443C3.24797 16.1863 3.16807 15.4915 3.07185 14.6548L3.06664 14.6095C2.86882 12.8898 2.76033 11.3256 2.81459 9.57052C2.81656 9.50684 2.81844 9.44387 2.8203 9.38159C2.86249 7.97127 2.89413 6.91333 3.66729 6.04925C4.07752 5.5908 4.56238 5.33656 5.13959 5.16786C5.6749 5.01141 6.33496 4.91716 7.11626 4.80561C7.13225 4.80331 7.14832 4.80102 7.16446 4.79872Z" fill="currentColor"/>
</symbol>
<symbol id="icon-up-caret" viewBox="0 0 48 48">
<path d="M2.988 33.02c-1.66 0-1.943-.81-.618-1.824l20-15.28c.878-.672 2.31-.67 3.188 0l20.075 15.288c1.316 1.003 1.048 1.816-.62 1.816H2.987z" />
</symbol>
<symbol id="icon-copy" viewBox="0 0 24 24">
<path d="M5.503 4.627 5.5 6.75v10.504a3.25 3.25 0 0 0 3.25 3.25h8.616a2.251 2.251 0 0 1-2.122 1.5H8.75A4.75 4.75 0 0 1 4 17.254V6.75c0-.98.627-1.815 1.503-2.123ZM17.75 2A2.25 2.25 0 0 1 20 4.25v13a2.25 2.25 0 0 1-2.25 2.25h-9a2.25 2.25 0 0 1-2.25-2.25v-13A2.25 2.25 0 0 1 8.75 2h9Zm0 1.5h-9a.75.75 0 0 0-.75.75v13c0 .414.336.75.75.75h9a.75.75 0 0 0 .75-.75v-13a.75.75 0 0 0-.75-.75Z" />
</symbol>
<symbol id="eye-show" viewBox="0 0 24 24">
<path d="M12 9.005a4 4 0 1 1 0 8 4 4 0 0 1 0-8Zm0 1.5a2.5 2.5 0 1 0 0 5 2.5 2.5 0 0 0 0-5ZM12 5.5c4.613 0 8.596 3.15 9.701 7.564a.75.75 0 1 1-1.455.365 8.503 8.503 0 0 0-16.493.004.75.75 0 0 1-1.455-.363A10.003 10.003 0 0 1 12 5.5Z" />
</symbol>
<symbol id="eye-hide" viewBox="0 0 24 24">
<path d="M2.22 2.22a.75.75 0 0 0-.073.976l.073.084 4.034 4.035a9.986 9.986 0 0 0-3.955 5.75.75.75 0 0 0 1.455.364 8.49 8.49 0 0 1 3.58-5.034l1.81 1.81A4 4 0 0 0 14.8 15.86l5.919 5.92a.75.75 0 0 0 1.133-.977l-.073-.084-6.113-6.114.001-.002-1.2-1.198-2.87-2.87h.002L8.719 7.658l.001-.002-1.133-1.13L3.28 2.22a.75.75 0 0 0-1.06 0Zm7.984 9.045 3.535 3.536a2.5 2.5 0 0 1-3.535-3.535ZM12 5.5c-1 0-1.97.148-2.889.425l1.237 1.236a8.503 8.503 0 0 1 9.899 6.272.75.75 0 0 0 1.455-.363A10.003 10.003 0 0 0 12 5.5Zm.195 3.51 3.801 3.8a4.003 4.003 0 0 0-3.801-3.8Z" />
</symbol>
<symbol id="icon-gear" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M3.50498 13.75C3.18794 13.2017 2.94148 12.6156 2.77148 12.0055C3.14146 11.8173 3.45218 11.5305 3.66926 11.1767C3.88633 10.8229 4.00131 10.4159 4.00146 10.0008C4.00162 9.58574 3.88695 9.1787 3.67014 8.82474C3.45332 8.47078 3.14282 8.18369 2.77298 7.99524C3.11201 6.76935 3.75753 5.64995 4.64873 4.74249C4.9968 4.96878 5.4007 5.09436 5.81572 5.10532C6.23074 5.11629 6.6407 5.01221 7.00023 4.80461C7.35976 4.59701 7.65485 4.29399 7.85283 3.92907C8.05081 3.56415 8.14396 3.15157 8.12198 2.73699C9.35357 2.41871 10.6459 2.41922 11.8772 2.73849C11.8554 3.15306 11.9488 3.56558 12.1469 3.9304C12.3451 4.29521 12.6403 4.59809 12.9999 4.80553C13.3595 5.01297 13.7694 5.11688 14.1844 5.10575C14.5994 5.09463 15.0033 4.9689 15.3512 4.74249C15.7855 5.18499 16.171 5.68824 16.495 6.24999C16.8197 6.81174 17.0627 7.39749 17.2285 7.99449C16.8585 8.18267 16.5478 8.46952 16.3307 8.82332C16.1136 9.17712 15.9987 9.58407 15.9985 9.99915C15.9984 10.4142 16.113 10.8213 16.3298 11.1752C16.5466 11.5292 16.8571 11.8163 17.227 12.0047C16.888 13.2306 16.2424 14.35 15.3512 15.2575C15.0032 15.0312 14.5993 14.9056 14.1843 14.8947C13.7692 14.8837 13.3593 14.9878 12.9997 15.1954C12.6402 15.403 12.3451 15.706 12.1471 16.0709C11.9492 16.4358 11.856 16.8484 11.878 17.263C10.6464 17.5813 9.35406 17.5808 8.12273 17.2615C8.14452 16.8469 8.05118 16.4344 7.85305 16.0696C7.65492 15.7048 7.35972 15.4019 7.00011 15.1944C6.64051 14.987 6.23053 14.8831 5.81553 14.8942C5.40053 14.9054 4.99671 15.0311 4.64873 15.2575C4.20548 14.8052 3.82118 14.2987 3.50498 13.75V13.75ZM7.74998 13.897C8.5492 14.358 9.15012 15.0978 9.43748 15.9745C9.81173 16.0097 10.1875 16.0105 10.5617 15.9752C10.8493 15.0984 11.4505 14.3586 12.25 13.8977C13.0489 13.4355 13.9904 13.2846 14.8937 13.474C15.1112 13.168 15.2987 12.8417 15.4547 12.5005C14.8393 11.8131 14.4993 10.9226 14.5 9.99999C14.5 9.05499 14.8525 8.17224 15.4547 7.49949C15.2976 7.15835 15.1093 6.83246 14.8922 6.52599C13.9894 6.71522 13.0486 6.5646 12.25 6.10299C11.4508 5.64202 10.8499 4.90223 10.5625 4.02549C10.1882 3.99024 9.81248 3.98949 9.43823 4.02474C9.15068 4.9016 8.54949 5.64141 7.74998 6.10224C6.95107 6.56448 6.00959 6.71538 5.10623 6.52599C4.88916 6.8322 4.70133 7.15814 4.54523 7.49949C5.16066 8.18691 5.50065 9.07733 5.49998 9.99999C5.49998 10.945 5.14748 11.8277 4.54523 12.5005C4.70234 12.8416 4.89064 13.1675 5.10773 13.474C6.01052 13.2848 6.95139 13.4354 7.74998 13.897ZM9.99998 12.25C9.40325 12.25 8.83095 12.0129 8.40899 11.591C7.98704 11.169 7.74998 10.5967 7.74998 9.99999C7.74998 9.40325 7.98704 8.83096 8.40899 8.409C8.83095 7.98704 9.40325 7.74999 9.99998 7.74999C10.5967 7.74999 11.169 7.98704 11.591 8.409C12.0129 8.83096 12.25 9.40325 12.25 9.99999C12.25 10.5967 12.0129 11.169 11.591 11.591C11.169 12.0129 10.5967 12.25 9.99998 12.25ZM9.99998 10.75C10.1989 10.75 10.3897 10.671 10.5303 10.5303C10.671 10.3897 10.75 10.1989 10.75 9.99999C10.75 9.80108 10.671 9.61031 10.5303 9.46966C10.3897 9.32901 10.1989 9.24999 9.99998 9.24999C9.80107 9.24999 9.61031 9.32901 9.46965 9.46966C9.329 9.61031 9.24998 9.80108 9.24998 9.99999C9.24998 10.1989 9.329 10.3897 9.46965 10.5303C9.61031 10.671 9.80107 10.75 9.99998 10.75V10.75Z" fill="#868C98"/>
</symbol>
<symbol id="icon-linear" viewBox="0 0 24 24">
<path d="M0.294 14.765c-0.053-0.228 0.218-0.371 0.383-0.206l8.762 8.762c0.165 0.165 0.022 0.436-0.206 0.383C4.812 22.668 1.332 19.188 0.294 14.765zM0 11.253c-0.004 0.068 0.021 0.134 0.07 0.183l12.494 12.494c0.048 0.048 0.115 0.074 0.183 0.07c0.568-0.035 1.127-0.11 1.671-0.222c0.183-0.038 0.247-0.263 0.115-0.396l-13.847-13.847c-0.132-0.132-0.358-0.068-0.396 0.115c-0.112 0.544-0.187 1.102-0.222 1.671zM1.011 7.129c-0.04 0.09-0.02 0.195 0.05 0.264l15.546 15.546c0.069 0.069 0.174 0.09 0.264 0.05c0.429-0.191 0.844-0.406 1.244-0.644c0.133-0.079 0.153-0.261 0.044-0.37l-16.134-16.134c-0.109-0.109-0.291-0.089-0.37 0.044c-0.238 0.4-0.453 0.816-0.644 1.244zM3.038 4.338c-0.089-0.089-0.094-0.231-0.011-0.325c2.2-2.46 5.4-4.013 8.973-4.013 6.627 0 12 5.373 12 12c0 3.562-1.55 6.76-4.013 8.961c-0.094 0.084-0.236 0.078-0.325-0.011l-16.624-16.612z"/>
</symbol>
<symbol id="icon-instagram" viewBox="0 0 24 24">
<path d="M 8 3 C 5.243 3 3 5.243 3 8 L 3 16 C 3 18.757 5.243 21 8 21 L 16 21 C 18.757 21 21 18.757 21 16 L 21 8 C 21 5.243 18.757 3 16 3 L 8 3 z M 8 5 L 16 5 C 17.654 5 19 6.346 19 8 L 19 16 C 19 17.654 17.654 19 16 19 L 8 19 C 6.346 19 5 17.654 5 16 L 5 8 C 5 6.346 6.346 5 8 5 z M 17 6 A 1 1 0 0 0 16 7 A 1 1 0 0 0 17 8 A 1 1 0 0 0 18 7 A 1 1 0 0 0 17 6 z M 12 7 C 9.243 7 7 9.243 7 12 C 7 14.757 9.243 17 12 17 C 14.757 17 17 14.757 17 12 C 17 9.243 14.757 7 12 7 z M 12 9 C 13.654 9 15 10.346 15 12 C 15 13.654 13.654 15 12 15 C 10.346 15 9 13.654 9 12 C 9 10.346 10.346 9 12 9 z"/>
</symbol>
<symbol id="icon-tiktok" viewBox="0 0 21 24">
<path fill="currentColor" d="M17.804,4.814C16.176,3.752 15.19,1.944 15.19,0L11.062,0L11.054,16.541C10.982,18.453 9.371,19.948 7.459,19.872C5.547,19.8 4.052,18.188 4.128,16.277C4.2,14.413 5.731,12.942 7.595,12.942C7.944,12.942 8.289,12.998 8.617,13.102L8.617,8.886C8.277,8.838 7.936,8.814 7.595,8.81C3.407,8.81 0,12.216 0,16.405C0.008,20.597 3.403,23.996 7.599,24C11.788,24 15.194,20.593 15.194,16.405L15.194,8.02C16.866,9.222 18.874,9.872 20.934,9.868L20.934,5.739C19.82,5.743 18.733,5.419 17.804,4.814Z"/>
</symbol>
<symbol id="icon-notion" viewBox="0 0 24 24">
<path fill="currentColor" d="M6.104 5.91c.584.474.802.438 1.898.365l10.332-.62c.22 0 .037-.22-.036-.256l-1.716-1.24c-.329-.255-.767-.548-1.606-.475l-10.005.73c-.364.036-.437.219-.292.365zm.62 2.408v10.87c0 .585.292.803.95.767l11.354-.657c.657-.036.73-.438.73-.913V7.588c0-.474-.182-.73-.584-.693l-11.866.693c-.438.036-.584.255-.584.73m11.21.583c.072.328 0 .657-.33.694l-.547.109v8.025c-.475.256-.913.401-1.278.401c-.584 0-.73-.182-1.168-.729l-3.579-5.618v5.436l1.133.255s0 .656-.914.656l-2.519.146c-.073-.146 0-.51.256-.583l.657-.182v-7.187l-.913-.073c-.073-.329.11-.803.621-.84l2.702-.182l3.724 5.692V9.886l-.95-.109c-.072-.402.22-.693.585-.73zM4.131 3.429l10.406-.766c1.277-.11 1.606-.036 2.41.547l3.321 2.335c.548.401.731.51.731.948v12.805c0 .803-.292 1.277-1.314 1.35l-12.085.73c-.767.036-1.132-.073-1.534-.584L3.62 17.62c-.438-.584-.62-1.021-.62-1.533V4.705c0-.656.292-1.203 1.132-1.276"/>
</symbol>
<symbol id="icon-shopify" viewBox="0 0 32 32">
<path fill="currentColor" d="m20.448 31.974l9.625-2.083s-3.474-23.484-3.5-23.641s-.156-.255-.281-.255c-.13 0-2.573-.182-2.573-.182s-1.703-1.698-1.922-1.88a.4.4 0 0 0-.161-.099l-1.219 28.141zm-4.833-16.901s-1.083-.563-2.365-.563c-1.932 0-2.005 1.203-2.005 1.521c0 1.641 4.318 2.286 4.318 6.172c0 3.057-1.922 5.01-4.542 5.01c-3.141 0-4.719-1.953-4.719-1.953l.859-2.781s1.661 1.422 3.042 1.422c.901 0 1.302-.724 1.302-1.245c0-2.156-3.542-2.255-3.542-5.807c-.047-2.984 2.094-5.891 6.438-5.891c1.677 0 2.5.479 2.5.479l-1.26 3.625zm-.719-13.969c.177 0 .359.052.536.182c-1.313.62-2.75 2.188-3.344 5.323a76 76 0 0 1-2.516.771c.688-2.38 2.359-6.26 5.323-6.26zm1.646 3.932v.182c-1.005.307-2.115.646-3.193.979c.62-2.37 1.776-3.526 2.781-3.958c.255.667.411 1.568.411 2.797zm.718-2.973c.922.094 1.521 1.151 1.901 2.339c-.464.151-.979.307-1.542.484v-.333c0-1.005-.13-1.828-.359-2.495zm3.99 1.718c-.031 0-.083.026-.104.026c-.026 0-.385.099-.953.281C19.63 2.442 18.625.927 16.849.927h-.156C16.183.281 15.558 0 15.021 0c-4.141 0-6.12 5.172-6.74 7.797c-1.594.484-2.75.844-2.88.896c-.901.286-.927.313-1.031 1.161c-.099.615-2.438 18.75-2.438 18.75L20.01 32z"/>
</symbol>
<symbol id="icon-slack" viewBox="0 0 24 24">
<path fill="currentColor" d="M6.527 14.514A1.973 1.973 0 0 1 4.56 16.48a1.973 1.973 0 0 1-1.968-1.967c0-1.083.885-1.968 1.968-1.968h1.967zm.992 0c0-1.083.885-1.968 1.968-1.968s1.967.885 1.967 1.968v4.927a1.973 1.973 0 0 1-1.967 1.968a1.973 1.973 0 0 1-1.968-1.968zm1.968-7.987A1.973 1.973 0 0 1 7.519 4.56c0-1.083.885-1.967 1.968-1.967s1.967.884 1.967 1.967v1.968zm0 .992c1.083 0 1.967.884 1.967 1.967a1.973 1.973 0 0 1-1.967 1.968H4.56a1.973 1.973 0 0 1-1.968-1.968c0-1.083.885-1.967 1.968-1.967zm7.986 1.967c0-1.083.885-1.967 1.968-1.967s1.968.884 1.968 1.967a1.973 1.973 0 0 1-1.968 1.968h-1.968zm-.991 0a1.973 1.973 0 0 1-1.968 1.968a1.973 1.973 0 0 1-1.968-1.968V4.56c0-1.083.885-1.967 1.968-1.967s1.968.884 1.968 1.967zm-1.968 7.987c1.083 0 1.968.885 1.968 1.968a1.973 1.973 0 0 1-1.968 1.968a1.973 1.973 0 0 1-1.968-1.968v-1.968zm0-.992a1.973 1.973 0 0 1-1.968-1.967c0-1.083.885-1.968 1.968-1.968h4.927c1.083 0 1.968.885 1.968 1.968a1.973 1.973 0 0 1-1.968 1.967z"/>
</symbol>
</svg>

After

Width:  |  Height:  |  Size: 43 KiB

View File

@@ -0,0 +1,50 @@
<%#
# Javascript Partial
This partial imports the necessary javascript on each page.
By default, it includes the application JS,
but each page can define additional JS sources
by providing a `content_for(:javascript)` block.
%>
<% Administrate::Engine.javascripts.each do |js_path| %>
<%= javascript_include_tag js_path %>
<% end %>
<%= yield :javascript %>
<% if Rails.env.test? %>
<%= javascript_tag do %>
$.fx.off = true;
$.ajaxSetup({ async: false });
<% end %>
<% end %>
<script>
window.chatwootSettings = {
hideMessageBubble: true,
};
(function(d,t) {
var BASE_URL = '';
var g=d.createElement(t),s=d.getElementsByTagName(t)[0];
g.src= BASE_URL + "/packs/js/sdk.js";
g.async = true;
s.parentNode.insertBefore(g,s);
g.onload=function(){
window.chatwootSDK.run({
websiteToken: '<%= ChatwootHub.support_config[:support_website_token] %>',
baseUrl: '<%= ChatwootHub.support_config[:support_script_url] %>'
})
}
})(document,"script");
window.addEventListener('chatwoot:ready', function() {
window.$chatwoot.setUser('<%= ChatwootHub.installation_identifier %>', {
identifier_hash: '<%= ChatwootHub.support_config[:support_identifier_hash] %>',
email: '<%= SuperAdmin.first.email %>',
name: '<%= SuperAdmin.first.name %>'
});
})
</script>

View File

@@ -0,0 +1,7 @@
<li class="px-4 mb-1">
<% text_class_name = current_page?(url) ? 'text-woot-500 bg-slate-25' : 'text-slate-800' %>
<%= link_to(url, class: text_class_name + " -ml-1 focus:outline-none cursor-pointer flex items-center px-2 py-1.5 text-slate-800 cursor-pointer hover:text-woot-500 hover:bg-slate-25 rounded-lg") do %>
<svg width="16" height="16"><use xlink:href="#<%= icon %>" /></svg>
<span class="ml-2 text-sm"><%= label %></span>
<% end %>
</li>

View File

@@ -0,0 +1,55 @@
<%#
# Navigation
This partial is used to display the navigation in Administrate.
By default, the navigation contains navigation links
for all resources in the admin dashboard,
as defined by the routes in the `admin/` namespace
%>
<%= vite_client_tag %>
<%= vite_javascript_tag 'superadmin_pages' %>
<%
sidebar_icons = {
accounts: 'icon-building-4-line',
users: 'icon-user-follow-line',
platform_apps: 'icon-apps-2-line',
agent_bots: 'icon-robot-line',
}
%>
<div class="border-slate-100 border-r w-56 flex-shrink-0 justify-between h-full flex flex-col" role="navigation">
<div>
<div class="flex mx-4 mb-4 border-slate-100 border-b py-6">
<%= link_to image_tag('/brand-assets/logo_thumbnail.svg', alt: 'Chatwoot Admin Dashboard', class: 'h-10'), super_admin_root_url %>
<div class="flex flex-col ml-3">
<div class="text-sm">Chatwoot <%= Chatwoot.config[:version] %></div>
<div class="text-xs text-slate-700 mt-0.5">Super Admin Console</div>
</div>
</div>
<ul class="my-4">
<%= render partial: "nav_item", locals: { icon: 'icon-grid-line', url: super_admin_root_url, label: 'Dashboard' } %>
<% Administrate::Namespace.new(namespace).resources.each do |resource| %>
<% next if ["account_users", "access_tokens", "installation_configs", "dashboard", "devise/sessions", "app_configs", "instance_statuses", "settings"].include? resource.resource %>
<%= render partial: "nav_item", locals: {
icon: sidebar_icons[resource.resource.to_sym],
url: resource_index_route(resource),
label: display_resource_name(resource),
}
%>
<% end %>
<%= render 'settings_menu', open: settings_open? %>
</ul>
</div>
<div>
<ul class="my-4">
<%= render partial: "nav_item", locals: { icon: 'icon-mist-fill', url: sidekiq_web_url, label: 'Sidekiq Dashboard' } %>
<%= render partial: "nav_item", locals: { icon: 'icon-health-book-line', url: super_admin_instance_status_url, label: 'Instance Health' } %>
<%= render partial: "nav_item", locals: { icon: 'icon-dashboard-line', url: '/', label: 'Agent Dashboard' } %>
<%= render partial: "nav_item", locals: { icon: 'icon-logout-circle-r-line', url: super_admin_logout_url, label: 'Logout' } %>
</ul>
</div>
</div>

View File

@@ -0,0 +1,24 @@
<form class="search" role="search">
<label class="search__label" for="search">
<svg class="search__eyeglass-icon" role="img">
<title>
<%= t("administrate.search.label", resource: resource_name) %>
</title>
<use xlink:href="#icon-eyeglass" />
</svg>
</label>
<input class="search__input"
id="search"
type="search"
name="search"
placeholder="<%= t("administrate.search.label", resource: resource_name) %>"
value="<%= search_term %>">
<%= link_to clear_search_params, class: "search__clear-link" do %>
<svg class="search__clear-icon" role="img">
<title><%= t("administrate.search.clear") %></title>
<use xlink:href="#icon-cancel" />
</svg>
<% end %>
</form>

View File

@@ -0,0 +1,24 @@
<li class="px-4 mb-1">
<details class="group" <%= 'open' if open %>>
<summary class="-ml-1 flex items-center px-2 py-1.5 cursor-pointer rounded-lg <%= open ? 'text-woot-500 bg-slate-25' : 'text-slate-800 hover:text-woot-500 hover:bg-slate-25' %> list-none">
<%= link_to super_admin_settings_url, class: 'flex items-center flex-1' do %>
<svg width="16" height="16"><use xlink:href="#icon-settings-2-line" /></svg>
<span class="ml-2 text-sm">Settings</span>
<% end %>
<svg class="ml-auto w-4 h-4 transition-transform duration-200 group-open:rotate-180" viewBox="0 0 20 20" fill="currentColor">
<path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule="evenodd" />
</svg>
</summary>
<ul class="ml-4 mt-1">
<% settings_pages.each do |_feature_key, attrs| %>
<% url = super_admin_app_config_url(config: attrs['config_key']) %>
<li class="px-4 mb-1">
<% text_class = current_page?(url) ? 'text-woot-500 bg-slate-25' : 'text-slate-800' %>
<%= link_to url, class: text_class + ' -ml-1 flex items-center px-2 py-1.5 hover:text-woot-500 hover:bg-slate-25 rounded-lg' do %>
<span class="ml-2 text-sm"><%= attrs['name'] %></span>
<% end %>
</li>
<% end %>
</ul>
</details>
</li>

View File

@@ -0,0 +1,14 @@
<%#
# Stylesheet Partial
This partial imports the necessary stylesheets on each page.
By default, it includes the application CSS,
but each page can define additional CSS sources
by providing a `content_for(:stylesheet)` block.
%>
<% Administrate::Engine.stylesheets.each do |css_path| %>
<%= stylesheet_link_tag css_path %>
<% end %>
<%= yield :stylesheet %>

View File

@@ -0,0 +1,75 @@
<%#
# Index
This view is the template for the index page.
It is responsible for rendering the search bar, header and pagination.
It renders the `_table` partial to display details about the resources.
## Local variables:
- `page`:
An instance of [Administrate::Page::Collection][1].
Contains helper methods to help display a table,
and knows which attributes should be displayed in the resource's table.
- `resources`:
An instance of `ActiveRecord::Relation` containing the resources
that match the user's search criteria.
By default, these resources are passed to the table partial to be displayed.
- `search_term`:
A string containing the term the user has searched for, if any.
- `show_search_bar`:
A boolean that determines if the search bar should be shown.
[1]: http://www.rubydoc.info/gems/administrate/Administrate/Page/Collection
%>
<% content_for(:title) do %>
<%= display_resource_name(page.resource_name) %>
<% end %>
<header class="main-content__header" role="banner">
<div class="flex items-center justify-between w-full">
<h1 class="main-content__page-title m-0 mr-6" id="page-title">
<%= content_for(:title) %>
</h1>
<div class="flex items-center">
<% if show_search_bar %>
<div class="flex items-center">
<%= render("filters", page: page) %>
<div class="ml-3">
<%= render(
"search",
search_term: search_term,
resource_name: display_resource_name(page.resource_name)
) %>
</div>
</div>
<% end %>
<div class="whitespace-nowrap ml-4">
<%= link_to(
t(
"administrate.actions.new_resource",
name: page.resource_name.titleize.downcase
),
[:new, namespace, page.resource_path.to_sym],
class: "button",
) if accessible_action?(new_resource, :new) %>
</div>
</div>
</div>
</header>
<section class="main-content__body main-content__body--flush">
<%= render(
"collection",
collection_presenter: page,
collection_field_name: resource_name,
page: page,
resources: resources,
table_title: "page-title"
) %>
<%= paginate resources, param_name: '_page'%>
</section>

View File

@@ -0,0 +1,65 @@
<%#
# Show
This view is the template for the show page.
It renders the attributes of a resource,
as well as a link to its edit page.
## Local variables:
- `page`:
An instance of [Administrate::Page::Show][1].
Contains methods for accessing the resource to be displayed on the page,
as well as helpers for describing how each attribute of the resource
should be displayed.
[1]: http://www.rubydoc.info/gems/administrate/Administrate/Page/Show
%>
<% content_for(:title) { t("administrate.actions.show_resource", name: page.page_title) } %>
<header class="main-content__header">
<h1 class="main-content__page-title">
<%= content_for(:title) %>
</h1>
<div>
<%= link_to(
"Edit",
[:edit, namespace, page.resource],
class: "button",
) if accessible_action?(page.resource, :edit) %>
<%= link_to(
t("administrate.actions.destroy"),
[namespace, page.resource],
class: "button button--danger",
method: :delete,
data: { confirm: t("administrate.actions.confirm") }
) if accessible_action?(page.resource, :destroy) %>
</div>
</header>
<section class="main-content__body">
<dl>
<% page.attributes.each do |title, attributes| %>
<fieldset class="<%= "field-unit--nested" if title.present? %>">
<% if title.present? %>
<legend><%= t "helpers.label.#{page.resource_name}.#{title}", default: title %></legend>
<% end %>
<% attributes.each do |attribute| %>
<dt class="attribute-label" id="<%= attribute.name %>">
<%= t(
"helpers.label.#{resource_name}.#{attribute.name}",
default: page.resource.class.human_attribute_name(attribute.name),
) %>
</dt>
<dd class="attribute-data attribute-data--<%=attribute.html_class%>"
><%= render_field attribute, page: page %></dd>
<% end %>
</fieldset>
<% end %>
</dl>
</section>

View File

@@ -0,0 +1,11 @@
<% content_for(:title) do %>
Admin Dashboard
<% end %>
<%= render_vue_component('DashboardIndex', {
accountsCount: @accounts_count,
usersCount: @users_count,
inboxesCount: @inboxes_count,
conversationsCount: @conversations_count,
chartData: @data
}) %>

View File

@@ -0,0 +1,49 @@
<!DOCTYPE html>
<html>
<head>
<title>SuperAdmin | Chatwoot</title>
<%= vite_client_tag %>
<%= vite_javascript_tag 'superadmin' %>
</head>
<body>
<div class="h-full w-full antialiased">
<main class="flex flex-col bg-woot-25 min-h-screen w-full py-20 sm:px-6 lg:px-8 dark:bg-slate-900">
<section class="max-w-5xl mx-auto">
<img src="/brand-assets/logo.svg" alt="Chatwoot" class="mx-auto h-8 w-auto block dark:hidden">
<img src="/brand-assets/logo_dark.svg" alt="Chatwoot" class="mx-auto h-8 w-auto hidden dark:block">
<h2 class="mt-6 text-center text-3xl font-medium text-slate-900 dark:text-woot-50">
Howdy, admin 👋
</h2>
</section>
<section class="bg-white shadow sm:mx-auto mt-11 sm:w-full sm:max-w-lg dark:bg-slate-800 p-11 sm:shadow-lg sm:rounded-lg mb-8 mt-15">
<div>
<%= form_for(resource, as: resource_name, url: '/super_admin/sign_in') do |f| %>
<% if flash[:error].present? %>
<div data-alert class="rounded-md bg-red-500 p-4 text-white text-sm mb-5"><%= flash[:error] %></div>
<% end %>
<div class="mb-5">
<label for="email_address" class="flex justify-between text-sm font-medium leading-6 text-slate-900 dark:text-white">
Email Address
</label>
<div class="mt-1">
<%= f.email_field :email, autofocus: true, autocomplete: "email", placeholder: "Email eg: someone@example.com", class: "block w-full rounded-md border-0 px-3 py-3 appearance-none shadow-sm ring-1 ring-inset text-slate-900 dark:text-slate-100 placeholder:text-slate-400 focus:ring-2 focus:ring-inset focus:ring-woot-500 sm:text-sm sm:leading-6 outline-none dark:bg-slate-700 dark:ring-slate-600 dark:focus:ring-woot-500 ring-slate-200" %>
</div>
</div>
<div class="mb-5">
<label for="password" class="flex justify-between text-sm font-medium leading-6 text-slate-900 dark:text-white">
Password
</label>
<div class="mt-1">
<%= f.password_field :password, autocomplete: "current-password", placeholder: "Password", class: "block w-full rounded-md border-0 px-3 py-3 appearance-none shadow-sm ring-1 ring-inset text-slate-900 dark:text-slate-100 placeholder:text-slate-400 focus:ring-2 focus:ring-inset focus:ring-woot-500 sm:text-sm sm:leading-6 outline-none dark:bg-slate-700 dark:ring-slate-600 dark:focus:ring-woot-500 ring-slate-200" %>
</div>
</div>
<button type="submit" class="flex items-center w-full justify-center rounded-md bg-woot-500 py-3 px-3 text-base font-medium text-white shadow-sm hover:bg-woot-600 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-woot-500 cursor-pointer">
<span>Login</span>
</button>
<% end %>
</div>
</section>
</main>
</div>
</body>
</html>

View File

@@ -0,0 +1,23 @@
<% content_for(:title) do %>
Instance Status
<% end %>
<header class="main-content__header" role="banner">
<h1 class="main-content__page-title" id="page-title">
<%= content_for(:title) %>
</h1>
</header>
<section class="main-content__body">
<table>
<tr>
<th>Metric</th>
<th>Value</th>
</tr>
<% @metrics.each do |key,value| %>
<tr>
<td> <%= key %> </td>
<td> <%= value %></td>
</tr>
<% end %>
</table>
</section>

View File

@@ -0,0 +1,4 @@
<span class="flex gap-1 items-center bg-slate-100 h-9 border border-solid border-slate-100 rounded text-n-slate-11 font-medium p-2">
<svg class="h-4 w-4" width="24" height="24" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M13.209 3.103c-.495-1.004-1.926-1.004-2.421 0L8.43 7.88l-5.273.766c-1.107.161-1.55 1.522-.748 2.303l3.815 3.72-.9 5.25c-.19 1.103.968 1.944 1.959 1.424l4.715-2.48 4.716 2.48c.99.52 2.148-.32 1.96-1.424l-.902-5.25 3.816-3.72c.8-.78.359-2.142-.748-2.303l-5.273-.766-2.358-4.777ZM9.74 8.615l2.258-4.576 2.259 4.576a1.35 1.35 0 0 0 1.016.738l5.05.734-3.654 3.562a1.35 1.35 0 0 0-.388 1.195l.862 5.03-4.516-2.375a1.35 1.35 0 0 0-1.257 0l-4.516 2.374.862-5.029a1.35 1.35 0 0 0-.388-1.195l-3.654-3.562 5.05-.734c.44-.063.82-.34 1.016-.738ZM1.164 3.782a.75.75 0 0 0 .118 1.054l2.5 2a.75.75 0 1 0 .937-1.172l-2.5-2a.75.75 0 0 0-1.055.118Z" fill="currentColor"/><path d="M22.836 18.218a.75.75 0 0 0-.117-1.054l-2.5-2a.75.75 0 0 0-.938 1.172l2.5 2a.75.75 0 0 0 1.055-.117ZM1.282 17.164a.75.75 0 1 0 .937 1.172l2.5-2a.75.75 0 0 0-.937-1.172l-2.5 2ZM22.836 3.782a.75.75 0 0 1-.117 1.054l-2.5 2a.75.75 0 0 1-.938-1.172l-2.5-2a.75.75 0 0 1 1.055.118Z" fill="currentColor"/></svg>
<span class="px-1">Switch to Enterprise edition</span>
</span>

View File

@@ -0,0 +1,4 @@
<a href="<%= ChatwootHub.billing_url %>" target="_blank" rel="noopener noreferrer" class="flex gap-1 items-center bg-slate-100 h-9 hover:bg-slate-300 hover:text-n-slate-12 border border-solid border-slate-100 rounded text-n-slate-11 font-medium p-2 focus:outline-none">
<svg class="h-4 w-4" width="24" height="24" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M13.209 3.103c-.495-1.004-1.926-1.004-2.421 0L8.43 7.88l-5.273.766c-1.107.161-1.55 1.522-.748 2.303l3.815 3.72-.9 5.25c-.19 1.103.968 1.944 1.959 1.424l4.715-2.48 4.716 2.48c.99.52 2.148-.32 1.96-1.424l-.902-5.25 3.816-3.72c.8-.78.359-2.142-.748-2.303l-5.273-.766-2.358-4.777ZM9.74 8.615l2.258-4.576 2.259 4.576a1.35 1.35 0 0 0 1.016.738l5.05.734-3.654 3.562a1.35 1.35 0 0 0-.388 1.195l.862 5.03-4.516-2.375a1.35 1.35 0 0 0-1.257 0l-4.516 2.374.862-5.029a1.35 1.35 0 0 0-.388-1.195l-3.654-3.562 5.05-.734c.44-.063.82-.34 1.016-.738ZM1.164 3.782a.75.75 0 0 0 .118 1.054l2.5 2a.75.75 0 1 0 .937-1.172l-2.5-2a.75.75 0 0 0-1.055.118Z" fill="currentColor"/><path d="M22.836 18.218a.75.75 0 0 0-.117-1.054l-2.5-2a.75.75 0 0 0-.938 1.172l2.5 2a.75.75 0 0 0 1.055-.117ZM1.282 17.164a.75.75 0 1 0 .937 1.172l2.5-2a.75.75 0 0 0-.937-1.172l-2.5 2ZM22.836 3.782a.75.75 0 0 1-.117 1.054l-2.5 2a.75.75 0 0 1-.938-1.172l-2.5-2a.75.75 0 0 1 1.055.118Z" fill="currentColor"/></svg>
<span class="px-1">Upgrade now</span>
</a>

View File

@@ -0,0 +1,129 @@
<% content_for(:title) do %>
Settings
<% end %>
<header class="flex px-8 py-4 items-center border-b border-n-weak" role="banner">
<div class="border border-n-weak mr-4 p-2 rounded-full">
<svg width="24" height="24"><use xlink:href="#icon-settings-2-line" /></svg>
</div>
<div class="flex flex-col h-14 justify-center">
<h1 class="text-base font-medium leading-6 text-n-slate-12" id="page-title">
<%= content_for(:title) %>
</h1>
<p class="text-sm font-normal leading-5 text-slate-500 m-0">Update your instance settings, access billing portal</p>
</div>
</header>
<section class="main-content__body px-8">
<% if Redis::Alfred.get(Redis::Alfred::CHATWOOT_INSTALLATION_CONFIG_RESET_WARNING) %>
<div class="bg-red-100 border border-red-400 text-red-700 px-4 py-3 rounded relative mb-5" role="alert">
<strong class="font-bold">Alert!</strong>
<span class="block sm:inline">Unauthorized premium changes detected in Chatwoot. To keep using them, please upgrade your plan.
Contact for help :</span><span class="inline rounded-full bg-red-200 px-2 text-white ml-2">sales@chatwoot.com</span>
</div>
<% end %>
<div class="bg-white py-2 px-4 xl:px-0">
<%= javascript_include_tag "secretField" %>
<div class="flex items-center mb-6">
<h4 class="text-sm font-medium leading-5 h-5 text-n-slate-12 mr-4">Installation Identifier</h4>
<div data-secret-text="<%= ChatwootHub.installation_identifier %>" class="cell-data__secret-field text-sm leading-5 h-5 text-n-slate-11">
<span data-secret-masked="true" class="select-none"></span>
<button type="button" onclick="toggleSecretField(event)" data-secret-toggler class="inline-flex items-center justify-center h-5 w-5 p-0 rounded text-n-slate-11 hover:text-n-slate-12 transition-colors focus:outline-none">
<svg width="20" height="20" class="w-5 h-5 fill-current">
<use xlink:href="#eye-show" />
</svg>
</button>
<button type="button" onclick="copySecretField(event)" data-secret-copier class="inline-flex items-center justify-center h-5 w-5 p-0 rounded text-n-slate-11 hover:text-n-slate-12 transition-colors focus:outline-none">
<svg width="20" height="20" class="w-5 h-5 fill-current">
<use xlink:href="#icon-copy" />
</svg>
</button>
</div>
</div>
<% if ChatwootApp.enterprise? %>
<div class="flex p-4 outline outline-1 outline-n-container rounded-lg items-start md:items-center shadow-sm flex-col md:flex-row">
<div class="flex flex-col flex-grow gap-1">
<div class="flex items-center gap-2">
<h2 class="h-5 leading-5 text-n-slate-12 text-sm font-medium">Current plan</h2>
<a href="<%= refresh_super_admin_settings_url %>" class="inline-flex gap-1 text-xs font-medium items-center text-woot-500 hover:text-woot-700">
<svg width="16" height="16"><use xlink:href="#icon-refresh-line" /></svg>
<span>Refresh</span>
</a>
</div>
<p class="text-n-slate-11 m-0 text-sm"><%= SuperAdmin::FeaturesHelper.plan_details.html_safe %></p>
</div>
<a href="<%= ChatwootHub.billing_url %>" target="_blank" rel="noopener noreferrer">
<button class="mt-4 md:mt-0 flex gap-1 items-center bg-transparent shadow-sm h-9 hover:text-n-slate-12 hover:bg-slate-50 outline outline-1 outline-n-container rounded text-n-slate-11 font-medium p-2 focus:outline-none">
<svg width="16" height="16"><use xlink:href="#icon-settings-2-line" /></svg>
<span class="px-1">Manage</span>
</button>
</a>
</div>
<% end %>
<% if ChatwootHub.pricing_plan != 'community' && User.count > ChatwootHub.pricing_plan_quantity %>
<div role="alert">
<div class="border border-t-0 border-red-400 rounded-b bg-red-100 px-4 py-3 text-red-700">
<p>You have <%= User.count %> agents. Please add more licenses to add more users.</p>
</div>
</div>
<% end %>
<div class="flex p-4 outline outline-1 outline-n-container rounded-lg mt-4 items-start md:items-center shadow-sm flex-col md:flex-row">
<div class="flex flex-col flex-grow gap-1">
<h2 class="h-5 leading-5 text-n-slate-12 text-sm font-medium">Need help?</h2>
<p class="text-n-slate-11 m-0 text-sm">Do you face any issues? We are here to help.</p>
</div>
<a href="https://discord.gg/cJXdrwS" target="_blank">
<button class="flex mt-4 md:mt-0 gap-1 items-center bg-transparent shadow-sm h-9 bg-violet-500 hover:bg-violet-600 text-white border border-solid border-violet-600 rounded font-medium p-2 focus:outline-none">
<svg class="h-4 w-4" width="24" height="24" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M13.209 3.103c-.495-1.004-1.926-1.004-2.421 0L8.43 7.88l-5.273.766c-1.107.161-1.55 1.522-.748 2.303l3.815 3.72-.9 5.25c-.19 1.103.968 1.944 1.959 1.424l4.715-2.48 4.716 2.48c.99.52 2.148-.32 1.96-1.424l-.902-5.25 3.816-3.72c.8-.78.359-2.142-.748-2.303l-5.273-.766-2.358-4.777ZM9.74 8.615l2.258-4.576 2.259 4.576a1.35 1.35 0 0 0 1.016.738l5.05.734-3.654 3.562a1.35 1.35 0 0 0-.388 1.195l.862 5.03-4.516-2.375a1.35 1.35 0 0 0-1.257 0l-4.516 2.374.862-5.029a1.35 1.35 0 0 0-.388-1.195l-3.654-3.562 5.05-.734c.44-.063.82-.34 1.016-.738ZM1.164 3.782a.75.75 0 0 0 .118 1.054l2.5 2a.75.75 0 1 0 .937-1.172l-2.5-2a.75.75 0 0 0-1.055.118Z" fill="currentColor"/><path d="M22.836 18.218a.75.75 0 0 0-.117-1.054l-2.5-2a.75.75 0 0 0-.938 1.172l2.5 2a.75.75 0 0 0 1.055-.117ZM1.282 17.164a.75.75 0 1 0 .937 1.172l2.5-2a.75.75 0 0 0-.937-1.172l-2.5 2ZM22.836 3.782a.75.75 0 0 1-.117 1.054l-2.5 2a.75.75 0 0 1-.938-1.172l2.5-2a.75.75 0 0 1 1.055.118Z" fill="currentColor"/></svg>
<span class="px-1">Community Support</span>
</button>
</a>
<% if ChatwootHub.pricing_plan !='community' %>
<button class="ml-4 flex gap-1 items-center bg-transparent h-9 hover:text-n-slate-12 hover:bg-slate-50 border border-solid border-slate-100 rounded text-n-slate-11 font-medium p-2 focus:outline-none" onclick="window.$chatwoot.toggle('open')">
<svg class="h-4 w-4" width="24" height="24" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M13.209 3.103c-.495-1.004-1.926-1.004-2.421 0L8.43 7.88l-5.273.766c-1.107.161-1.55 1.522-.748 2.303l3.815 3.72-.9 5.25c-.19 1.103.968 1.944 1.959 1.424l4.715-2.48 4.716 2.48c.99.52 2.148-.32 1.96-1.424l-.902-5.25 3.816-3.72c.8-.78.359-2.142-.748-2.303l-5.273-.766-2.358-4.777ZM9.74 8.615l2.258-4.576 2.259 4.576a1.35 1.35 0 0 0 1.016.738l5.05.734-3.654 3.562a1.35 1.35 0 0 0-.388 1.195l.862 5.03-4.516-2.375a1.35 1.35 0 0 0-1.257 0l-4.516 2.374.862-5.029a1.35 1.35 0 0 0-.388-1.195l-3.654-3.562 5.05-.734c.44-.063.82-.34 1.016-.738ZM1.164 3.782a.75.75 0 0 0 .118 1.054l2.5 2a.75.75 0 1 0 .937-1.172l-2.5-2a.75.75 0 0 0-1.055.118Z" fill="currentColor"/><path d="M22.836 18.218a.75.75 0 0 0-.117-1.054l-2.5-2a.75.75 0 0 0-.938 1.172l2.5 2a.75.75 0 0 0 1.055-.117ZM1.282 17.164a.75.75 0 1 0 .937 1.172l2.5-2a.75.75 0 0 0-.937-1.172l-2.5 2ZM22.836 3.782a.75.75 0 0 1-.117 1.054l-2.5 2a.75.75 0 0 1-.938-1.172l2.5-2a.75.75 0 0 1 1.055.118Z" fill="currentColor"/></svg>
<span class="px-1">Chat Support</span>
</button>
<% end %>
</div>
<div class="mt-10 py-4">
<h3 class="h-5 leading-5 text-n-slate-12 font-medium text-base">Features</h3>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-x-2 gap-y-3">
<% SuperAdmin::FeaturesHelper.available_features.each do |feature, attrs| %>
<div class="group outline outline-1 outline-n-container p-4 rounded-lg relative shadow-sm">
<span class="<%= attrs[:enabled] ? 'bg-green-400 text-white': 'bg-slate-300 text-slate-800' %> absolute rounded-full p-1 inline-flex right-4 top-5">
<svg width="14" height="14"><use xlink:href="<%= attrs[:enabled] ? '#icon-tick-line': '#icon-lock-line' %>" /></svg>
</span>
<div class="visible <% if !attrs[:enabled] %> group-hover:invisible <% end %> flex items-center justify-center w-10 h-10 mb-2 border border-slate-100 border-solid text-slate-800 rounded-full">
<svg width="20" height="20"><use xlink:href="#<%= attrs[:icon] %>" /></svg>
</div>
<% if !attrs[:enabled] %>
<div class="flex h-9 absolute top-5 items-center invisible group-hover:visible">
<% if ChatwootApp.enterprise? %>
<%= render 'upgrade_button_enterprise' %>
<% else %>
<%= render 'upgrade_button_community' %>
<% end %>
</div>
<% end %>
<div class="flex items-center justify-between mb-1.5 mt-4">
<div class="flex items-center gap-2">
<h3 class="text-n-slate-12 font-medium"><%= attrs[:name] %></h3>
<% if attrs[:enterprise] %>
<span class="px-2 h-4 leading-4 rounded-xl text-green-800 font-medium bg-green-100/70 text-xxs">EE</span>
<% end %>
<% if attrs[:config_key].present? && attrs[:enabled] %>
<a class="inline-flex items-center justify-center h-5 w-5 hover:bg-slate-50 rounded-sm" href="/super_admin/app_config?config=<%= attrs[:config_key] %>">
<svg width="18" height="18"><use xlink:href="#icon-gear" /></svg>
</a>
<% end %>
</div>
</div>
<p class="text-n-slate-11 mb-0"><%= attrs[:description] %></p>
</div>
<% end %>
</div>
</div>
</section>

View File

@@ -0,0 +1,54 @@
<%#
# Account User Form Partial
This partial renders the account user creation form.
Used by both account and user show pages.
## Local variables:
- `page`: The Administrate page object (Account or User)
- `namespace`: The current namespace (usually :super_admin)
- `resource_type`: Either 'account' or 'user' to determine hidden field
%>
<section class="main-content__body">
<% account_user_page = Administrate::Page::Form.new(AccountUserDashboard.new, AccountUser.new) %>
<%= form_for([namespace, account_user_page.resource], html: { class: "form" }) do |f| %>
<% if account_user_page.resource.errors.any? %>
<div id="error_explanation">
<h2>
<%= t(
"administrate.form.errors",
pluralized_errors: pluralize(
account_user_page.resource.errors.count,
t("administrate.form.error")
),
resource_name: display_resource_name(account_user_page.resource_name)
) %>
</h2>
<ul>
<% account_user_page.resource.errors.full_messages.each do |message| %>
<li class="flash-error"><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<% account_user_page.attributes.each do |title, attributes| -%>
<% attributes.each do |attribute| %>
<% if attribute.name == resource_type %>
<%= f.hidden_field("#{resource_type}_id", value: page.resource.id) %>
<% else %>
<div class="field-unit field-unit--<%= attribute.html_class %> field-unit--<%= requireness(attribute) %>">
<%= render_field attribute, f: f %>
</div>
<% end %>
<% end %>
<% end -%>
<div class="form-actions">
<%= f.submit %>
</div>
<% end %>
</section>

View File

@@ -0,0 +1,95 @@
<%#
# Collection
This partial is used on the `index` and `show` pages
to display a collection of resources in an HTML table.
## Local variables:
- `collection_presenter`:
An instance of [Administrate::Page::Collection][1].
The table presenter uses `ResourceDashboard::COLLECTION_ATTRIBUTES` to determine
the columns displayed in the table
- `resources`:
An ActiveModel::Relation collection of resources to be displayed in the table.
By default, the number of resources is limited by pagination
or by a hard limit to prevent excessive page load times
[1]: http://www.rubydoc.info/gems/administrate/Administrate/Page/Collection
%>
<table aria-labelledby="<%= table_title %>">
<thead>
<tr>
<% collection_presenter.attribute_types.each do |attr_name, attr_type| %>
<th class="cell-label
cell-label--<%= attr_type.html_class %>
cell-label--<%= collection_presenter.ordered_html_class(attr_name) %>"
scope="col"
role="columnheader"
aria-sort="<%= sort_order(collection_presenter.ordered_html_class(attr_name)) %>">
<%= link_to(sanitized_order_params(page, collection_field_name).merge(
collection_presenter.order_params_for(attr_name, key: collection_field_name)
)) do %>
<%= t(
"helpers.label.#{collection_presenter.resource_name}.#{attr_name}",
default: attr_name.to_s,
).titleize %>
<% if collection_presenter.ordered_by?(attr_name) %>
<span class="cell-label__sort-indicator cell-label__sort-indicator--<%= collection_presenter.ordered_html_class(attr_name) %>">
<svg aria-hidden="true">
<use xlink:href="#icon-up-caret" />
</svg>
</span>
<% end %>
<% end %>
</th>
<% end %>
<% [existing_action?(collection_presenter.resource_name, :edit),
existing_action?(collection_presenter.resource_name, :destroy)].count(true).times do %>
<th scope="col"></th>
<% end %>
</tr>
</thead>
<tbody>
<% resources.each do |resource| %>
<tr class="js-table-row"
tabindex="0"
<% if existing_action? collection_presenter.resource_name, :show %>
<%= %(role=link data-url=#{polymorphic_path([namespace, resource.becomes(User)])}) %>
<% end %>
>
<% collection_presenter.attributes_for(resource).each do |attribute| %>
<td class="cell-data cell-data--<%= attribute.html_class %>">
<% if authorized_action? resource, :show -%>
<a href="<%= polymorphic_path([namespace, resource.becomes(User)]) -%>"
class="action-show"
>
<%= render_field attribute %>
</a>
<% end -%>
</td>
<% end %>
<% if existing_action? collection_presenter.resource_name, :edit %>
<td><%= link_to(
t("administrate.actions.edit"),
[:edit, namespace, resource.becomes(User)],
class: "action-edit",
) if authorized_action? resource, :edit%></td>
<% end %>
<% if existing_action? collection_presenter.resource_name, :destroy %>
<td><%= link_to(
t("administrate.actions.destroy"),
[namespace, collection_presenter.resource_name == 'account_user' ? resource : resource.becomes(User)],
class: "text-color-red",
method: :delete,
data: { confirm: t("administrate.actions.confirm") }
) if authorized_action? resource, :destroy %></td>
<% end %>
</tr>
<% end %>
</tbody>
</table>

View File

@@ -0,0 +1,8 @@
<section class="main-content__body">
<hr/>
<div class="form-actions">
<p class="text-color-red">Caution: Any actions executed after impersonate will appear as if performed by the impersonated user - [<%= page.resource.name %> ]</p>
<a class='button' target='_blank' href='<%= page.resource.generate_sso_link_with_impersonation %>'>Impersonate user </a>
</div>
</section>

View File

@@ -0,0 +1,61 @@
<%#
# Show
This view is the template for the show page.
It renders the attributes of a resource,
as well as a link to its edit page.
## Local variables:
- `page`:
An instance of [Administrate::Page::Show][1].
Contains methods for accessing the resource to be displayed on the page,
as well as helpers for describing how each attribute of the resource
should be displayed.
[1]: http://www.rubydoc.info/gems/administrate/Administrate/Page/Show
%>
<% content_for(:title) { t("administrate.actions.show_resource", name: page.page_title) } %>
<header class="main-content__header" role="banner">
<h1 class="main-content__page-title">
<%= content_for(:title) %>
</h1>
<div>
<%= link_to(
t("administrate.actions.edit"),
[:edit, namespace, page.resource.becomes(User)],
class: "button",
) if authorized_action? page.resource, :edit %>
</div>
</header>
<section class="main-content__body">
<dl>
<% page.attributes.each do |title, attributes| %>
<fieldset class="<%= "field-unit--nested" if title.present? %>">
<% if title.present? %>
<legend><%= t "helpers.label.#{page.resource_name}.#{title}", default: title %></legend>
<% end %>
<% attributes.each do |attribute| %>
<dt class="attribute-label" id="<%= attribute.name %>">
<%= t(
"helpers.label.#{resource_name}.#{attribute.name}",
default: page.resource.class.human_attribute_name(attribute.name),
) %>
</dt>
<dd class="attribute-data attribute-data--<%=attribute.html_class%>"
><%= render_field attribute, page: page %></dd>
<% end %>
</fieldset>
<% end %>
</dl>
</section>
<%= render 'super_admin/shared/account_user_form', page: page, namespace: namespace, resource_type: 'user' %>
<%= render partial: "impersonate", locals: {page: page} %>