zendesk_apps_support 4.29.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +176 -0
- data/README.md +39 -0
- data/config/locales/en.yml +163 -0
- data/config/locales/translations/zendesk_apps_support.yml +405 -0
- data/lib/zendesk_apps_support.rb +42 -0
- data/lib/zendesk_apps_support/app_file.rb +44 -0
- data/lib/zendesk_apps_support/app_requirement.rb +11 -0
- data/lib/zendesk_apps_support/app_version.rb +78 -0
- data/lib/zendesk_apps_support/assets/default_app_logo.svg +10 -0
- data/lib/zendesk_apps_support/assets/default_styles.scss +3 -0
- data/lib/zendesk_apps_support/assets/default_template.html.erb +10 -0
- data/lib/zendesk_apps_support/assets/installed.js.erb +21 -0
- data/lib/zendesk_apps_support/assets/src.js.erb +37 -0
- data/lib/zendesk_apps_support/build_translation.rb +51 -0
- data/lib/zendesk_apps_support/engine.rb +11 -0
- data/lib/zendesk_apps_support/finders.rb +36 -0
- data/lib/zendesk_apps_support/i18n.rb +31 -0
- data/lib/zendesk_apps_support/installation.rb +22 -0
- data/lib/zendesk_apps_support/installed.rb +27 -0
- data/lib/zendesk_apps_support/location.rb +71 -0
- data/lib/zendesk_apps_support/manifest.rb +197 -0
- data/lib/zendesk_apps_support/manifest/location_options.rb +35 -0
- data/lib/zendesk_apps_support/manifest/no_override_hash.rb +50 -0
- data/lib/zendesk_apps_support/manifest/parameter.rb +23 -0
- data/lib/zendesk_apps_support/package.rb +402 -0
- data/lib/zendesk_apps_support/product.rb +31 -0
- data/lib/zendesk_apps_support/sass_functions.rb +43 -0
- data/lib/zendesk_apps_support/stylesheet_compiler.rb +38 -0
- data/lib/zendesk_apps_support/validations/banner.rb +35 -0
- data/lib/zendesk_apps_support/validations/manifest.rb +412 -0
- data/lib/zendesk_apps_support/validations/marketplace.rb +31 -0
- data/lib/zendesk_apps_support/validations/mime.rb +41 -0
- data/lib/zendesk_apps_support/validations/requests.rb +47 -0
- data/lib/zendesk_apps_support/validations/requirements.rb +154 -0
- data/lib/zendesk_apps_support/validations/secrets.rb +77 -0
- data/lib/zendesk_apps_support/validations/secure_settings.rb +37 -0
- data/lib/zendesk_apps_support/validations/source.rb +25 -0
- data/lib/zendesk_apps_support/validations/stylesheets.rb +28 -0
- data/lib/zendesk_apps_support/validations/svg.rb +81 -0
- data/lib/zendesk_apps_support/validations/templates.rb +20 -0
- data/lib/zendesk_apps_support/validations/translations.rb +160 -0
- data/lib/zendesk_apps_support/validations/validation_error.rb +77 -0
- metadata +327 -0
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ZendeskAppsSupport
|
4
|
+
require 'zendesk_apps_support/engine'
|
5
|
+
|
6
|
+
autoload :AppFile, 'zendesk_apps_support/app_file'
|
7
|
+
autoload :BuildTranslation, 'zendesk_apps_support/build_translation'
|
8
|
+
autoload :I18n, 'zendesk_apps_support/i18n'
|
9
|
+
autoload :Location, 'zendesk_apps_support/location'
|
10
|
+
autoload :Manifest, 'zendesk_apps_support/manifest'
|
11
|
+
autoload :Product, 'zendesk_apps_support/product'
|
12
|
+
autoload :Package, 'zendesk_apps_support/package'
|
13
|
+
autoload :Installed, 'zendesk_apps_support/installed'
|
14
|
+
autoload :Installation, 'zendesk_apps_support/installation'
|
15
|
+
autoload :Finders, 'zendesk_apps_support/finders'
|
16
|
+
autoload :AppRequirement, 'zendesk_apps_support/app_requirement'
|
17
|
+
autoload :AppVersion, 'zendesk_apps_support/app_version'
|
18
|
+
autoload :StylesheetCompiler, 'zendesk_apps_support/stylesheet_compiler'
|
19
|
+
|
20
|
+
module Validations
|
21
|
+
autoload :ValidationError, 'zendesk_apps_support/validations/validation_error'
|
22
|
+
autoload :Manifest, 'zendesk_apps_support/validations/manifest'
|
23
|
+
autoload :SecureSettings, 'zendesk_apps_support/validations/secure_settings'
|
24
|
+
autoload :Marketplace, 'zendesk_apps_support/validations/marketplace'
|
25
|
+
autoload :Mime, 'zendesk_apps_support/validations/mime'
|
26
|
+
autoload :Secrets, 'zendesk_apps_support/validations/secrets'
|
27
|
+
autoload :Source, 'zendesk_apps_support/validations/source'
|
28
|
+
autoload :Templates, 'zendesk_apps_support/validations/templates'
|
29
|
+
autoload :Translations, 'zendesk_apps_support/validations/translations'
|
30
|
+
autoload :Stylesheets, 'zendesk_apps_support/validations/stylesheets'
|
31
|
+
autoload :Requirements, 'zendesk_apps_support/validations/requirements'
|
32
|
+
autoload :Requests, 'zendesk_apps_support/validations/requests'
|
33
|
+
autoload :Banner, 'zendesk_apps_support/validations/banner'
|
34
|
+
autoload :Svg, 'zendesk_apps_support/validations/svg'
|
35
|
+
end
|
36
|
+
|
37
|
+
class Manifest
|
38
|
+
autoload :LocationOptions, 'zendesk_apps_support/manifest/location_options'
|
39
|
+
autoload :Parameter, 'zendesk_apps_support/manifest/parameter'
|
40
|
+
autoload :NoOverrideHash, 'zendesk_apps_support/manifest/no_override_hash'
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ZendeskAppsSupport
|
4
|
+
class AppFile
|
5
|
+
attr_reader :relative_path
|
6
|
+
attr_reader :absolute_path
|
7
|
+
|
8
|
+
def initialize(package, relative_path)
|
9
|
+
@relative_path = relative_path
|
10
|
+
@file = File.new(package.path_to(relative_path))
|
11
|
+
@absolute_path = File.absolute_path @file.path
|
12
|
+
end
|
13
|
+
|
14
|
+
def read
|
15
|
+
File.read @file.path
|
16
|
+
end
|
17
|
+
|
18
|
+
def extension
|
19
|
+
File.extname relative_path
|
20
|
+
end
|
21
|
+
|
22
|
+
def =~(regex)
|
23
|
+
relative_path =~ regex
|
24
|
+
end
|
25
|
+
|
26
|
+
def match(regex)
|
27
|
+
self =~ regex
|
28
|
+
end
|
29
|
+
|
30
|
+
alias_method :to_s, :relative_path
|
31
|
+
|
32
|
+
def method_missing(sym, *args, &block)
|
33
|
+
if @file.respond_to?(sym)
|
34
|
+
@file.call(sym, *args, &block)
|
35
|
+
else
|
36
|
+
super
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def respond_to_missing?(sym, include_private = false)
|
41
|
+
@file.send(:respond_to_missing?, sym, include_private) || super
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ZendeskAppsSupport
|
4
|
+
class AppRequirement
|
5
|
+
CUSTOM_OBJECTS_KEY = 'custom_objects'
|
6
|
+
CUSTOM_OBJECTS_TYPE_KEY = 'custom_object_types'
|
7
|
+
CUSTOM_OBJECTS_RELATIONSHIP_TYPE_KEY = 'custom_object_relationship_types'
|
8
|
+
TYPES = %w[automations channel_integrations custom_objects macros targets views ticket_fields
|
9
|
+
triggers user_fields organization_fields].freeze
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ZendeskAppsSupport
|
4
|
+
# At any point in time, we support up to four versions:
|
5
|
+
# * deprecated -- we will still serve apps targeting the deprecated version,
|
6
|
+
# but newly created or updated apps CANNOT target it
|
7
|
+
# * sunsetting -- we will soon be removing support for this version;
|
8
|
+
# updated apps SHOULD target the current version, no new apps allowed
|
9
|
+
# * current -- we will serve apps targeting the current version;
|
10
|
+
# newly created or updated apps SHOULD target it
|
11
|
+
# * future -- we will serve apps targeting the future version;
|
12
|
+
# newly created or updates apps MAY target it, but it
|
13
|
+
# may change without notice
|
14
|
+
class AppVersion
|
15
|
+
DEPRECATED = ['0.5', '1.0'].freeze
|
16
|
+
SUNSETTING = nil
|
17
|
+
CURRENT = '2.0'
|
18
|
+
FUTURE = nil
|
19
|
+
|
20
|
+
TO_BE_SERVED = [DEPRECATED, SUNSETTING, CURRENT, FUTURE].flatten.compact.freeze
|
21
|
+
VALID_FOR_UPDATE = [SUNSETTING, CURRENT, FUTURE].compact.freeze
|
22
|
+
VALID_FOR_CREATE = [CURRENT, FUTURE].compact.freeze
|
23
|
+
|
24
|
+
attr_reader :current
|
25
|
+
|
26
|
+
def initialize(version)
|
27
|
+
@version = version.to_s.freeze
|
28
|
+
@current = CURRENT
|
29
|
+
freeze
|
30
|
+
end
|
31
|
+
|
32
|
+
def servable?
|
33
|
+
TO_BE_SERVED.include?(@version)
|
34
|
+
end
|
35
|
+
|
36
|
+
def valid_for_update?
|
37
|
+
VALID_FOR_UPDATE.include?(@version)
|
38
|
+
end
|
39
|
+
|
40
|
+
def valid_for_create?
|
41
|
+
VALID_FOR_CREATE.include?(@version)
|
42
|
+
end
|
43
|
+
|
44
|
+
def deprecated?
|
45
|
+
DEPRECATED.include?(@version)
|
46
|
+
end
|
47
|
+
|
48
|
+
def sunsetting?
|
49
|
+
@version == SUNSETTING
|
50
|
+
end
|
51
|
+
|
52
|
+
def obsolete?
|
53
|
+
!servable?
|
54
|
+
end
|
55
|
+
|
56
|
+
def blank?
|
57
|
+
@version.nil? || @version == ''
|
58
|
+
end
|
59
|
+
|
60
|
+
def present?
|
61
|
+
!blank?
|
62
|
+
end
|
63
|
+
|
64
|
+
def to_s
|
65
|
+
@version
|
66
|
+
end
|
67
|
+
|
68
|
+
def to_json(*)
|
69
|
+
@version.inspect
|
70
|
+
end
|
71
|
+
|
72
|
+
def ==(other)
|
73
|
+
@version == other.to_s
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
AppVersion.freeze
|
78
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<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"
|
3
|
+
viewBox="0 0 18 18" style="enable-background:new 0 0 18 18;" xml:space="preserve">
|
4
|
+
<path id="Fill-3" d="M1.5,6.1C1.3,5.9,1,6,1,6.4l0,7c0,0.3,0.2,0.7,0.5,0.9l6,3.6C7.8,18.1,8,18,8,17.6l0-7.1c0-0.3-0.2-0.7-0.5-0.9
|
5
|
+
L1.5,6.1z"/>
|
6
|
+
<path id="Fill-5" d="M10.5,17.9c-0.3,0.2-0.5,0-0.5-0.3l0-7c0-0.3,0.2-0.7,0.5-0.9l6-3.6C16.8,5.9,17,6,17,6.4l0,7.1
|
7
|
+
c0,0.3-0.2,0.7-0.5,0.9L10.5,17.9z"/>
|
8
|
+
<path id="Fill-1" d="M2.2,3.7c-0.3,0.2-0.3,0.4,0,0.6l6.2,3.6C8.7,8,9.2,8,9.4,7.9l6.3-3.6c0.3-0.2,0.3-0.4,0-0.6L9.5,0.1
|
9
|
+
C9.2,0,8.8,0,8.5,0.1L2.2,3.7z"/>
|
10
|
+
</svg>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
(function() {
|
2
|
+
<% appsjs.each do |appjs| %>
|
3
|
+
<%= appjs %>
|
4
|
+
<% end %>
|
5
|
+
|
6
|
+
<% installations.each do |installation| %>
|
7
|
+
if (ZendeskApps[<%= installation.app_name.to_json %>]) {
|
8
|
+
ZendeskApps[<%= installation.app_name.to_json %>].install(<%= installation.to_json %>);
|
9
|
+
}
|
10
|
+
<% end %>
|
11
|
+
|
12
|
+
<% installation_orders.each do |loc_name, installation_list| %>
|
13
|
+
ZendeskApps.sortAppsForSite(<%= loc_name.to_json %>, <%= installation_list.to_json %>);
|
14
|
+
<% end %>
|
15
|
+
}());
|
16
|
+
|
17
|
+
<% unless rollbar_zaf_access_token.empty? %>
|
18
|
+
ZendeskApps.rollbarAccessToken = "<%= rollbar_zaf_access_token %>";
|
19
|
+
<% end %>
|
20
|
+
|
21
|
+
ZendeskApps.trigger && ZendeskApps.trigger('ready');
|
@@ -0,0 +1,37 @@
|
|
1
|
+
<% unless iframe_only %>
|
2
|
+
with( ZendeskApps.AppScope.create() ) {
|
3
|
+
<% unless modules.empty? %>
|
4
|
+
require.modules = {
|
5
|
+
<% modules.each do |path, content| %>
|
6
|
+
<%= path.to_json %>: function(exports, require, module) {
|
7
|
+
<%= content %>
|
8
|
+
},
|
9
|
+
<% end %>
|
10
|
+
eom: undefined
|
11
|
+
};
|
12
|
+
<% end %>
|
13
|
+
|
14
|
+
var source = <%= source %>;
|
15
|
+
}
|
16
|
+
<% end %>
|
17
|
+
var app = ZendeskApps.defineApp(<%= iframe_only ? 'null' : 'source' %>)
|
18
|
+
.reopenClass(<%= app_class_properties.to_json %>)
|
19
|
+
.reopen({
|
20
|
+
appName: <%= name.to_json %>,
|
21
|
+
appVersion: <%= version.to_json %>,
|
22
|
+
locationIcons: <%= location_icons.to_json %>,
|
23
|
+
assetUrlPrefix: <%= asset_url_prefix.to_json %>,
|
24
|
+
logoAssetHash: <%= logo_asset_hash.to_json %>,
|
25
|
+
appClassName: <%= app_class_name.to_json %>,
|
26
|
+
author: {
|
27
|
+
name: <%= author['name'].to_json %>,
|
28
|
+
email: <%= author['email'].to_json %>
|
29
|
+
},
|
30
|
+
<% unless iframe_only %>
|
31
|
+
translations: <%= translations.to_json %>,
|
32
|
+
templates: <%= templates.to_json %>,
|
33
|
+
<% end %>
|
34
|
+
frameworkVersion: <%= framework_version.to_json %>
|
35
|
+
});
|
36
|
+
|
37
|
+
ZendeskApps[<%= name.to_json %>] = app;
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ZendeskAppsSupport
|
4
|
+
module BuildTranslation
|
5
|
+
I18N_TITLE_KEY = 'title'
|
6
|
+
I18N_VALUE_KEY = 'value'
|
7
|
+
I18N_KEYS = [I18N_TITLE_KEY, I18N_VALUE_KEY].freeze
|
8
|
+
|
9
|
+
def to_flattened_namespaced_hash(hash, target_key = nil, prefix = nil)
|
10
|
+
hash.each_with_object({}) do |(key, value), result|
|
11
|
+
key = [prefix, key].compact.join('.')
|
12
|
+
if value.is_a?(Hash)
|
13
|
+
if target_key && translation_hash?(value)
|
14
|
+
result[key] = value[target_key]
|
15
|
+
else
|
16
|
+
result.update(to_flattened_namespaced_hash(value, target_key, key))
|
17
|
+
end
|
18
|
+
else
|
19
|
+
result[key] = value
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def remove_zendesk_keys(scope, translations = {})
|
25
|
+
scope.each_key do |key|
|
26
|
+
context = scope[key]
|
27
|
+
|
28
|
+
if context.is_a?(Hash)
|
29
|
+
|
30
|
+
if translation_hash?(context)
|
31
|
+
translations[key] = context[I18N_VALUE_KEY]
|
32
|
+
else
|
33
|
+
translations[key] ||= {}
|
34
|
+
translations[key] = remove_zendesk_keys(context, translations[key])
|
35
|
+
end
|
36
|
+
|
37
|
+
else
|
38
|
+
translations[key] = context
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
translations
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def translation_hash?(hash)
|
48
|
+
hash.keys.sort == I18N_KEYS
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ZendeskAppsSupport
|
4
|
+
module Finders
|
5
|
+
class RecordNotFound < StandardError
|
6
|
+
def initialize(msg)
|
7
|
+
super(msg)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def find_by(arg)
|
12
|
+
all.find(&filter_by_arg(arg))
|
13
|
+
end
|
14
|
+
|
15
|
+
def find_by!(arg)
|
16
|
+
found = find_by(arg)
|
17
|
+
raise(RecordNotFound, "Unable to find #{name} with #{arg.inspect}") if found.nil?
|
18
|
+
found
|
19
|
+
end
|
20
|
+
|
21
|
+
def where(arg)
|
22
|
+
all.select(&filter_by_arg(arg))
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def filter_by_arg(arg)
|
28
|
+
lambda do |findable_record|
|
29
|
+
arg.all? do |attribute, value|
|
30
|
+
value = value.to_s if value.is_a? Symbol
|
31
|
+
findable_record.public_send(attribute) == value
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ZendeskAppsSupport
|
4
|
+
module I18n
|
5
|
+
class << self
|
6
|
+
def t(key, *args)
|
7
|
+
i18n.t(key, *args)
|
8
|
+
end
|
9
|
+
|
10
|
+
def set_load_path
|
11
|
+
i18n
|
12
|
+
nil
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def i18n
|
18
|
+
@i18n ||= begin
|
19
|
+
require 'i18n'
|
20
|
+
::I18n.load_path += locale_files
|
21
|
+
::I18n
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def locale_files
|
26
|
+
Dir[File.expand_path('../../../config/locales/*.yml', __FILE__)] -
|
27
|
+
Dir[File.expand_path('../../../config/locales/*.zendesk.yml', __FILE__)]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ZendeskAppsSupport
|
4
|
+
class Installation
|
5
|
+
attr_accessor :id, :app_id, :app_name, :requirements, :settings, :enabled, :collapsible, :updated_at, :created_at
|
6
|
+
attr_accessor :plan
|
7
|
+
|
8
|
+
def initialize(options)
|
9
|
+
options.each do |k, v|
|
10
|
+
public_send("#{k}=", v)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_json
|
15
|
+
hash = {}
|
16
|
+
instance_variables.each do |var|
|
17
|
+
hash[var.to_s.sub('@', '')] = instance_variable_get var
|
18
|
+
end
|
19
|
+
hash.to_json
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'erubis'
|
4
|
+
|
5
|
+
module ZendeskAppsSupport
|
6
|
+
class Installed
|
7
|
+
extend Gem::Deprecate
|
8
|
+
INSTALLED_TEMPLATE = Erubis::Eruby.new(File.read(File.expand_path('../assets/installed.js.erb', __FILE__)))
|
9
|
+
|
10
|
+
def initialize(appsjs, installations = [])
|
11
|
+
@appsjs = appsjs
|
12
|
+
@installations = installations
|
13
|
+
end
|
14
|
+
|
15
|
+
def compile(options = {})
|
16
|
+
INSTALLED_TEMPLATE.result(
|
17
|
+
appsjs: @appsjs,
|
18
|
+
installations: @installations,
|
19
|
+
installation_orders: options.fetch(:installation_orders, {}),
|
20
|
+
rollbar_zaf_access_token: options.fetch(:rollbar_zaf_access_token, '')
|
21
|
+
)
|
22
|
+
end
|
23
|
+
|
24
|
+
alias compile_js compile
|
25
|
+
deprecate :compile_js, :compile, 2017, 1
|
26
|
+
end
|
27
|
+
end
|