drg_cms 0.6.0.1 → 0.6.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/assets/javascripts/drg_cms/drg_cms.js +54 -7
- data/app/assets/javascripts/drg_cms_application.js +1 -1
- data/app/assets/javascripts/drg_cms_cms.js +1 -1
- data/app/assets/stylesheets/drg_cms/drg_cms.css +32 -1
- data/app/controllers/cmsedit_controller.rb +49 -18
- data/app/controllers/dc_application_controller.rb +82 -21
- data/app/controllers/dc_common_controller.rb +64 -5
- data/app/forms/all_options.yml +2 -0
- data/app/forms/dc_ad.yml +11 -22
- data/app/forms/dc_design.yml +13 -13
- data/app/forms/dc_json_ld.yml +59 -0
- data/app/forms/dc_key_value.yml +32 -0
- data/app/forms/dc_menu_item.yml +1 -0
- data/app/forms/dc_page.yml +1 -5
- data/app/forms/dc_seo.yml +33 -0
- data/app/forms/json_ld_schema.yml +168 -0
- data/app/helpers/cmsedit_helper.rb +29 -24
- data/app/helpers/dc_application_helper.rb +105 -4
- data/app/models/concerns/dc_page_concern.rb +30 -5
- data/app/models/concerns/dc_seo_concern.rb +66 -0
- data/app/models/dc_design.rb +2 -0
- data/app/models/dc_json_ld.rb +152 -0
- data/app/models/dc_key_value.rb +48 -0
- data/app/models/dc_page.rb +0 -1
- data/app/models/drgcms_form_fields/hash_field.rb +86 -0
- data/app/models/drgcms_form_fields/select.rb +48 -15
- data/app/models/drgcms_form_fields/text_autocomplete.rb +14 -2
- data/app/models/drgcms_form_fields/tree_select.rb +4 -1
- data/app/{helpers → renderers}/dc_ad_renderer.rb +0 -0
- data/app/{helpers → renderers}/dc_big_menu_renderer.rb +0 -0
- data/app/{helpers → renderers}/dc_captcha_renderer.rb +0 -0
- data/app/{helpers → renderers}/dc_common_renderer.rb +0 -0
- data/app/{helpers → renderers}/dc_gallery_renderer.rb +0 -0
- data/app/{helpers → renderers}/dc_menu_renderer.rb +10 -4
- data/app/{helpers → renderers}/dc_page_renderer.rb +0 -0
- data/app/{helpers → renderers}/dc_part_renderer.rb +4 -4
- data/app/{helpers → renderers}/dc_piece_renderer.rb +0 -0
- data/app/{helpers → renderers}/dc_poll_renderer.rb +13 -5
- data/app/{helpers → renderers}/dc_renderer.rb +0 -0
- data/app/{helpers → renderers}/dc_simple_menu_renderer.rb +0 -0
- data/app/views/cmsedit/_edit_stuff.html.erb +3 -22
- data/config/locales/drgcms_en.yml +3 -1
- data/config/locales/drgcms_sl.yml +2 -0
- data/config/locales/models_en.yml +38 -6
- data/config/locales/models_sl.yml +39 -7
- data/lib/drg_cms.rb +2 -1
- data/lib/drg_cms/version.rb +1 -1
- metadata +22 -14
|
@@ -55,7 +55,7 @@ def autocomplete
|
|
|
55
55
|
a = if params['search'].match(/\./)
|
|
56
56
|
name, method = params['search'].split('.')
|
|
57
57
|
table.send(method, params['input']).inject([]) do |r,v|
|
|
58
|
-
r << { label: v[0], value: v[0], id: v[1].to_s }
|
|
58
|
+
r << { label: v[0], value: v[0], id: (v[1] || v[0]).to_s }
|
|
59
59
|
end
|
|
60
60
|
# simply search which will search and return field_name defined in params['search']
|
|
61
61
|
else
|
|
@@ -64,7 +64,7 @@ def autocomplete
|
|
|
64
64
|
end
|
|
65
65
|
end
|
|
66
66
|
|
|
67
|
-
render
|
|
67
|
+
render plain: a.to_json
|
|
68
68
|
end
|
|
69
69
|
|
|
70
70
|
########################################################################
|
|
@@ -92,8 +92,21 @@ def toggle_edit_mode
|
|
|
92
92
|
if session[:edit_mode] < 1
|
|
93
93
|
dc_render_404
|
|
94
94
|
else
|
|
95
|
+
# if return_to_ypos parameter is present it will forward it and thus scroll to
|
|
96
|
+
# aproximate position it was when toggle was clicked
|
|
95
97
|
session[:edit_mode] = (session[:edit_mode] == 1) ? 2 : 1
|
|
96
|
-
|
|
98
|
+
uri = Rack::Utils.parse_nested_query(request.url)
|
|
99
|
+
# it parses only on & so first (return_to) parameter also contains url
|
|
100
|
+
url = uri.first.last
|
|
101
|
+
if (i = url.index('?return_to_ypos')).to_i > 0
|
|
102
|
+
url = url[0,i]
|
|
103
|
+
end
|
|
104
|
+
# offset CMS menu
|
|
105
|
+
if (ypos = uri['return_to_ypos'].to_i) > 0
|
|
106
|
+
ypos += session[:edit_mode] == 2 ? 250 : -250
|
|
107
|
+
end
|
|
108
|
+
url << "?return_to_ypos=#{ypos}"
|
|
109
|
+
redirect_to url
|
|
97
110
|
end
|
|
98
111
|
end
|
|
99
112
|
|
|
@@ -149,7 +162,7 @@ end
|
|
|
149
162
|
def restore_from_journal
|
|
150
163
|
# Only administrators can perform this operation
|
|
151
164
|
unless dc_user_has_role('admin')
|
|
152
|
-
return render
|
|
165
|
+
return render plain: { 'msg_info' => (t ('drgcms.not_authorized')) }.to_json
|
|
153
166
|
end
|
|
154
167
|
# selected fields to hash
|
|
155
168
|
restore = {}
|
|
@@ -178,7 +191,7 @@ def restore_from_journal
|
|
|
178
191
|
# TODO Error checking
|
|
179
192
|
{ 'msg_info' => (t ('drgcms.dc_journal.restored')) }
|
|
180
193
|
end
|
|
181
|
-
render
|
|
194
|
+
render plain: result.to_json
|
|
182
195
|
end
|
|
183
196
|
|
|
184
197
|
########################################################################
|
|
@@ -236,8 +249,54 @@ def paste_clipboard
|
|
|
236
249
|
dc_render_ajax(div: 'result', value: result )
|
|
237
250
|
end
|
|
238
251
|
|
|
252
|
+
########################################################################
|
|
253
|
+
# Will add new json_ld element with blank structure into dc_json_ld field on a
|
|
254
|
+
# document.
|
|
255
|
+
########################################################################
|
|
256
|
+
def add_json_ld_schema
|
|
257
|
+
edited_document = DcJsonLd.find_document_by_ids(params[:table], params[:ids])
|
|
258
|
+
yaml = YAML.load_file( dc_find_form_file('json_ld_schema') )
|
|
259
|
+
schema_data = yaml[params[:schema]]
|
|
260
|
+
# Existing document
|
|
261
|
+
if edited_document.dc_json_lds.find_by(type: "@#{params[:schema]}")
|
|
262
|
+
return render json: {'msg_error' => t('helpers.help.dc_json_ld.add_error', schema: params[:schema] ) }
|
|
263
|
+
else
|
|
264
|
+
add_empty_json_ld_schema(edited_document, schema_data, params[:schema], params[:schema], yaml)
|
|
265
|
+
end
|
|
266
|
+
render json: {'reload_' => 1}
|
|
267
|
+
end
|
|
268
|
+
|
|
239
269
|
protected
|
|
240
270
|
|
|
271
|
+
########################################################################
|
|
272
|
+
# Subroutine of add_json_ld_schema for adding one element
|
|
273
|
+
########################################################################
|
|
274
|
+
def add_empty_json_ld_schema(edited_document, schema, schema_name, schema_type, yaml) #:nodoc
|
|
275
|
+
data = {}
|
|
276
|
+
doc = DcJsonLd.new
|
|
277
|
+
doc.name = schema_name
|
|
278
|
+
doc.type = schema_type
|
|
279
|
+
|
|
280
|
+
edited_document.dc_json_lds << doc
|
|
281
|
+
schema.each do |element_name, element|
|
|
282
|
+
next if element_name == 'level' # skip level element
|
|
283
|
+
if yaml[element['type']]
|
|
284
|
+
if element['n'].to_s == '1'
|
|
285
|
+
# single element
|
|
286
|
+
doc_1 = yaml[element['type'] ]
|
|
287
|
+
data[element_name] = doc_1
|
|
288
|
+
else
|
|
289
|
+
# array
|
|
290
|
+
add_empty_json_ld_schema(doc, yaml[element['type']], element_name, element['type'], yaml)
|
|
291
|
+
end
|
|
292
|
+
else
|
|
293
|
+
data[element_name] = element['text']
|
|
294
|
+
end
|
|
295
|
+
end
|
|
296
|
+
doc.data = data.to_yaml
|
|
297
|
+
doc.save
|
|
298
|
+
end
|
|
299
|
+
|
|
241
300
|
########################################################################
|
|
242
301
|
# Update some anomalies in json data on paste_clipboard action.
|
|
243
302
|
########################################################################
|
data/app/forms/all_options.yml
CHANGED
data/app/forms/dc_ad.yml
CHANGED
|
@@ -42,14 +42,12 @@ form:
|
|
|
42
42
|
name: position
|
|
43
43
|
type: text_with_select
|
|
44
44
|
eval: dc_big_table 'ads-positions'
|
|
45
|
-
|
|
46
|
-
size: 20
|
|
45
|
+
size: 20
|
|
47
46
|
|
|
48
47
|
20:
|
|
49
48
|
name: description
|
|
50
49
|
type: text_field
|
|
51
|
-
|
|
52
|
-
size: 50
|
|
50
|
+
size: 50
|
|
53
51
|
|
|
54
52
|
30:
|
|
55
53
|
name: type
|
|
@@ -58,26 +56,22 @@ form:
|
|
|
58
56
|
40:
|
|
59
57
|
name: file
|
|
60
58
|
type: file_select
|
|
61
|
-
|
|
62
|
-
size: 50
|
|
59
|
+
size: 50
|
|
63
60
|
|
|
64
61
|
50:
|
|
65
62
|
name: width
|
|
66
63
|
type: text_field
|
|
67
|
-
|
|
68
|
-
size: 5
|
|
64
|
+
size: 5
|
|
69
65
|
|
|
70
66
|
60:
|
|
71
67
|
name: height
|
|
72
68
|
type: text_field
|
|
73
|
-
|
|
74
|
-
size: 5
|
|
69
|
+
size: 5
|
|
75
70
|
|
|
76
71
|
70:
|
|
77
72
|
name: link
|
|
78
73
|
type: text_field
|
|
79
|
-
|
|
80
|
-
size: 50
|
|
74
|
+
size: 50
|
|
81
75
|
|
|
82
76
|
75:
|
|
83
77
|
name: link_target
|
|
@@ -86,26 +80,22 @@ form:
|
|
|
86
80
|
80:
|
|
87
81
|
name: script
|
|
88
82
|
type: text_area
|
|
89
|
-
|
|
90
|
-
size: 100x20
|
|
83
|
+
size: 100x20
|
|
91
84
|
|
|
92
85
|
90:
|
|
93
86
|
name: displays
|
|
94
87
|
type: text_field
|
|
95
|
-
|
|
96
|
-
size: 6
|
|
88
|
+
size: 6
|
|
97
89
|
|
|
98
90
|
100:
|
|
99
91
|
name: clicks
|
|
100
92
|
type: text_field
|
|
101
|
-
|
|
102
|
-
size: 6
|
|
93
|
+
size: 6
|
|
103
94
|
|
|
104
95
|
110:
|
|
105
96
|
name: priority
|
|
106
97
|
type: text_field
|
|
107
|
-
|
|
108
|
-
size: 6
|
|
98
|
+
size: 6
|
|
109
99
|
|
|
110
100
|
120:
|
|
111
101
|
name: valid_from
|
|
@@ -122,8 +112,7 @@ form:
|
|
|
122
112
|
140:
|
|
123
113
|
name: active
|
|
124
114
|
type: check_box
|
|
125
|
-
|
|
126
|
-
size: 50
|
|
115
|
+
size: 50
|
|
127
116
|
|
|
128
117
|
150:
|
|
129
118
|
name: dc_site_id
|
data/app/forms/dc_design.yml
CHANGED
|
@@ -33,8 +33,7 @@ form:
|
|
|
33
33
|
10:
|
|
34
34
|
name: description
|
|
35
35
|
type: text_field
|
|
36
|
-
|
|
37
|
-
size: 50
|
|
36
|
+
size: 50
|
|
38
37
|
20:
|
|
39
38
|
name: site_id
|
|
40
39
|
type: select
|
|
@@ -44,32 +43,33 @@ form:
|
|
|
44
43
|
30:
|
|
45
44
|
name: control
|
|
46
45
|
type: text_field
|
|
47
|
-
|
|
48
|
-
size: 50
|
|
46
|
+
size: 50
|
|
49
47
|
|
|
50
48
|
40:
|
|
51
49
|
name: control_method
|
|
52
50
|
type: text_field
|
|
53
|
-
|
|
54
|
-
size: 50
|
|
51
|
+
size: 50
|
|
55
52
|
|
|
56
53
|
50:
|
|
57
54
|
name: rails_view
|
|
58
55
|
type: text_field
|
|
59
|
-
|
|
60
|
-
size: 50
|
|
56
|
+
size: 50
|
|
61
57
|
|
|
62
58
|
60:
|
|
59
|
+
name: params
|
|
60
|
+
type: text_area
|
|
61
|
+
size: 100x10
|
|
62
|
+
|
|
63
|
+
70:
|
|
63
64
|
name: body
|
|
64
65
|
type: text_area
|
|
65
|
-
|
|
66
|
-
size: 120x25
|
|
66
|
+
size: 120x25
|
|
67
67
|
|
|
68
|
-
|
|
68
|
+
80:
|
|
69
69
|
name: css
|
|
70
70
|
type: text_area
|
|
71
|
-
|
|
72
|
-
|
|
71
|
+
size: 100x10
|
|
72
|
+
|
|
73
73
|
tab2:
|
|
74
74
|
10:
|
|
75
75
|
name: dc_parts
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
## YAML Template for Link
|
|
2
|
+
---
|
|
3
|
+
table: dc_json_ld
|
|
4
|
+
|
|
5
|
+
index:
|
|
6
|
+
actions:
|
|
7
|
+
1: new
|
|
8
|
+
10:
|
|
9
|
+
type: menu
|
|
10
|
+
eval: DcJsonLd.add_schema_menu(self)
|
|
11
|
+
caption: helpers.help.dc_json_ld.add_schema
|
|
12
|
+
|
|
13
|
+
result_set:
|
|
14
|
+
actions:
|
|
15
|
+
1: edit
|
|
16
|
+
2: delete
|
|
17
|
+
|
|
18
|
+
columns:
|
|
19
|
+
10:
|
|
20
|
+
name: name
|
|
21
|
+
width: 20%
|
|
22
|
+
20:
|
|
23
|
+
name: type
|
|
24
|
+
width: 20%
|
|
25
|
+
30:
|
|
26
|
+
name: updated_at
|
|
27
|
+
width: 20%
|
|
28
|
+
40:
|
|
29
|
+
name: active
|
|
30
|
+
eval: dc_icon4_boolean
|
|
31
|
+
|
|
32
|
+
form:
|
|
33
|
+
title:
|
|
34
|
+
field: type
|
|
35
|
+
|
|
36
|
+
actions: standard
|
|
37
|
+
|
|
38
|
+
fields:
|
|
39
|
+
10:
|
|
40
|
+
name: name
|
|
41
|
+
type: text_field
|
|
42
|
+
size: 20
|
|
43
|
+
|
|
44
|
+
20:
|
|
45
|
+
name: type
|
|
46
|
+
type: text_with_select
|
|
47
|
+
eval: DcJsonLd.choices4_type
|
|
48
|
+
|
|
49
|
+
30:
|
|
50
|
+
name: data
|
|
51
|
+
type: text_area
|
|
52
|
+
size: 100x8
|
|
53
|
+
40:
|
|
54
|
+
name: dc_json_lds
|
|
55
|
+
type: embedded
|
|
56
|
+
table: dc_json_ld
|
|
57
|
+
html:
|
|
58
|
+
height: 400
|
|
59
|
+
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
## YAML Template for dc_key_value_store
|
|
2
|
+
---
|
|
3
|
+
table: dc_key_value
|
|
4
|
+
|
|
5
|
+
index:
|
|
6
|
+
actions: standard
|
|
7
|
+
|
|
8
|
+
result_set:
|
|
9
|
+
actions:
|
|
10
|
+
1: edit
|
|
11
|
+
2: delete
|
|
12
|
+
|
|
13
|
+
columns:
|
|
14
|
+
1:
|
|
15
|
+
name: key
|
|
16
|
+
2:
|
|
17
|
+
name: value
|
|
18
|
+
|
|
19
|
+
form:
|
|
20
|
+
title:
|
|
21
|
+
field: key
|
|
22
|
+
|
|
23
|
+
fields:
|
|
24
|
+
10:
|
|
25
|
+
name: key
|
|
26
|
+
type: text_field
|
|
27
|
+
size: 30
|
|
28
|
+
|
|
29
|
+
20:
|
|
30
|
+
name: value
|
|
31
|
+
type: text_field
|
|
32
|
+
size: 50
|
data/app/forms/dc_menu_item.yml
CHANGED
data/app/forms/dc_page.yml
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
## YAML Template for page
|
|
2
2
|
---
|
|
3
3
|
table: dc_page
|
|
4
|
+
include: dc_seo
|
|
4
5
|
|
|
5
6
|
index:
|
|
6
7
|
filter: subject, sub_subject as text_field, subject_link, alt_link, author_name, dc_site_id, body as text_field
|
|
@@ -40,10 +41,6 @@ form:
|
|
|
40
41
|
name: subject_link
|
|
41
42
|
type: text_field
|
|
42
43
|
size: 50
|
|
43
|
-
30:
|
|
44
|
-
name: title
|
|
45
|
-
type: text_field
|
|
46
|
-
size: 50
|
|
47
44
|
40:
|
|
48
45
|
name: alt_link
|
|
49
46
|
type: text_field
|
|
@@ -189,4 +186,3 @@ form:
|
|
|
189
186
|
name: if_params
|
|
190
187
|
type: text_area
|
|
191
188
|
size: 80x10
|
|
192
|
-
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
form:
|
|
2
|
+
tabs:
|
|
3
|
+
seo:
|
|
4
|
+
caption: helpers.label.dc_seo.seo
|
|
5
|
+
10:
|
|
6
|
+
name: title
|
|
7
|
+
text: helpers.label.dc_seo.title
|
|
8
|
+
help: helpers.help.dc_seo.title
|
|
9
|
+
type: text_field
|
|
10
|
+
size: 70
|
|
11
|
+
|
|
12
|
+
20:
|
|
13
|
+
name: meta_description
|
|
14
|
+
text: helpers.label.dc_seo.meta_description
|
|
15
|
+
help: helpers.help.dc_seo.meta_description
|
|
16
|
+
type: text_area
|
|
17
|
+
size: 100x2
|
|
18
|
+
|
|
19
|
+
30:
|
|
20
|
+
name: canonical_link
|
|
21
|
+
text: helpers.label.dc_seo.canonical_link
|
|
22
|
+
help: helpers.help.dc_seo.canonical_link
|
|
23
|
+
type: text_field
|
|
24
|
+
size: 100
|
|
25
|
+
|
|
26
|
+
40:
|
|
27
|
+
name: dc_json_lds
|
|
28
|
+
text: helpers.label.dc_seo.dc_json_lds
|
|
29
|
+
help: helpers.help.dc_seo.dc_json_lds
|
|
30
|
+
type: embedded
|
|
31
|
+
table: dc_json_ld
|
|
32
|
+
html:
|
|
33
|
+
height: 600
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
## JSON/LD schema description
|
|
2
|
+
---
|
|
3
|
+
# Organization
|
|
4
|
+
Organization:
|
|
5
|
+
level: 1
|
|
6
|
+
name:
|
|
7
|
+
type: String
|
|
8
|
+
text: Organization name
|
|
9
|
+
|
|
10
|
+
legalName:
|
|
11
|
+
type: String
|
|
12
|
+
text: Organization legal name
|
|
13
|
+
|
|
14
|
+
'@id':
|
|
15
|
+
type: String
|
|
16
|
+
text: https://www.example.com
|
|
17
|
+
|
|
18
|
+
url:
|
|
19
|
+
type: String
|
|
20
|
+
text: https://www.example.com
|
|
21
|
+
|
|
22
|
+
logo:
|
|
23
|
+
type: String
|
|
24
|
+
text: https://www.example.com/logo.jpg
|
|
25
|
+
|
|
26
|
+
foundingDate:
|
|
27
|
+
type: String
|
|
28
|
+
text: Year
|
|
29
|
+
|
|
30
|
+
founders:
|
|
31
|
+
type: Person
|
|
32
|
+
|
|
33
|
+
address:
|
|
34
|
+
type: PostalAddress
|
|
35
|
+
|
|
36
|
+
contactPoint:
|
|
37
|
+
type: ContactPoint
|
|
38
|
+
|
|
39
|
+
sameAs:
|
|
40
|
+
type: Array
|
|
41
|
+
|
|
42
|
+
# Person
|
|
43
|
+
Person:
|
|
44
|
+
|
|
45
|
+
name:
|
|
46
|
+
type: String
|
|
47
|
+
text: Name
|
|
48
|
+
|
|
49
|
+
address:
|
|
50
|
+
type: PostalAddress
|
|
51
|
+
|
|
52
|
+
collegue:
|
|
53
|
+
type: Array
|
|
54
|
+
|
|
55
|
+
email:
|
|
56
|
+
type: String
|
|
57
|
+
text: eMail address
|
|
58
|
+
|
|
59
|
+
image:
|
|
60
|
+
type: String
|
|
61
|
+
text: Image filename
|
|
62
|
+
|
|
63
|
+
jobTitle:
|
|
64
|
+
type: String
|
|
65
|
+
text: Job title
|
|
66
|
+
|
|
67
|
+
alumniOf:
|
|
68
|
+
type: String
|
|
69
|
+
text: School name
|
|
70
|
+
|
|
71
|
+
birthPlace:
|
|
72
|
+
type: String
|
|
73
|
+
text: City of birth
|
|
74
|
+
|
|
75
|
+
birthDate:
|
|
76
|
+
type: String
|
|
77
|
+
text: 1999-31-12
|
|
78
|
+
|
|
79
|
+
jobTitle:
|
|
80
|
+
type: String
|
|
81
|
+
text: Job title
|
|
82
|
+
|
|
83
|
+
gender:
|
|
84
|
+
type: String
|
|
85
|
+
text: male/female
|
|
86
|
+
|
|
87
|
+
telephone:
|
|
88
|
+
type: String
|
|
89
|
+
text: (123) 456-6789
|
|
90
|
+
|
|
91
|
+
url:
|
|
92
|
+
type: String
|
|
93
|
+
text: http://www.example.com
|
|
94
|
+
|
|
95
|
+
sameAs:
|
|
96
|
+
type: Array
|
|
97
|
+
|
|
98
|
+
#PostalAddress
|
|
99
|
+
PostalAddress:
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
streetAddress:
|
|
103
|
+
type: String
|
|
104
|
+
text: address
|
|
105
|
+
|
|
106
|
+
postalCode:
|
|
107
|
+
type: String
|
|
108
|
+
text: 1234
|
|
109
|
+
|
|
110
|
+
addressLocality:
|
|
111
|
+
type: String
|
|
112
|
+
text: CityName
|
|
113
|
+
|
|
114
|
+
addressRegion:
|
|
115
|
+
type: String
|
|
116
|
+
text: CA
|
|
117
|
+
|
|
118
|
+
addressCountry:
|
|
119
|
+
type: String
|
|
120
|
+
text: SI or Slovenia
|
|
121
|
+
|
|
122
|
+
#ContactPoint
|
|
123
|
+
ContactPoint:
|
|
124
|
+
|
|
125
|
+
telephone:
|
|
126
|
+
type: String
|
|
127
|
+
text: +1-877-453-1304
|
|
128
|
+
|
|
129
|
+
contactType:
|
|
130
|
+
type: String
|
|
131
|
+
text: technical support
|
|
132
|
+
|
|
133
|
+
contactOption:
|
|
134
|
+
type: String
|
|
135
|
+
text: TollFree
|
|
136
|
+
|
|
137
|
+
areaServed:
|
|
138
|
+
type: Array
|
|
139
|
+
text: [US,CA]
|
|
140
|
+
|
|
141
|
+
availableLanguage:
|
|
142
|
+
type: String
|
|
143
|
+
text: [English,French]
|
|
144
|
+
|
|
145
|
+
FAQPage:
|
|
146
|
+
level: 1
|
|
147
|
+
|
|
148
|
+
dummy:
|
|
149
|
+
type: String
|
|
150
|
+
text: yes
|
|
151
|
+
|
|
152
|
+
mainEntity:
|
|
153
|
+
type: Question
|
|
154
|
+
|
|
155
|
+
Question:
|
|
156
|
+
|
|
157
|
+
name:
|
|
158
|
+
type: String
|
|
159
|
+
text: Question?
|
|
160
|
+
|
|
161
|
+
acceptedAnswer:
|
|
162
|
+
type: Answer
|
|
163
|
+
n: 1
|
|
164
|
+
|
|
165
|
+
Answer:
|
|
166
|
+
'@type': Answer
|
|
167
|
+
text: Your answer
|
|
168
|
+
|