Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature presidecms 1132 #443

Closed
Closed
Expand Up @@ -190,11 +190,11 @@ component extends="tests.resources.HelperObjects.PresideBddTestCase"{
var configService = _getConfigSvc();

mockDao.$( "selectData" )
.$args( selectFields=[ "setting", "value" ], filter={ category="mycategory", site=activeSite } )
.$args( selectFields=[ "setting", "value" ], filter={ category="mycategory", site=activeSite }, fromVersionTable=false, maxVersionNumber=0, orderBy="" )
.$results( QueryNew( 'setting,value', 'varchar,varchar', [ [ "setting1", "value1" ], [ "setting2", "value2" ] ] ) );

mockDao.$( "selectData" )
.$args( selectFields=[ "setting", "value" ], filter="category = :category and site is null", filterParams={ category="mycategory" } )
.$args( selectFields=[ "setting", "value" ], filter="category = :category and site is null", filterParams={ category="mycategory" }, fromVersionTable=false, maxVersionNumber=0, orderBy="" )
.$results( QueryNew( 'setting,value', 'varchar,varchar', [ [ "setting1", "value1global" ], [ "setting2", "value2global" ], [ "setting3", "value3global" ] ] ) );

expect( configService.getCategorySettings( category="mycategory" ) ).toBe( {
Expand All @@ -212,11 +212,11 @@ component extends="tests.resources.HelperObjects.PresideBddTestCase"{
} );

mockDao.$( "selectData" )
.$args( selectFields=[ "setting", "value" ], filter={ category="mycategory", site=activeSite } )
.$args( selectFields=[ "setting", "value" ], filter={ category="mycategory", site=activeSite }, fromVersionTable=false, maxVersionNumber=0, orderBy="" )
.$results( QueryNew( 'setting,value', 'varchar,varchar', [ [ "setting1", "value1" ], [ "setting3", "value3" ] ] ) );

mockDao.$( "selectData" )
.$args( selectFields=[ "setting", "value" ], filter="category = :category and site is null", filterParams={ category="mycategory" } )
.$args( selectFields=[ "setting", "value" ], filter="category = :category and site is null", filterParams={ category="mycategory" }, fromVersionTable=false, maxVersionNumber=0, orderBy="" )
.$results( QueryNew( 'setting,value', 'varchar,varchar', [ [ "setting1", "value1global" ], [ "setting2", "value2global" ], [ "setting3", "value3global" ] ] ) );


Expand All @@ -236,11 +236,11 @@ component extends="tests.resources.HelperObjects.PresideBddTestCase"{
} );

mockDao.$( "selectData" )
.$args( selectFields=[ "setting", "value" ], filter={ category="mycategory", site=activeSite } )
.$args( selectFields=[ "setting", "value" ], filter={ category="mycategory", site=activeSite }, fromVersionTable=false, maxVersionNumber=0, orderBy="" )
.$results( QueryNew( 'setting,value', 'varchar,varchar', [ [ "setting1", "value1" ], [ "setting3", "value3" ] ] ) );

mockDao.$( "selectData" )
.$args( selectFields=[ "setting", "value" ], filter="category = :category and site is null", filterParams={ category="mycategory" } )
.$args( selectFields=[ "setting", "value" ], filter="category = :category and site is null", filterParams={ category="mycategory" }, fromVersionTable=false, maxVersionNumber=0, orderBy="" )
.$results( QueryNew( 'setting,value', 'varchar,varchar', [ [ "setting1", "value1global" ], [ "setting2", "value2global" ], [ "setting3", "value3global" ] ] ) );


Expand All @@ -258,11 +258,11 @@ component extends="tests.resources.HelperObjects.PresideBddTestCase"{
} );

mockDao.$( "selectData" )
.$args( selectFields=[ "setting", "value" ], filter={ category="mycategory", site=activeSite } )
.$args( selectFields=[ "setting", "value" ], filter={ category="mycategory", site=activeSite }, fromVersionTable=false, maxVersionNumber=0, orderBy="" )
.$results( QueryNew( 'setting,value', 'varchar,varchar', [ [ "setting1", "value1" ], [ "setting3", "value3" ], [ "setting5", "value5" ] ] ) );

