Merge branch 'release/v0.5.0' into main
|
|
@ -1,6 +1,6 @@
|
|||
TOOLJET_HOST=http://localhost:8082
|
||||
|
||||
ENCRYPTION_SERVICE_SALT=replace_with_salt
|
||||
LOCKBOX_MASTER_KEY=replace_with_encryption_key
|
||||
|
||||
SECRET_KEY_BASE=replace_with_secret_key_base
|
||||
|
||||
|
|
|
|||
248
.rubocop.yml
Normal file
|
|
@ -0,0 +1,248 @@
|
|||
require: rubocop-rails
|
||||
AllCops:
|
||||
SuggestExtensions: false
|
||||
TargetRubyVersion: 2.7
|
||||
# RuboCop has a bunch of cops enabled by default. This setting tells RuboCop
|
||||
# to ignore them, so only the ones explicitly set in this file are enabled.
|
||||
DisabledByDefault: true
|
||||
Exclude:
|
||||
- "**/templates/**/*"
|
||||
- "**/vendor/**/*"
|
||||
- "actionpack/lib/action_dispatch/journey/parser.rb"
|
||||
- "db/schema.rb"
|
||||
- "db/migrate/**/*"
|
||||
- "node_modules/**/*"
|
||||
- "bin/**"
|
||||
- "config/application.rb"
|
||||
- "config/boot.rb"
|
||||
- "config/environment.rb"
|
||||
- "config/environments/*.rb"
|
||||
- "config/routes.rb"
|
||||
|
||||
Rails/EnvironmentVariableAccess:
|
||||
Enabled: false
|
||||
|
||||
Rails/TimeZoneAssignment:
|
||||
Enabled: true
|
||||
|
||||
# Prefer &&/|| over and/or.
|
||||
Style/AndOr:
|
||||
Enabled: true
|
||||
|
||||
# Align `when` with `case`.
|
||||
Layout/CaseIndentation:
|
||||
Enabled: true
|
||||
|
||||
# Align comments with method definitions.
|
||||
Layout/CommentIndentation:
|
||||
Enabled: true
|
||||
|
||||
Layout/EmptyLineAfterMagicComment:
|
||||
Enabled: true
|
||||
|
||||
# In a regular class definition, no empty lines around the body.
|
||||
Layout/EmptyLinesAroundClassBody:
|
||||
Enabled: true
|
||||
|
||||
# In a regular method definition, no empty lines around the body.
|
||||
Layout/EmptyLinesAroundMethodBody:
|
||||
Enabled: true
|
||||
|
||||
# In a regular module definition, no empty lines around the body.
|
||||
Layout/EmptyLinesAroundModuleBody:
|
||||
Enabled: true
|
||||
|
||||
Layout/FirstArgumentIndentation:
|
||||
Enabled: true
|
||||
|
||||
# Use Ruby >= 1.9 syntax for hashes. Prefer { a: :b } over { :a => :b }.
|
||||
Style/HashSyntax:
|
||||
Enabled: true
|
||||
|
||||
# Method definitions after `private` or `protected` isolated calls need one
|
||||
# extra level of indentation.
|
||||
Layout/IndentationConsistency:
|
||||
Enabled: true
|
||||
EnforcedStyle: indented_internal_methods
|
||||
|
||||
# Two spaces, no tabs (for indentation).
|
||||
Layout/IndentationWidth:
|
||||
Enabled: true
|
||||
|
||||
Layout/LeadingCommentSpace:
|
||||
Enabled: true
|
||||
|
||||
Layout/SpaceAfterColon:
|
||||
Enabled: true
|
||||
|
||||
Layout/SpaceAfterComma:
|
||||
Enabled: true
|
||||
|
||||
Layout/SpaceAroundEqualsInParameterDefault:
|
||||
Enabled: true
|
||||
|
||||
Layout/SpaceAroundKeyword:
|
||||
Enabled: true
|
||||
|
||||
# If we enable it then following code indentation fails
|
||||
# @current_row_project_name = row["Project"]
|
||||
# @current_row_date = row["Date"]
|
||||
# @current_row_email = row["Email"]
|
||||
# @current_row_client_name = row["Client"]
|
||||
# @current_row_task_name = row["Task"]
|
||||
# @current_row_notes = row["Notes"]
|
||||
# @current_row_hours = row["Hours"]
|
||||
Layout/SpaceAroundOperators:
|
||||
Enabled: false
|
||||
|
||||
Layout/SpaceBeforeComma:
|
||||
Enabled: true
|
||||
|
||||
Layout/SpaceBeforeFirstArg:
|
||||
Enabled: true
|
||||
|
||||
Style/DefWithParentheses:
|
||||
Enabled: true
|
||||
|
||||
# Defining a method with parameters needs parentheses.
|
||||
Style/MethodDefParentheses:
|
||||
Enabled: true
|
||||
|
||||
Style/FrozenStringLiteralComment:
|
||||
Enabled: true
|
||||
EnforcedStyle: always
|
||||
|
||||
# Use `foo {}` not `foo{}`.
|
||||
Layout/SpaceBeforeBlockBraces:
|
||||
Enabled: true
|
||||
|
||||
# Use `foo { bar }` not `foo {bar}`.
|
||||
Layout/SpaceInsideBlockBraces:
|
||||
Enabled: true
|
||||
|
||||
# Use `{ a: 1 }` not `{a:1}`.
|
||||
Layout/SpaceInsideHashLiteralBraces:
|
||||
Enabled: true
|
||||
|
||||
Layout/SpaceInsideParens:
|
||||
Enabled: true
|
||||
|
||||
# Check quotes usage according to lint rule below.
|
||||
Style/StringLiterals:
|
||||
Enabled: true
|
||||
EnforcedStyle: double_quotes
|
||||
|
||||
# This cop looks for trailing blank lines and a final newline in the source code.
|
||||
# This is being disabled because the requirement to have a final newline is illogical.
|
||||
Layout/TrailingEmptyLines:
|
||||
Enabled: false
|
||||
|
||||
# No trailing whitespace.
|
||||
Layout/TrailingWhitespace:
|
||||
Enabled: true
|
||||
|
||||
# Use quotes for string literals when they are enough.
|
||||
Style/RedundantPercentQ:
|
||||
Enabled: true
|
||||
|
||||
# Align `end` with the matching keyword or starting expression except for
|
||||
# assignments, where it should be aligned with the LHS.
|
||||
Layout/EndAlignment:
|
||||
Enabled: true
|
||||
EnforcedStyleAlignWith: variable
|
||||
|
||||
# Use my_method(my_arg) not my_method( my_arg ) or my_method my_arg.
|
||||
Lint/RequireParentheses:
|
||||
Enabled: true
|
||||
|
||||
Style/RedundantReturn:
|
||||
Enabled: true
|
||||
AllowMultipleReturnValues: true
|
||||
|
||||
Style/Semicolon:
|
||||
Enabled: true
|
||||
AllowAsExpressionSeparator: true
|
||||
|
||||
# Corrects usage of :true/:false to true/false
|
||||
Lint/BooleanSymbol:
|
||||
Enabled: true
|
||||
|
||||
# No space in method name and the arguments
|
||||
Lint/ParenthesesAsGroupedExpression:
|
||||
Enabled: true
|
||||
|
||||
# Enabled Rails cops for the command rubocop -a
|
||||
Rails:
|
||||
Enabled: true
|
||||
|
||||
# Correct usage of Date methods in Rails
|
||||
Rails/Date:
|
||||
Enabled: true
|
||||
|
||||
# Correct usage of TimeZone methods in Rails
|
||||
Rails/TimeZone:
|
||||
Enabled: true
|
||||
|
||||
Rails/ActiveRecordCallbacksOrder:
|
||||
Enabled: true
|
||||
|
||||
Rails/FindById:
|
||||
Enabled: true
|
||||
|
||||
Rails/Inquiry:
|
||||
Enabled: false
|
||||
|
||||
Rails/MailerName:
|
||||
Enabled: true
|
||||
|
||||
Rails/MatchRoute:
|
||||
Enabled: true
|
||||
|
||||
Rails/NegateInclude:
|
||||
Enabled: true
|
||||
|
||||
Rails/Pluck:
|
||||
Enabled: true
|
||||
|
||||
Rails/PluckInWhere:
|
||||
Enabled: true
|
||||
|
||||
Rails/RenderInline:
|
||||
Enabled: true
|
||||
|
||||
Rails/RenderPlainText:
|
||||
Enabled: true
|
||||
|
||||
Rails/ShortI18n:
|
||||
Enabled: true
|
||||
|
||||
Rails/WhereExists:
|
||||
Enabled: true
|
||||
|
||||
Rails/AfterCommitOverride:
|
||||
Enabled: true
|
||||
|
||||
Rails/SquishedSQLHeredocs:
|
||||
Enabled: true
|
||||
|
||||
Rails/WhereNot:
|
||||
Enabled: true
|
||||
|
||||
Rails/SkipsModelValidations:
|
||||
Enabled: false
|
||||
|
||||
Rails/AttributeDefaultBlockValue: # (new in 2.9)
|
||||
Enabled: true
|
||||
Rails/WhereEquals: # (new in 2.9)
|
||||
Enabled: false
|
||||
|
||||
Rails/HelperInstanceVariable:
|
||||
Enabled: false
|
||||
|
||||
Rails/UnknownEnv:
|
||||
Environments:
|
||||
- production
|
||||
- development
|
||||
- test
|
||||
- staging
|
||||
- heroku
|
||||
2
Gemfile
|
|
@ -38,12 +38,14 @@ gem 'typhoeus'
|
|||
gem "mongo", "~> 2"
|
||||
gem 'aws-sdk', '~> 3'
|
||||
gem 'kaminari'
|
||||
gem 'lockbox'
|
||||
|
||||
group :development, :test do
|
||||
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
|
||||
gem 'byebug', platforms: %i[mri mingw x64_mingw]
|
||||
gem 'dotenv-rails'
|
||||
gem 'rubocop', require: false
|
||||
gem 'rubocop-rails'
|
||||
end
|
||||
|
||||
group :development do
|
||||
|
|
|
|||
17
Gemfile.lock
|
|
@ -1238,6 +1238,7 @@ GEM
|
|||
listen (3.5.1)
|
||||
rb-fsevent (~> 0.10, >= 0.10.3)
|
||||
rb-inotify (~> 0.9, >= 0.9.10)
|
||||
lockbox (0.6.4)
|
||||
lograge (0.11.2)
|
||||
actionpack (>= 4)
|
||||
activesupport (>= 4)
|
||||
|
|
@ -1270,7 +1271,7 @@ GEM
|
|||
racc (~> 1.4)
|
||||
os (1.1.1)
|
||||
parallel (1.20.1)
|
||||
parser (3.0.1.0)
|
||||
parser (3.0.1.1)
|
||||
ast (~> 2.4.1)
|
||||
pg (1.2.3)
|
||||
public_suffix (4.0.6)
|
||||
|
|
@ -1321,17 +1322,21 @@ GEM
|
|||
request_store (1.5.0)
|
||||
rack (>= 1.4)
|
||||
rexml (3.2.5)
|
||||
rubocop (1.13.0)
|
||||
rubocop (1.15.0)
|
||||
parallel (~> 1.10)
|
||||
parser (>= 3.0.0.0)
|
||||
rainbow (>= 2.2.2, < 4.0)
|
||||
regexp_parser (>= 1.8, < 3.0)
|
||||
rexml
|
||||
rubocop-ast (>= 1.2.0, < 2.0)
|
||||
rubocop-ast (>= 1.5.0, < 2.0)
|
||||
ruby-progressbar (~> 1.7)
|
||||
unicode-display_width (>= 1.4.0, < 3.0)
|
||||
rubocop-ast (1.4.1)
|
||||
parser (>= 2.7.1.5)
|
||||
rubocop-ast (1.7.0)
|
||||
parser (>= 3.0.1.1)
|
||||
rubocop-rails (2.10.1)
|
||||
activesupport (>= 4.2.0)
|
||||
rack (>= 1.1)
|
||||
rubocop (>= 1.7.0, < 2.0)
|
||||
ruby-progressbar (1.11.0)
|
||||
ruby2_keywords (0.0.4)
|
||||
signet (0.15.0)
|
||||
|
|
@ -1375,6 +1380,7 @@ DEPENDENCIES
|
|||
jwt
|
||||
kaminari
|
||||
listen (~> 3.3)
|
||||
lockbox
|
||||
lograge
|
||||
mongo (~> 2)
|
||||
mysql2
|
||||
|
|
@ -1385,6 +1391,7 @@ DEPENDENCIES
|
|||
rails (~> 6.1.3, >= 6.1.3.1)
|
||||
redis
|
||||
rubocop
|
||||
rubocop-rails
|
||||
simple_command
|
||||
spring
|
||||
typhoeus
|
||||
|
|
|
|||
4
app.json
|
|
@ -18,8 +18,8 @@
|
|||
"description": "Public URL of ToolJet installtion.",
|
||||
"value": "https://app.tooljet.io"
|
||||
},
|
||||
"ENCRYPTION_SERVICE_SALT": {
|
||||
"description": "Salt for encrypting datasource credentials.",
|
||||
"LOCKBOX_MASTER_KEY": {
|
||||
"description": "Key for encrypting datasource credentials.",
|
||||
"value": ""
|
||||
},
|
||||
"SECRET_KEY_BASE": {
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class AppUsersController < ApplicationController
|
||||
def create
|
||||
org_user_id = params[:org_user_id]
|
||||
|
|
@ -18,7 +20,7 @@ class AppUsersController < ApplicationController
|
|||
if app_user.save
|
||||
render json: { success: true }
|
||||
else
|
||||
render json: { message: 'Could not create user' }, status: 500
|
||||
render json: { message: "Could not create user" }, status: :internal_server_error
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class ApplicationController < ActionController::API
|
||||
include Pundit
|
||||
rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized
|
||||
|
|
@ -7,12 +9,12 @@ class ApplicationController < ActionController::API
|
|||
|
||||
private
|
||||
|
||||
def authenticate_request
|
||||
@current_user = AuthorizeApiRequest.call(request.headers).result
|
||||
render json: { error: 'Not Authorized' }, status: 401 unless @current_user
|
||||
end
|
||||
def authenticate_request
|
||||
@current_user = AuthorizeApiRequest.call(request.headers).result
|
||||
render json: { error: "Not Authorized" }, status: :unauthorized unless @current_user
|
||||
end
|
||||
|
||||
def user_not_authorized
|
||||
render json: { error: 'Access denied' }, status: :forbidden
|
||||
end
|
||||
def user_not_authorized
|
||||
render json: { error: "Access denied" }, status: :forbidden
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class AppsController < ApplicationController
|
||||
skip_before_action :authenticate_request, only: [:show]
|
||||
|
||||
|
|
@ -13,44 +15,44 @@ class AppsController < ApplicationController
|
|||
@scope = @folder.apps
|
||||
end
|
||||
|
||||
@apps = @scope.order('created_at desc')
|
||||
@apps = @scope.order("created_at desc")
|
||||
.page(params[:page])
|
||||
.per(10)
|
||||
.includes(:user)
|
||||
|
||||
@meta = {
|
||||
@meta = {
|
||||
total_pages: @apps.total_pages,
|
||||
folder_count: @scope.count,
|
||||
total_count: App.where(organization: @current_user.organization).count,
|
||||
current_page: @apps.current_page
|
||||
}
|
||||
current_page: @apps.current_page
|
||||
}
|
||||
end
|
||||
|
||||
def create
|
||||
authorize App
|
||||
@app = App.create({
|
||||
name: 'Untitled app',
|
||||
name: "Untitled app",
|
||||
organization: @current_user.organization,
|
||||
current_version: AppVersion.new(name: 'v0'),
|
||||
current_version: AppVersion.new(name: "v0"),
|
||||
user: @current_user
|
||||
})
|
||||
AppUser.create(app: @app, user: @current_user, role: 'admin')
|
||||
AppUser.create(app: @app, user: @current_user, role: "admin")
|
||||
end
|
||||
|
||||
def show
|
||||
@app = App.find params[:id]
|
||||
@app = App.find params[:id]
|
||||
|
||||
# Logic to bypass auth for public apps
|
||||
unless @app.is_public
|
||||
authenticate_request
|
||||
authorize @app
|
||||
end
|
||||
# Logic to bypass auth for public apps
|
||||
unless @app.is_public
|
||||
authenticate_request
|
||||
authorize @app
|
||||
end
|
||||
end
|
||||
|
||||
def update
|
||||
@app = App.find params[:id]
|
||||
authorize @app
|
||||
@app.update(params['app'].permit('name', 'current_version_id', 'is_public'))
|
||||
@app.update(params["app"].permit("name", "current_version_id", "is_public"))
|
||||
end
|
||||
|
||||
def users
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class AuthenticationController < ApplicationController
|
||||
skip_before_action :authenticate_request
|
||||
|
||||
|
|
@ -5,7 +7,7 @@ class AuthenticationController < ApplicationController
|
|||
command = AuthenticateUser.call(params[:email], params[:password])
|
||||
|
||||
if command.success?
|
||||
user = User.find_by_email params[:email]
|
||||
user = User.find_by email: params[:email]
|
||||
render json: { auth_token: command.result, first_name: user.first_name, last_name: user.last_name,
|
||||
email: user.email }
|
||||
else
|
||||
|
|
@ -15,15 +17,15 @@ class AuthenticationController < ApplicationController
|
|||
|
||||
def signup
|
||||
# Check if the installation allows user signups
|
||||
if(ENV['DISABLE_SIGNUPS'] === "true")
|
||||
render json: {}, status: 500
|
||||
if (ENV["DISABLE_SIGNUPS"] === "true")
|
||||
render json: {}, status: :internal_server_error
|
||||
else
|
||||
email = params[:email]
|
||||
password = SecureRandom.uuid
|
||||
org = Organization.create(name: 'new org')
|
||||
org = Organization.create(name: "new org")
|
||||
user = User.create(email: email, password: password, organization: org, invitation_token: SecureRandom.uuid)
|
||||
|
||||
org_user = OrganizationUser.create(user: user, organization: org, role: 'admin')
|
||||
org_user = OrganizationUser.create(user_id: user.id, organization_id: org.id, role: "admin")
|
||||
|
||||
# UserMailer.with(user: user, sender: @current_user).new_signup_email.deliver if org_user.save
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class DataQueriesController < ApplicationController
|
||||
skip_before_action :authenticate_request, only: [:run]
|
||||
|
||||
|
|
@ -15,11 +17,10 @@ class DataQueriesController < ApplicationController
|
|||
)
|
||||
|
||||
if @data_query.errors.present?
|
||||
render json: { message: 'Query could not be created' }, status: 500
|
||||
render json: { message: "Query could not be created" }, status: :internal_server_error
|
||||
else
|
||||
render json: { message: 'success' }
|
||||
render json: { message: "success" }
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
def update
|
||||
|
|
@ -27,9 +28,9 @@ class DataQueriesController < ApplicationController
|
|||
@data_query.update(options: params[:options], name: params[:name])
|
||||
|
||||
if @data_query.errors.present?
|
||||
render json: { message: 'Query could not be updated' }, status: 500
|
||||
else
|
||||
render json: { message: 'success' }
|
||||
render json: { message: "Query could not be updated" }, status: :internal_server_error
|
||||
else
|
||||
render json: { message: "success" }
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class DataSourcesController < ApplicationController
|
||||
def index
|
||||
@data_sources = DataSource.where(app_id: params[:app_id])
|
||||
|
|
@ -8,17 +10,17 @@ class DataSourcesController < ApplicationController
|
|||
|
||||
options_to_save = {}
|
||||
options.each do |option|
|
||||
if option['encrypted']
|
||||
credential = Credential.create(value: option['value'])
|
||||
if option["encrypted"]
|
||||
credential = Credential.create(value: option["value"])
|
||||
|
||||
options_to_save[option['key']] = {
|
||||
options_to_save[option["key"]] = {
|
||||
credential_id: credential.id,
|
||||
encrypted: option['encrypted']
|
||||
encrypted: option["encrypted"]
|
||||
}
|
||||
else
|
||||
options_to_save[option['key']] = {
|
||||
value: option['value'],
|
||||
encrypted: option['encrypted']
|
||||
options_to_save[option["key"]] = {
|
||||
value: option["value"],
|
||||
encrypted: option["encrypted"]
|
||||
}
|
||||
end
|
||||
end
|
||||
|
|
@ -38,17 +40,17 @@ class DataSourcesController < ApplicationController
|
|||
|
||||
options_to_save = {}
|
||||
options.each do |option|
|
||||
if option['encrypted']
|
||||
credential = Credential.create(value: option['value'])
|
||||
if option["encrypted"]
|
||||
credential = Credential.create(value: option["value"])
|
||||
|
||||
options_to_save[option['key']] = {
|
||||
options_to_save[option["key"]] = {
|
||||
credential_id: credential.id,
|
||||
encrypted: option['encrypted']
|
||||
encrypted: option["encrypted"]
|
||||
}
|
||||
else
|
||||
options_to_save[option['key']] = {
|
||||
value: option['value'],
|
||||
encrypted: option['encrypted']
|
||||
options_to_save[option["key"]] = {
|
||||
value: option["value"],
|
||||
encrypted: option["encrypted"]
|
||||
}
|
||||
end
|
||||
end
|
||||
|
|
@ -67,27 +69,27 @@ class DataSourcesController < ApplicationController
|
|||
render json: { status: 200 }
|
||||
rescue StandardError => e
|
||||
puts e
|
||||
render json: { message: e }, status: 500
|
||||
render json: { message: e }, status: :internal_server_error
|
||||
end
|
||||
|
||||
def authorize_oauth2
|
||||
data_source = DataSource.find params[:data_source_id]
|
||||
options = CredentialService.new.decrypt_options(data_source.options)
|
||||
access_token_url = options['access_token_url']
|
||||
access_token_url = options["access_token_url"]
|
||||
|
||||
custom_params = options['custom_auth_params'].to_h
|
||||
custom_params = options["custom_auth_params"].to_h
|
||||
|
||||
response = HTTParty.post(access_token_url,
|
||||
body: { code: params[:code],
|
||||
client_id: options['client_id'],
|
||||
client_secret: options['client_secret'],
|
||||
grant_type: options['grant_type'],
|
||||
client_id: options["client_id"],
|
||||
client_secret: options["client_secret"],
|
||||
grant_type: options["grant_type"],
|
||||
redirect_uri: "#{ENV.fetch('TOOLJET_HOST')}/oauth2/authorize",
|
||||
**custom_params }.to_json,
|
||||
headers: { 'Content-Type' => 'application/json' })
|
||||
headers: { "Content-Type" => "application/json" })
|
||||
|
||||
result = JSON.parse(response.body)
|
||||
access_token = result['access_token']
|
||||
access_token = result["access_token"]
|
||||
|
||||
options = { access_token: access_token }
|
||||
|
||||
|
|
@ -108,20 +110,20 @@ class DataSourcesController < ApplicationController
|
|||
render json: { url: url }
|
||||
end
|
||||
|
||||
private
|
||||
def fetch_oauth_options(options)
|
||||
private
|
||||
def fetch_oauth_options(options)
|
||||
# Fetch necessary access token if OAuth2 based data source
|
||||
if options.find { |option| option['key'] == 'oauth2' }
|
||||
provider = options.find { |option| option['key'] === 'provider' } ['value']
|
||||
if options.find { |option| option["key"] == "oauth2" }
|
||||
provider = options.find { |option| option["key"] === "provider" } ["value"]
|
||||
service_class = "#{provider.capitalize}OauthService".constantize
|
||||
access_info = service_class.fetch_access_token(options.find { |option| option['key'] === 'code' } ['value'])
|
||||
options.reject! { |option| option['key'] == 'code' }
|
||||
access_info = service_class.fetch_access_token(options.find { |option| option["key"] === "code" } ["value"])
|
||||
options.reject! { |option| option["key"] == "code" }
|
||||
|
||||
access_info.each do |info|
|
||||
option = {}
|
||||
option['key'] = info[0]
|
||||
option['value'] = info[1]
|
||||
option['encrypted'] = true
|
||||
option["key"] = info[0]
|
||||
option["value"] = info[1]
|
||||
option["encrypted"] = true
|
||||
options << option
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,22 +1,23 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class FolderAppsController < ApplicationController
|
||||
def create
|
||||
app_id = params[:app_id]
|
||||
folder_id = params[:folder_id]
|
||||
|
||||
def create
|
||||
app_id = params[:app_id]
|
||||
folder_id = params[:folder_id]
|
||||
|
||||
@app = App.find app_id
|
||||
@app = App.find app_id
|
||||
|
||||
unless AppPolicy.new(@current_user, @app).update?
|
||||
render json: { message: 'Could not add app to folder due to insufficient permissions' }, status: 500
|
||||
return
|
||||
end
|
||||
|
||||
folder_app = FolderApp.new(app_id: app_id, folder_id: folder_id)
|
||||
|
||||
if folder_app.save
|
||||
render json: {}
|
||||
else
|
||||
render json: { message: 'App already in folder' }, status: 500
|
||||
end
|
||||
unless AppPolicy.new(@current_user, @app).update?
|
||||
render json: { message: "Could not add app to folder due to insufficient permissions" }, status: :internal_server_error
|
||||
return
|
||||
end
|
||||
|
||||
folder_app = FolderApp.new(app_id: app_id, folder_id: folder_id)
|
||||
|
||||
if folder_app.save
|
||||
render json: {}
|
||||
else
|
||||
render json: { message: "App already in folder" }, status: :internal_server_error
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,10 +1,11 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class FoldersController < ApplicationController
|
||||
def index
|
||||
@folders = Folder.where(organization: @current_user.organization)
|
||||
end
|
||||
|
||||
def index
|
||||
@folders = Folder.where(organization: @current_user.organization)
|
||||
end
|
||||
|
||||
def create
|
||||
Folder.create(name: params[:name], organization: @current_user.organization)
|
||||
end
|
||||
def create
|
||||
Folder.create(name: params[:name], organization: @current_user.organization)
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class OrganizationUsersController < ApplicationController
|
||||
def create
|
||||
authorize OrganizationUser
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class OrganizationsController < ApplicationController
|
||||
def users
|
||||
@org_users = OrganizationUser.where(organization: @current_user.organization).includes(:user)
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class ProbeController < ApplicationController
|
||||
skip_before_action :authenticate_request
|
||||
|
||||
def health_check
|
||||
render json: { works: 'yeah' }
|
||||
render json: { works: "yeah" }
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class UsersController < ApplicationController
|
||||
skip_before_action :authenticate_request
|
||||
|
||||
|
|
@ -6,13 +8,13 @@ class UsersController < ApplicationController
|
|||
|
||||
if user
|
||||
user.update(first_name: params[:first_name], last_name: params[:last_name], password: params[:password], invitation_token: nil)
|
||||
user.organization_users.first.update(status: 'active')
|
||||
user.organization_users.first.update(status: "active")
|
||||
|
||||
if params[:new_signup]
|
||||
user.organization.update(name: params[:organization])
|
||||
end
|
||||
else
|
||||
render json: { message: 'Invalid Invitation Token' }, status: :bad_request
|
||||
render json: { message: "Invalid Invitation Token" }, status: :bad_request
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,12 +1,14 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class VersionsController < ApplicationController
|
||||
def create
|
||||
@app = App.find params[:app_id]
|
||||
name = params[:version]['versionName']
|
||||
name = params[:version]["versionName"]
|
||||
AppVersion.create(app: @app, name: name)
|
||||
end
|
||||
|
||||
def index
|
||||
@versions = AppVersion.where(app_id: params['app_id']).order('created_at desc')
|
||||
@versions = AppVersion.where(app_id: params["app_id"]).order("created_at desc")
|
||||
end
|
||||
|
||||
def update
|
||||
|
|
|
|||
|
|
@ -1,8 +1,10 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class App < ApplicationRecord
|
||||
belongs_to :organization
|
||||
has_many :data_queries
|
||||
has_many :app_users
|
||||
has_many :app_versions
|
||||
belongs_to :current_version, class_name: 'AppVersion', optional: true
|
||||
belongs_to :current_version, class_name: "AppVersion", optional: true
|
||||
belongs_to :user, optional: true
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,17 +1,19 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class AppUser < ApplicationRecord
|
||||
belongs_to :app
|
||||
belongs_to :user
|
||||
validates_uniqueness_of :app_id, scope: [:user_id]
|
||||
validates :app_id, uniqueness: { scope: [:user_id] }
|
||||
|
||||
def admin?
|
||||
role == 'admin'
|
||||
role == "admin"
|
||||
end
|
||||
|
||||
def developer?
|
||||
role == 'developer'
|
||||
role == "developer"
|
||||
end
|
||||
|
||||
def viewer?
|
||||
role == 'viewer'
|
||||
role == "viewer"
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class AppVersion < ApplicationRecord
|
||||
belongs_to :app
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class ApplicationRecord < ActiveRecord::Base
|
||||
self.abstract_class = true
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
class Credential < ApplicationRecord
|
||||
include Encryptable
|
||||
# frozen_string_literal: true
|
||||
|
||||
attr_encrypted :value
|
||||
class Credential < ApplicationRecord
|
||||
encrypts :value
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class DataQuery < ApplicationRecord
|
||||
belongs_to :app
|
||||
belongs_to :data_source, optional: true
|
||||
validates_uniqueness_of :name, scope: [:app_id]
|
||||
validates :name, uniqueness: { scope: [:app_id] }
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class DataSource < ApplicationRecord
|
||||
belongs_to :app
|
||||
has_many :data_queries
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
class DataSourceUserOauth2 < ApplicationRecord
|
||||
include Encryptable
|
||||
# frozen_string_literal: true
|
||||
|
||||
class DataSourceUserOauth2 < ApplicationRecord
|
||||
belongs_to :user
|
||||
belongs_to :data_source
|
||||
|
||||
attr_encrypted :options
|
||||
encrypts :options
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class Folder < ApplicationRecord
|
||||
belongs_to :organization
|
||||
has_many :folder_apps
|
||||
has_many :apps, :through => :folder_apps
|
||||
has_many :apps, through: :folder_apps
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class FolderApp < ApplicationRecord
|
||||
belongs_to :folder
|
||||
belongs_to :app
|
||||
validates_uniqueness_of :app_id, scope: [:folder_id]
|
||||
validates :app_id, uniqueness: { scope: [:folder_id] }
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class Organization < ApplicationRecord
|
||||
has_many :users
|
||||
has_many :apps
|
||||
|
|
|
|||
|
|
@ -1,16 +1,18 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class OrganizationUser < ApplicationRecord
|
||||
belongs_to :organization
|
||||
belongs_to :user
|
||||
|
||||
def admin?
|
||||
role == 'admin'
|
||||
role == "admin"
|
||||
end
|
||||
|
||||
def developer?
|
||||
role == 'developer'
|
||||
role == "developer"
|
||||
end
|
||||
|
||||
def viewer?
|
||||
role == 'viewer'
|
||||
role == "viewer"
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class User < ApplicationRecord
|
||||
has_secure_password
|
||||
has_many :organization_users
|
||||
|
|
|
|||
68
app/services/airtable_query_service.rb
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
class AirtableQueryService
|
||||
attr_accessor :query, :source, :options, :source_options, :current_user
|
||||
|
||||
def initialize(data_query, data_source, options, source_options, current_user)
|
||||
@query = data_query
|
||||
@source = data_source
|
||||
@options = options
|
||||
@source_options = source_options
|
||||
@current_user = current_user
|
||||
end
|
||||
|
||||
def process
|
||||
operation = options['operation']
|
||||
api_key = source_options['api_key']
|
||||
error = false
|
||||
|
||||
if operation === 'list_records'
|
||||
|
||||
base_id = options['base_id']
|
||||
table_name = options['table_name']
|
||||
page_size = options['page_size']
|
||||
offset = options['offset']
|
||||
|
||||
result = list_records(api_key, base_id, table_name, page_size, offset)
|
||||
|
||||
data = result
|
||||
error = result.code != 200
|
||||
end
|
||||
|
||||
if operation === 'retrieve_record'
|
||||
|
||||
base_id = options['base_id']
|
||||
table_name = options['table_name']
|
||||
record_id = options['record_id']
|
||||
|
||||
result = retrieve_record(api_key, base_id, table_name, record_id)
|
||||
|
||||
data = result
|
||||
error = result.code != 200
|
||||
end
|
||||
|
||||
if error
|
||||
{ status: 'error', code: 500, message: data["message"], data: data }
|
||||
else
|
||||
{ status: 'success', data: data }
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def list_records(api_key, base_id, table_name, page_size, offset)
|
||||
|
||||
result = HTTParty.get(URI.encode("https://api.airtable.com/v0/#{base_id}/#{table_name}"),
|
||||
headers: { 'Content-Type':
|
||||
'application/json', "Authorization": "Bearer #{api_key}" })
|
||||
|
||||
result
|
||||
end
|
||||
|
||||
def retrieve_record(api_key, base_id, table_name, record_id)
|
||||
|
||||
result = HTTParty.get(URI.encode("https://api.airtable.com/v0/#{base_id}/#{table_name}/#{record_id}"),
|
||||
headers: { 'Content-Type':
|
||||
'application/json', "Authorization": "Bearer #{api_key}" })
|
||||
|
||||
result
|
||||
end
|
||||
end
|
||||
|
|
@ -13,10 +13,23 @@ class ElasticsearchQueryService
|
|||
end
|
||||
|
||||
def self.connection options
|
||||
|
||||
scheme = options.dig('scheme', 'value')
|
||||
host = options.dig('host', 'value')
|
||||
port = options.dig('port', 'value')
|
||||
username = options.dig('username', 'value')
|
||||
password = options.dig('password', 'value')
|
||||
|
||||
unless username.blank? || password.blank?
|
||||
url = "#{scheme}://#{username}:#{password}@#{host}:#{port}"
|
||||
else
|
||||
url = "#{scheme}://#{host}:#{port}"
|
||||
end
|
||||
|
||||
client = Elasticsearch::Client.new(
|
||||
url: "#{options.dig('host', 'value')}:#{options.dig('port', 'value')}",
|
||||
url: url,
|
||||
retry_on_failure: 5,
|
||||
request_timeout: 30,
|
||||
request_timeout: 15,
|
||||
adapter: :typhoeus
|
||||
)
|
||||
|
||||
|
|
@ -71,10 +84,23 @@ class ElasticsearchQueryService
|
|||
|
||||
private
|
||||
def create_connection
|
||||
|
||||
scheme = source_options['scheme']
|
||||
host = source_options['host']
|
||||
port = source_options['port']
|
||||
username = source_options['username']
|
||||
password = source_options['password']
|
||||
|
||||
unless username.blank? || password.blank?
|
||||
url = "#{scheme}://#{username}:#{password}@#{host}:#{port}"
|
||||
else
|
||||
url = "#{scheme}://#{host}:#{port}"
|
||||
end
|
||||
|
||||
connection = Elasticsearch::Client.new(
|
||||
url: "#{source_options['host']}:#{source_options['port']}",
|
||||
url: url,
|
||||
retry_on_failure: 5,
|
||||
request_timeout: 30,
|
||||
request_timeout: 15,
|
||||
adapter: :typhoeus
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -1,26 +0,0 @@
|
|||
class EncryptionService
|
||||
KEY = ActiveSupport::KeyGenerator.new(
|
||||
ENV.fetch('SECRET_KEY_BASE')
|
||||
).generate_key(
|
||||
ENV.fetch('ENCRYPTION_SERVICE_SALT'),
|
||||
ActiveSupport::MessageEncryptor.key_len
|
||||
).freeze
|
||||
|
||||
private_constant :KEY
|
||||
|
||||
delegate :encrypt_and_sign, :decrypt_and_verify, to: :encryptor
|
||||
|
||||
def self.encrypt(value)
|
||||
new.encrypt_and_sign(value)
|
||||
end
|
||||
|
||||
def self.decrypt(value)
|
||||
new.decrypt_and_verify(value)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def encryptor
|
||||
ActiveSupport::MessageEncryptor.new(KEY)
|
||||
end
|
||||
end
|
||||
|
|
@ -39,7 +39,10 @@ class PostgresqlQueryService
|
|||
result = connection.exec(query_text)
|
||||
|
||||
rescue StandardError => e
|
||||
reset_connection(data_source) if connection.finished?
|
||||
if connection&.status === PG::Constants::CONNECTION_BAD
|
||||
connection&.finish
|
||||
reset_connection(data_source)
|
||||
end
|
||||
|
||||
puts e
|
||||
error = { message: e.message }
|
||||
|
|
|
|||
1
config/initializers/lockbox.rb
Normal file
|
|
@ -0,0 +1 @@
|
|||
Lockbox.master_key = ENV.fetch('LOCKBOX_MASTER_KEY')
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
class AddCipherTextToCredentials < ActiveRecord::Migration[6.1]
|
||||
def change
|
||||
add_column :credentials, :value_ciphertext, :text
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
class AddCipherTextToDataSourceUserOauth2 < ActiveRecord::Migration[6.1]
|
||||
def change
|
||||
add_column :data_source_user_oauth2s, :options_ciphertext, :text
|
||||
end
|
||||
end
|
||||
32
db/schema.rb
generated
|
|
@ -10,14 +10,14 @@
|
|||
#
|
||||
# It's strongly recommended that you check this file into your version control system.
|
||||
|
||||
ActiveRecord::Schema.define(version: 2021_05_19_084741) do
|
||||
ActiveRecord::Schema.define(version: 2021_05_29_140113) do
|
||||
|
||||
# These are extensions that must be enabled in order to support this database
|
||||
enable_extension "pgcrypto"
|
||||
enable_extension "plpgsql"
|
||||
enable_extension "uuid-ossp"
|
||||
|
||||
create_table "app_users", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
|
||||
create_table "app_users", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
|
||||
t.uuid "app_id", null: false
|
||||
t.uuid "user_id", null: false
|
||||
t.string "role"
|
||||
|
|
@ -27,7 +27,7 @@ ActiveRecord::Schema.define(version: 2021_05_19_084741) do
|
|||
t.index ["user_id"], name: "index_app_users_on_user_id"
|
||||
end
|
||||
|
||||
create_table "app_versions", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
|
||||
create_table "app_versions", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
|
||||
t.uuid "app_id", null: false
|
||||
t.string "name"
|
||||
t.json "definition"
|
||||
|
|
@ -36,7 +36,7 @@ ActiveRecord::Schema.define(version: 2021_05_19_084741) do
|
|||
t.index ["app_id"], name: "index_app_versions_on_app_id"
|
||||
end
|
||||
|
||||
create_table "apps", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
|
||||
create_table "apps", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
|
||||
t.string "name"
|
||||
t.datetime "created_at", precision: 6, null: false
|
||||
t.datetime "updated_at", precision: 6, null: false
|
||||
|
|
@ -50,13 +50,14 @@ ActiveRecord::Schema.define(version: 2021_05_19_084741) do
|
|||
t.index ["user_id"], name: "index_apps_on_user_id"
|
||||
end
|
||||
|
||||
create_table "credentials", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
|
||||
create_table "credentials", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
|
||||
t.text "encrypted_value"
|
||||
t.datetime "created_at", precision: 6, null: false
|
||||
t.datetime "updated_at", precision: 6, null: false
|
||||
t.text "value_ciphertext"
|
||||
end
|
||||
|
||||
create_table "data_queries", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
|
||||
create_table "data_queries", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
|
||||
t.uuid "app_id", null: false
|
||||
t.string "name"
|
||||
t.json "options"
|
||||
|
|
@ -68,17 +69,18 @@ ActiveRecord::Schema.define(version: 2021_05_19_084741) do
|
|||
t.index ["data_source_id"], name: "index_data_queries_on_data_source_id"
|
||||
end
|
||||
|
||||
create_table "data_source_user_oauth2s", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
|
||||
create_table "data_source_user_oauth2s", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
|
||||
t.uuid "user_id", null: false
|
||||
t.uuid "data_source_id", null: false
|
||||
t.text "encrypted_options"
|
||||
t.datetime "created_at", precision: 6, null: false
|
||||
t.datetime "updated_at", precision: 6, null: false
|
||||
t.text "options_ciphertext"
|
||||
t.index ["data_source_id"], name: "index_data_source_user_oauth2s_on_data_source_id"
|
||||
t.index ["user_id"], name: "index_data_source_user_oauth2s_on_user_id"
|
||||
end
|
||||
|
||||
create_table "data_sources", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
|
||||
create_table "data_sources", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
|
||||
t.uuid "app_id", null: false
|
||||
t.string "name"
|
||||
t.json "options"
|
||||
|
|
@ -88,7 +90,7 @@ ActiveRecord::Schema.define(version: 2021_05_19_084741) do
|
|||
t.index ["app_id"], name: "index_data_sources_on_app_id"
|
||||
end
|
||||
|
||||
create_table "endpoints", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
|
||||
create_table "endpoints", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
|
||||
t.string "identifier"
|
||||
t.string "path"
|
||||
t.string "method"
|
||||
|
|
@ -101,7 +103,7 @@ ActiveRecord::Schema.define(version: 2021_05_19_084741) do
|
|||
t.index ["integration_id"], name: "index_endpoints_on_integration_id"
|
||||
end
|
||||
|
||||
create_table "folder_apps", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
|
||||
create_table "folder_apps", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
|
||||
t.uuid "folder_id", null: false
|
||||
t.uuid "app_id", null: false
|
||||
t.datetime "created_at", precision: 6, null: false
|
||||
|
|
@ -110,7 +112,7 @@ ActiveRecord::Schema.define(version: 2021_05_19_084741) do
|
|||
t.index ["folder_id"], name: "index_folder_apps_on_folder_id"
|
||||
end
|
||||
|
||||
create_table "folders", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
|
||||
create_table "folders", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
|
||||
t.string "name"
|
||||
t.uuid "organization_id", null: false
|
||||
t.datetime "created_at", precision: 6, null: false
|
||||
|
|
@ -118,14 +120,14 @@ ActiveRecord::Schema.define(version: 2021_05_19_084741) do
|
|||
t.index ["organization_id"], name: "index_folders_on_organization_id"
|
||||
end
|
||||
|
||||
create_table "integrations", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
|
||||
create_table "integrations", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
|
||||
t.string "identifier"
|
||||
t.string "name"
|
||||
t.datetime "created_at", precision: 6, null: false
|
||||
t.datetime "updated_at", precision: 6, null: false
|
||||
end
|
||||
|
||||
create_table "organization_users", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
|
||||
create_table "organization_users", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
|
||||
t.uuid "organization_id", null: false
|
||||
t.uuid "user_id", null: false
|
||||
t.string "role"
|
||||
|
|
@ -136,14 +138,14 @@ ActiveRecord::Schema.define(version: 2021_05_19_084741) do
|
|||
t.index ["user_id"], name: "index_organization_users_on_user_id"
|
||||
end
|
||||
|
||||
create_table "organizations", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
|
||||
create_table "organizations", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
|
||||
t.string "name"
|
||||
t.string "domain"
|
||||
t.datetime "created_at", precision: 6, null: false
|
||||
t.datetime "updated_at", precision: 6, null: false
|
||||
end
|
||||
|
||||
create_table "users", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
|
||||
create_table "users", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
|
||||
t.string "first_name"
|
||||
t.string "last_name"
|
||||
t.string "email"
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ kind: Deployment
|
|||
metadata:
|
||||
name: tooljet-server-deployment
|
||||
spec:
|
||||
replicas: 1
|
||||
replicas: 3
|
||||
strategy:
|
||||
type: RollingUpdate
|
||||
rollingUpdate:
|
||||
|
|
@ -24,11 +24,11 @@ spec:
|
|||
command: ["bundle", "exec", "rails", "s", "-p", "3000", "-b", "0.0.0.0"]
|
||||
resources:
|
||||
limits:
|
||||
memory: "1024Mi"
|
||||
cpu: "1000m"
|
||||
memory: "3000Mi"
|
||||
cpu: "500m"
|
||||
requests:
|
||||
memory: "1024Mi"
|
||||
cpu: "1000m"
|
||||
memory: "3000Mi"
|
||||
cpu: "500m"
|
||||
ports:
|
||||
- containerPort: 3000
|
||||
readinessProbe:
|
||||
|
|
@ -62,16 +62,16 @@ spec:
|
|||
secretKeyRef:
|
||||
name: server
|
||||
key: db
|
||||
- name: LOCKBOX_MASTER_KEY
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: server
|
||||
key: lockbox_key
|
||||
- name: SECRET_KEY_BASE
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: server
|
||||
key: secret_key_base
|
||||
- name: ENCRYPTION_SERVICE_SALT
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: server
|
||||
key: encryption_salt
|
||||
|
||||
imagePullSecrets:
|
||||
imagePullSecrets:
|
||||
- name: registry-secret
|
||||
|
|
@ -5,8 +5,7 @@ sidebar_position: 5
|
|||
# Adding a widget
|
||||
|
||||
To add a widget, navigate to the `insert` tab of right sidebar. It will display the list of built-in widgets that can be added to the app. Use the search functionality to quickly find the widget that you want.
|
||||
|
||||
<img src="/img/tutorial/adding-widget/widgets.gif" alt="ToolJet - widgets list" height="420"/>
|
||||
<img class="screenshot-full" src="/img/tutorial/adding-widget/widgets.gif" alt="ToolJet - widgets list" height="420"/>
|
||||
|
||||
## Drag and drop a widget
|
||||
Let's add a `table` widget to the app to show the customer data from the query that we created in the previous steps.
|
||||
|
|
@ -32,4 +31,8 @@ Since we have already run the query in previous step, the data will be immedietl
|
|||
|
||||
<img class="screenshot-full" src="/img/tutorial/adding-widget/table-data.gif" alt="ToolJet - Table with data" height="420"/>
|
||||
|
||||
So far in this tutorial, we have connected to a PostgreSQL database and displayed the data on a table.
|
||||
So far in this tutorial, we have connected to a PostgreSQL database and displayed the data on a table.
|
||||
|
||||
:::tip
|
||||
Read the widget reference of table [here](/docs/widgets/table) for more customizations such as server-side pagination, actions, editing data.
|
||||
:::
|
||||
70
docs/docs/widgets/chart.md
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
---
|
||||
sidebar_position: 1
|
||||
---
|
||||
|
||||
# Chart
|
||||
|
||||
Chart widget takes the chart type, data and styles to draw charts using Plotly.js.
|
||||
|
||||
Support chart types:
|
||||
- Line charts
|
||||
- Bar charts
|
||||
- Pie charts
|
||||
|
||||
## Line charts
|
||||
|
||||
Data requirements:
|
||||
|
||||
The data needs to be an array of objects and each object should have `x` and `y` keys.
|
||||
|
||||
Example:
|
||||
|
||||
```
|
||||
[
|
||||
{ "x": 100, "y": "Jan"},
|
||||
{ "x": 80, "y": "Feb"},
|
||||
{ "x": 40, "y": "Mar"}
|
||||
]
|
||||
```
|
||||
|
||||
The chart will look like this:
|
||||
<img class="screenshot-full" src="/img/widgets/chart/line.png" alt="ToolJet - line charts" height="420"/>
|
||||
|
||||
## Bar charts
|
||||
|
||||
Data requirements:
|
||||
|
||||
The data needs to be an array of objects and each object should have `x` and `y` keys.
|
||||
|
||||
Example:
|
||||
|
||||
```
|
||||
[
|
||||
{ "x": 100, "y": "Jan"},
|
||||
{ "x": 80, "y": "Feb"},
|
||||
{ "x": 40, "y": "Mar"}
|
||||
]
|
||||
```
|
||||
|
||||
The chart will look like this:
|
||||
<img class="screenshot-full" src="/img/widgets/chart/bar.png" alt="ToolJet - line charts" height="420"/>
|
||||
|
||||
|
||||
## Pie charts
|
||||
|
||||
Data requirements:
|
||||
|
||||
The data needs to be an array of objects and each object should have `label` and `value` keys.
|
||||
|
||||
Example:
|
||||
|
||||
```
|
||||
[
|
||||
{ "label": "Jan", "value": 100 },
|
||||
{ "label": "Feb", "value": 80 },
|
||||
{ "label": "Mar", "value": 20 }
|
||||
]
|
||||
```
|
||||
|
||||
The chart will look like this:
|
||||
<img class="screenshot-full" src="/img/widgets/chart/pie.png" alt="ToolJet - line charts" height="420"/>
|
||||
|
|
@ -3,3 +3,90 @@ sidebar_position: 1
|
|||
---
|
||||
|
||||
# Table
|
||||
|
||||
Tables can be used for both displaying and editing data.
|
||||
|
||||
<img class="screenshot-full" src="/img/widgets/table/adding.gif" alt="ToolJet - line charts" height="420"/>
|
||||
|
||||
## Displaying Data
|
||||
|
||||
The data object should be an array of objects. Table columns can be added, removed, rearranged from the inspector. `key` property is the accessor key used to get data from a single element of table data object. For example:
|
||||
|
||||
If the table data is:
|
||||
|
||||
```
|
||||
[
|
||||
{
|
||||
"review": {
|
||||
"title": "An app review"
|
||||
},
|
||||
"user": {
|
||||
"name": "sam",
|
||||
"email": "sam@example.com"
|
||||
},
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
To display email column, the key for the column should be `user.email`.
|
||||
|
||||
## Cell data types
|
||||
|
||||
- String ( Default )
|
||||
- Text
|
||||
- Badge - can be used to display and edit predefined badges such as status of shipment.
|
||||
- Multiple badges
|
||||
- Tags - similar to badges but the values are not predefined.
|
||||
- Dropdown
|
||||
- Multiselect dropdown
|
||||
|
||||
## Client-side pagination
|
||||
|
||||
Client-side pagination is enabled by default. The number of records per page is 10 by default and can be changed to upto 50.
|
||||
|
||||
## Server-side pagination
|
||||
|
||||
Server-side pagination can be used to run a query whenever the page is changed. Go to events section of the inspector and change the action for `on page changed` event. Number of records per page needs to be handled in your query. If server-side pagination is enabled, `pageIndex` property will be exposed on the table object, this property will have the current page index. `pageIndex` can be used to query the next set of results when page is changed.
|
||||
|
||||
## Search
|
||||
Client-side search is enabled by default and server-side search can be enabled from the events section of the inspector. Whenever the search text is changed, the `searchText` property of the table component is updated. If server-side search is enabled, `on search` event is fired after the content of `searchText` property is changed. `searchText` can be used to run a specific query to search for the records in your datasource.
|
||||
|
||||
## Event: On row clicked
|
||||
|
||||
This event is triggered when a table row is clicked. `selectedRow` property of the table object will have the table data of the selected row.
|
||||
|
||||
## Actions
|
||||
Actions are buttons that will be displayed as the last column of the table. The styles of these buttons can be customised and `on click` actions can be configured. when clicked, `selectedRow` property of the table will have the table data of the row.
|
||||
|
||||
## Property: Loading state (Boolean)
|
||||
Loading state shows a loading skeleton for the table. This property can be used to show a loading status on the table while data is being loaded. `isLoading` property of a query can be used to get the status of a query.
|
||||
|
||||
## Saving data
|
||||
Enable `editable` property of a column to make the cells editable. If a data type is not selected, `string` is selected as the data type.
|
||||
|
||||
If the data in a cell is changed, `changeSet` property of the table object will have the index of the row and the field that changed.
|
||||
For example, if the name field of second row of example in the 'Displaying Data' section is changed, `changeSet` will look like this:
|
||||
|
||||
```
|
||||
{
|
||||
2: {
|
||||
"name": "new name"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Along with `changeSet`, `dataUpdates` property will also be changed when the value of a cell changes. `dataUpdates` will have the whole data of the changed index from the table data. `dataUpdates` will look like this for our example:
|
||||
|
||||
```
|
||||
[{
|
||||
"review": {
|
||||
"title": "An app review"
|
||||
},
|
||||
"user": {
|
||||
"name": "new name",
|
||||
"email": "sam@example.com"
|
||||
},
|
||||
}]
|
||||
```
|
||||
|
||||
If the data of a cell is changed, "save changes" button will be shown at the bottom of the table. This button when clicked will trigger the `Bulk update query` event. This event can be used to run a query to update the data on your datasource.
|
||||
|
|
@ -154,3 +154,7 @@ body {
|
|||
strong {
|
||||
color: #3c92dc;
|
||||
}
|
||||
|
||||
.alert a {
|
||||
color: inherit;
|
||||
}
|
||||
|
|
|
|||
BIN
docs/static/img/widgets/chart/bar.png
vendored
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
docs/static/img/widgets/chart/line.png
vendored
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
docs/static/img/widgets/chart/pie.png
vendored
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
docs/static/img/widgets/table/adding.gif
vendored
Normal file
|
After Width: | Height: | Size: 12 MiB |
47
frontend/assets/images/icons/app-menu.svg
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 283.535 283.535" style="enable-background:new 0 0 283.535 283.535;" xml:space="preserve">
|
||||
<g>
|
||||
<path d="M40.687,101.082C18.252,101.082,0,119.333,0,141.768s18.252,40.686,40.687,40.686s40.686-18.251,40.686-40.686
|
||||
S63.121,101.082,40.687,101.082z M40.687,164.453c-12.51,0-22.687-10.177-22.687-22.686s10.177-22.686,22.687-22.686
|
||||
c12.509,0,22.686,10.177,22.686,22.686S53.195,164.453,40.687,164.453z"/>
|
||||
<path d="M141.768,101.082c-22.435,0-40.686,18.251-40.686,40.686s18.251,40.686,40.686,40.686s40.686-18.251,40.686-40.686
|
||||
S164.202,101.082,141.768,101.082z M141.768,164.453c-12.509,0-22.686-10.177-22.686-22.686s10.177-22.686,22.686-22.686
|
||||
s22.686,10.177,22.686,22.686S154.276,164.453,141.768,164.453z"/>
|
||||
<path d="M242.849,101.082c-22.435,0-40.686,18.251-40.686,40.686s18.251,40.686,40.686,40.686s40.687-18.251,40.687-40.686
|
||||
S265.283,101.082,242.849,101.082z M242.849,164.453c-12.509,0-22.686-10.177-22.686-22.686s10.177-22.686,22.686-22.686
|
||||
c12.51,0,22.687,10.177,22.687,22.686S255.358,164.453,242.849,164.453z"/>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.6 KiB |
10
frontend/assets/images/icons/apps.svg
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="28px" height="28px" viewBox="0 0 28 28" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<title>ic_fluent_office_apps_28_regular</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<g id="🔍-Product-Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="ic_fluent_office_apps_28_regular" fill="#212121" fill-rule="nonzero">
|
||||
<path d="M14,21 C15.1045695,21 16,21.8954305 16,23 C16,24.1045695 15.1045695,25 14,25 C12.8954305,25 12,24.1045695 12,23 C12,21.8954305 12.8954305,21 14,21 Z M23,21 C24.1045695,21 25,21.8954305 25,23 C25,24.1045695 24.1045695,25 23,25 C21.8954305,25 21,24.1045695 21,23 C21,21.8954305 21.8954305,21 23,21 Z M5,21 C6.1045695,21 7,21.8954305 7,23 C7,24.1045695 6.1045695,25 5,25 C3.8954305,25 3,24.1045695 3,23 C3,21.8954305 3.8954305,21 5,21 Z M14,12 C15.1045695,12 16,12.8954305 16,14 C16,15.1045695 15.1045695,16 14,16 C12.8954305,16 12,15.1045695 12,14 C12,12.8954305 12.8954305,12 14,12 Z M23,12 C24.1045695,12 25,12.8954305 25,14 C25,15.1045695 24.1045695,16 23,16 C21.8954305,16 21,15.1045695 21,14 C21,12.8954305 21.8954305,12 23,12 Z M5,12 C6.1045695,12 7,12.8954305 7,14 C7,15.1045695 6.1045695,16 5,16 C3.8954305,16 3,15.1045695 3,14 C3,12.8954305 3.8954305,12 5,12 Z M14,3 C15.1045695,3 16,3.8954305 16,5 C16,6.1045695 15.1045695,7 14,7 C12.8954305,7 12,6.1045695 12,5 C12,3.8954305 12.8954305,3 14,3 Z M23,3 C24.1045695,3 25,3.8954305 25,5 C25,6.1045695 24.1045695,7 23,7 C21.8954305,7 21,6.1045695 21,5 C21,3.8954305 21.8954305,3 23,3 Z M5,3 C6.1045695,3 7,3.8954305 7,5 C7,6.1045695 6.1045695,7 5,7 C3.8954305,7 3,6.1045695 3,5 C3,3.8954305 3.8954305,3 5,3 Z" id="🎨-Color"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
45
frontend/assets/images/icons/copy.svg
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 488.3 488.3" style="enable-background:new 0 0 488.3 488.3;" xml:space="preserve">
|
||||
<g>
|
||||
<g>
|
||||
<path d="M314.25,85.4h-227c-21.3,0-38.6,17.3-38.6,38.6v325.7c0,21.3,17.3,38.6,38.6,38.6h227c21.3,0,38.6-17.3,38.6-38.6V124
|
||||
C352.75,102.7,335.45,85.4,314.25,85.4z M325.75,449.6c0,6.4-5.2,11.6-11.6,11.6h-227c-6.4,0-11.6-5.2-11.6-11.6V124
|
||||
c0-6.4,5.2-11.6,11.6-11.6h227c6.4,0,11.6,5.2,11.6,11.6V449.6z"/>
|
||||
<path d="M401.05,0h-227c-21.3,0-38.6,17.3-38.6,38.6c0,7.5,6,13.5,13.5,13.5s13.5-6,13.5-13.5c0-6.4,5.2-11.6,11.6-11.6h227
|
||||
c6.4,0,11.6,5.2,11.6,11.6v325.7c0,6.4-5.2,11.6-11.6,11.6c-7.5,0-13.5,6-13.5,13.5s6,13.5,13.5,13.5c21.3,0,38.6-17.3,38.6-38.6
|
||||
V38.6C439.65,17.3,422.35,0,401.05,0z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
42
frontend/assets/images/icons/download.svg
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 485 485" style="enable-background:new 0 0 485 485;" xml:space="preserve">
|
||||
<g>
|
||||
<g>
|
||||
<path d="M426.5,458h-368C51,458,45,464,45,471.5S51,485,58.5,485h368c7.5,0,13.5-6,13.5-13.5S434,458,426.5,458z"/>
|
||||
<path d="M233,378.7c2.5,2.5,6,4,9.5,4s7-1.4,9.5-4l107.5-107.5c5.3-5.3,5.3-13.8,0-19.1c-5.3-5.3-13.8-5.3-19.1,0L256,336.5v-323
|
||||
C256,6,250,0,242.5,0S229,6,229,13.5v323l-84.4-84.4c-5.3-5.3-13.8-5.3-19.1,0s-5.3,13.8,0,19.1L233,378.7z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 910 B |
81
frontend/assets/images/icons/edit-source.svg
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 490.273 490.273" style="enable-background:new 0 0 490.273 490.273;" xml:space="preserve">
|
||||
<g>
|
||||
<g>
|
||||
<g>
|
||||
<path d="M313.548,152.387l-230.8,230.9c-6.7,6.7-6.7,17.6,0,24.3c3.3,3.3,7.7,5,12.1,5s8.8-1.7,12.1-5l230.8-230.8
|
||||
c6.7-6.7,6.7-17.6,0-24.3C331.148,145.687,320.248,145.687,313.548,152.387z"/>
|
||||
<path d="M431.148,191.887c4.4,0,8.8-1.7,12.1-5l25.2-25.2c29.1-29.1,29.1-76.4,0-105.4l-34.4-34.4
|
||||
c-14.1-14.1-32.8-21.8-52.7-21.8c-19.9,0-38.6,7.8-52.7,21.8l-25.2,25.2c-6.7,6.7-6.7,17.6,0,24.3l115.6,115.6
|
||||
C422.348,190.187,426.748,191.887,431.148,191.887z M352.948,45.987c7.6-7.6,17.7-11.8,28.5-11.8c10.7,0,20.9,4.2,28.5,11.8
|
||||
l34.4,34.4c15.7,15.7,15.7,41.2,0,56.9l-13.2,13.2l-91.4-91.4L352.948,45.987z"/>
|
||||
<path d="M162.848,467.187l243.5-243.5c6.7-6.7,6.7-17.6,0-24.3s-17.6-6.7-24.3,0l-239.3,239.5l-105.6,14.2l14.2-105.6
|
||||
l228.6-228.6c6.7-6.7,6.7-17.6,0-24.3c-6.7-6.7-17.6-6.7-24.3,0l-232.6,232.8c-2.7,2.7-4.4,6.1-4.9,9.8l-18,133.6
|
||||
c-0.7,5.3,1.1,10.6,4.9,14.4c3.2,3.2,7.6,5,12.1,5c0.8,0,1.5-0.1,2.3-0.2l133.6-18
|
||||
C156.748,471.587,160.248,469.887,162.848,467.187z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
81
frontend/assets/images/icons/edit.svg
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 490.273 490.273" style="enable-background:new 0 0 490.273 490.273;" xml:space="preserve">
|
||||
<g>
|
||||
<g>
|
||||
<g>
|
||||
<path d="M313.548,152.387l-230.8,230.9c-6.7,6.7-6.7,17.6,0,24.3c3.3,3.3,7.7,5,12.1,5s8.8-1.7,12.1-5l230.8-230.8
|
||||
c6.7-6.7,6.7-17.6,0-24.3C331.148,145.687,320.248,145.687,313.548,152.387z"/>
|
||||
<path d="M431.148,191.887c4.4,0,8.8-1.7,12.1-5l25.2-25.2c29.1-29.1,29.1-76.4,0-105.4l-34.4-34.4
|
||||
c-14.1-14.1-32.8-21.8-52.7-21.8c-19.9,0-38.6,7.8-52.7,21.8l-25.2,25.2c-6.7,6.7-6.7,17.6,0,24.3l115.6,115.6
|
||||
C422.348,190.187,426.748,191.887,431.148,191.887z M352.948,45.987c7.6-7.6,17.7-11.8,28.5-11.8c10.7,0,20.9,4.2,28.5,11.8
|
||||
l34.4,34.4c15.7,15.7,15.7,41.2,0,56.9l-13.2,13.2l-91.4-91.4L352.948,45.987z"/>
|
||||
<path d="M162.848,467.187l243.5-243.5c6.7-6.7,6.7-17.6,0-24.3s-17.6-6.7-24.3,0l-239.3,239.5l-105.6,14.2l14.2-105.6
|
||||
l228.6-228.6c6.7-6.7,6.7-17.6,0-24.3c-6.7-6.7-17.6-6.7-24.3,0l-232.6,232.8c-2.7,2.7-4.4,6.1-4.9,9.8l-18,133.6
|
||||
c-0.7,5.3,1.1,10.6,4.9,14.4c3.2,3.2,7.6,5,12.1,5c0.8,0,1.5-0.1,2.3-0.2l133.6-18
|
||||
C156.748,471.587,160.248,469.887,162.848,467.187z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
21
frontend/assets/images/icons/editor/datasources/airtable.svg
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 500 500" style="enable-background:new 0 0 500 500;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:#FFBF00;}
|
||||
.st1{fill:#26B5F8;}
|
||||
.st2{fill:#ED3049;}
|
||||
.st3{fill:#B22437;}
|
||||
</style>
|
||||
<g id="XMLID_1_">
|
||||
<path id="XMLID_2_" class="st0" d="M230.5,101.2L94.4,157.5c-7.6,3.1-7.5,13.9,0.1,16.9l136.7,54.2c12,4.8,25.4,4.8,37.4,0
|
||||
l136.7-54.2c7.6-3,7.7-13.8,0.1-16.9l-136.1-56.3C256.8,96,242.9,96,230.5,101.2"/>
|
||||
<path id="XMLID_3_" class="st1" d="M262,258.2v135.4c0,6.4,6.5,10.8,12.5,8.5l152.3-59.1c3.5-1.4,5.8-4.7,5.8-8.5V199.1
|
||||
c0-6.4-6.5-10.8-12.5-8.5l-152.3,59.1C264.3,251.1,262,254.4,262,258.2"/>
|
||||
<path id="XMLID_4_" class="st2" d="M226.4,265.2L181.2,287l-4.6,2.2l-95.4,45.7c-6,2.9-13.8-1.5-13.8-8.2V199.6
|
||||
c0-2.4,1.2-4.5,2.9-6.1c0.7-0.7,1.5-1.3,2.3-1.7c2.3-1.4,5.5-1.7,8.3-0.6l144.7,57.3C233,251.4,233.6,261.7,226.4,265.2"/>
|
||||
<path id="XMLID_5_" class="st3" d="M77.6,190.5c-1.8,0-3.5,0.5-4.8,1.3c-0.8,0.5-1.6,1-2.3,1.7L181.2,287l45.2-21.8
|
||||
c3.4-1.7,5.1-4.9,5.1-8.1c0-3.5-2-7.1-5.8-8.6L81,191.2C79.9,190.7,78.7,190.5,77.6,190.5"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
|
|
@ -0,0 +1 @@
|
|||
<svg width="2215" height="2500" viewBox="0 0 256 289" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid"><path d="M165.258 288.501h3.508l57.261-28.634.953-1.347V29.964l-.953-1.354L168.766 0h-3.551l.043 288.501" fill="#5294CF"/><path d="M90.741 288.501h-3.557l-57.212-28.634-1.161-1.997-.589-226.742 1.75-2.518L87.184 0h3.601l-.044 288.501" fill="#1F5B98"/><path d="M87.285 0h81.426v288.501H87.285V0z" fill="#2D72B8"/><path d="M256 137.769l-1.935-.429-27.628-2.576-.41.204-57.312-2.292h-81.43l-57.313 2.292V91.264l-.06.032.06-.128 57.313-13.28h81.43l57.312 13.28 21.069 11.199v-7.2l8.904-.974-.922-1.798-28.192-20.159-.859.279-57.312-17.759h-81.43L29.972 72.515V28.61L0 63.723v30.666l.232-.168 8.672.946v7.348L0 107.28v30.513l.232-.024 8.672.128v12.807l-7.482.112L0 150.68v30.525l8.904 4.788v7.433l-8.531.942-.373-.28v30.661l29.972 35.118v-43.901l57.313 17.759h81.43l57.481-17.811.764.335 27.821-19.862 1.219-1.979-8.904-.982v-7.284l-1.167-.466-19.043 10.265-.69 1.44-57.481 13.203v.016h-81.43v-.016l-57.313-13.259v-43.864l57.313 2.284v.056h81.43l57.312-2.34 1.305.6 26.779-2.306 1.889-.923-8.904-.128v-12.807l8.904-.128" fill="#1A476F"/><path d="M226.027 215.966v43.901L256 224.749v-30.461l-29.8 21.626-.173.052M226.027 197.421l.173-.04 29.8-16.028v-30.649l-29.973 2.757v43.96M226.2 91.208l-.173-.04v43.8L256 137.769v-30.634l-29.8-15.927M226.2 72.687L256 94.193V63.731L226.027 28.61v43.905l.173.06v.112" fill="#2D72B8"/></svg>
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
|
|
@ -0,0 +1 @@
|
|||
<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 80 80" width="2500" height="2500"><style>.st0{clip-path:url(#SVGID_2_);fill:#f0bf1a}.st1{clip-path:url(#SVGID_4_);fill:#3ebeb0}.st2{clip-path:url(#SVGID_6_);fill:#07a5de}.st3{clip-path:url(#SVGID_8_);fill:#231f20}.st4{fill:#d7a229}.st5{fill:#019b8f}.st6{fill:none}</style><defs><circle id="SVGID_1_" cx="40" cy="40" r="32"/></defs><clipPath id="SVGID_2_"><use xlink:href="#SVGID_1_" overflow="visible"/></clipPath><path class="st0" d="M53.7 26H10c-1.1 0-2-.9-2-2V10c0-1.1.9-2 2-2h57c1.1 0 2 .9 2 2v.7C68.9 19.1 62.1 26 53.7 26z"/><defs><circle id="SVGID_3_" cx="40" cy="40" r="32"/></defs><clipPath id="SVGID_4_"><use xlink:href="#SVGID_3_" overflow="visible"/></clipPath><path class="st1" d="M69.1 72H8.2V54h45.7c8.4 0 15.2 6.8 15.2 15.2V72z"/><g><defs><circle id="SVGID_5_" cx="40" cy="40" r="32"/></defs><clipPath id="SVGID_6_"><use xlink:href="#SVGID_5_" overflow="visible"/></clipPath><path class="st2" d="M50.1 49H4.8V31h45.3c5 0 9 4 9 9s-4.1 9-9 9z"/></g><g><defs><circle id="SVGID_7_" cx="40" cy="40" r="32"/></defs><clipPath id="SVGID_8_"><use xlink:href="#SVGID_7_" overflow="visible"/></clipPath><path class="st3" d="M36 31H6.4v18H36c.7-2.7 1.1-5.7 1.1-9s-.4-6.3-1.1-9z"/></g><path class="st4" d="M23.9 12.3c-5.4 3.2-9.9 8-12.7 13.7h23.6c-2.4-5.5-6.2-10.1-10.9-13.7z"/><path class="st5" d="M24.9 68.2c4.6-3.7 8.3-8.6 10.6-14.2H11.2c3 6 7.8 11 13.7 14.2z"/><path class="st6" d="M0 0h80v80H0z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
|
|
@ -0,0 +1,13 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="192" height="192">
|
||||
<defs>
|
||||
<clipPath id="a">
|
||||
<circle cx="96" cy="96" r="96" fill="none"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
<g clip-path="url(#a)" fill="none">
|
||||
<path fill="#ffc107" d="M0 0h192v192H0z"/>
|
||||
<path d="M1054 1119.333l-1000-1000v-18.666l9.692-4.308L54 86.667V68l42-18.667L138 68l1000 1000v18.667l-25.2-11.2 25.2 25.2v18.666l-22.05-9.8 16.8 16.8-36.75 16.334-29.077-29.077z" fill="#ffb300"/>
|
||||
<path d="M54 119.333v-18.666l9.692-4.308L54 86.667V68l42-18.667L138 68l54 54v70h-65.333z" fill="#ffb300"/>
|
||||
<path d="M96 100.667l-42 18.666v-18.666L96 82l42 18.667V117v-3.5 5.833zm0-51.334L138 68v18.667L96 68 54 86.667V68zM111.75 117l21 9.333L96 142.667V124z" fill="#fff" fill-rule="evenodd"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 775 B |
|
|
@ -0,0 +1,89 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="49px" height="67px" viewBox="0 0 49 67" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 54.1 (76490) - https://sketchapp.com -->
|
||||
<title>Sheets-icon</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs>
|
||||
<path d="M29.5833333,0 L4.4375,0 C1.996875,0 0,1.996875 0,4.4375 L0,60.6458333 C0,63.0864583 1.996875,65.0833333 4.4375,65.0833333 L42.8958333,65.0833333 C45.3364583,65.0833333 47.3333333,63.0864583 47.3333333,60.6458333 L47.3333333,17.75 L29.5833333,0 Z" id="path-1"></path>
|
||||
<path d="M29.5833333,0 L4.4375,0 C1.996875,0 0,1.996875 0,4.4375 L0,60.6458333 C0,63.0864583 1.996875,65.0833333 4.4375,65.0833333 L42.8958333,65.0833333 C45.3364583,65.0833333 47.3333333,63.0864583 47.3333333,60.6458333 L47.3333333,17.75 L29.5833333,0 Z" id="path-3"></path>
|
||||
<path d="M29.5833333,0 L4.4375,0 C1.996875,0 0,1.996875 0,4.4375 L0,60.6458333 C0,63.0864583 1.996875,65.0833333 4.4375,65.0833333 L42.8958333,65.0833333 C45.3364583,65.0833333 47.3333333,63.0864583 47.3333333,60.6458333 L47.3333333,17.75 L29.5833333,0 Z" id="path-5"></path>
|
||||
<linearGradient x1="50.0053945%" y1="8.58610612%" x2="50.0053945%" y2="100.013939%" id="linearGradient-7">
|
||||
<stop stop-color="#263238" stop-opacity="0.2" offset="0%"></stop>
|
||||
<stop stop-color="#263238" stop-opacity="0.02" offset="100%"></stop>
|
||||
</linearGradient>
|
||||
<path d="M29.5833333,0 L4.4375,0 C1.996875,0 0,1.996875 0,4.4375 L0,60.6458333 C0,63.0864583 1.996875,65.0833333 4.4375,65.0833333 L42.8958333,65.0833333 C45.3364583,65.0833333 47.3333333,63.0864583 47.3333333,60.6458333 L47.3333333,17.75 L29.5833333,0 Z" id="path-8"></path>
|
||||
<path d="M29.5833333,0 L4.4375,0 C1.996875,0 0,1.996875 0,4.4375 L0,60.6458333 C0,63.0864583 1.996875,65.0833333 4.4375,65.0833333 L42.8958333,65.0833333 C45.3364583,65.0833333 47.3333333,63.0864583 47.3333333,60.6458333 L47.3333333,17.75 L29.5833333,0 Z" id="path-10"></path>
|
||||
<path d="M29.5833333,0 L4.4375,0 C1.996875,0 0,1.996875 0,4.4375 L0,60.6458333 C0,63.0864583 1.996875,65.0833333 4.4375,65.0833333 L42.8958333,65.0833333 C45.3364583,65.0833333 47.3333333,63.0864583 47.3333333,60.6458333 L47.3333333,17.75 L29.5833333,0 Z" id="path-12"></path>
|
||||
<path d="M29.5833333,0 L4.4375,0 C1.996875,0 0,1.996875 0,4.4375 L0,60.6458333 C0,63.0864583 1.996875,65.0833333 4.4375,65.0833333 L42.8958333,65.0833333 C45.3364583,65.0833333 47.3333333,63.0864583 47.3333333,60.6458333 L47.3333333,17.75 L29.5833333,0 Z" id="path-14"></path>
|
||||
<radialGradient cx="3.16804688%" cy="2.71744318%" fx="3.16804688%" fy="2.71744318%" r="161.248516%" gradientTransform="translate(0.031680,0.027174),scale(1.000000,0.727273),translate(-0.031680,-0.027174)" id="radialGradient-16">
|
||||
<stop stop-color="#FFFFFF" stop-opacity="0.1" offset="0%"></stop>
|
||||
<stop stop-color="#FFFFFF" stop-opacity="0" offset="100%"></stop>
|
||||
</radialGradient>
|
||||
</defs>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="Consumer-Apps-Sheets-Large-VD-R8-" transform="translate(-451.000000, -451.000000)">
|
||||
<g id="Hero" transform="translate(0.000000, 63.000000)">
|
||||
<g id="Personal" transform="translate(277.000000, 299.000000)">
|
||||
<g id="Sheets-icon" transform="translate(174.833333, 89.958333)">
|
||||
<g id="Group">
|
||||
<g id="Clipped">
|
||||
<mask id="mask-2" fill="white">
|
||||
<use xlink:href="#path-1"></use>
|
||||
</mask>
|
||||
<g id="SVGID_1_"></g>
|
||||
<path d="M29.5833333,0 L4.4375,0 C1.996875,0 0,1.996875 0,4.4375 L0,60.6458333 C0,63.0864583 1.996875,65.0833333 4.4375,65.0833333 L42.8958333,65.0833333 C45.3364583,65.0833333 47.3333333,63.0864583 47.3333333,60.6458333 L47.3333333,17.75 L36.9791667,10.3541667 L29.5833333,0 Z" id="Path" fill="#0F9D58" fill-rule="nonzero" mask="url(#mask-2)"></path>
|
||||
</g>
|
||||
<g id="Clipped">
|
||||
<mask id="mask-4" fill="white">
|
||||
<use xlink:href="#path-3"></use>
|
||||
</mask>
|
||||
<g id="SVGID_1_"></g>
|
||||
<path d="M11.8333333,31.8020833 L11.8333333,53.25 L35.5,53.25 L35.5,31.8020833 L11.8333333,31.8020833 Z M22.1875,50.2916667 L14.7916667,50.2916667 L14.7916667,46.59375 L22.1875,46.59375 L22.1875,50.2916667 Z M22.1875,44.375 L14.7916667,44.375 L14.7916667,40.6770833 L22.1875,40.6770833 L22.1875,44.375 Z M22.1875,38.4583333 L14.7916667,38.4583333 L14.7916667,34.7604167 L22.1875,34.7604167 L22.1875,38.4583333 Z M32.5416667,50.2916667 L25.1458333,50.2916667 L25.1458333,46.59375 L32.5416667,46.59375 L32.5416667,50.2916667 Z M32.5416667,44.375 L25.1458333,44.375 L25.1458333,40.6770833 L32.5416667,40.6770833 L32.5416667,44.375 Z M32.5416667,38.4583333 L25.1458333,38.4583333 L25.1458333,34.7604167 L32.5416667,34.7604167 L32.5416667,38.4583333 Z" id="Shape" fill="#F1F1F1" fill-rule="nonzero" mask="url(#mask-4)"></path>
|
||||
</g>
|
||||
<g id="Clipped">
|
||||
<mask id="mask-6" fill="white">
|
||||
<use xlink:href="#path-5"></use>
|
||||
</mask>
|
||||
<g id="SVGID_1_"></g>
|
||||
<polygon id="Path" fill="url(#linearGradient-7)" fill-rule="nonzero" mask="url(#mask-6)" points="30.8813021 16.4520313 47.3333333 32.9003646 47.3333333 17.75"></polygon>
|
||||
</g>
|
||||
<g id="Clipped">
|
||||
<mask id="mask-9" fill="white">
|
||||
<use xlink:href="#path-8"></use>
|
||||
</mask>
|
||||
<g id="SVGID_1_"></g>
|
||||
<g id="Group" mask="url(#mask-9)">
|
||||
<g transform="translate(26.625000, -2.958333)">
|
||||
<path d="M2.95833333,2.95833333 L2.95833333,16.2708333 C2.95833333,18.7225521 4.94411458,20.7083333 7.39583333,20.7083333 L20.7083333,20.7083333 L2.95833333,2.95833333 Z" id="Path" fill="#87CEAC" fill-rule="nonzero"></path>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Clipped">
|
||||
<mask id="mask-11" fill="white">
|
||||
<use xlink:href="#path-10"></use>
|
||||
</mask>
|
||||
<g id="SVGID_1_"></g>
|
||||
<path d="M4.4375,0 C1.996875,0 0,1.996875 0,4.4375 L0,4.80729167 C0,2.36666667 1.996875,0.369791667 4.4375,0.369791667 L29.5833333,0.369791667 L29.5833333,0 L4.4375,0 Z" id="Path" fill-opacity="0.2" fill="#FFFFFF" fill-rule="nonzero" mask="url(#mask-11)"></path>
|
||||
</g>
|
||||
<g id="Clipped">
|
||||
<mask id="mask-13" fill="white">
|
||||
<use xlink:href="#path-12"></use>
|
||||
</mask>
|
||||
<g id="SVGID_1_"></g>
|
||||
<path d="M42.8958333,64.7135417 L4.4375,64.7135417 C1.996875,64.7135417 0,62.7166667 0,60.2760417 L0,60.6458333 C0,63.0864583 1.996875,65.0833333 4.4375,65.0833333 L42.8958333,65.0833333 C45.3364583,65.0833333 47.3333333,63.0864583 47.3333333,60.6458333 L47.3333333,60.2760417 C47.3333333,62.7166667 45.3364583,64.7135417 42.8958333,64.7135417 Z" id="Path" fill-opacity="0.2" fill="#263238" fill-rule="nonzero" mask="url(#mask-13)"></path>
|
||||
</g>
|
||||
<g id="Clipped">
|
||||
<mask id="mask-15" fill="white">
|
||||
<use xlink:href="#path-14"></use>
|
||||
</mask>
|
||||
<g id="SVGID_1_"></g>
|
||||
<path d="M34.0208333,17.75 C31.5691146,17.75 29.5833333,15.7642188 29.5833333,13.3125 L29.5833333,13.6822917 C29.5833333,16.1340104 31.5691146,18.1197917 34.0208333,18.1197917 L47.3333333,18.1197917 L47.3333333,17.75 L34.0208333,17.75 Z" id="Path" fill-opacity="0.1" fill="#263238" fill-rule="nonzero" mask="url(#mask-15)"></path>
|
||||
</g>
|
||||
</g>
|
||||
<path d="M29.5833333,0 L4.4375,0 C1.996875,0 0,1.996875 0,4.4375 L0,60.6458333 C0,63.0864583 1.996875,65.0833333 4.4375,65.0833333 L42.8958333,65.0833333 C45.3364583,65.0833333 47.3333333,63.0864583 47.3333333,60.6458333 L47.3333333,17.75 L29.5833333,0 Z" id="Path" fill="url(#radialGradient-16)" fill-rule="nonzero"></path>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 9 KiB |
|
|
@ -0,0 +1 @@
|
|||
<svg height="2500" viewBox="8.738 -5.03622834 17.45992422 39.40619484" width="2500" xmlns="http://www.w3.org/2000/svg"><path d="m15.9.087.854 1.604c.192.296.4.558.645.802a22.406 22.406 0 0 1 2.004 2.266c1.447 1.9 2.423 4.01 3.12 6.292.418 1.394.645 2.824.662 4.27.07 4.323-1.412 8.035-4.4 11.12a12.7 12.7 0 0 1 -1.57 1.342c-.296 0-.436-.227-.558-.436a3.589 3.589 0 0 1 -.436-1.255c-.105-.523-.174-1.046-.14-1.586v-.244c-.024-.052-.285-24.052-.181-24.175z" fill="#599636"/><path d="m15.9.034c-.035-.07-.07-.017-.105.017.017.35-.105.662-.296.96-.21.296-.488.523-.767.767-1.55 1.342-2.77 2.963-3.747 4.776-1.3 2.44-1.97 5.055-2.16 7.808-.087.993.314 4.497.627 5.508.854 2.684 2.388 4.933 4.375 6.885.488.47 1.01.906 1.55 1.325.157 0 .174-.14.21-.244a4.78 4.78 0 0 0 .157-.68l.35-2.614z" fill="#6cac48"/><path d="m16.754 28.845c.035-.4.227-.732.436-1.063-.21-.087-.366-.26-.488-.453a3.235 3.235 0 0 1 -.26-.575c-.244-.732-.296-1.5-.366-2.248v-.453c-.087.07-.105.662-.105.75a17.37 17.37 0 0 1 -.314 2.353c-.052.314-.087.627-.28.906 0 .035 0 .07.017.122.314.924.4 1.865.453 2.824v.35c0 .418-.017.33.33.47.14.052.296.07.436.174.105 0 .122-.087.122-.157l-.052-.575v-1.604c-.017-.28.035-.558.07-.82z" fill="#c2bfbf"/></svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
|
|
@ -0,0 +1 @@
|
|||
<svg width="191.151px" height="191.151px" viewBox="-18.458 -22.75 191.151 191.151" xmlns="http://www.w3.org/2000/svg"><path d="M-18.458 6.58h191.151v132.49H-18.458V6.58z" fill="none"/><path d="M40.054 113.583h-5.175c-.183-8.735-.687-16.947-1.511-24.642h-.046l-7.879 24.642h-3.94l-7.832-24.642h-.045c-.581 7.388-.947 15.602-1.099 24.642H7.81c.304-10.993 1.068-21.299 2.289-30.919h6.414l7.465 22.719h.046l7.511-22.719h6.137c1.344 11.268 2.138 21.575 2.382 30.919M62.497 90.771c-2.107 11.434-4.887 19.742-8.337 24.928-2.688 3.992-5.633 5.99-8.84 5.99-.855 0-1.91-.258-3.16-.77v-2.757c.611.088 1.328.138 2.152.138 1.498 0 2.702-.412 3.62-1.238 1.098-1.006 1.647-2.137 1.647-3.388 0-.858-.428-2.612-1.282-5.268L42.618 90.77h5.084l4.076 13.19c.916 2.995 1.298 5.086 1.145 6.277 2.229-5.953 3.786-12.444 4.673-19.468h4.901v.002z" fill="#5d87a1"/><path d="M131.382 113.583h-14.7V82.664h4.945v27.113h9.755v3.806zM112.834 114.33l-5.684-2.805c.504-.414.986-.862 1.42-1.381 2.416-2.838 3.621-7.035 3.621-12.594 0-10.229-4.014-15.346-12.045-15.346-3.938 0-7.01 1.298-9.207 3.895-2.414 2.84-3.619 7.022-3.619 12.551 0 5.435 1.068 9.422 3.205 11.951 1.955 2.291 4.902 3.438 8.843 3.438 1.47 0 2.819-.18 4.048-.543l7.4 4.308 2.018-3.474zm-18.413-6.934c-1.252-2.014-1.878-5.248-1.878-9.707 0-7.785 2.365-11.682 7.1-11.682 2.475 0 4.289.932 5.449 2.792 1.25 2.017 1.879 5.222 1.879 9.619 0 7.849-2.367 11.774-7.099 11.774-2.476.001-4.29-.928-5.451-2.796M85.165 105.013c0 2.622-.962 4.773-2.884 6.458-1.924 1.678-4.504 2.519-7.737 2.519-3.024 0-5.956-.966-8.794-2.888l1.329-2.655c2.442 1.223 4.653 1.831 6.638 1.831 1.863 0 3.319-.413 4.375-1.232 1.055-.822 1.684-1.975 1.684-3.433 0-1.837-1.281-3.407-3.631-4.722-2.167-1.19-6.501-3.678-6.501-3.678-2.349-1.712-3.525-3.55-3.525-6.578 0-2.506.877-4.529 2.632-6.068 1.757-1.545 4.024-2.315 6.803-2.315 2.87 0 5.479.769 7.829 2.291l-1.192 2.656c-2.01-.854-3.994-1.281-5.951-1.281-1.585 0-2.809.381-3.66 1.146-.858.762-1.387 1.737-1.387 2.933 0 1.828 1.308 3.418 3.722 4.759 2.196 1.192 6.638 3.723 6.638 3.723 2.409 1.709 3.612 3.53 3.612 6.534" fill="#f8981d"/><path d="M137.59 72.308c-2.99-.076-5.305.225-7.248 1.047-.561.224-1.453.224-1.531.933.303.3.338.784.601 1.198.448.747 1.229 1.752 1.942 2.276.783.6 1.569 1.194 2.393 1.717 1.453.899 3.1 1.422 4.516 2.318.825.521 1.645 1.195 2.471 1.756.406.299.666.784 1.193.971v-.114c-.264-.336-.339-.822-.598-1.196l-1.122-1.082c-1.084-1.456-2.431-2.727-3.884-3.771-1.196-.824-3.812-1.944-4.297-3.322l-.076-.076c.822-.077 1.797-.375 2.578-.604 1.271-.335 2.43-.259 3.734-.594.6-.15 1.195-.338 1.797-.523v-.337c-.676-.673-1.158-1.567-1.869-2.203-1.902-1.643-3.998-3.25-6.164-4.595-1.16-.749-2.652-1.231-3.887-1.868-.445-.225-1.195-.336-1.457-.71-.67-.822-1.047-1.904-1.533-2.877-1.08-2.053-2.129-4.331-3.061-6.502-.674-1.456-1.084-2.91-1.906-4.257-3.85-6.35-8.031-10.196-14.457-13.971-1.381-.786-3.024-1.121-4.779-1.533l-2.803-.148c-.598-.262-1.197-.973-1.719-1.309-2.132-1.344-7.621-4.257-9.189-.411-1.01 2.431 1.494 4.821 2.354 6.054.635.856 1.458 1.83 1.902 2.802.263.635.337 1.309.6 1.98.598 1.644 1.157 3.473 1.943 5.007.41.782.857 1.604 1.381 2.312.3.414.822.597.936 1.272-.521.744-.562 1.867-.861 2.801-1.344 4.221-.819 9.45 1.086 12.552.596.934 2.018 2.99 3.92 2.202 1.684-.672 1.311-2.801 1.795-4.668.111-.451.038-.747.262-1.043v.073c.521 1.045 1.047 2.052 1.53 3.1 1.159 1.829 3.177 3.735 4.858 5.002.895.676 1.604 1.832 2.725 2.245V74.1h-.074c-.227-.335-.559-.485-.857-.745-.674-.673-1.42-1.495-1.943-2.241-1.566-2.093-2.952-4.41-4.182-6.801-.602-1.16-1.121-2.428-1.606-3.586-.226-.447-.226-1.121-.601-1.346-.562.821-1.381 1.532-1.791 2.538-.711 1.609-.785 3.588-1.049 5.646l-.147.072c-1.19-.299-1.604-1.53-2.056-2.575-1.119-2.654-1.307-6.914-.336-9.976.26-.783 1.385-3.249.936-3.995-.225-.715-.973-1.122-1.383-1.685-.482-.708-1.01-1.604-1.346-2.39-.896-2.091-1.347-4.408-2.312-6.498-.451-.974-1.234-1.982-1.868-2.879-.712-1.008-1.495-1.718-2.058-2.913-.186-.411-.447-1.083-.148-1.53.073-.3.225-.412.523-.487.484-.409 1.867.111 2.352.336 1.385.56 2.543 1.083 3.699 1.867.523.375 1.084 1.085 1.755 1.272h.786c1.193.26 2.538.072 3.661.41 1.979.636 3.772 1.569 5.38 2.576 4.893 3.103 8.928 7.512 11.652 12.778.447.858.637 1.644 1.045 2.539.787 1.832 1.76 3.7 2.541 5.493.785 1.755 1.533 3.547 2.654 5.005.559.784 2.805 1.195 3.812 1.606.745.335 1.905.633 2.577 1.044 1.271.783 2.537 1.682 3.732 2.543.595.448 2.465 1.382 2.576 2.13M99.484 39.844a5.82 5.82 0 0 0-1.529.188v.075h.072c.301.597.824 1.011 1.197 1.532.301.599.562 1.193.857 1.791l.072-.074c.527-.373.789-.971.789-1.868-.227-.264-.262-.522-.451-.784-.22-.374-.705-.56-1.007-.86" fill="#5d87a1"/><path d="M141.148 113.578h.774v-3.788h-1.161l-.947 2.585-1.029-2.585h-1.118v3.788h.731v-2.882h.041l1.078 2.882h.557l1.074-2.882v2.882zm-6.235 0h.819v-3.146h1.072v-.643h-3.008v.643h1.115l.002 3.146z" fill="#f8981d"/></svg>
|
||||
|
After Width: | Height: | Size: 4.7 KiB |
|
After Width: | Height: | Size: 6.6 KiB |
|
|
@ -0,0 +1 @@
|
|||
<svg width="256px" height="256px" viewBox="0 -18 256 256" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet"><path d="M245.97 168.943c-13.662 7.121-84.434 36.22-99.501 44.075-15.067 7.856-23.437 7.78-35.34 2.09-11.902-5.69-87.216-36.112-100.783-42.597C3.566 169.271 0 166.535 0 163.951v-25.876s98.05-21.345 113.879-27.024c15.828-5.679 21.32-5.884 34.79-.95 13.472 4.936 94.018 19.468 107.331 24.344l-.006 25.51c.002 2.558-3.07 5.364-10.024 8.988" fill="#912626"/><path d="M245.965 143.22c-13.661 7.118-84.431 36.218-99.498 44.072-15.066 7.857-23.436 7.78-35.338 2.09-11.903-5.686-87.214-36.113-100.78-42.594-13.566-6.485-13.85-10.948-.524-16.166 13.326-5.22 88.224-34.605 104.055-40.284 15.828-5.677 21.319-5.884 34.789-.948 13.471 4.934 83.819 32.935 97.13 37.81 13.316 4.881 13.827 8.9.166 16.02" fill="#C6302B"/><path d="M245.97 127.074c-13.662 7.122-84.434 36.22-99.501 44.078-15.067 7.853-23.437 7.777-35.34 2.087-11.903-5.687-87.216-36.112-100.783-42.597C3.566 127.402 0 124.67 0 122.085V96.206s98.05-21.344 113.879-27.023c15.828-5.679 21.32-5.885 34.79-.95C162.142 73.168 242.688 87.697 256 92.574l-.006 25.513c.002 2.557-3.07 5.363-10.024 8.987" fill="#912626"/><path d="M245.965 101.351c-13.661 7.12-84.431 36.218-99.498 44.075-15.066 7.854-23.436 7.777-35.338 2.087-11.903-5.686-87.214-36.112-100.78-42.594-13.566-6.483-13.85-10.947-.524-16.167C23.151 83.535 98.05 54.148 113.88 48.47c15.828-5.678 21.319-5.884 34.789-.949 13.471 4.934 83.819 32.933 97.13 37.81 13.316 4.88 13.827 8.9.166 16.02" fill="#C6302B"/><path d="M245.97 83.653c-13.662 7.12-84.434 36.22-99.501 44.078-15.067 7.854-23.437 7.777-35.34 2.087-11.903-5.687-87.216-36.113-100.783-42.595C3.566 83.98 0 81.247 0 78.665v-25.88s98.05-21.343 113.879-27.021c15.828-5.68 21.32-5.884 34.79-.95C162.142 29.749 242.688 44.278 256 49.155l-.006 25.512c.002 2.555-3.07 5.361-10.024 8.986" fill="#912626"/><path d="M245.965 57.93c-13.661 7.12-84.431 36.22-99.498 44.074-15.066 7.854-23.436 7.777-35.338 2.09C99.227 98.404 23.915 67.98 10.35 61.497-3.217 55.015-3.5 50.55 9.825 45.331 23.151 40.113 98.05 10.73 113.88 5.05c15.828-5.679 21.319-5.883 34.789-.948 13.471 4.935 83.819 32.934 97.13 37.811 13.316 4.876 13.827 8.897.166 16.017" fill="#C6302B"/><path d="M159.283 32.757l-22.01 2.285-4.927 11.856-7.958-13.23-25.415-2.284 18.964-6.839-5.69-10.498 17.755 6.944 16.738-5.48-4.524 10.855 17.067 6.391M131.032 90.275L89.955 73.238l58.86-9.035-17.783 26.072M74.082 39.347c17.375 0 31.46 5.46 31.46 12.194 0 6.736-14.085 12.195-31.46 12.195s-31.46-5.46-31.46-12.195c0-6.734 14.085-12.194 31.46-12.194" fill="#FFF"/><path d="M185.295 35.998l34.836 13.766-34.806 13.753-.03-27.52" fill="#621B1C"/><path d="M146.755 51.243l38.54-15.245.03 27.519-3.779 1.478-34.791-13.752" fill="#9A2928"/></svg>
|
||||
|
After Width: | Height: | Size: 2.7 KiB |
84
frontend/assets/images/icons/editor/datasources/restapi.svg
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 511 511" style="enable-background:new 0 0 511 511;" xml:space="preserve">
|
||||
<g>
|
||||
<path d="M492.168,309.579l-17.626-10.177c2.96-14.723,4.458-29.466,4.458-43.902c0-14.646-1.474-29.403-4.384-43.946l17.552-10.134
|
||||
c5.436-3.138,9.325-8.206,10.949-14.269s0.791-12.396-2.348-17.832l-48-83.139c-3.139-5.436-8.206-9.325-14.269-10.949
|
||||
c-6.064-1.624-12.396-0.791-17.833,2.348l-17.566,10.142C380.912,68.2,354.798,53.092,327,43.692V23.5
|
||||
C327,10.542,316.458,0,303.5,0h-96C194.542,0,184,10.542,184,23.5v20.193c-27.65,9.362-53.728,24.49-75.999,44.088L90.332,77.579
|
||||
c-5.437-3.139-11.77-3.973-17.833-2.348c-6.063,1.625-11.13,5.513-14.269,10.949l-48,83.139
|
||||
c-3.139,5.436-3.972,11.769-2.348,17.832s5.513,11.131,10.949,14.269l17.626,10.177C33.499,226.32,32,241.063,32,255.5
|
||||
c0,14.644,1.474,29.401,4.384,43.945l-17.552,10.134c-11.222,6.479-15.08,20.879-8.602,32.102l48,83.139
|
||||
c6.479,11.221,20.879,15.08,32.102,8.601l17.565-10.142c22.19,19.521,48.303,34.629,76.103,44.03V487.5
|
||||
c0,12.958,10.542,23.5,23.5,23.5h96c12.958,0,23.5-10.542,23.5-23.5v-20.193c27.651-9.362,53.729-24.49,76-44.087l17.668,10.201
|
||||
c11.221,6.479,25.623,2.62,32.102-8.601l48-83.139C507.248,330.458,503.39,316.058,492.168,309.579z M487.779,334.181l-48,83.138
|
||||
c-2.343,4.06-7.552,5.455-11.611,3.111l-22.392-12.928c-2.845-1.643-6.43-1.242-8.842,0.989
|
||||
c-22.893,21.173-50.437,37.148-79.653,46.199c-3.14,0.973-5.281,3.877-5.281,7.164V487.5c0,4.687-3.813,8.5-8.5,8.5h-96
|
||||
c-4.687,0-8.5-3.813-8.5-8.5v-25.645c0-3.287-2.141-6.191-5.28-7.164c-29.396-9.107-56.974-25.062-79.755-46.139
|
||||
c-1.421-1.315-3.25-1.995-5.095-1.995c-1.286,0-2.579,0.33-3.748,1.005L82.832,420.43c-4.06,2.343-9.268,0.948-11.611-3.111
|
||||
l-48-83.138c-2.343-4.059-0.947-9.268,3.111-11.612l22.272-12.859c2.844-1.642,4.289-4.942,3.566-8.146
|
||||
C48.739,286.357,47,270.858,47,255.5c0-15.1,1.765-30.584,5.247-46.022c0.722-3.203-0.723-6.504-3.566-8.145L26.332,188.43
|
||||
c-1.966-1.135-3.372-2.968-3.96-5.161c-0.587-2.193-0.286-4.484,0.849-6.45l48-83.139c1.135-1.966,2.968-3.373,5.162-3.96
|
||||
c2.192-0.588,4.484-0.286,6.45,0.849l22.392,12.928c2.846,1.644,6.43,1.242,8.842-0.989c22.894-21.173,50.437-37.148,79.653-46.199
|
||||
c3.14-0.973,5.281-3.877,5.281-7.164V23.5c0-4.687,3.813-8.5,8.5-8.5h96c4.687,0,8.5,3.813,8.5,8.5v25.645
|
||||
c0,3.287,2.141,6.191,5.28,7.164c29.395,9.106,56.973,25.061,79.755,46.139c2.412,2.232,5.997,2.633,8.843,0.99l22.29-12.869
|
||||
c1.967-1.135,4.258-1.437,6.45-0.849c2.193,0.588,4.026,1.994,5.162,3.96l48,83.139c1.135,1.966,1.437,4.257,0.849,6.45
|
||||
c-0.588,2.193-1.994,4.026-3.96,5.161l-22.272,12.859c-2.844,1.642-4.289,4.943-3.566,8.146c3.431,15.206,5.17,30.704,5.17,46.065
|
||||
c0,15.1-1.765,30.584-5.247,46.021c-0.722,3.203,0.723,6.503,3.566,8.145l22.349,12.903
|
||||
C488.727,324.913,490.123,330.122,487.779,334.181z"/>
|
||||
<path d="M255.5,104C171.962,104,104,171.963,104,255.5S171.962,407,255.5,407S407,339.037,407,255.5S339.038,104,255.5,104z
|
||||
M255.5,392C180.234,392,119,330.766,119,255.5S180.234,119,255.5,119S392,180.234,392,255.5S330.766,392,255.5,392z"/>
|
||||
<path d="M283.5,216h-28c-4.142,0-7.5,3.358-7.5,7.5v64c0,4.142,3.358,7.5,7.5,7.5s7.5-3.358,7.5-7.5V271h20.5
|
||||
c15.164,0,27.5-12.336,27.5-27.5S298.664,216,283.5,216z M283.5,256H263v-25h20.5c6.893,0,12.5,5.607,12.5,12.5
|
||||
S290.393,256,283.5,256z"/>
|
||||
<path d="M214.522,220.867c-1.098-2.927-3.896-4.867-7.022-4.867h-8c-3.126,0-5.925,1.939-7.022,4.867l-24,64
|
||||
c-1.455,3.878,0.511,8.201,4.389,9.656c3.878,1.455,8.201-0.511,9.656-4.389L186.697,279h33.605l4.175,11.133
|
||||
c1.129,3.011,3.987,4.869,7.023,4.869c0.875,0,1.765-0.154,2.632-0.479c3.878-1.454,5.844-5.778,4.389-9.656L214.522,220.867z
|
||||
M192.322,264l11.178-29.807L214.678,264H192.322z"/>
|
||||
<path d="M327.5,216c-4.142,0-7.5,3.358-7.5,7.5v64c0,4.142,3.358,7.5,7.5,7.5s7.5-3.358,7.5-7.5v-64
|
||||
C335,219.358,331.642,216,327.5,216z"/>
|
||||
<path d="M309.152,87.3c5.205,1.659,10.394,3.586,15.421,5.726c0.958,0.408,1.954,0.601,2.934,0.601c2.916,0,5.69-1.712,6.904-4.564
|
||||
c1.622-3.811-0.152-8.216-3.963-9.838c-5.458-2.323-11.09-4.415-16.742-6.216c-3.945-1.258-8.165,0.922-9.423,4.868
|
||||
C303.026,81.823,305.206,86.042,309.152,87.3z"/>
|
||||
<path d="M100.45,339.904c-1.984-3.636-6.541-4.976-10.176-2.992c-3.636,1.984-4.976,6.54-2.992,10.176
|
||||
c3.112,5.704,6.557,11.315,10.239,16.677c1.454,2.117,3.801,3.255,6.189,3.255c1.463,0,2.941-0.427,4.239-1.318
|
||||
c3.415-2.345,4.282-7.014,1.937-10.428C106.493,350.332,103.318,345.161,100.45,339.904z"/>
|
||||
<path d="M240.14,431.341c-40.189-3.463-78.337-20.879-107.416-49.041c-2.976-2.882-7.724-2.805-10.605,0.17
|
||||
c-2.881,2.976-2.806,7.724,0.17,10.605c31.55,30.555,72.947,49.452,116.563,53.21c0.219,0.019,0.436,0.028,0.652,0.028
|
||||
c3.851,0,7.127-2.949,7.464-6.856C247.323,435.331,244.266,431.697,240.14,431.341z"/>
|
||||
<path d="M363.425,97.287c-3.42-2.337-8.087-1.459-10.424,1.96c-2.337,3.42-1.459,8.087,1.96,10.424
|
||||
c34.844,23.813,60.049,59.248,70.972,99.776c0.902,3.346,3.93,5.55,7.237,5.55c0.646,0,1.303-0.084,1.956-0.26
|
||||
c4-1.078,6.368-5.194,5.29-9.193C428.564,161.564,401.221,123.118,363.425,97.287z"/>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.3 KiB |
|
|
@ -0,0 +1 @@
|
|||
<svg width="2452.5px" height="2452.5px" viewBox="-2.45 0 2452.5 2452.5" enable-background="new 0 0 2447.6 2452.5" xmlns="http://www.w3.org/2000/svg"><g clip-rule="evenodd" fill-rule="evenodd"><path d="m897.4 0c-135.3.1-244.8 109.9-244.7 245.2-.1 135.3 109.5 245.1 244.8 245.2h244.8v-245.1c.1-135.3-109.5-245.1-244.9-245.3.1 0 .1 0 0 0m0 654h-652.6c-135.3.1-244.9 109.9-244.8 245.2-.2 135.3 109.4 245.1 244.7 245.3h652.7c135.3-.1 244.9-109.9 244.8-245.2.1-135.4-109.5-245.2-244.8-245.3z" fill="#36c5f0"/><path d="m2447.6 899.2c.1-135.3-109.5-245.1-244.8-245.2-135.3.1-244.9 109.9-244.8 245.2v245.3h244.8c135.3-.1 244.9-109.9 244.8-245.3zm-652.7 0v-654c.1-135.2-109.4-245-244.7-245.2-135.3.1-244.9 109.9-244.8 245.2v654c-.2 135.3 109.4 245.1 244.7 245.3 135.3-.1 244.9-109.9 244.8-245.3z" fill="#2eb67d"/><path d="m1550.1 2452.5c135.3-.1 244.9-109.9 244.8-245.2.1-135.3-109.5-245.1-244.8-245.2h-244.8v245.2c-.1 135.2 109.5 245 244.8 245.2zm0-654.1h652.7c135.3-.1 244.9-109.9 244.8-245.2.2-135.3-109.4-245.1-244.7-245.3h-652.7c-135.3.1-244.9 109.9-244.8 245.2-.1 135.4 109.4 245.2 244.7 245.3z" fill="#ecb22e"/><path d="m0 1553.2c-.1 135.3 109.5 245.1 244.8 245.2 135.3-.1 244.9-109.9 244.8-245.2v-245.2h-244.8c-135.3.1-244.9 109.9-244.8 245.2zm652.7 0v654c-.2 135.3 109.4 245.1 244.7 245.3 135.3-.1 244.9-109.9 244.8-245.2v-653.9c.2-135.3-109.4-245.1-244.7-245.3-135.4 0-244.9 109.8-244.8 245.1 0 0 0 .1 0 0" fill="#e01e5a"/></g></svg>
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
24
frontend/assets/images/icons/editor/datasources/stripe.svg
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 24.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 468 222.5" style="enable-background:new 0 0 468 222.5;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill-rule:evenodd;clip-rule:evenodd;fill:#635BFF;}
|
||||
</style>
|
||||
<g>
|
||||
<path class="st0" d="M414,113.4c0-25.6-12.4-45.8-36.1-45.8c-23.8,0-38.2,20.2-38.2,45.6c0,30.1,17,45.3,41.4,45.3
|
||||
c11.9,0,20.9-2.7,27.7-6.5v-20c-6.8,3.4-14.6,5.5-24.5,5.5c-9.7,0-18.3-3.4-19.4-15.2h48.9C413.8,121,414,115.8,414,113.4z
|
||||
M364.6,103.9c0-11.3,6.9-16,13.2-16c6.1,0,12.6,4.7,12.6,16H364.6z"/>
|
||||
<path class="st0" d="M301.1,67.6c-9.8,0-16.1,4.6-19.6,7.8l-1.3-6.2h-22v116.6l25-5.3l0.1-28.3c3.6,2.6,8.9,6.3,17.7,6.3
|
||||
c17.9,0,34.2-14.4,34.2-46.1C335.1,83.4,318.6,67.6,301.1,67.6z M295.1,136.5c-5.9,0-9.4-2.1-11.8-4.7l-0.1-37.1
|
||||
c2.6-2.9,6.2-4.9,11.9-4.9c9.1,0,15.4,10.2,15.4,23.3C310.5,126.5,304.3,136.5,295.1,136.5z"/>
|
||||
<polygon class="st0" points="223.8,61.7 248.9,56.3 248.9,36 223.8,41.3 "/>
|
||||
<rect x="223.8" y="69.3" class="st0" width="25.1" height="87.5"/>
|
||||
<path class="st0" d="M196.9,76.7l-1.6-7.4h-21.6v87.5h25V97.5c5.9-7.7,15.9-6.3,19-5.2v-23C214.5,68.1,202.8,65.9,196.9,76.7z"/>
|
||||
<path class="st0" d="M146.9,47.6l-24.4,5.2l-0.1,80.1c0,14.8,11.1,25.7,25.9,25.7c8.2,0,14.2-1.5,17.5-3.3V135
|
||||
c-3.2,1.3-19,5.9-19-8.9V90.6h19V69.3h-19L146.9,47.6z"/>
|
||||
<path class="st0" d="M79.3,94.7c0-3.9,3.2-5.4,8.5-5.4c7.6,0,17.2,2.3,24.8,6.4V72.2c-8.3-3.3-16.5-4.6-24.8-4.6
|
||||
C67.5,67.6,54,78.2,54,95.9c0,27.6,38,23.2,38,35.1c0,4.6-4,6.1-9.6,6.1c-8.3,0-18.9-3.4-27.3-8v23.8c9.3,4,18.7,5.7,27.3,5.7
|
||||
c20.8,0,35.1-10.3,35.1-28.2C117.4,100.6,79.3,105.9,79.3,94.7z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.8 KiB |
17
frontend/assets/images/icons/editor/rearrange.svg
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="210px" height="210px" viewBox="0 0 210 210" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<title>rearrange</title>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="rearrange" fill="#262626" fill-rule="nonzero">
|
||||
<path d="M195,0 L175,0 C166.716,0 160,6.716 160,15 L160,35 C160,43.284 166.716,50 175,50 L195,50 C203.284,50 210,43.284 210,35 L210,15 C210,6.716 203.284,0 195,0 Z" id="XMLID_17_"></path>
|
||||
<path d="M115,0 L95,0 C86.716,0 80,6.716 80,15 L80,35 C80,43.284 86.716,50 95,50 L115,50 C123.284,50 130,43.284 130,35 L130,15 C130,6.716 123.284,0 115,0 Z" id="XMLID_18_"></path>
|
||||
<path d="M35,0 L15,0 C6.716,0 0,6.716 0,15 L0,35 C0,43.284 6.716,50 15,50 L35,50 C43.284,50 50,43.284 50,35 L50,15 C50,6.716 43.284,0 35,0 Z" id="XMLID_19_"></path>
|
||||
<path d="M195,160 L175,160 C166.716,160 160,166.716 160,175 L160,195 C160,203.284 166.716,210 175,210 L195,210 C203.284,210 210,203.284 210,195 L210,175 C210,166.716 203.284,160 195,160 Z" id="XMLID_20_"></path>
|
||||
<path d="M115,160 L95,160 C86.716,160 80,166.716 80,175 L80,195 C80,203.284 86.716,210 95,210 L115,210 C123.284,210 130,203.284 130,195 L130,175 C130,166.716 123.284,160 115,160 Z" id="XMLID_21_"></path>
|
||||
<path d="M35,160 L15,160 C6.716,160 0,166.716 0,175 L0,195 C0,203.284 6.716,210 15,210 L35,210 C43.284,210 50,203.284 50,195 L50,175 C50,166.716 43.284,160 35,160 Z" id="XMLID_22_"></path>
|
||||
<path d="M195,80 L175,80 C166.716,80 160,86.716 160,95 L160,115 C160,123.284 166.716,130 175,130 L195,130 C203.284,130 210,123.284 210,115 L210,95 C210,86.716 203.284,80 195,80 Z" id="XMLID_23_"></path>
|
||||
<path d="M115,80 L95,80 C86.716,80 80,86.716 80,95 L80,115 C80,123.284 86.716,130 95,130 L115,130 C123.284,130 130,123.284 130,115 L130,95 C130,86.716 123.284,80 115,80 Z" id="XMLID_24_"></path>
|
||||
<path d="M35,80 L15,80 C6.716,80 0,86.716 0,95 L0,115 C0,123.284 6.716,130 15,130 L35,130 C43.284,130 50,123.284 50,115 L50,95 C50,86.716 43.284,80 35,80 Z" id="XMLID_25_"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.2 KiB |
41
frontend/assets/images/icons/filter.svg
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 518.462 518.462" style="enable-background:new 0 0 518.462 518.462;" xml:space="preserve">
|
||||
<g>
|
||||
<g>
|
||||
<path d="M518.462,22.82H0l193.159,203.495l-0.014,269.327l132.173-68.37l-0.014-200.957L518.462,22.82z M212.837,463.286
|
||||
l0.014-244.827L45.846,42.512h426.769L305.611,218.459l0.014,196.832L212.837,463.286z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 783 B |
61
frontend/assets/images/icons/insert.svg
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
|
||||
<g>
|
||||
<g>
|
||||
<polygon points="0,0 0,173.419 49.548,173.419 49.548,49.548 173.419,49.548 173.419,0 "/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<polygon points="338.581,0 338.581,49.548 462.452,49.548 462.452,173.419 512,173.419 512,0 "/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<polygon points="462.452,338.581 462.452,462.452 338.581,462.452 338.581,512 512,512 512,338.581 "/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<polygon points="49.548,462.452 49.548,338.581 0,338.581 0,512 173.419,512 173.419,462.452 "/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<polygon points="280.774,231.226 280.774,140.387 231.226,140.387 231.226,231.226 140.387,231.226 140.387,280.774
|
||||
231.226,280.774 231.226,371.613 280.774,371.613 280.774,280.774 371.613,280.774 371.613,231.226 "/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
9
frontend/assets/images/icons/lens.svg
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Uploaded to SVGRepo https://www.svgrepo.com -->
|
||||
<svg version="1.2" baseProfile="tiny" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
x="0px" y="0px" viewBox="0 0 256 256" xml:space="preserve">
|
||||
<path d="M256,229.484l-81.427-81.427c9.903-14.981,15.679-32.917,15.679-52.181C190.253,43.562,147.691,1,95.376,1
|
||||
S0.5,43.562,0.5,95.876s42.562,94.876,94.876,94.876c19.521,0,37.683-5.929,52.783-16.077L229.484,256L256,229.484z M20.5,95.876
|
||||
C20.5,54.589,54.089,21,95.376,21c41.287,0,74.876,33.589,74.876,74.876c0,41.287-33.59,74.876-74.876,74.876
|
||||
C54.089,170.753,20.5,137.163,20.5,95.876z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 690 B |
11
frontend/assets/images/icons/maximize.svg
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="28px" height="28px" viewBox="0 0 28 28" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Uploaded to SVGRepo https://www.svgrepo.com -->
|
||||
<title>ic_fluent_arrow_maximize_28_regular</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<g id="🔍-System-Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="ic_fluent_arrow_maximize_28_regular" fill="#212121" fill-rule="nonzero">
|
||||
<path d="M16.25,3 L24.25,3 C24.6296958,3 24.943491,3.28215388 24.9931534,3.64822944 L25,3.75 L25,11.75 C25,12.1642136 24.6642136,12.5 24.25,12.5 C23.8703042,12.5 23.556509,12.2178461 23.5068466,11.8517706 L23.5,11.75 L23.5,5.56 L5.56,23.5 L11.75,23.5 C12.1296958,23.5 12.443491,23.7821539 12.4931534,24.1482294 L12.5,24.25 C12.5,24.6296958 12.2178461,24.943491 11.8517706,24.9931534 L11.75,25 L3.75,25 C3.37030423,25 3.05650904,24.7178461 3.00684662,24.3517706 L3,24.25 L3,16.25 C3,15.8357864 3.33578644,15.5 3.75,15.5 C4.12969577,15.5 4.44349096,15.7821539 4.49315338,16.1482294 L4.5,16.25 L4.5,22.438 L22.438,4.5 L16.25,4.5 C15.8703042,4.5 15.556509,4.21784612 15.5068466,3.85177056 L15.5,3.75 C15.5,3.37030423 15.7821539,3.05650904 16.1482294,3.00684662 L16.25,3 L24.25,3 L16.25,3 Z" id="🎨-Color"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
55
frontend/assets/images/icons/menu.svg
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 56 56" style="enable-background:new 0 0 56 56;" xml:space="preserve">
|
||||
<g>
|
||||
<path d="M8,40c-4.411,0-8,3.589-8,8s3.589,8,8,8s8-3.589,8-8S12.411,40,8,40z M8,54c-3.309,0-6-2.691-6-6s2.691-6,6-6s6,2.691,6,6
|
||||
S11.309,54,8,54z"/>
|
||||
<path d="M28,40c-4.411,0-8,3.589-8,8s3.589,8,8,8s8-3.589,8-8S32.411,40,28,40z M28,54c-3.309,0-6-2.691-6-6s2.691-6,6-6
|
||||
s6,2.691,6,6S31.309,54,28,54z"/>
|
||||
<path d="M48,40c-4.411,0-8,3.589-8,8s3.589,8,8,8s8-3.589,8-8S52.411,40,48,40z M48,54c-3.309,0-6-2.691-6-6s2.691-6,6-6
|
||||
s6,2.691,6,6S51.309,54,48,54z"/>
|
||||
<path d="M8,20c-4.411,0-8,3.589-8,8s3.589,8,8,8s8-3.589,8-8S12.411,20,8,20z M8,34c-3.309,0-6-2.691-6-6s2.691-6,6-6s6,2.691,6,6
|
||||
S11.309,34,8,34z"/>
|
||||
<path d="M28,20c-4.411,0-8,3.589-8,8s3.589,8,8,8s8-3.589,8-8S32.411,20,28,20z M28,34c-3.309,0-6-2.691-6-6s2.691-6,6-6
|
||||
s6,2.691,6,6S31.309,34,28,34z"/>
|
||||
<path d="M48,20c-4.411,0-8,3.589-8,8s3.589,8,8,8s8-3.589,8-8S52.411,20,48,20z M48,34c-3.309,0-6-2.691-6-6s2.691-6,6-6
|
||||
s6,2.691,6,6S51.309,34,48,34z"/>
|
||||
<path d="M8,0C3.589,0,0,3.589,0,8s3.589,8,8,8s8-3.589,8-8S12.411,0,8,0z M8,14c-3.309,0-6-2.691-6-6s2.691-6,6-6s6,2.691,6,6
|
||||
S11.309,14,8,14z"/>
|
||||
<path d="M28,0c-4.411,0-8,3.589-8,8s3.589,8,8,8s8-3.589,8-8S32.411,0,28,0z M28,14c-3.309,0-6-2.691-6-6s2.691-6,6-6s6,2.691,6,6
|
||||
S31.309,14,28,14z"/>
|
||||
<path d="M48,16c4.411,0,8-3.589,8-8s-3.589-8-8-8s-8,3.589-8,8S43.589,16,48,16z M48,2c3.309,0,6,2.691,6,6s-2.691,6-6,6
|
||||
s-6-2.691-6-6S44.691,2,48,2z"/>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.9 KiB |
11
frontend/assets/images/icons/minimize.svg
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="28px" height="28px" viewBox="0 0 28 28" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Uploaded to SVGRepo https://www.svgrepo.com -->
|
||||
<title>ic_fluent_arrow_minimize_28_filled</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<g id="🔍-System-Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="ic_fluent_arrow_minimize_28_filled" fill="#212121" fill-rule="nonzero">
|
||||
<path d="M4,15 L12,15 C12.5128358,15 12.9355072,15.3860402 12.9932723,15.8833789 L13,16 L13,24 C13,24.5522847 12.5522847,25 12,25 C11.4871642,25 11.0644928,24.6139598 11.0067277,24.1166211 L11,24 L11,18.413 L3.70710678,25.7071068 C3.31658249,26.0976311 2.68341751,26.0976311 2.29289322,25.7071068 C1.93240926,25.3466228 1.90467972,24.7793918 2.20970461,24.3871006 L2.29289322,24.2928932 L9.585,17 L4,17 C3.48716416,17 3.06449284,16.6139598 3.00672773,16.1166211 L3,16 C3,15.4871642 3.38604019,15.0644928 3.88337887,15.0067277 L4,15 L12,15 L4,15 Z M25.7071068,2.29289322 C26.0675907,2.65337718 26.0953203,3.22060824 25.7902954,3.61289944 L25.7071068,3.70710678 L18.413,11 L24,11 C24.5128358,11 24.9355072,11.3860402 24.9932723,11.8833789 L25,12 C25,12.5128358 24.6139598,12.9355072 24.1166211,12.9932723 L24,13 L16,13 C15.4871642,13 15.0644928,12.6139598 15.0067277,12.1166211 L15,12 L15,4 C15,3.44771525 15.4477153,3 16,3 C16.5128358,3 16.9355072,3.38604019 16.9932723,3.88337887 L17,4 L17,9.585 L24.2928932,2.29289322 C24.6834175,1.90236893 25.3165825,1.90236893 25.7071068,2.29289322 Z" id="🎨-Color"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.6 KiB |
52
frontend/assets/images/icons/padlock.svg
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 280.221 280.221" style="enable-background:new 0 0 280.221 280.221;" xml:space="preserve">
|
||||
<g>
|
||||
<path style="fill:#EFC75E;" d="M35.1,96.452h210.02c9.661,0,17.502,7.841,17.502,17.502v148.765c0,9.67-7.841,17.502-17.502,17.502
|
||||
H35.1c-9.661,0-17.502-7.832-17.502-17.502V113.954C17.598,104.284,25.439,96.452,35.1,96.452z"/>
|
||||
<path style="fill:#D7B354;" d="M245.12,96.452H35.1c-9.661,0-17.502,7.841-17.502,17.502v17.502c0,9.67,7.841,17.502,17.502,17.502
|
||||
h210.02c9.661,0,17.502-7.832,17.502-17.502v-17.502C262.622,104.284,254.782,96.452,245.12,96.452z"/>
|
||||
<g>
|
||||
<path style="fill:#B29446;" d="M70.104,105.203c-14.5,0-26.253,7.841-26.253,17.502c0,9.67,11.752,17.502,26.253,17.502
|
||||
s26.253-7.832,26.253-17.502S84.604,105.203,70.104,105.203z M210.118,105.203c-14.491,0-26.253,7.841-26.253,17.502
|
||||
c0,9.67,11.761,17.502,26.253,17.502c14.5,0,26.253-7.832,26.253-17.502S224.618,105.203,210.118,105.203z"/>
|
||||
</g>
|
||||
<path style="fill:#D1D5D7;" d="M140.111,0C91.78,0,52.602,39.195,52.602,87.526v35.362c0,4.839,7.841,8.751,17.502,8.751
|
||||
s17.502-3.912,17.502-8.751V85.015c0-27.618,23.514-49.994,52.505-49.994c29,0,52.505,22.376,52.505,49.994v37.874
|
||||
c0,4.839,7.841,8.751,17.502,8.751s17.502-3.912,17.502-8.751V87.526C227.618,39.195,188.441,0,140.111,0z"/>
|
||||
<path style="fill:#DADDDF;" d="M140.111,17.502c-48.331,0-70.007,39.195-70.007,87.526v26.611c9.661,0,17.502-3.912,17.502-8.751
|
||||
V85.015c0-27.618,23.514-49.994,52.505-49.994c29,0,52.505,22.376,52.505,49.994v37.874c0,4.839,7.841,8.751,17.502,8.751v-26.611
|
||||
C210.118,56.697,188.441,17.502,140.111,17.502z"/>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2 KiB |
51
frontend/assets/images/icons/trash.svg
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
|
||||
<rect x="104.923" y="191.732" style="fill:#F4B2B0;" width="302.163" height="304.524"/>
|
||||
<g>
|
||||
<path style="fill:#B3404A;" d="M180.066,413.377c-8.69,0-15.738-7.047-15.738-15.738V296.918c0-8.69,7.047-15.738,15.738-15.738
|
||||
s15.738,7.047,15.738,15.738v100.721C195.803,406.329,188.756,413.377,180.066,413.377z"/>
|
||||
<path style="fill:#B3404A;" d="M256,413.377c-8.69,0-15.738-7.047-15.738-15.738V296.918c0-8.69,7.047-15.738,15.738-15.738
|
||||
c8.69,0,15.738,7.047,15.738,15.738v100.721C271.738,406.329,264.69,413.377,256,413.377z"/>
|
||||
<path style="fill:#B3404A;" d="M331.934,413.377c-8.69,0-15.738-7.047-15.738-15.738V296.918c0-8.69,7.047-15.738,15.738-15.738
|
||||
s15.738,7.047,15.738,15.738v100.721C347.672,406.329,340.625,413.377,331.934,413.377z"/>
|
||||
<path style="fill:#B3404A;" d="M395.935,73.706c-8.69,0-15.738,7.047-15.738,15.738s7.047,15.738,15.738,15.738
|
||||
c18.295,0,33.18,14.885,33.18,33.18v37.64H407.08H104.92H82.886v-37.64c0-18.295,14.885-33.18,33.18-33.18h163.541
|
||||
c8.69,0,15.738-7.047,15.738-15.738s-7.047-15.738-15.738-15.738h-92.852v-42.23h138.492v57.968c0,8.69,7.047,15.738,15.738,15.738
|
||||
s15.738-7.047,15.738-15.738V15.738c0-8.69-7.047-15.738-15.738-15.738H171.017c-8.69,0-15.738,7.047-15.738,15.738v57.968h-39.214
|
||||
c-35.651,0-64.655,29.005-64.655,64.655v53.377c0,8.69,7.047,15.738,15.738,15.738h22.034v288.786
|
||||
c0,8.69,7.047,15.738,15.738,15.738h302.16c8.69,0,15.738-7.047,15.738-15.738V207.476h22.034c8.69,0,15.738-7.047,15.738-15.738
|
||||
v-53.377C460.59,102.71,431.585,73.706,395.935,73.706z M391.342,480.525H120.658V207.476h270.685V480.525z"/>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.1 KiB |
58
frontend/assets/images/icons/users.svg
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 459.864 459.864" style="enable-background:new 0 0 459.864 459.864;" xml:space="preserve">
|
||||
<g>
|
||||
<g>
|
||||
<g>
|
||||
<path d="M395.988,193.978c-6.215,8.338-13.329,15.721-21.13,21.941c33.044,21.079,55.005,58.06,55.005,100.077
|
||||
c0,13.638-20.011,23.042-31.938,27.434c-9.301,3.425-20.237,6.229-32.19,8.347c0.387,5.05,0.586,10.153,0.586,15.3
|
||||
c0,4.455-0.389,9.647-1.518,15.299c16.064-2.497,30.815-6.128,43.488-10.794c42.626-15.694,51.573-38.891,51.573-55.586
|
||||
C459.863,265.52,434.565,220.85,395.988,193.978z"/>
|
||||
<path d="M311.244,15.147c-18.734,0-36.411,7.436-50.724,21.145c5.632,7.212,10.553,15.004,14.733,23.246
|
||||
c9.592-10.94,22.195-17.602,35.991-17.602c29.955,0,54.325,31.352,54.325,69.888s-24.37,69.888-54.325,69.888
|
||||
c-9.01,0-17.507-2.853-24.995-7.868c-2.432,8.863-5.627,17.42-9.53,25.565c10.642,5.952,22.36,9.093,34.525,9.093
|
||||
c45.83,0,81.115-44.3,81.115-96.678C392.359,59.441,357.069,15.147,311.244,15.147z"/>
|
||||
<path d="M259.999,226.28c-6.487,8.205-13.385,15.089-20.57,20.892c40.84,24.367,68.257,68.991,68.257,119.904
|
||||
c0,17.196-24.104,28.639-38.472,33.929c-26.025,9.583-62.857,15.078-101.053,15.078c-38.196,0-75.029-5.495-101.054-15.078
|
||||
c-14.368-5.29-38.472-16.732-38.472-33.929c0-50.914,27.417-95.538,68.257-119.904c-7.184-5.802-14.083-12.687-20.57-20.892
|
||||
C30.403,256.335,0,308.218,0,367.077c0,18.127,9.926,43.389,57.213,60.8c29.496,10.861,68.898,16.841,110.947,16.841
|
||||
c42.049,0,81.451-5.98,110.947-16.841c47.287-17.411,57.213-42.673,57.213-60.8C336.32,308.218,305.918,256.335,259.999,226.28z"
|
||||
/>
|
||||
<path d="M168.16,242.764c53.003,0,93.806-51.234,93.806-111.804c0-60.571-40.808-111.804-93.806-111.804
|
||||
c-52.995,0-93.806,51.223-93.806,111.804C74.354,191.542,115.169,242.764,168.16,242.764z M168.16,47.79
|
||||
c35.936,0,65.171,37.31,65.171,83.169s-29.236,83.169-65.171,83.169s-65.171-37.31-65.171-83.169S132.225,47.79,168.16,47.79z"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.3 KiB |
BIN
frontend/assets/images/icons/widgets/modal.png
Normal file
|
After Width: | Height: | Size: 914 B |
43
frontend/assets/images/icons/zoom-in.svg
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 52.966 52.966" style="enable-background:new 0 0 52.966 52.966;" xml:space="preserve">
|
||||
<g>
|
||||
<path d="M28.983,20h-6v-6c0-0.552-0.448-1-1-1s-1,0.448-1,1v6h-6c-0.552,0-1,0.448-1,1s0.448,1,1,1h6v6c0,0.552,0.448,1,1,1
|
||||
s1-0.448,1-1v-6h6c0.552,0,1-0.448,1-1S29.535,20,28.983,20z"/>
|
||||
<path d="M51.704,51.273L36.845,35.82c3.79-3.801,6.138-9.041,6.138-14.82c0-11.58-9.42-21-21-21s-21,9.42-21,21s9.42,21,21,21
|
||||
c5.083,0,9.748-1.817,13.384-4.832l14.895,15.491c0.196,0.205,0.458,0.307,0.721,0.307c0.25,0,0.499-0.093,0.693-0.279
|
||||
C52.074,52.304,52.086,51.671,51.704,51.273z M2.983,21c0-10.477,8.523-19,19-19s19,8.523,19,19s-8.523,19-19,19
|
||||
S2.983,31.477,2.983,21z"/>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
42
frontend/assets/images/icons/zoom-out.svg
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 52.966 52.966" style="enable-background:new 0 0 52.966 52.966;" xml:space="preserve">
|
||||
<g>
|
||||
<path d="M28.983,20h-14c-0.552,0-1,0.448-1,1s0.448,1,1,1h14c0.552,0,1-0.448,1-1S29.535,20,28.983,20z"/>
|
||||
<path d="M51.704,51.273L36.845,35.82c3.79-3.801,6.138-9.041,6.138-14.82c0-11.58-9.42-21-21-21s-21,9.42-21,21s9.42,21,21,21
|
||||
c5.083,0,9.748-1.817,13.384-4.832l14.895,15.491c0.196,0.205,0.458,0.307,0.721,0.307c0.25,0,0.499-0.093,0.693-0.279
|
||||
C52.074,52.304,52.086,51.671,51.704,51.273z M2.983,21c0-10.477,8.523-19,19-19s19,8.523,19,19s-8.523,19-19,19
|
||||
S2.983,31.477,2.983,21z"/>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1 KiB |
17
frontend/package-lock.json
generated
|
|
@ -13710,6 +13710,23 @@
|
|||
"react-draggable": "^4.0.3"
|
||||
}
|
||||
},
|
||||
"react-rnd": {
|
||||
"version": "10.3.0",
|
||||
"resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-10.3.0.tgz",
|
||||
"integrity": "sha512-v+0TRPIaRWY25TYv02vLQHYpACbkX+4xKvsyIrUEy4bMpq0bP1oEiaxTorp0Xn72IVv0QZV1vOnZimgTEB/skw==",
|
||||
"requires": {
|
||||
"re-resizable": "6.9.0",
|
||||
"react-draggable": "4.4.3",
|
||||
"tslib": "2.2.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"tslib": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz",
|
||||
"integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"react-router": {
|
||||
"version": "5.2.0",
|
||||
"resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz",
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@
|
|||
"react-loading-skeleton": "^2.2.0",
|
||||
"react-plotly.js": "^2.5.1",
|
||||
"react-resizable": "^1.11.1",
|
||||
"react-rnd": "^10.3.0",
|
||||
"react-router-dom": "^5.0.0",
|
||||
"react-scripts": "3.4.3",
|
||||
"react-select-search": "^3.0.5",
|
||||
|
|
@ -46,6 +47,7 @@
|
|||
"react-toastify": "^7.0.3",
|
||||
"react-tooltip": "^4.2.18",
|
||||
"rxjs": "^6.3.3",
|
||||
"tinycolor2": "^1.4.2",
|
||||
"yup": "^0.27.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ export const Box = function Box({
|
|||
const backgroundColor = yellow ? 'yellow' : '';
|
||||
|
||||
let styles = {
|
||||
cursor: mode === 'edit' ? 'move' : ''
|
||||
|
||||
};
|
||||
|
||||
if (inCanvas) {
|
||||
|
|
@ -85,7 +85,7 @@ export const Box = function Box({
|
|||
containerProps={containerProps}
|
||||
></ComponentToRender>
|
||||
) : (
|
||||
<div className="row p-1 m-1" style={{ cursor: 'move' }}>
|
||||
<div className="row p-1 m-1">
|
||||
<div className="col-auto component-image-holder p-3">
|
||||
<div
|
||||
style={{
|
||||
|
|
|
|||
|
|
@ -41,6 +41,10 @@ export function CodeHinter({
|
|||
value={initialValue}
|
||||
realState={realState}
|
||||
scrollbarStyle={null}
|
||||
onBlur={(editor) => {
|
||||
const value = editor.getValue();
|
||||
onChange(value);
|
||||
}}
|
||||
onChange={(editor) => handleChange(editor, onChange, suggestions)}
|
||||
onBeforeChange={(editor, change) => onBeforeChange(editor, change)}
|
||||
options={options}
|
||||
|
|
|
|||
|
|
@ -75,9 +75,6 @@ export function canShowHint(editor) {
|
|||
|
||||
export function handleChange(editor, onChange, suggestions) {
|
||||
|
||||
const value = editor.getValue();
|
||||
onChange(value);
|
||||
|
||||
let state = editor.state.matchHighlighter;
|
||||
editor.addOverlay(state.overlay = makeOverlay(state.options.style));
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
import React, { useState, useEffect } from 'react';
|
||||
import { resolveReferences } from '@/_helpers/utils';
|
||||
var tinycolor = require("tinycolor2");
|
||||
|
||||
export const Button = function Button({
|
||||
id, width, height, component, onComponentClick, currentState
|
||||
|
|
@ -24,12 +25,13 @@ export const Button = function Button({
|
|||
backgroundColor,
|
||||
color,
|
||||
width,
|
||||
height
|
||||
height,
|
||||
'--tblr-btn-color-darker': tinycolor(backgroundColor).darken(8).toString()
|
||||
};
|
||||
|
||||
return (
|
||||
<button
|
||||
className={`btn btn-primary p-1 ${loadingState === true ? ' btn-loading' : ''}`}
|
||||
className={`jet-button btn btn-primary p-1 ${loadingState === true ? ' btn-loading' : ''}`}
|
||||
style={computedStyles}
|
||||
onClick={() => onComponentClick(id, component)}
|
||||
>
|
||||
|
|
|
|||
|
|
@ -68,12 +68,22 @@ export const Chart = function Chart({
|
|||
|
||||
if(!Array.isArray(rawData)) { rawData = []; }
|
||||
|
||||
const newData = [{
|
||||
type: chartType || 'line',
|
||||
x: rawData.map((item) => item["x"]),
|
||||
y: rawData.map((item) => item["y"]),
|
||||
marker: { color: markerColor }
|
||||
}];
|
||||
let newData = [];
|
||||
|
||||
if(chartType === 'pie') {
|
||||
newData = [{
|
||||
type: chartType,
|
||||
values: rawData.map((item) => item["value"]),
|
||||
labels: rawData.map((item) => item["label"]),
|
||||
}];
|
||||
} else {
|
||||
newData = [{
|
||||
type: chartType || 'line',
|
||||
x: rawData.map((item) => item["x"]),
|
||||
y: rawData.map((item) => item["y"]),
|
||||
marker: { color: markerColor }
|
||||
}];
|
||||
}
|
||||
|
||||
setChartData(newData);
|
||||
|
||||
|
|
|
|||
|
|
@ -38,6 +38,9 @@ export function Table({
|
|||
const serverSidePaginationProperty = component.definition.properties.serverSidePagination;
|
||||
const serverSidePagination = serverSidePaginationProperty ? serverSidePaginationProperty.value : false;
|
||||
|
||||
const serverSideSearchProperty = component.definition.properties.serverSideSearch;
|
||||
const serverSideSearch = serverSideSearchProperty ? serverSideSearchProperty.value : false;
|
||||
|
||||
const [loadingState, setLoadingState] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
|
|
@ -275,8 +278,8 @@ export function Table({
|
|||
onBlur={(e) => {
|
||||
handleCellValueChange(cell.row.index, column.key || column.name, e.target.value, cell.row.original);
|
||||
}}
|
||||
value={cellValue}
|
||||
>
|
||||
{cellValue}
|
||||
</textarea>;
|
||||
} if (columnType === 'dropdown') {
|
||||
return (
|
||||
|
|
@ -453,15 +456,33 @@ export function Table({
|
|||
setGlobalFilter(filterValue || undefined);
|
||||
}, 200);
|
||||
|
||||
const handleSearchTextChange = (text) => {
|
||||
|
||||
setValue(text);
|
||||
onChange(text);
|
||||
|
||||
onComponentOptionChanged(component, 'searchText', text).then(() => {
|
||||
if(serverSideSearch === true ) {
|
||||
onEvent('onSearch', { component, data: {} });
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="ms-2 d-inline-block">
|
||||
Search:{' '}
|
||||
<input
|
||||
value={value || ''}
|
||||
onChange={(e) => {
|
||||
setValue(e.target.value);
|
||||
onChange(e.target.value);
|
||||
defaultValue={value || ''}
|
||||
onBlur={(e) => {
|
||||
handleSearchTextChange(e.target.value)
|
||||
}}
|
||||
onKeyDown={(e) => {
|
||||
if(e.key === 'Enter') {
|
||||
handleSearchTextChange(e.target.value)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
placeholder={`${count} records`}
|
||||
style={{
|
||||
border: '0'
|
||||
|
|
@ -474,7 +495,7 @@ export function Table({
|
|||
return (
|
||||
<div
|
||||
className="card"
|
||||
style={{ width: `${width}px`, height: `${height + 3}px` }}
|
||||
style={{ width: `${width}px`, height: `${height}px` }}
|
||||
onClick={() => onComponentClick(id, component)}
|
||||
>
|
||||
<div className="card-body border-bottom py-3 jet-data-table-header">
|
||||
|
|
@ -526,6 +547,11 @@ export function Table({
|
|||
</tr>
|
||||
))}
|
||||
</thead>
|
||||
|
||||
{!loadingState && page.length === 0 &&
|
||||
<center className="w-100"><div className="py-5"> no data </div></center>
|
||||
}
|
||||
|
||||
{!loadingState && (
|
||||
<tbody {...getTableBodyProps()}>
|
||||
{console.log('page', page)}
|
||||
|
|
@ -597,7 +623,7 @@ export function Table({
|
|||
|
||||
<div className="col-auto">
|
||||
<span data-tip="Filter data" className="btn btn-light btn-sm p-1 mx-2" onClick={() => showFilters()}>
|
||||
<img src="https://www.svgrepo.com/show/264090/filter.svg" width="13" height="13" />
|
||||
<img src="/assets/images/icons/filter.svg" width="13" height="13" />
|
||||
{filters.length > 0 &&
|
||||
<a class="badge bg-azure" style={{width: '4px', height: '4px', marginTop: '5px'}}></a>
|
||||
}
|
||||
|
|
@ -607,7 +633,7 @@ export function Table({
|
|||
className="btn btn-light btn-sm p-1"
|
||||
onClick={() => exportData('csv', true)}
|
||||
>
|
||||
<img src="https://www.svgrepo.com/show/27716/download.svg" width="13" height="13" />
|
||||
<img src="/assets/images/icons/download.svg" width="13" height="13" />
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -7,12 +7,12 @@ export const componentTypes = [
|
|||
properties: {
|
||||
title: { type: 'string', displayName: 'Title' },
|
||||
data: { type: 'code', displayName: 'Table data' },
|
||||
visible: { type: 'string', displayName: 'Show when' },
|
||||
loadingState: { type: 'code', displayName: 'Loading state' },
|
||||
columns: { type: 'array', displayName: 'Table Columns' },
|
||||
serverSidePagination: { type: 'toggle', displayName: 'Server Side Pagination'},
|
||||
actionButtonBackgroundColor: { type: 'color', displayName: 'Background Color'},
|
||||
actionButtonTextColor: { type: 'color', displayName: 'Text Color'}
|
||||
serverSidePagination: { type: 'toggle', displayName: 'Server-side pagination'},
|
||||
serverSideSearch: { type: 'toggle', displayName: 'Server-side search'},
|
||||
actionButtonBackgroundColor: { type: 'color', displayName: 'Background color'},
|
||||
actionButtonTextColor: { type: 'color', displayName: 'Text color'}
|
||||
},
|
||||
defaultSize: {
|
||||
width: 810,
|
||||
|
|
@ -21,7 +21,8 @@ export const componentTypes = [
|
|||
events: {
|
||||
onRowClicked: { displayName: 'On row clicked'},
|
||||
onBulkUpdate: { displayName: 'Bulk update query'},
|
||||
onPageChanged: { displayName: 'On page changed query'}
|
||||
onPageChanged: { displayName: 'On page changed'},
|
||||
onSearch: { displayName: 'On search'}
|
||||
},
|
||||
styles: {
|
||||
textColor: { type: 'color', displayName: 'Text Color' }
|
||||
|
|
@ -30,7 +31,8 @@ export const componentTypes = [
|
|||
selectedRow: {},
|
||||
changeSet: {},
|
||||
dataUpdates: [],
|
||||
pageIndex: 0
|
||||
pageIndex: 0,
|
||||
searchText: ''
|
||||
},
|
||||
definition: {
|
||||
properties: {
|
||||
|
|
@ -62,7 +64,12 @@ export const componentTypes = [
|
|||
options: {
|
||||
|
||||
}
|
||||
},
|
||||
onSearch: {
|
||||
options: {
|
||||
|
||||
}
|
||||
}
|
||||
},
|
||||
styles: {
|
||||
textColor: { value: '' }
|
||||
|
|
@ -70,7 +77,6 @@ export const componentTypes = [
|
|||
}
|
||||
},
|
||||
{
|
||||
icon: '/assets/images/icons/button.svg',
|
||||
name: 'Button',
|
||||
displayName: 'Button',
|
||||
description: 'Trigger actions: queries, alerts etc',
|
||||
|
|
@ -81,7 +87,6 @@ export const componentTypes = [
|
|||
},
|
||||
properties: {
|
||||
text: { type: 'code', displayName: 'Button Text' },
|
||||
visible: { type: 'string', displayName: 'Show when', tip: 'Widget will be hidden if the value of this field is false.' },
|
||||
loadingState: { type: 'code', displayName: 'Loading State'}
|
||||
},
|
||||
events: {
|
||||
|
|
@ -112,7 +117,6 @@ export const componentTypes = [
|
|||
}
|
||||
},
|
||||
{
|
||||
icon: 'https://www.svgrepo.com/show/36266/chart.svg',
|
||||
name: 'Chart',
|
||||
displayName: 'Chart',
|
||||
description: 'Display charts',
|
||||
|
|
@ -129,7 +133,8 @@ export const componentTypes = [
|
|||
showGridLines: { type: 'toggle', displayName: 'Show grid lines'},
|
||||
type: { type: 'select', displayName: 'Chart type', options: [
|
||||
{ name: 'Line', value: 'line' },
|
||||
{ name: 'Bar', value: 'bar' }
|
||||
{ name: 'Bar', value: 'bar' },
|
||||
{ name: 'Pie', value: 'pie' }
|
||||
] },
|
||||
},
|
||||
events: {},
|
||||
|
|
@ -161,7 +166,6 @@ export const componentTypes = [
|
|||
}
|
||||
},
|
||||
{
|
||||
icon: 'https://cdn.iconscout.com/icon/free/png-256/modal-10-444862.png',
|
||||
name: 'Modal',
|
||||
displayName: 'Modal',
|
||||
description: 'Modal triggered by events',
|
||||
|
|
@ -199,7 +203,6 @@ export const componentTypes = [
|
|||
}
|
||||
},
|
||||
{
|
||||
icon: 'https://www.svgrepo.com/show/38828/text.svg',
|
||||
name: 'TextInput',
|
||||
displayName: 'Text Input',
|
||||
description: 'Text field for forms',
|
||||
|
|
@ -231,7 +234,6 @@ export const componentTypes = [
|
|||
}
|
||||
},
|
||||
{
|
||||
icon: 'https://www.svgrepo.com/show/14690/calendar.svg',
|
||||
name: 'Datepicker',
|
||||
displayName: 'Date Picker',
|
||||
description: 'Select a date and time',
|
||||
|
|
@ -267,7 +269,6 @@ export const componentTypes = [
|
|||
}
|
||||
},
|
||||
{
|
||||
icon: 'https://www.svgrepo.com/show/309414/checkbox-checked.svg',
|
||||
name: 'Checkbox',
|
||||
displayName: 'Checkbox',
|
||||
description: 'A single checkbox',
|
||||
|
|
@ -309,7 +310,6 @@ export const componentTypes = [
|
|||
}
|
||||
},
|
||||
{
|
||||
icon: 'https://www.svgrepo.com/show/317958/editor-left.svg',
|
||||
name: 'Textarea',
|
||||
displayName: 'Textarea',
|
||||
description: 'Text area form field',
|
||||
|
|
@ -343,7 +343,6 @@ export const componentTypes = [
|
|||
}
|
||||
},
|
||||
{
|
||||
icon: 'https://www.svgrepo.com/show/14690/calendar.svg',
|
||||
name: 'DateRangePicker',
|
||||
displayName: 'Date Range Picker',
|
||||
description: 'Select a date range',
|
||||
|
|
@ -376,14 +375,12 @@ export const componentTypes = [
|
|||
}
|
||||
},
|
||||
{
|
||||
icon: 'https://www.svgrepo.com/show/219344/text.svg',
|
||||
name: 'Text',
|
||||
displayName: 'Text',
|
||||
description: 'Display markdown or HTML',
|
||||
component: 'Text',
|
||||
properties: {
|
||||
text: { type: 'code', displayName: 'Text' },
|
||||
visible: { type: 'string', displayName: 'Show when' },
|
||||
loadingState: { type: 'code', displayName: 'Show loading state' }
|
||||
},
|
||||
defaultSize: {
|
||||
|
|
@ -412,7 +409,6 @@ export const componentTypes = [
|
|||
}
|
||||
},
|
||||
{
|
||||
icon: 'https://www.svgrepo.com/show/35088/image.svg',
|
||||
name: 'Image',
|
||||
displayName: 'Image',
|
||||
description: 'Display an Image',
|
||||
|
|
@ -423,7 +419,6 @@ export const componentTypes = [
|
|||
component: 'Image',
|
||||
properties: {
|
||||
source: { type: 'code', displayName: 'URL' },
|
||||
visible: { type: 'string', displayName: 'Show when' }
|
||||
},
|
||||
events: {
|
||||
onClick: { displayName: 'On click'},
|
||||
|
|
@ -446,7 +441,6 @@ export const componentTypes = [
|
|||
}
|
||||
},
|
||||
{
|
||||
icon: 'https://www.svgrepo.com/show/14343/table.svg',
|
||||
name: 'Container',
|
||||
displayName: 'Container',
|
||||
description: 'Wrapper for multiple components',
|
||||
|
|
@ -456,7 +450,6 @@ export const componentTypes = [
|
|||
},
|
||||
component: 'Container',
|
||||
properties: {
|
||||
visible: { type: 'string', displayName: 'Show when' }
|
||||
},
|
||||
events: {},
|
||||
styles: {
|
||||
|
|
@ -474,7 +467,6 @@ export const componentTypes = [
|
|||
}
|
||||
},
|
||||
{
|
||||
icon: 'https://www.svgrepo.com/show/46775/drop-down-list.svg',
|
||||
name: 'Dropdown',
|
||||
displayName: 'Dropdown Selector',
|
||||
description: 'Select one value from options',
|
||||
|
|
@ -515,7 +507,6 @@ export const componentTypes = [
|
|||
}
|
||||
},
|
||||
{
|
||||
icon: 'https://www.svgrepo.com/show/16187/multiple-shots.svg',
|
||||
name: 'Multiselect',
|
||||
displayName: 'Multiselect',
|
||||
description: 'Select multiple values from options',
|
||||
|
|
@ -556,7 +547,6 @@ export const componentTypes = [
|
|||
}
|
||||
},
|
||||
{
|
||||
icon: 'https://www.svgrepo.com/show/5908/text-document.svg',
|
||||
name: 'RichTextEditor',
|
||||
displayName: 'Rich Text Editor',
|
||||
description: 'Rich text editor',
|
||||
|
|
@ -588,7 +578,6 @@ export const componentTypes = [
|
|||
}
|
||||
},
|
||||
{
|
||||
icon: 'https://www.svgrepo.com/show/135620/map.svg',
|
||||
name: 'Map',
|
||||
displayName: 'Map',
|
||||
description: 'Display Google Maps',
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ return <div className="config-handle" ref={dragRef}>
|
|||
>
|
||||
<img
|
||||
style={{cursor: 'pointer'}}
|
||||
src="https://www.svgrepo.com/show/83981/menu.svg"
|
||||
src="/assets/images/icons/menu.svg"
|
||||
width="8"
|
||||
height="8"
|
||||
style={{marginRight: '5px'}}
|
||||
|
|
@ -27,7 +27,7 @@ return <div className="config-handle" ref={dragRef}>
|
|||
</span>
|
||||
<img
|
||||
style={{cursor: 'pointer'}}
|
||||
src="https://www.svgrepo.com/show/244045/delete-trash.svg"
|
||||
src="/assets/images/icons/trash.svg"
|
||||
width="12"
|
||||
role="button"
|
||||
className="mx-2"
|
||||
|
|
|
|||
|
|
@ -147,14 +147,24 @@ export const Container = ({
|
|||
[moveBox]
|
||||
);
|
||||
|
||||
function onResizeStop(id, width, height, e, direction, ref, d) {
|
||||
function onResizeStop(id, e, direction, ref, d, position) {
|
||||
const deltaWidth = d.width;
|
||||
const deltaHeight = d.height;
|
||||
|
||||
let { x, y } = position;
|
||||
|
||||
let { left, top, width, height } = boxes[id];
|
||||
|
||||
top = y;
|
||||
left = x;
|
||||
|
||||
width = width + deltaWidth;
|
||||
height = height + deltaHeight
|
||||
|
||||
setBoxes(
|
||||
update(boxes, {
|
||||
[id]: {
|
||||
$merge: { width: deltaWidth + width, height: deltaHeight + height }
|
||||
$merge: { width, height, top, left }
|
||||
}
|
||||
})
|
||||
);
|
||||
|
|
@ -232,9 +242,7 @@ export const Container = ({
|
|||
{appLoading && (
|
||||
<div className="mx-auto mt-5 w-50 p-5">
|
||||
<center>
|
||||
<div className="progress progress-sm w-50">
|
||||
<div className="progress-bar progress-bar-indeterminate"></div>
|
||||
</div>
|
||||
<div class="spinner-border text-azure" role="status"></div>
|
||||
</center>
|
||||
</div>
|
||||
)}
|
||||
|
|
|
|||
|
|
@ -148,7 +148,7 @@ class DataSourceManager extends React.Component {
|
|||
{selectedDataSource && (
|
||||
<div className="row">
|
||||
<img
|
||||
src={dataSourceMeta.icon}
|
||||
src={`/assets/images/icons/editor/datasources/${dataSourceMeta.name.toLowerCase()}.svg`}
|
||||
style={{ objectFit: 'contain' }}
|
||||
height="25"
|
||||
width="25"
|
||||
|
|
@ -164,7 +164,7 @@ class DataSourceManager extends React.Component {
|
|||
autoFocus
|
||||
/>
|
||||
<span className="input-icon-addon">
|
||||
<img src="https://www.svgrepo.com/show/149235/edit.svg" width="12" height="12" />
|
||||
<img src="/assets/images/icons/edit-source.svg" width="12" height="12" />
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -190,7 +190,8 @@ class DataSourceManager extends React.Component {
|
|||
<div className="card mb-3" role="button" onClick={() => this.selectDataSource(dataSource)}>
|
||||
<div className="card-body">
|
||||
<center>
|
||||
<img src={dataSource.icon} width="50" height="50" alt="" />
|
||||
<img src={`/assets/images/icons/editor/datasources/${dataSource.kind.toLowerCase()}.svg`} width="50" height="50" alt="" />
|
||||
|
||||
<br></br>
|
||||
<br></br>
|
||||
{dataSource.name}
|
||||
|
|
@ -207,7 +208,8 @@ class DataSourceManager extends React.Component {
|
|||
<div className="card" role="button" onClick={() => this.selectDataSource(dataSource)}>
|
||||
<div className="card-body">
|
||||
<center>
|
||||
<img src={dataSource.icon} width="50" height="50" alt="" />
|
||||
<img src={`/assets/images/icons/editor/datasources/${dataSource.kind.toLowerCase()}.svg`} width="50" height="50" alt="" />
|
||||
|
||||
<br></br>
|
||||
<br></br>
|
||||
{dataSource.name}
|
||||
|
|
@ -242,23 +244,24 @@ class DataSourceManager extends React.Component {
|
|||
})
|
||||
}
|
||||
>
|
||||
<img src="https://www.svgrepo.com/show/135545/copy.svg" className="mx-1" width="14" height="14" role="button"/>
|
||||
<img src="/assets/images/icons/copy.svg" className="mx-1" width="14" height="14" role="button"/>
|
||||
</CopyToClipboard>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="col">
|
||||
<small>
|
||||
<a href={`https://docs.tooljet.io/data-sources/${selectedDataSource.kind}`}>Read documentation</a>
|
||||
<a href={`https://docs.tooljet.io/docs/data-sources/${selectedDataSource.kind}`}>Read documentation</a>
|
||||
</small>
|
||||
</div>
|
||||
<div className="col-auto">
|
||||
<TestConnection kind={selectedDataSource.kind} options={options} />
|
||||
</div>
|
||||
<div className="col-auto">
|
||||
<Button className="m-2" disabled={isSaving} variant="primary" onClick={this.createDataSource}>
|
||||
{isSaving ? 'Saving...' : 'Save'}
|
||||
<Button className={`m-2 ${isSaving ? 'btn-loading' : ''}`} disabled={isSaving} variant="primary" onClick={this.createDataSource}>
|
||||
{'Save'}
|
||||
</Button>
|
||||
|
||||
</div>
|
||||
</Modal.Footer>
|
||||
)}
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@ export const dataBaseSources = [
|
|||
{
|
||||
name: 'PostgreSQL',
|
||||
kind: 'postgresql',
|
||||
icon: 'https://www.svgrepo.com/show/303301/postgresql-logo.svg',
|
||||
options: {
|
||||
host: { type: 'string' },
|
||||
port: { type: 'string' },
|
||||
|
|
@ -19,7 +18,6 @@ export const dataBaseSources = [
|
|||
{
|
||||
name: 'MySQL',
|
||||
kind: 'mysql',
|
||||
icon: 'https://www.svgrepo.com/show/303251/mysql-logo.svg',
|
||||
exposedVariables: {
|
||||
isLoading: {},
|
||||
data: {},
|
||||
|
|
@ -36,7 +34,6 @@ export const dataBaseSources = [
|
|||
{
|
||||
name: 'MongoDB',
|
||||
kind: 'mongodb',
|
||||
icon: 'https://cdn.worldvectorlogo.com/logos/mongodb-icon-1.svg',
|
||||
exposedVariables: {
|
||||
isLoading: {},
|
||||
data: {},
|
||||
|
|
@ -54,7 +51,6 @@ export const dataBaseSources = [
|
|||
{
|
||||
name: 'Firestore',
|
||||
kind: 'firestore',
|
||||
icon: 'https://static.invertase.io/assets/firebase/cloud-firestore.svg',
|
||||
exposedVariables: {
|
||||
isLoading: {},
|
||||
data: [],
|
||||
|
|
@ -67,7 +63,6 @@ export const dataBaseSources = [
|
|||
{
|
||||
name: 'DynamoDB',
|
||||
kind: 'dynamodb',
|
||||
icon: 'https://pics.freeicons.io/uploads/icons/png/9820297401540553608-512.png',
|
||||
exposedVariables: {
|
||||
isLoading: {},
|
||||
data: {},
|
||||
|
|
@ -82,7 +77,6 @@ export const dataBaseSources = [
|
|||
{
|
||||
name: 'Elasticsearch',
|
||||
kind: 'elasticsearch',
|
||||
icon: 'https://cdn.worldvectorlogo.com/logos/elastic-elasticsearch.svg',
|
||||
exposedVariables: {
|
||||
isLoading: {},
|
||||
data: {},
|
||||
|
|
@ -98,7 +92,6 @@ export const dataBaseSources = [
|
|||
{
|
||||
name: 'Redis',
|
||||
kind: 'redis',
|
||||
icon: 'https://www.svgrepo.com/show/303460/redis-logo.svg',
|
||||
exposedVariables: {
|
||||
isLoading: {},
|
||||
data: {},
|
||||
|
|
@ -117,7 +110,6 @@ export const apiSources = [
|
|||
{
|
||||
name: 'Rest API',
|
||||
kind: 'restapi',
|
||||
icon: 'https://www.svgrepo.com/show/120283/api.svg',
|
||||
options: {
|
||||
url: { type: 'string' },
|
||||
auth_type: { type: 'string' },
|
||||
|
|
@ -143,7 +135,19 @@ export const apiSources = [
|
|||
{
|
||||
name: 'Stripe',
|
||||
kind: 'stripe',
|
||||
icon: 'https://upload.wikimedia.org/wikipedia/commons/b/ba/Stripe_Logo%2C_revised_2016.svg',
|
||||
exposedVariables: {
|
||||
isLoading: {},
|
||||
data: {},
|
||||
rawData: {}
|
||||
},
|
||||
options: {
|
||||
api_key: { type: 'string', encrypted: true }
|
||||
},
|
||||
customTesting: true
|
||||
},
|
||||
{
|
||||
name: 'Airtable',
|
||||
kind: 'airtable',
|
||||
exposedVariables: {
|
||||
isLoading: {},
|
||||
data: {},
|
||||
|
|
@ -157,7 +161,6 @@ export const apiSources = [
|
|||
{
|
||||
name: 'Google Sheets',
|
||||
kind: 'googlesheets',
|
||||
icon: 'https://upload.wikimedia.org/wikipedia/commons/3/30/Google_Sheets_logo_%282014-2020%29.svg',
|
||||
exposedVariables: {
|
||||
isLoading: {},
|
||||
data: {},
|
||||
|
|
@ -171,7 +174,6 @@ export const apiSources = [
|
|||
{
|
||||
name: 'Slack',
|
||||
kind: 'slack',
|
||||
icon: 'https://www.svgrepo.com/show/303320/slack-new-logo-logo.svg',
|
||||
exposedVariables: {
|
||||
isLoading: {},
|
||||
data: {},
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@ export const defaultOptions = {
|
|||
},
|
||||
|
||||
elasticsearch: {
|
||||
scheme: { value: 'https' },
|
||||
host: { value: 'localhost' },
|
||||
port: { value: 9200 },
|
||||
username: { value: '' },
|
||||
|
|
@ -38,6 +39,9 @@ export const defaultOptions = {
|
|||
stripe: {
|
||||
api_key: { value: '' }
|
||||
},
|
||||
airtable: {
|
||||
api_key: { value: '' }
|
||||
},
|
||||
firestore: {
|
||||
gcp_key: { value: '' }
|
||||
},
|
||||
|
|
|
|||
|
|
@ -0,0 +1,42 @@
|
|||
import React from 'react';
|
||||
import Button from 'react-bootstrap/Button';
|
||||
|
||||
export const Airtable = ({
|
||||
optionchanged, createDataSource, options, isSaving
|
||||
}) => {
|
||||
return (
|
||||
<div>
|
||||
<div className="row">
|
||||
<div className="col-md-12">
|
||||
<label className="form-label">
|
||||
API key
|
||||
<small className="text-green mx-2">
|
||||
<img className="mx-2 encrypted-icon" src="/assets/images/icons/padlock.svg" width="12" height="12" />
|
||||
Encrypted
|
||||
</small>
|
||||
</label>
|
||||
<input
|
||||
type="password"
|
||||
className="form-control"
|
||||
onChange={(e) => optionchanged('api_key', e.target.value)}
|
||||
value={options.api_key.value}
|
||||
/>
|
||||
<small className="text-muted">
|
||||
For generating API key, visit:{' '}
|
||||
<a href="https://airtable.com/account" target="_blank" rel="noreferrer">
|
||||
Airtable account page
|
||||
</a>
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
<div className="row mt-3">
|
||||
<div className="col"></div>
|
||||
<div className="col-auto">
|
||||
<Button className="m-2" disabled={isSaving} variant="primary" onClick={createDataSource}>
|
||||
{isSaving ? 'Saving...' : 'Save'}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
|
@ -40,7 +40,7 @@ export const Dynamodb = ({ optionchanged, options }) => {
|
|||
<label className="form-label">
|
||||
Secret key
|
||||
<small className="text-green mx-2">
|
||||
<img className="mx-2 encrypted-icon" src="https://www.svgrepo.com/show/12694/padlock.svg" width="12" height="12" />
|
||||
<img className="mx-2 encrypted-icon" src="/assets/images/icons/padlock.svg" width="12" height="12" />
|
||||
Encrypted
|
||||
</small>
|
||||
</label>
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
import React from 'react';
|
||||
import SelectSearch, { fuzzySearch } from 'react-select-search';
|
||||
|
||||
export const Elasticsearch = ({
|
||||
optionchanged, options
|
||||
|
|
@ -6,7 +7,25 @@ export const Elasticsearch = ({
|
|||
return (
|
||||
<div>
|
||||
<div className="row">
|
||||
<div className="col-md-9">
|
||||
<div className="col-md-2 mb-2">
|
||||
<label className="form-label">
|
||||
Scheme
|
||||
</label>
|
||||
<SelectSearch
|
||||
options={[
|
||||
{name: 'http', value: 'http'},
|
||||
{name: 'https', value: 'https'}
|
||||
]}
|
||||
value={options.scheme.value}
|
||||
search={true}
|
||||
onChange={(value) => {
|
||||
optionchanged('scheme', value);
|
||||
}}
|
||||
filterOptions={fuzzySearch}
|
||||
placeholder="Select.."
|
||||
/>
|
||||
</div>
|
||||
<div className="col-md-7">
|
||||
<label className="form-label">Host</label>
|
||||
<input
|
||||
type="text"
|
||||
|
|
@ -24,6 +43,26 @@ export const Elasticsearch = ({
|
|||
value={options.port.value}
|
||||
/>
|
||||
</div>
|
||||
<div className="row mt-3">
|
||||
<div className="col-md-6">
|
||||
<label className="form-label">Username</label>
|
||||
<input
|
||||
type="text"
|
||||
className="form-control"
|
||||
onChange={(e) => optionchanged('username', e.target.value)}
|
||||
value={options.username.value}
|
||||
/>
|
||||
</div>
|
||||
<div className="col-md-6">
|
||||
<label className="form-label">Password</label>
|
||||
<input
|
||||
type="text"
|
||||
className="form-control"
|
||||
onChange={(e) => optionchanged('password', e.target.value)}
|
||||
value={options.password.value}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ export const Firestore = ({ optionchanged, options }) => {
|
|||
<label className="form-label">
|
||||
Private Key
|
||||
<small className="text-green mx-2">
|
||||
<img className="mx-2 encrypted-icon" src="https://www.svgrepo.com/show/12694/padlock.svg" width="12" height="12" />
|
||||
<img className="mx-2 encrypted-icon" src="/assets/images/icons/padlock.svg" width="12" height="12" />
|
||||
Encrypted
|
||||
</small>
|
||||
</label>
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ export const Mongodb = ({ optionchanged, options }) => {
|
|||
<label className="form-label">
|
||||
Connection string
|
||||
<small className="text-green mx-2">
|
||||
<img className="mx-2 encrypted-icon" src="https://www.svgrepo.com/show/12694/padlock.svg" width="12" height="12" />
|
||||
<img className="mx-2 encrypted-icon" src="/assets/images/icons/padlock.svg" width="12" height="12" />
|
||||
Encrypted
|
||||
</small>
|
||||
</label>
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ export const Mysql = ({
|
|||
<label className="form-label">
|
||||
Password
|
||||
<small className="text-green mx-2">
|
||||
<img className="mx-2 encrypted-icon encrypted-icon" src="https://www.svgrepo.com/show/12694/padlock.svg" width="12" height="12" />
|
||||
<img className="mx-2 encrypted-icon encrypted-icon" src="/assets/images/icons/padlock.svg" width="12" height="12" />
|
||||
<span className="pt-2">Encrypted</span>
|
||||
</small>
|
||||
</label>
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@ export const Postgresql = ({ optionchanged, options }) => {
|
|||
<label className="form-label">
|
||||
Password
|
||||
<small className="text-green mx-2">
|
||||
<img className="mx-2 encrypted-icon" src="https://www.svgrepo.com/show/12694/padlock.svg" width="12" height="12" />
|
||||
<img className="mx-2 encrypted-icon" src="/assets/images/icons/padlock.svg" width="12" height="12" />
|
||||
Encrypted
|
||||
</small>
|
||||
</label>
|
||||
|
|
|
|||