nodebb-plugin-poll 3.0.1 → 3.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.
- package/languages/en_GB/poll.json +47 -47
- package/package.json +1 -1
- package/public/js/poll/creator.js +9 -6
- package/public/js/poll/main.js +7 -1
- package/public/js/poll/serializer.js +1 -1
- package/public/js/poll/view.js +4 -4
- package/templates/admin/plugins/poll.tpl +57 -57
- package/templates/poll/view/details.tpl +6 -6
- package/templates/poll/view/results.tpl +14 -14
- package/templates/poll/view.tpl +28 -28
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
{
|
|
2
|
-
"poll": "Poll",
|
|
3
|
-
"toggles": "Toggles",
|
|
4
|
-
"allow_guests": "Allow guests to view poll results",
|
|
5
|
-
"limits": "Limits",
|
|
6
|
-
"max_options": "Maximum number of options per poll",
|
|
7
|
-
"defaults": "Defaults",
|
|
8
|
-
"default_title": "Default poll title",
|
|
9
|
-
"max_votes": "Maximum number of votes per user",
|
|
10
|
-
"disallow_vote_update": "Don't allow users to update their vote",
|
|
11
|
-
"info_choices": "A number greater than 1 will enable multiple choice polls.",
|
|
12
|
-
"settings": "Settings",
|
|
13
|
-
"save": "Save",
|
|
14
|
-
"reset": "Reset",
|
|
15
|
-
|
|
16
|
-
"creator_title": "Create a poll",
|
|
17
|
-
"poll_title": "Poll Title",
|
|
18
|
-
"poll_title_placeholder": "Enter poll title",
|
|
19
|
-
"options_title": "Options",
|
|
20
|
-
"options_add": "Add option",
|
|
21
|
-
"max_votes_placeholder": "Enter amount",
|
|
22
|
-
"auto_end_title": "Automatically end poll",
|
|
23
|
-
"auto_end_placeholder": "Click to enter date and time",
|
|
24
|
-
"auto_end_help": "Leaving this empty will never end the poll.",
|
|
25
|
-
|
|
26
|
-
"error.max_options": "You can only create %d options.",
|
|
27
|
-
"error.no_options": "Create at least one option.",
|
|
28
|
-
"error.valid_date": "Please enter a valid date.",
|
|
29
|
-
|
|
30
|
-
"error.not_main": "Can only add poll in main post.",
|
|
31
|
-
"error.privilege.create": "You're not allowed to create a poll",
|
|
32
|
-
|
|
33
|
-
"warning.redactor": "You're using Redactor. Do <strong>not</strong> edit the markup manually. Instead, re-open the poll creator.",
|
|
34
|
-
|
|
35
|
-
"vote": "Vote",
|
|
36
|
-
"update_vote": "Update vote",
|
|
37
|
-
"remove_vote": "Remove vote",
|
|
38
|
-
"to_voting": "To Voting",
|
|
39
|
-
"to_results": "Results",
|
|
40
|
-
"voting_unavailable_title": "Voting unavailable",
|
|
41
|
-
"voting_unavailable_message": "This poll has ended or has been marked as deleted. You can still view the results.",
|
|
42
|
-
"voting_update_disallowed_message": "You have already voted and changing your vote is not allowed for this poll",
|
|
43
|
-
"vote_is_final": "Changing your vote is not allowed for this poll so your vote is final",
|
|
44
|
-
|
|
45
|
-
"vote_count": "users voted for this option",
|
|
46
|
-
"votes": "votes",
|
|
47
|
-
"admin.create-poll": "Create Poll"
|
|
1
|
+
{
|
|
2
|
+
"poll": "Poll",
|
|
3
|
+
"toggles": "Toggles",
|
|
4
|
+
"allow_guests": "Allow guests to view poll results",
|
|
5
|
+
"limits": "Limits",
|
|
6
|
+
"max_options": "Maximum number of options per poll",
|
|
7
|
+
"defaults": "Defaults",
|
|
8
|
+
"default_title": "Default poll title",
|
|
9
|
+
"max_votes": "Maximum number of votes per user",
|
|
10
|
+
"disallow_vote_update": "Don't allow users to update their vote",
|
|
11
|
+
"info_choices": "A number greater than 1 will enable multiple choice polls.",
|
|
12
|
+
"settings": "Settings",
|
|
13
|
+
"save": "Save",
|
|
14
|
+
"reset": "Reset",
|
|
15
|
+
|
|
16
|
+
"creator_title": "Create a poll",
|
|
17
|
+
"poll_title": "Poll Title",
|
|
18
|
+
"poll_title_placeholder": "Enter poll title",
|
|
19
|
+
"options_title": "Options",
|
|
20
|
+
"options_add": "Add option",
|
|
21
|
+
"max_votes_placeholder": "Enter amount",
|
|
22
|
+
"auto_end_title": "Automatically end poll",
|
|
23
|
+
"auto_end_placeholder": "Click to enter date and time",
|
|
24
|
+
"auto_end_help": "Leaving this empty will never end the poll.",
|
|
25
|
+
|
|
26
|
+
"error.max_options": "You can only create %d options.",
|
|
27
|
+
"error.no_options": "Create at least one option.",
|
|
28
|
+
"error.valid_date": "Please enter a valid date.",
|
|
29
|
+
|
|
30
|
+
"error.not_main": "Can only add poll in main post.",
|
|
31
|
+
"error.privilege.create": "You're not allowed to create a poll",
|
|
32
|
+
|
|
33
|
+
"warning.redactor": "You're using Redactor. Do <strong>not</strong> edit the markup manually. Instead, re-open the poll creator.",
|
|
34
|
+
|
|
35
|
+
"vote": "Vote",
|
|
36
|
+
"update_vote": "Update vote",
|
|
37
|
+
"remove_vote": "Remove vote",
|
|
38
|
+
"to_voting": "To Voting",
|
|
39
|
+
"to_results": "Results",
|
|
40
|
+
"voting_unavailable_title": "Voting unavailable",
|
|
41
|
+
"voting_unavailable_message": "This poll has ended or has been marked as deleted. You can still view the results.",
|
|
42
|
+
"voting_update_disallowed_message": "You have already voted and changing your vote is not allowed for this poll",
|
|
43
|
+
"vote_is_final": "Changing your vote is not allowed for this poll so your vote is final",
|
|
44
|
+
|
|
45
|
+
"vote_count": "users voted for this option",
|
|
46
|
+
"votes": "votes",
|
|
47
|
+
"admin.create-poll": "Create Poll"
|
|
48
48
|
}
|
package/package.json
CHANGED
|
@@ -61,18 +61,21 @@
|
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
function composerBtnHandle(composer, textarea) {
|
|
64
|
-
require(['composer/controls'], function (controls) {
|
|
64
|
+
require(['composer/controls', 'alerts'], function (controls, alerts) {
|
|
65
65
|
var post = composer.posts[composer.active];
|
|
66
66
|
if (!post || !post.isMain || (isNaN(parseInt(post.cid, 10)) && isNaN(parseInt(post.pid, 10)))) {
|
|
67
|
-
return
|
|
67
|
+
return alerts.error('[[poll:error.not_main]]');
|
|
68
68
|
}
|
|
69
69
|
if (parseInt(post.cid, 10) === 0) {
|
|
70
|
-
return
|
|
70
|
+
return alerts.error('[[error:category-not-selected]]');
|
|
71
71
|
}
|
|
72
72
|
|
|
73
73
|
Poll.sockets.canCreate({ cid: post.cid, pid: post.pid }, function (err, canCreate) {
|
|
74
|
-
if (err
|
|
75
|
-
return
|
|
74
|
+
if (err) {
|
|
75
|
+
return alerts.error(err.message);
|
|
76
|
+
}
|
|
77
|
+
if (!canCreate) {
|
|
78
|
+
return alerts.error('[[error:no-privileges]]');
|
|
76
79
|
}
|
|
77
80
|
|
|
78
81
|
Poll.sockets.getConfig(null, function (err, config) {
|
|
@@ -118,7 +121,7 @@
|
|
|
118
121
|
|
|
119
122
|
Creator.show = function (poll, config, callback) {
|
|
120
123
|
if (poll.hasOwnProperty('info')) {
|
|
121
|
-
return
|
|
124
|
+
return Poll.alertError('Editing not implemented');
|
|
122
125
|
}
|
|
123
126
|
|
|
124
127
|
require(['flatpickr', 'flatpickr.i10n', 'bootbox', 'dayjs', 'translator'], function (flatpickr, flatpickrI10N, bootbox, dayjs, Translator) {
|
package/public/js/poll/main.js
CHANGED
|
@@ -3,6 +3,12 @@
|
|
|
3
3
|
window.Poll = {};
|
|
4
4
|
|
|
5
5
|
(function () {
|
|
6
|
+
window.Poll.alertError = function (message) {
|
|
7
|
+
require(['alerts'], function (alerts) {
|
|
8
|
+
alerts.error(message);
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
|
|
6
12
|
require('poll/serializer')(window.utils);
|
|
7
13
|
$(window).on('action:topic.loading', function () {
|
|
8
14
|
if (ajaxify.data.posts.length > 0 && ajaxify.data.posts[0].hasOwnProperty('pollId')) {
|
|
@@ -22,7 +28,7 @@ window.Poll = {};
|
|
|
22
28
|
if (!isNaN(pollId)) {
|
|
23
29
|
Poll.sockets.getPoll({ pollId: pollId }, function (err, pollData) {
|
|
24
30
|
if (err) {
|
|
25
|
-
return
|
|
31
|
+
return Poll.alertError(err.message);
|
|
26
32
|
}
|
|
27
33
|
Poll.view.load(pollData);
|
|
28
34
|
});
|
package/public/js/poll/view.js
CHANGED
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
if (err) {
|
|
31
|
-
return
|
|
31
|
+
return Poll.alertError(err.message);
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
view.showResultsPanel();
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
|
|
59
59
|
Poll.sockets.updateVote(voteData, function (err) {
|
|
60
60
|
if (err) {
|
|
61
|
-
return
|
|
61
|
+
return Poll.alertError(err.message);
|
|
62
62
|
}
|
|
63
63
|
view.showResultsPanel();
|
|
64
64
|
});
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
|
|
79
79
|
Poll.sockets.removeVote(voteData, function (err) {
|
|
80
80
|
if (err) {
|
|
81
|
-
return
|
|
81
|
+
return Poll.alertError(err.message);
|
|
82
82
|
}
|
|
83
83
|
view.showResultsPanel();
|
|
84
84
|
});
|
|
@@ -124,7 +124,7 @@
|
|
|
124
124
|
optionId: optionId,
|
|
125
125
|
}, function (err, details) {
|
|
126
126
|
if (err) {
|
|
127
|
-
return
|
|
127
|
+
return Poll.alertError(err.message);
|
|
128
128
|
}
|
|
129
129
|
|
|
130
130
|
view.showOptionDetails(details);
|
|
@@ -1,58 +1,58 @@
|
|
|
1
|
-
<div class="row">
|
|
2
|
-
<div class="col-lg-9">
|
|
3
|
-
<form class="form poll-settings">
|
|
4
|
-
<div class="card">
|
|
5
|
-
<div class="card-header">[[poll:poll]]</div>
|
|
6
|
-
<div class="card-body">
|
|
7
|
-
<div class="row">
|
|
8
|
-
<div class="col-lg-6">
|
|
9
|
-
<h6>[[poll:toggles]]</h6>
|
|
10
|
-
<div class="mb-3">
|
|
11
|
-
<div class="form-check">
|
|
12
|
-
<label class="form-check-label">[[poll:allow_guests]]</label>
|
|
13
|
-
<input class="form-check-input" type="checkbox" data-key="toggles.allowAnon" data-trim="false">
|
|
14
|
-
</div>
|
|
15
|
-
</div>
|
|
16
|
-
</div>
|
|
17
|
-
<div class="col-lg-6">
|
|
18
|
-
<h6>[[poll:limits]]</h6>
|
|
19
|
-
<div>
|
|
20
|
-
<label class="form-label" for="maxPollOptions">[[poll:max_options]]</label>
|
|
21
|
-
<input type="number" class="form-control" id="maxPollOptions" placeholder="10" min="1" max="100" data-key="limits.maxOptions">
|
|
22
|
-
</div>
|
|
23
|
-
</div>
|
|
24
|
-
</div>
|
|
25
|
-
</div>
|
|
26
|
-
</div>
|
|
27
|
-
|
|
28
|
-
<div class="card">
|
|
29
|
-
<div class="card-header">[[poll:defaults]]</div>
|
|
30
|
-
<div class="card-body">
|
|
31
|
-
<div class="row">
|
|
32
|
-
<div class="col-lg-6">
|
|
33
|
-
<div class="mb-3">
|
|
34
|
-
<label class="form-label" for="defaultsTitle">[[poll:default_title]]</label>
|
|
35
|
-
<input type="text" class="form-control" id="defaultsTitle" placeholder="Poll" data-key="defaults.title">
|
|
36
|
-
</div>
|
|
37
|
-
<div>
|
|
38
|
-
<label class="form-label" for="defaultsMaxVotes">[[poll:max_votes]]</label>
|
|
39
|
-
<input type="number" class="form-control" id="defaultsMaxVotes" placeholder="1" min="1" max="100" data-key="defaults.maxvotes">
|
|
40
|
-
<p class="form-text">[[poll:info_choices]]</p>
|
|
41
|
-
</div>
|
|
42
|
-
</div>
|
|
43
|
-
</div>
|
|
44
|
-
</div>
|
|
45
|
-
</div>
|
|
46
|
-
</form>
|
|
47
|
-
</div>
|
|
48
|
-
|
|
49
|
-
<div class="col-lg-3">
|
|
50
|
-
<div class="card">
|
|
51
|
-
<div class="card-header">[[poll:settings]]</div>
|
|
52
|
-
<div class="card-body">
|
|
53
|
-
<button id="save" class="btn btn-primary btn-block">[[poll:save]]</button>
|
|
54
|
-
<button id="reset" class="btn btn-warning btn-block">[[poll:reset]]</button>
|
|
55
|
-
</div>
|
|
56
|
-
</div>
|
|
57
|
-
</div>
|
|
1
|
+
<div class="row">
|
|
2
|
+
<div class="col-lg-9">
|
|
3
|
+
<form class="form poll-settings">
|
|
4
|
+
<div class="card">
|
|
5
|
+
<div class="card-header">[[poll:poll]]</div>
|
|
6
|
+
<div class="card-body">
|
|
7
|
+
<div class="row">
|
|
8
|
+
<div class="col-lg-6">
|
|
9
|
+
<h6>[[poll:toggles]]</h6>
|
|
10
|
+
<div class="mb-3">
|
|
11
|
+
<div class="form-check">
|
|
12
|
+
<label class="form-check-label">[[poll:allow_guests]]</label>
|
|
13
|
+
<input class="form-check-input" type="checkbox" data-key="toggles.allowAnon" data-trim="false">
|
|
14
|
+
</div>
|
|
15
|
+
</div>
|
|
16
|
+
</div>
|
|
17
|
+
<div class="col-lg-6">
|
|
18
|
+
<h6>[[poll:limits]]</h6>
|
|
19
|
+
<div>
|
|
20
|
+
<label class="form-label" for="maxPollOptions">[[poll:max_options]]</label>
|
|
21
|
+
<input type="number" class="form-control" id="maxPollOptions" placeholder="10" min="1" max="100" data-key="limits.maxOptions">
|
|
22
|
+
</div>
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
|
|
28
|
+
<div class="card">
|
|
29
|
+
<div class="card-header">[[poll:defaults]]</div>
|
|
30
|
+
<div class="card-body">
|
|
31
|
+
<div class="row">
|
|
32
|
+
<div class="col-lg-6">
|
|
33
|
+
<div class="mb-3">
|
|
34
|
+
<label class="form-label" for="defaultsTitle">[[poll:default_title]]</label>
|
|
35
|
+
<input type="text" class="form-control" id="defaultsTitle" placeholder="Poll" data-key="defaults.title">
|
|
36
|
+
</div>
|
|
37
|
+
<div>
|
|
38
|
+
<label class="form-label" for="defaultsMaxVotes">[[poll:max_votes]]</label>
|
|
39
|
+
<input type="number" class="form-control" id="defaultsMaxVotes" placeholder="1" min="1" max="100" data-key="defaults.maxvotes">
|
|
40
|
+
<p class="form-text">[[poll:info_choices]]</p>
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
</div>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
</form>
|
|
47
|
+
</div>
|
|
48
|
+
|
|
49
|
+
<div class="col-lg-3">
|
|
50
|
+
<div class="card">
|
|
51
|
+
<div class="card-header">[[poll:settings]]</div>
|
|
52
|
+
<div class="card-body">
|
|
53
|
+
<button id="save" class="btn btn-primary btn-block">[[poll:save]]</button>
|
|
54
|
+
<button id="reset" class="btn btn-warning btn-block">[[poll:reset]]</button>
|
|
55
|
+
</div>
|
|
56
|
+
</div>
|
|
57
|
+
</div>
|
|
58
58
|
</div>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
<h2>{voteCount} [[poll:vote_count]]</h2>
|
|
2
|
-
<!-- BEGIN votes -->
|
|
3
|
-
<a href="{config.relative_path}/user/{votes.userslug}" class="poll-result-details">
|
|
4
|
-
{buildAvatar(votes, "24px", true)}
|
|
5
|
-
</a>
|
|
6
|
-
<!-- END votes -->
|
|
1
|
+
<h2>{voteCount} [[poll:vote_count]]</h2>
|
|
2
|
+
<!-- BEGIN votes -->
|
|
3
|
+
<a href="{config.relative_path}/user/{votes.userslug}" class="poll-result-details">
|
|
4
|
+
{buildAvatar(votes, "24px", true)}
|
|
5
|
+
</a>
|
|
6
|
+
<!-- END votes -->
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
<!-- BEGIN poll.options -->
|
|
2
|
-
<div class="poll-result" data-poll-option-id="{poll.options.id}">
|
|
3
|
-
<strong>{poll.options.title}</strong>
|
|
4
|
-
<small class="pull-right">
|
|
5
|
-
<a class="poll-result-votecount" href="#">
|
|
6
|
-
<span>{poll.options.voteCount}</span> [[poll:votes]]
|
|
7
|
-
</a>
|
|
8
|
-
</small>
|
|
9
|
-
<div class="progress">
|
|
10
|
-
<div class="progress-bar poll-result-progressbar" role="progressbar" aria-valuenow="{poll.options.percentage}" aria-valuemin="0" aria-valuemax="100" style="width: {poll.options.percentage}%;">
|
|
11
|
-
<span><span class="percent">{poll.options.percentage}</span>%</span>
|
|
12
|
-
</div>
|
|
13
|
-
</div>
|
|
14
|
-
</div>
|
|
1
|
+
<!-- BEGIN poll.options -->
|
|
2
|
+
<div class="poll-result" data-poll-option-id="{poll.options.id}">
|
|
3
|
+
<strong>{poll.options.title}</strong>
|
|
4
|
+
<small class="pull-right">
|
|
5
|
+
<a class="poll-result-votecount" href="#">
|
|
6
|
+
<span>{poll.options.voteCount}</span> [[poll:votes]]
|
|
7
|
+
</a>
|
|
8
|
+
</small>
|
|
9
|
+
<div class="progress">
|
|
10
|
+
<div class="progress-bar poll-result-progressbar" role="progressbar" aria-valuenow="{poll.options.percentage}" aria-valuemin="0" aria-valuemax="100" style="width: {poll.options.percentage}%;">
|
|
11
|
+
<span><span class="percent">{poll.options.percentage}</span>%</span>
|
|
12
|
+
</div>
|
|
13
|
+
</div>
|
|
14
|
+
</div>
|
|
15
15
|
<!-- END poll.options -->
|
package/templates/poll/view.tpl
CHANGED
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
<div class="poll-view" data-poll-id="{poll.info.pollId}">
|
|
2
|
-
<div class="card">
|
|
3
|
-
<div class="card-header">
|
|
4
|
-
<h3 class="card-title">{poll.settings.title}</h3>
|
|
5
|
-
<div class="btn-group float-end hidden">
|
|
6
|
-
<a href="#" class="poll-button-edit">
|
|
7
|
-
<span class="fa fa-pencil"></span>
|
|
8
|
-
</a>
|
|
9
|
-
</div>
|
|
10
|
-
</div>
|
|
11
|
-
<div class="card-body">
|
|
12
|
-
<div class="poll-view-messages hidden"></div>
|
|
13
|
-
<div class="poll-view-voting <!-- IF poll.hasVoted -->hidden<!-- ENDIF poll.hasVoted -->">
|
|
14
|
-
<!-- IMPORT poll/view/voting.tpl -->
|
|
15
|
-
</div>
|
|
16
|
-
<div class="poll-view-results <!-- IF !poll.hasVoted -->hidden<!-- ENDIF !poll.hasVoted -->">
|
|
17
|
-
<!-- IMPORT poll/view/results.tpl -->
|
|
18
|
-
</div>
|
|
19
|
-
|
|
20
|
-
<div class="poll-view-buttons">
|
|
21
|
-
<button type="button" class="btn btn-primary poll-button-vote hidden">[[poll:vote]]</button>
|
|
22
|
-
<button type="button" class="btn btn-primary poll-button-update-vote hidden">[[poll:update_vote]]</button>
|
|
23
|
-
<button type="button" class="btn btn-danger poll-button-remove-vote hidden">[[poll:remove_vote]]</button>
|
|
24
|
-
<button type="button" class="btn btn-link poll-button-results hidden">[[poll:to_results]]</button>
|
|
25
|
-
<button type="button" class="btn btn-link poll-button-voting hidden">[[poll:to_voting]]</button>
|
|
26
|
-
</div>
|
|
27
|
-
</div>
|
|
28
|
-
</div>
|
|
1
|
+
<div class="poll-view" data-poll-id="{poll.info.pollId}">
|
|
2
|
+
<div class="card">
|
|
3
|
+
<div class="card-header">
|
|
4
|
+
<h3 class="card-title">{poll.settings.title}</h3>
|
|
5
|
+
<div class="btn-group float-end hidden">
|
|
6
|
+
<a href="#" class="poll-button-edit">
|
|
7
|
+
<span class="fa fa-pencil"></span>
|
|
8
|
+
</a>
|
|
9
|
+
</div>
|
|
10
|
+
</div>
|
|
11
|
+
<div class="card-body">
|
|
12
|
+
<div class="poll-view-messages hidden"></div>
|
|
13
|
+
<div class="poll-view-voting <!-- IF poll.hasVoted -->hidden<!-- ENDIF poll.hasVoted -->">
|
|
14
|
+
<!-- IMPORT poll/view/voting.tpl -->
|
|
15
|
+
</div>
|
|
16
|
+
<div class="poll-view-results <!-- IF !poll.hasVoted -->hidden<!-- ENDIF !poll.hasVoted -->">
|
|
17
|
+
<!-- IMPORT poll/view/results.tpl -->
|
|
18
|
+
</div>
|
|
19
|
+
|
|
20
|
+
<div class="poll-view-buttons">
|
|
21
|
+
<button type="button" class="btn btn-primary poll-button-vote hidden">[[poll:vote]]</button>
|
|
22
|
+
<button type="button" class="btn btn-primary poll-button-update-vote hidden">[[poll:update_vote]]</button>
|
|
23
|
+
<button type="button" class="btn btn-danger poll-button-remove-vote hidden">[[poll:remove_vote]]</button>
|
|
24
|
+
<button type="button" class="btn btn-link poll-button-results hidden">[[poll:to_results]]</button>
|
|
25
|
+
<button type="button" class="btn btn-link poll-button-voting hidden">[[poll:to_voting]]</button>
|
|
26
|
+
</div>
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
29
29
|
</div>
|