mockDao.$( "selectData" )
.$args( selectFields=[ "setting", "value" ], filter="category = :category and site is null", filterParams={ category="mycategory" } )
.$args( selectFields=[ "setting", "value" ], filter="category = :category and site is null", filterParams={ category="mycategory" }, fromVersionTable=false, maxVersionNumber=0, orderBy="" )
.$results( QueryNew( 'setting,value', 'varchar,varchar', [ [ "setting1", "value1global" ], [ "setting2", "value2global" ], [ "setting3", "value3global" ] ] ) );


Expand Down
48 changes: 47 additions & 1 deletion system/handlers/admin/DataManager.cfc
Expand Up @@ -1035,6 +1035,53 @@ component extends="preside.system.base.AdminHandler" {
return renderView( view="admin/datamanager/versionNavigator", args=args );
}

private string function groupVersionNavigator( event, rc, prc, args={} ) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I do not think that this belongs in DataManager.cfc. It seems completely specific to system config so should go int he sysConfig admin handler I think.

var selectedVersion = Val( args.version ?: "" );
var objectName = args.object ?: "";
var id = args.id ?: "";
var setting = structKeyList( event.getCollectionForForm( "system-config.#args.id#" ) );
var maxVersion = presideObjectService.getNextVersionNumber();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be avoided. This will grow the version table unnecessarily. Instead of this (and the query of queries below), we should add a method to the sysConfig service that calculates the max version for a category. This should be achievable with a single regular selectData query I should think. Rough pseudocode:

var version = $getPresideObject( versionObjectNameForSysConfgTable ).selectData(
      selectFields = [ "Max( _version_number ) as max_version_number" ]
    , filter = { category = arguments.category }
);

return Val( version.max_version_number );


args.versions = presideObjectService.selectData(
objectName = "system_config",
selectFields = ["system_config.id", "system_config.site", "system_config.category", "system_config.setting", "system_config.value", "system_config.datecreated", "system_config.datemodified", "system_config._version_is_draft", "system_config._version_has_drafts", "system_config._version_number"],
filter = "category = :category AND setting IN ( :setting )",
filterParams = { "category"=id, "setting"={ value=setting, list="yes" } },
fromVersionTable = true,
maxVersionNumber = maxVersion,
orderBy = "system_config._version_number DESC"
);

args.latestVersion = queryExecute(
sql = "select top 1 _version_number as latestVersion from args.versions order by _version_number DESC"
, options = { dbtype="query" }
).latestVersion[1];
if(args.latestVersion EQ "") args.latestVersion = maxVersion;

args.latestPublishedVersion = queryExecute(
sql = "select top 1 _version_number as latestVersion from args.versions where _version_is_draft = 0 order by _version_number DESC"
, options = { dbtype="query" }
).latestVersion[1];
if(args.latestPublishedVersion EQ "") args.latestPublishedVersion = maxVersion;

if ( !selectedVersion ) {
selectedVersion = args.latestVersion;
}

args.isLatest = args.latestVersion == selectedVersion;
args.nextVersion = 0;
args.prevVersion = args.versions.recordCount < 2 ? 0 : args.versions._version_number[ args.versions.recordCount-1 ];

for( var i=1; i <= args.versions.recordCount; i++ ){
if ( args.versions._version_number[i] == selectedVersion ) {
args.nextVersion = i > 1 ? args.versions._version_number[i-1] : 0;
args.prevVersion = i < args.versions.recordCount ? args.versions._version_number[i+1] : 0;
}
}

return renderView( view="admin/datamanager/groupVersionNavigator", args=args );
}

