mirror of
https://github.com/TryGhost/Ghost.git
synced 2025-02-03 23:00:14 -05:00
Added boolean as allowed custom theme setting type
refs https://github.com/TryGhost/Team/issues/1106 - updated schema validation to add `'boolean'` as an allowed `type` value - added `format()` and `parse()` methods to `CustomThemeSetting` model to match `Settings` model behaviour for boolean-type settings
This commit is contained in:
parent
f3dcf578a9
commit
7cb93be60b
3 changed files with 97 additions and 2 deletions
|
@ -678,7 +678,8 @@ module.exports = {
|
||||||
nullable: false,
|
nullable: false,
|
||||||
validations: {
|
validations: {
|
||||||
isIn: [[
|
isIn: [[
|
||||||
'select'
|
'select',
|
||||||
|
'boolean'
|
||||||
]]
|
]]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,7 +1,48 @@
|
||||||
|
const _ = require('lodash');
|
||||||
const ghostBookshelf = require('./base');
|
const ghostBookshelf = require('./base');
|
||||||
|
|
||||||
const CustomThemeSetting = ghostBookshelf.Model.extend({
|
const CustomThemeSetting = ghostBookshelf.Model.extend({
|
||||||
tableName: 'custom_theme_settings'
|
tableName: 'custom_theme_settings',
|
||||||
|
|
||||||
|
parse() {
|
||||||
|
const attrs = ghostBookshelf.Model.prototype.parse.apply(this, arguments);
|
||||||
|
const settingType = attrs.type;
|
||||||
|
|
||||||
|
// transform "0" to false for boolean type
|
||||||
|
if (settingType === 'boolean' && (attrs.value === '0' || attrs.value === '1')) {
|
||||||
|
attrs.value = !!+attrs.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// transform "false" to false for boolean type
|
||||||
|
if (settingType === 'boolean' && (attrs.value === 'false' || attrs.value === 'true')) {
|
||||||
|
attrs.value = JSON.parse(attrs.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
return attrs;
|
||||||
|
},
|
||||||
|
|
||||||
|
format() {
|
||||||
|
const attrs = ghostBookshelf.Model.prototype.format.apply(this, arguments);
|
||||||
|
const settingType = attrs.type;
|
||||||
|
|
||||||
|
if (settingType === 'boolean') {
|
||||||
|
// CASE: Ensure we won't forward strings, otherwise model events or model interactions can fail
|
||||||
|
if (attrs.value === '0' || attrs.value === '1') {
|
||||||
|
attrs.value = !!+attrs.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// CASE: Ensure we won't forward strings, otherwise model events or model interactions can fail
|
||||||
|
if (attrs.value === 'false' || attrs.value === 'true') {
|
||||||
|
attrs.value = JSON.parse(attrs.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_.isBoolean(attrs.value)) {
|
||||||
|
attrs.value = attrs.value.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return attrs;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
|
|
53
test/unit/server/models/custom-theme-setting.test.js
Normal file
53
test/unit/server/models/custom-theme-setting.test.js
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
const should = require('should');
|
||||||
|
const models = require('../../../../core/server/models');
|
||||||
|
|
||||||
|
describe('Unit: models/custom-theme-setting', function () {
|
||||||
|
before(function () {
|
||||||
|
models.init();
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('parse', function () {
|
||||||
|
it('ensure correct parsing when fetching from db', function () {
|
||||||
|
const setting = models.CustomThemeSetting.forge();
|
||||||
|
|
||||||
|
let returns = setting.parse({theme: 'test', key: 'dark_mode', value: 'false', type: 'boolean'});
|
||||||
|
should.equal(returns.value, false);
|
||||||
|
|
||||||
|
returns = setting.parse({theme: 'test', key: 'dark_mode', value: false, type: 'boolean'});
|
||||||
|
should.equal(returns.value, false);
|
||||||
|
|
||||||
|
returns = setting.parse({theme: 'test', key: 'dark_mode', value: true, type: 'boolean'});
|
||||||
|
should.equal(returns.value, true);
|
||||||
|
|
||||||
|
returns = setting.parse({theme: 'test', key: 'dark_mode', value: 'true', type: 'boolean'});
|
||||||
|
should.equal(returns.value, true);
|
||||||
|
|
||||||
|
returns = setting.parse({theme: 'test', key: 'dark_mode', value: '0', type: 'boolean'});
|
||||||
|
should.equal(returns.value, false);
|
||||||
|
|
||||||
|
returns = setting.parse({theme: 'test', key: 'dark_mode', value: '1', type: 'boolean'});
|
||||||
|
should.equal(returns.value, true);
|
||||||
|
|
||||||
|
returns = setting.parse({theme: 'test', key: 'something', value: 'null', type: 'select'});
|
||||||
|
should.equal(returns.value, 'null');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('format', function () {
|
||||||
|
it('ensure correct formatting when setting', function () {
|
||||||
|
const setting = models.CustomThemeSetting.forge();
|
||||||
|
|
||||||
|
let returns = setting.format({theme: 'test', key: 'dark_mode', value: '0', type: 'boolean'});
|
||||||
|
should.equal(returns.value, 'false');
|
||||||
|
|
||||||
|
returns = setting.format({theme: 'test', key: 'dark_mode', value: '1', type: 'boolean'});
|
||||||
|
should.equal(returns.value, 'true');
|
||||||
|
|
||||||
|
returns = setting.format({theme: 'test', key: 'dark_mode', value: 'false', type: 'boolean'});
|
||||||
|
should.equal(returns.value, 'false');
|
||||||
|
|
||||||
|
returns = setting.format({theme: 'test', key: 'dark_mode', value: 'true', type: 'boolean'});
|
||||||
|
should.equal(returns.value, 'true');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
Loading…
Add table
Reference in a new issue