Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions assets/components/sendex/js/mgr/misc/utils.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
Sendex.utils.escapeHtmlAttr = function(value) {
return String(value)
.replace(/&/g, '&')
.replace(/"/g, '"')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;');
};

Sendex.utils.renderActions = function(value, props, row) {
var res = [];
for (var i in row.data.actions) {
Expand Down
10 changes: 1 addition & 9 deletions assets/components/sendex/js/mgr/widgets/newsletters.grid.js
Original file line number Diff line number Diff line change
Expand Up @@ -88,21 +88,13 @@ Ext.extend(Sendex.grid.Newsletters,MODx.grid.Grid,Ext.apply({
: '<span style="color:green">' + _('yes') + '</span>';
}

,_escapeHtmlAttr: function(value) {
return String(value)
.replace(/&/g, '&amp;')
.replace(/"/g, '&quot;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;');
}

,_renderImage: function(val,cell,row) {
if (!val) {return '';}
else if (val.substr(0,1) != '/') {
val = '/' + val;
}

return '<img src="' + this._escapeHtmlAttr(val) + '" alt="" height="50" />';
return '<img src="' + Sendex.utils.escapeHtmlAttr(val) + '" alt="" height="50" />';
}

,_renderTemplate: function(val,cell,row) {
Expand Down
2 changes: 1 addition & 1 deletion core/components/sendex/docs/changelog.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [2.0.1-pl] - 2026-07-29

### Fixed
- [#114] Mgr newsletter create appeared to hang on «Загружается…» and the grid stayed empty after reload (row was saved; duplicate-name error on retry). Newsletter `getlist` no longer uses JOIN/subquery SQL (subscriber count and template name are added in `prepareRow`); grid refresh after save is deferred so the create window can close first; `getlist`/`get` accept `view_sendex` as well as `view_document`; create `beforeSet()` returns strict `true` for MODX 3.
- [#114] Mgr newsletter create appeared to hang on «Загружается…» and the grid stayed empty after reload (row was saved; duplicate-name error on retry). Newsletter `getlist` no longer uses JOIN/subquery SQL (subscriber count and template name are added in `prepareRow`); grid refresh after save is deferred so the create window can close first; `getlist`/`get` accept `view_sendex` as well as `view_document`; create `beforeSet()` returns strict `true` for MODX 3. Image column renderer uses `Sendex.utils.escapeHtmlAttr` (ExtJS does not keep grid scope for column renderers).
- [#111] Mgr row-action and menu icons no longer force `font-family: "Font Awesome 5 Free"` (Sendex does not load FA5); icons inherit the mgr icon font on MODX 2.3+/3.x or bundled FA4 on older MODX.
- [#25666] Transport package built on MODX 3.x stored vehicle class as `xPDO\Transport\xPDOObjectVehicle`, which MODX 2.8.8/2.8.9 cannot load (install fails with ~30 "Could not load class" errors). Release build now runs on MODX 2.x so the manifest uses the legacy vehicle format that installs on both MODX 2.8+ and 3.x.

Expand Down
10 changes: 7 additions & 3 deletions tests/Unit/MgrGridSelectionContractTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -84,11 +84,15 @@ public function testNewsletterGridRenderersEscapeImageAndCloseSpanTags()
);

$this->assertStringContainsString("'</span>'", $source);
$this->assertStringContainsString('_escapeHtmlAttr: function(value)', $source);
$this->assertStringContainsString(".replace(/\"/g, '&quot;')", $source);
$this->assertStringContainsString(
"return '<img src=\"' + this._escapeHtmlAttr(val) + '\" alt=\"\" height=\"50\" />';",
"return '<img src=\"' + Sendex.utils.escapeHtmlAttr(val) + '\" alt=\"\" height=\"50\" />';",
$source
);

$utils = file_get_contents(
dirname(__DIR__, 2) . '/assets/components/sendex/js/mgr/misc/utils.js'
);
$this->assertStringContainsString('Sendex.utils.escapeHtmlAttr = function(value)', $utils);
$this->assertStringContainsString(".replace(/\"/g, '&quot;')", $utils);
}
}
Loading