private string function translationVersionNavigator( event, rc, prc, args={} ) {
var recordId = args.id ?: "";
var language = args.language ?: "";
Expand Down Expand Up @@ -2745,7 +2792,6 @@ component extends="preside.system.base.AdminHandler" {

}


try {
prc.recordLabel = renderLabel( prc.objectName, prc.recordId );
} catch ( "PresideObjectService.no.label.field" e ) {
Expand Down
57 changes: 52 additions & 5 deletions system/handlers/admin/SysConfig.cfc
Expand Up @@ -3,6 +3,7 @@ component extends="preside.system.base.AdminHandler" {
property name="systemConfigurationService" inject="systemConfigurationService";
property name="siteService" inject="siteService";
property name="messageBox" inject="messagebox@cbmessagebox";
property name="presideObjectService" inject="presideObjectService";


// LIFECYCLE EVENTS
Expand Down Expand Up @@ -33,8 +34,10 @@ component extends="preside.system.base.AdminHandler" {
}

public any function category( event, rc, prc ) {
var categoryId = Trim( rc.id ?: "" );
var siteId = Trim( rc.site ?: "" );
var categoryId = Trim( rc.id ?: "" );
var siteId = Trim( rc.site ?: "" );
var versionId = Val( rc.version ?: "" );
var fromVersionTable = Val( versionId ) ? true : false

try {
prc.category = systemConfigurationService.getConfigCategory( id = categoryId );
Expand All @@ -46,14 +49,22 @@ component extends="preside.system.base.AdminHandler" {
var isSiteConfig = prc.sites.recordCount > 1 && siteId.len();
if ( isSiteConfig ) {
prc.savedData = systemConfigurationService.getCategorySettings(
category = categoryId
, includeDefaults = false
, siteId = siteId
category = categoryId
, includeDefaults = false
, siteId = siteId
, fromVersionTable = fromVersionTable
, maxVersionNumber = versionId
, maxRows = 2
, orderBy = "dateCreated DESC"
);
} else {
prc.savedData = systemConfigurationService.getCategorySettings(
category = categoryId
, globalDefaultsOnly = true
, fromVersionTable = fromVersionTable
, maxVersionNumber = versionId
, maxRows = 2
, orderBy = "dateCreated DESC"
);
}

Expand Down Expand Up @@ -149,6 +160,42 @@ component extends="preside.system.base.AdminHandler" {
setNextEvent( url=event.buildAdminLink( linkTo="sysconfig.category", queryString="id=#categoryId#" ) );
}

public void function configHistory( event, rc, prc ) {
var categoryId = Trim( rc.id ?: "" );
var siteId = Trim( rc.site ?: "" );

try {
prc.category = systemConfigurationService.getConfigCategory( id = categoryId );
} catch( "SystemConfigurationService.category.notFound" e ) {
event.notFound();
}
}

public void function getConfigHistoryForAjaxDataTables( event, rc, prc ) {
prc.setting = structKeyList( event.getCollectionForForm( "system-config.#rc.id#" ) );

var nextVersionNumber = presideObjectService.getNextVersionNumber();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See other review comment about avoiding this. This method call inserts a new version number in the version number table. Instead, we shoud calculate the real max version number for the settings category.

var allFieldsData = presideObjectService.selectData(
objectName = "system_config",
filter = "category = :category AND setting IN ( :setting )",
filterParams = { "category"=rc.id, "setting"={ value=prc.setting, list="yes" } },
fromVersionTable = true,
maxVersionNumber = nextVersionNumber
);
var configIds = listRemoveDuplicates(valueList(allFieldsData.id));

runEvent(
event = "admin.DataManager._getRecordHistoryForAjaxDataTables"
, prePostExempt = true
, private = true
, eventArguments = {
object = "system_config"
, recordId = configIds
, actionsView = "admin/SysConfig/_historyActions"
}
);
}

// VIEWLETS
private string function categoryMenu( event, rc, prc, args ) {
args.categories = systemConfigurationService.listConfigCategories();
Expand Down
3 changes: 3 additions & 0 deletions system/i18n/cms.properties
Expand Up @@ -853,6 +853,9 @@ sysconfig.saved=Your settings have been successfully saved
sysconfig.validation.failed=There was a problem with your form and the settings have not been saved. Please review any error messages and try again.
sysConfig.global.settings=Global defaults
sysConfig.site.config.info=Note: to override global default settings, ensure that the 'Override' checkbox is checked for each option you wish to override.
sysconfig.viewHistory.label=View history
sysconfig.history.title=Config history for '{1}'
sysconfig.history.subTitle=Config history

sitenav.currentsite.title=Site: {1}
sitenav.managesites=Manage sites
Expand Down
19 changes: 14 additions & 5 deletions system/services/configuration/SystemConfigurationService.cfc
Expand Up @@ -84,6 +84,9 @@ component displayName="System configuration service" {
required string category
, boolean includeDefaults = true
, boolean globalDefaultsOnly = false
, boolean fromVersionTable = false
, numeric maxVersionNumber = 0
, string orderBy = ""
, string siteId = _getSiteService().getActiveSiteId()
) {
_reloadCheck();
Expand All @@ -92,8 +95,11 @@ component displayName="System configuration service" {

if ( !arguments.globalDefaultsOnly ) {
var rawSiteResult = _getDao().selectData(
selectFields = [ "setting", "value" ]
, filter = { category = arguments.category, site=arguments.siteId }
selectFields = [ "setting", "value" ]
, filter = { category = arguments.category, site=arguments.siteId }
, fromVersionTable = arguments.fromVersionTable
, maxVersionNumber = arguments.maxVersionNumber
, orderBy = arguments.orderBy
);

for( var record in rawSiteResult ){
Expand All @@ -104,9 +110,12 @@ component displayName="System configuration service" {
if ( arguments.includeDefaults ) {
var injectedStartsWith = "#arguments.category#.";
var rawGlobalResult = _getDao().selectData(
selectFields = [ "setting", "value" ]
, filter = "category = :category and site is null"
, filterParams = { category = arguments.category }
selectFields = [ "setting", "value" ]
, filter = "category = :category and site is null"
, filterParams = { category = arguments.category }
, fromVersionTable = arguments.fromVersionTable
, maxVersionNumber = arguments.maxVersionNumber
, orderBy = arguments.orderBy
);

for( var record in rawGlobalResult ){
Expand Down
14 changes: 14 additions & 0 deletions system/services/presideObjects/PresideObjectService.cfc
Expand Up @@ -177,6 +177,7 @@ component displayName="Preside Object Service" {
, boolean useCache = _getUseCacheDefault()
, boolean fromVersionTable = false
, numeric specificVersion = 0
, numeric maxVersionNumber = 0
, boolean allowDraftVersions = $getRequestContext().showNonLiveContent()
, string forceJoins = ""
, array extraJoins = []
Expand Down Expand Up @@ -1260,6 +1261,10 @@ component displayName="Preside Object Service" {
args.filterParams = { "#idField#" = arguments.id, _version_changed_fields = "%,#args.fieldName#,%" };
args.delete( "fieldName" );
args.delete( "id" );
} else if ( listLen( arguments.id ) GT 1 ){
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we remove this? This is an unrelated change. You can achieve the same thing with:

selectData( filter={ id=arrayOfIds } );

This could be a useful approach, but I'd rather make that a separate change and rather use an array than a string list to avoid ambiguity.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@DominicWatson
This is the line called and send configIds,
\system\handlers\admin\SysConfig.cfc : 193, Here if I implement the above changes means I've to change the dataManager and dataManagerService.cfc. Or else we've create a new service which we've to achieve this changes.
BTW Not sure whether we need to implement this change.

args.filter = "#idField# IN ( :#idField# )";
args.filterParams = { "#idField#" = { value = arguments.id, list="yes"} };
args.delete( "id" );
}

return selectData( argumentCollection = args );
Expand Down Expand Up @@ -2381,6 +2386,7 @@ component displayName="Preside Object Service" {
, required array joins
, required array selectFields
, required numeric specificVersion
, required numeric maxVersionNumber
, required boolean allowDraftVersions
, required any filter
, required array params
Expand Down Expand Up @@ -2417,6 +2423,14 @@ component displayName="Preside Object Service" {
params.append( { name="#arguments.objectName#___version_is_draft", value=false, type="cf_sql_bit" } );
}

} else if ( arguments.maxVersionNumber ) {
versionFilter = "#arguments.objectName#._version_number <= :#arguments.objectName#._max_version_number";
params.append( { name="#arguments.objectName#___max_version_number", value=arguments.maxVersionNumber, type="cf_sql_int" } );

if ( !arguments.allowDraftVersions ) {
versionFilter &= " and ( #arguments.objectName#._version_is_draft is null or #arguments.objectName#._version_is_draft = :#arguments.objectName#._version_is_draft )";
params.append( { name="#arguments.objectName#___version_is_draft", value=false, type="cf_sql_bit" } );
}
} else {
var latestVersionField = arguments.allowDraftVersions ? "_version_is_latest_draft" : "_version_is_latest";
versionFilter = "#arguments.objectName#.#latestVersionField# = :#arguments.objectName#.#latestVersionField#";
Expand Down
9 changes: 9 additions & 0 deletions system/views/admin/sysconfig/_historyActions.cfm
@@ -0,0 +1,9 @@
<cfparam name="args.id" type="string" />

<cfoutput>
<div class="action-buttons btn-group">
<a href="#event.buildAdminLink( linkTo='SysConfig.category', queryString='id=#rc.id#&version=#args._version_number#' )#" data-context-key="e" title="#HtmlEditFormat( translateResource( uri="cms:datatable.contextmenu.edit" ) )#">
<i class="fa fa-pencil"></i>
</a>
</div>
</cfoutput>
12 changes: 12 additions & 0 deletions system/views/admin/sysconfig/category.cfm
Expand Up @@ -7,11 +7,23 @@
sites = prc.sites ?: QueryNew('');
categoryId = Trim( rc.id ?: "" );
site = Trim( rc.site ?: "" );
version = Trim( rc.version ?: "" );
canSaveDraft = false;

isSiteConfig = sites.recordCount > 1 && site.len();
</cfscript>

<cfoutput>
#renderViewlet( event='admin.datamanager.groupVersionNavigator', args={
object = "system_config"
, id = categoryId
, version = version
, isDraft = IsTrue( page._version_is_draft ?: "" )
, baseUrl = event.buildAdminLink( linkTo="sysconfig.category", queryString="id=#categoryId#&version=" )
, allVersionsUrl = event.buildAdminLink( linkTo="sysconfig.configHistory", queryString="id=#categoryId#" )
<!--- sysconfig.discardDraftsAction event will not be available, but that is not needed here as we don't support drafts for settings --->
, discardDraftsUrl = ( canSaveDraft ? event.buildAdminlink( linkTo="sysconfig.discardDraftsAction", queryString="id=#categoryId#" ) : "" )
} )#
<cfif sites.recordcount gt 1>
<div class="tabbable tabs-left">
<ul class="nav nav-tabs">
Expand Down
14 changes: 14 additions & 0 deletions system/views/admin/sysconfig/configHistory.cfm
@@ -0,0 +1,14 @@
<cfscript>
prc.pageIcon = "history";
prc.pageTitle = translateResource( uri="cms:sysconfig.history.title", data=[ rc.id ] );
prc.pageSubTitle = translateResource( uri="cms:sysconfig.history.subTitle" );

id = rc.id ?: "";
</cfscript>

<cfoutput>
#renderView( view="/admin/datamanager/_objectVersionHistoryTable", args={
objectName = "system_config"
, datasourceUrl = event.buildAdminLink( linkTo="ajaxProxy", queryString="action=SysConfig.getConfigHistoryForAjaxDataTables&id=#id#" )
} )#
</cfoutput>
5 changes: 5 additions & 0 deletions system/views/admin/sysconfig/index.cfm
Expand Up @@ -4,6 +4,7 @@
<ul class="list-unstyled">
<cfloop array="#prc.categories#" item="category" index="i">
<cfset editCategoryUrl = event.buildAdminLink( linkTo='sysconfig.category', queryString='id=#category.getId()#' ) />
<cfset versionHistoryUrl = event.buildAdminLink( linkTo='sysconfig.configHistory', queryString='id=#category.getId()#' ) />
<li class="config-category">
<a href="#editCategoryUrl#" class="pull-left"><i class="fa fa-fw #translateResource( uri=category.getIcon(), defaultValue='fa-cogs' )# fa-3x"></i></a>&nbsp;
<div class="pull-left title-and-description">
Expand All @@ -14,6 +15,10 @@
</h4>
<p>#translateResource( uri=category.getDescription(), defaultValue="" )#</p>
</div>
<a href="#versionHistoryUrl#" class="pull-right">
<i class="fa fa-fw fa-history"></i>
#translateResource( "cms:sysconfig.viewHistory.label" )#
</a>&nbsp;
</li>
</cfloop>
</ul>
Expand Down