From db3dcf73317817b831eb11ffbe499f5bd7de0d14 Mon Sep 17 00:00:00 2001 From: Guy Sartorelli Date: Thu, 17 Oct 2024 12:49:24 +1300 Subject: [PATCH] API Make CMSMain more generic Remove hardcoded references to pages and SiteTree Remove assumption that records are versioned Remove or validate assumptions about methods on the model class Improve general architecture of CMSMain --- _config.php | 4 - _config/adminpanels.yml | 2 +- _config/cache.yml | 6 +- _config/permissions.yml | 1 - client/dist/js/bundle.js | 2 +- client/src/legacy/CMSMain.AddForm.js | 16 +- client/src/legacy/CMSMain.Tree.js | 2 +- code/Controllers/CMSMain.php | 1091 +++++++++-------- code/Controllers/CMSPageAddController.php | 239 ---- code/Controllers/CMSPageEditController.php | 13 +- .../Controllers/CMSPageSettingsController.php | 15 +- code/Controllers/CMSPagesController.php | 34 - code/Controllers/CMSSiteTreeFilter.php | 6 +- .../CMSSiteTreeFilter_PublishedPages.php | 2 +- .../CMSSiteTreeFilter_StatusDeletedPages.php | 2 +- .../CMSSiteTreeFilter_StatusDraftPages.php | 2 +- .../LeftAndMainPageIconsExtension.php | 8 +- code/Forms/CMSMainAddForm.php | 230 ++++ code/Forms/InternalLinkFormFactory.php | 4 +- ...tifier.php => CurrentRecordIdentifier.php} | 6 +- code/Model/RedirectorPage.php | 2 +- code/Model/SiteTree.php | 308 +---- code/Model/VirtualPage.php | 2 +- code/Reports/BrokenLinksReport.php | 2 +- lang/en.yml | 2 + .../Controllers/Includes/CMSMain_AddForm.ss | 47 + .../Controllers/Includes/CMSMain_Content.ss | 17 +- ...tions.ss => CMSMain_ContentToolActions.ss} | 6 +- .../Controllers/Includes/CMSMain_EditForm.ss | 5 - .../Controllers/Includes/CMSMain_Filter.ss | 2 +- .../Controllers/Includes/CMSMain_LeftPanel.ss | 24 + .../Controllers/Includes/CMSMain_ListView.ss | 4 +- .../Includes/CMSMain_PageList_Sidebar.ss | 1 - ...Main_PageList.ss => CMSMain_RecordList.ss} | 0 .../Controllers/Includes/CMSMain_SubTree.ss | 2 +- .../CMS/Controllers/Includes/CMSMain_Tools.ss | 35 +- .../Controllers/Includes/CMSMain_TreeNode.ss | 2 +- .../Controllers/Includes/CMSMain_TreeView.ss | 20 +- .../Includes/CMSMain_ViewControls.ss | 6 +- .../Includes/CMSPageAddController_Content.ss | 45 - .../Includes/CMSPagesController_Content.ss | 18 - .../Includes/CMSPagesController_Tools.ss | 3 - tests/php/Controllers/CMSMainTest.php | 30 +- .../php/Controllers/CMSSiteTreeFilterTest.php | 42 +- tests/php/Model/SiteTreeTest.php | 1 + 45 files changed, 1098 insertions(+), 1213 deletions(-) delete mode 100644 code/Controllers/CMSPageAddController.php delete mode 100644 code/Controllers/CMSPagesController.php create mode 100644 code/Forms/CMSMainAddForm.php rename code/Model/{CurrentPageIdentifier.php => CurrentRecordIdentifier.php} (75%) create mode 100644 templates/SilverStripe/CMS/Controllers/Includes/CMSMain_AddForm.ss rename templates/SilverStripe/CMS/Controllers/Includes/{CMSPagesController_ContentToolActions.ss => CMSMain_ContentToolActions.ss} (73%) create mode 100644 templates/SilverStripe/CMS/Controllers/Includes/CMSMain_LeftPanel.ss delete mode 100644 templates/SilverStripe/CMS/Controllers/Includes/CMSMain_PageList_Sidebar.ss rename templates/SilverStripe/CMS/Controllers/Includes/{CMSMain_PageList.ss => CMSMain_RecordList.ss} (100%) delete mode 100644 templates/SilverStripe/CMS/Controllers/Includes/CMSPageAddController_Content.ss delete mode 100644 templates/SilverStripe/CMS/Controllers/Includes/CMSPagesController_Content.ss delete mode 100644 templates/SilverStripe/CMS/Controllers/Includes/CMSPagesController_Tools.ss diff --git a/_config.php b/_config.php index 0fb43491..75c19579 100644 --- a/_config.php +++ b/_config.php @@ -1,8 +1,6 @@ register( [SiteTree::class, 'link_shortcode_handler'] ); -CMSMenu::remove_menu_class(CMSMain::class); CMSMenu::remove_menu_class(CMSPageEditController::class); CMSMenu::remove_menu_class(CMSPageSettingsController::class); -CMSMenu::remove_menu_class(CMSPageAddController::class); diff --git a/_config/adminpanels.yml b/_config/adminpanels.yml index 0c13ba40..3704d101 100644 --- a/_config/adminpanels.yml +++ b/_config/adminpanels.yml @@ -2,4 +2,4 @@ Name: cmsdefaultadmin --- SilverStripe\Admin\AdminRootController: - default_panel: SilverStripe\CMS\Controllers\CMSPagesController + default_panel: SilverStripe\CMS\Controllers\CMSMain diff --git a/_config/cache.yml b/_config/cache.yml index 65c7b080..0237deb2 100644 --- a/_config/cache.yml +++ b/_config/cache.yml @@ -4,10 +4,10 @@ After: - '#corecache' --- SilverStripe\Core\Injector\Injector: - Psr\SimpleCache\CacheInterface.CMSMain_SiteTreeHints: + Psr\SimpleCache\CacheInterface.CMSMain_TreeHints: factory: SilverStripe\Core\Cache\CacheFactory constructor: - namespace: "CMSMain_SiteTreeHints" + namespace: "CMSMain_TreeHints" Psr\SimpleCache\CacheInterface.SiteTree_CreatableChildren: factory: SilverStripe\Core\Cache\CacheFactory constructor: @@ -15,4 +15,4 @@ SilverStripe\Core\Injector\Injector: Psr\SimpleCache\CacheInterface.SiteTree_PageIcons: factory: SilverStripe\Core\Cache\CacheFactory constructor: - namespace: "SiteTree_PageIcons" \ No newline at end of file + namespace: "SiteTree_PageIcons" diff --git a/_config/permissions.yml b/_config/permissions.yml index e1401cf6..00bb9048 100644 --- a/_config/permissions.yml +++ b/_config/permissions.yml @@ -17,4 +17,3 @@ SilverStripe\Core\Injector\Injector: Services: - '%$SilverStripe\Security\PermissionChecker.sitetree' - '%$SilverStripe\CMS\Controllers\CMSMain' - - '%$SilverStripe\CMS\Model\SiteTree' diff --git a/client/dist/js/bundle.js b/client/dist/js/bundle.js index 45acbd6d..2477f0aa 100644 --- a/client/dist/js/bundle.js +++ b/client/dist/js/bundle.js @@ -1 +1 @@ -!function(){"use strict";var e={38:function(e,t,n){var a=i(n(420)),o=i(n(121));function i(e){return e&&e.__esModule?e:{default:e}}window.document.addEventListener("DOMContentLoaded",(()=>{(0,o.default)(),(0,a.default)()}))},121:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var a=i(n(207)),o=i(n(269));function i(e){return e&&e.__esModule?e:{default:e}}t.default=()=>{a.default.component.register("AnchorSelectorField",o.default)}},420:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var a=r(n(207)),o=n(367),i=r(n(796));function r(e){return e&&e.__esModule?e:{default:e}}t.default=()=>{a.default.reducer.register("cms",(0,o.combineReducers)({anchorSelector:i.default}))}},269:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default=t.ConnectedAnchorSelectorField=t.Component=void 0;var a=C(n(815)),o=C(n(594)),i=C(n(950)),r=n(40),s=n(367),l=n(381),d=C(n(898)),u=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var n=_(t);if(n&&n.has(e))return n.get(e);var a={__proto__:null},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var i in e)if("default"!==i&&{}.hasOwnProperty.call(e,i)){var r=o?Object.getOwnPropertyDescriptor(e,i):null;r&&(r.get||r.set)?Object.defineProperty(a,i,r):a[i]=e[i]}return a.default=e,n&&n.set(e,a),a}(n(979)),c=C(n(996)),f=C(n(623)),h=C(n(315)),p=C(n(657)),m=C(n(432)),g=C(n(304)),v=C(n(935));function _(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(_=function(e){return e?n:t})(e)}function C(e){return e&&e.__esModule?e:{default:e}}const b=()=>null;class w extends d.default{constructor(e){super(e),this.handleChange=this.handleChange.bind(this),this.handleLoadingError=this.handleLoadingError.bind(this)}componentDidMount(){this.ensurePagesLoaded()}componentDidUpdate(e){this.props.pageId!==e.pageId&&this.ensurePagesLoaded()}ensurePagesLoaded(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.props;if(e.loadingState===c.default.UPDATING||e.loadingState===c.default.SUCCESS||!e.pageId)return Promise.resolve();let t=[];e.loadingState===c.default.FIELD_ONLY&&(t=this.props.anchors),e.actions.anchorSelector.beginUpdating(e.pageId);const n=e.data.endpoint.replace(/:id/,e.pageId);return(0,i.default)(n,{credentials:"same-origin"}).then((e=>e.json())).then((n=>{const a=[...new Set([...n,...t])];return e.actions.anchorSelector.updated(e.pageId,a),a})).catch((t=>{e.actions.anchorSelector.updateFailed(e.pageId),this.handleLoadingError(t,e)}))}getDropdownOptions(){const e=this.props.anchors.map((e=>({value:e})));return this.props.value&&!this.props.anchors.find((e=>e===this.props.value))&&e.unshift({value:this.props.value}),e}handleChange(e){"function"==typeof this.props.onChange&&this.props.onChange(e?e.value:"")}handleLoadingError(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.props;if(t.onLoadingError===b)throw e;return t.onLoadingError({errors:[{value:e.message,type:"error"}]})}render(){const{extraClass:e,CreatableSelectComponent:t}=this.props,n=(0,g.default)("anchorselectorfield",e),i=this.getDropdownOptions(),r=this.props.value||"",s=a.default._t("CMS.ANCHOR_SELECT_OR_TYPE","Select or enter anchor");return o.default.createElement(p.default,null,o.default.createElement(t,{isSearchable:!0,isClearable:!0,options:i,className:n,name:this.props.name,onChange:this.handleChange,value:{value:r},noOptionsMessage:()=>a.default._t("CMS.ANCHOR_NO_OPTIONS","No options"),placeholder:s,getOptionLabel:e=>{let{value:t}=e;return t},classNamePrefix:"anchorselectorfield"}))}}t.Component=w,w.propTypes={extraClass:v.default.string,id:v.default.string,name:v.default.string.isRequired,onChange:v.default.func,value:v.default.string,attributes:v.default.oneOfType([v.default.object,v.default.array]),pageId:v.default.number,anchors:v.default.array,loadingState:v.default.oneOf(Object.keys(c.default).map((e=>c.default[e]))),onLoadingError:v.default.func,data:v.default.shape({endpoint:v.default.string,targetFieldName:v.default.string})},w.defaultProps={value:"",extraClass:"",onLoadingError:b,attributes:{},CreatableSelectComponent:h.default};const S=t.ConnectedAnchorSelectorField=(0,r.connect)((function(e,t){const n=(0,l.formValueSelector)(t.formid,m.default),a=t&&t.data&&t.data.targetFieldName||"PageID",o=Number(n(e,a)||0);let i=[];const r=o?e.cms.anchorSelector.pages.find((e=>e.id===o)):null;!r||r.loadingState!==c.default.SUCCESS&&r.loadingState!==c.default.DIRTY&&r.loadingState!==c.default.FIELD_ONLY||(i=r.anchors);let s=null;return s=r?r.loadingState:o?c.default.DIRTY:c.default.SUCCESS,{pageId:o,anchors:i,loadingState:s}}),(function(e){return{actions:{anchorSelector:(0,s.bindActionCreators)(u,e)}}}))(w);t.default=(0,f.default)(S)},586:function(e,t,n){var a;((a=n(669))&&a.__esModule?a:{default:a}).default.entwine("ss",(function(e){e(".TreeDropdownField").entwine({OldValue:null}),e("#Form_AddForm_ParentID_Holder .treedropdownfield").entwine({onmatch(){this._super(),e(".cms-add-form").updateTypeList()}}),e(".cms-add-form .parent-mode :input").entwine({onclick:function(e){var t=this.closest("form").find("#Form_AddForm_ParentID_Holder .TreeDropdownField");"top"==this.val()?(t.setOldValue(t.getValue()),t.setValue(0)):(t.setValue(t.getOldValue()||0),t.setOldValue(null)),t.refresh(),t.trigger("change")}}),e(".cms-add-form").entwine({ParentCache:{},onadd:function(){var t=this;this.find("#Form_AddForm_ParentID_Holder .TreeDropdownField").on("change",(function(){t.updateTypeList()})),this.find(".SelectionGroup.parent-mode").on("change",(function(){t.updateTypeList()})),"top"==e(".cms-add-form .parent-mode :input").val()&&this.updateTypeList()},loadCachedChildren:function(e){var t=this.getParentCache();return void 0!==t[e]?t[e]:null},saveCachedChildren:function(e,t){var n=this.getParentCache();n[e]=t,this.setParentCache(n)},updateTypeList:function(){var t=this.data("hints"),n=this.find("#Form_AddForm_ParentID"),a=this.find("input[name=ParentModeField]:checked").val(),o=n.data("metadata"),i="child"===a?n.getValue():null,r=o?o.ClassName:null,s=r&&"child"===a&&i?r:"Root",l=void 0!==t[s]?t[s]:null,d=this,u=l&&void 0!==l.defaultChild?l.defaultChild:null,c=[];if(i){if(this.hasClass("loading"))return;return this.addClass("loading"),null!==(c=this.loadCachedChildren(i))?(this.updateSelectionFilter(c,u),void this.removeClass("loading")):(e.ajax({url:d.data("childfilter"),data:{ParentID:i},success:function(e){d.saveCachedChildren(i,e),d.updateSelectionFilter(e,u)},complete:function(){d.removeClass("loading")}}),!1)}c=l&&void 0!==l.disallowedChildren?l.disallowedChildren:[],this.updateSelectionFilter(c,u)},updateSelectionFilter:function(t,n){var a=this.find("#Form_AddForm_PageType div.radio.selected")[0],o=!1,i=null;if(this.find("#Form_AddForm_PageType div.radio").each((function(n,r){var s=e(this).find("input").val(),l=-1===e.inArray(s,t);r===a&&l&&(o=!0),e(this).setEnabled(l),l||e(this).setSelected(!1),i=(null===i||i)&&l})),o)var r=e(a).parents("li:first");else if(n)r=this.find("#Form_AddForm_PageType div.radio input[value="+n+"]").parents("li:first");else r=this.find("#Form_AddForm_PageType div.radio:not(.disabled):first");r.setSelected(!0),r.siblings().setSelected(!1),this.find("#Form_AddForm_PageType div.radio:not(.disabled)").length?this.find("button[name=action_doAdd]").removeAttr("disabled"):this.find("button[name=action_doAdd]").attr("disabled","disabled"),this.find(".message-restricted")[i?"hide":"show"]()}}),e(".cms-add-form #Form_AddForm_PageType div.radio").entwine({onclick:function(e){this.setSelected(!0)},setSelected:function(e){var t=this.find("input");e&&!t.is(":disabled")?(this.siblings().setSelected(!1),this.toggleClass("selected",!0),t.prop("checked",!0)):(this.toggleClass("selected",!1),t.prop("checked",!1))},setEnabled:function(t){e(this).toggleClass("disabled",!t),t?e(this).find("input").removeAttr("disabled"):e(this).find("input").attr("disabled","disabled").removeAttr("checked")}}),e(".cms-content-addpage-button").entwine({onclick:function(t){var n,a=e(".cms-tree"),o=e(".cms-list"),i=0;if(a.is(":visible")){var r=a.jstree("get_selected");i=r?e(r[0]).data("id"):null}else{var s=o.find('input[name="Page[GridState]"]').val();s&&(i=parseInt(JSON.parse(s).ParentID,10))}var l,d={selector:this.data("targetPanel"),pjax:this.data("pjax")};i?(n=this.data("extraParams")?this.data("extraParams"):"",l=e.path.addSearchParams(i18n.sprintf(this.data("urlAddpage"),i),n)):l=this.attr("href"),e(".cms-container").loadPanel(l,null,d),t.preventDefault(),this.blur()}})}))},677:function(e,t,n){var a=r(n(669)),o=r(n(815)),i=r(n(216));function r(e){return e&&e.__esModule?e:{default:e}}a.default.entwine("ss",(function(e){e(".cms-edit-form :input#Form_EditForm_ClassName").entwine({onchange:function(){alert(o.default._t("CMS.ALERTCLASSNAME"))}}),e(".cms-edit-form input[name=Title]").entwine({onmatch:function(){var t=this;t.data("OrigVal",t.val());var n=t.closest("form"),a=e("input:text[name=URLSegment]",n),o=e("input[name=LiveLink]",n);a.length>0&&(t._addActions(),this.on("change",(function(n){var i=t.data("OrigVal"),r=t.val();t.data("OrigVal",r),0===a.val().indexOf(a.data("defaultUrl"))&&""==o.val()?t.updateURLSegment(r):e(".update",t.parent()).show().parent(".form__field-holder").addClass("input-group"),t.updateRelatedFields(r,i),t.updateBreadcrumbLabel(r)}))),this._super()},onunmatch:function(){this._super()},updateRelatedFields:function(t,n){this.parents("form").find("input[name=MetaTitle], input[name=MenuTitle]").each((function(){var a=e(this);a.val()==n&&(a.val(t),a.updatedRelatedFields&&a.updatedRelatedFields())}))},updateURLSegment:function(t){var n=e("input:text[name=URLSegment]",this.closest("form")).closest(".field.urlsegment"),a=e(".update",this.parent());n.update(t),a.is(":visible")&&a.hide().parent(".form__field-holder").removeClass("input-group")},updateBreadcrumbLabel:function(t){e(".cms-edit-form input[name=ID]").val();var n=e("span.cms-panel-link.crumb");t&&""!=t&&n.text(t)},_addActions:function(){var t,n=this;(t=e(" + <% end_if %> diff --git a/templates/SilverStripe/CMS/Controllers/Includes/CMSMain_LeftPanel.ss b/templates/SilverStripe/CMS/Controllers/Includes/CMSMain_LeftPanel.ss new file mode 100644 index 00000000..12e1feba --- /dev/null +++ b/templates/SilverStripe/CMS/Controllers/Includes/CMSMain_LeftPanel.ss @@ -0,0 +1,24 @@ +
+
+ <% if $TreeIsFiltered %> + <% include SilverStripe\\Admin\\BackLink_Button Backlink=$BreadcrumbsBacklink %> + <% end_if %> + <% if $CurrentRecord %> + <%-- Explicit breadcrumb item for this menu section --%> +
+ +
+ <% else %> + <%-- Full breadcrumbs (useful for tree view which isn't available when viewing an edit form) --%> + <% include SilverStripe\\Admin\\CMSBreadcrumbs %> + <% end_if %> + <% include SilverStripe\\CMS\\Controllers\\CMSMain_Filter %> +
+
+ +
+
+
+
+ $RecordList +
diff --git a/templates/SilverStripe/CMS/Controllers/Includes/CMSMain_ListView.ss b/templates/SilverStripe/CMS/Controllers/Includes/CMSMain_ListView.ss index aed42dfe..e9257f35 100644 --- a/templates/SilverStripe/CMS/Controllers/Includes/CMSMain_ListView.ss +++ b/templates/SilverStripe/CMS/Controllers/Includes/CMSMain_ListView.ss @@ -1,6 +1,6 @@ -<% include SilverStripe\\CMS\\Controllers\\CMSPagesController_ContentToolActions %> +<% include SilverStripe\\CMS\\Controllers\\CMSMain_ContentToolActions %> -
+
$AddForm
diff --git a/templates/SilverStripe/CMS/Controllers/Includes/CMSMain_PageList_Sidebar.ss b/templates/SilverStripe/CMS/Controllers/Includes/CMSMain_PageList_Sidebar.ss deleted file mode 100644 index 296f8a6e..00000000 --- a/templates/SilverStripe/CMS/Controllers/Includes/CMSMain_PageList_Sidebar.ss +++ /dev/null @@ -1 +0,0 @@ -<% include SilverStripe\\CMS\\Controllers\\CMSMain_PageList %> diff --git a/templates/SilverStripe/CMS/Controllers/Includes/CMSMain_PageList.ss b/templates/SilverStripe/CMS/Controllers/Includes/CMSMain_RecordList.ss similarity index 100% rename from templates/SilverStripe/CMS/Controllers/Includes/CMSMain_PageList.ss rename to templates/SilverStripe/CMS/Controllers/Includes/CMSMain_RecordList.ss diff --git a/templates/SilverStripe/CMS/Controllers/Includes/CMSMain_SubTree.ss b/templates/SilverStripe/CMS/Controllers/Includes/CMSMain_SubTree.ss index 34140b29..740124ae 100644 --- a/templates/SilverStripe/CMS/Controllers/Includes/CMSMain_SubTree.ss +++ b/templates/SilverStripe/CMS/Controllers/Includes/CMSMain_SubTree.ss @@ -4,7 +4,7 @@ <% if $limited %> diff --git a/templates/SilverStripe/CMS/Controllers/Includes/CMSMain_Tools.ss b/templates/SilverStripe/CMS/Controllers/Includes/CMSMain_Tools.ss index d3d94aeb..356780a7 100644 --- a/templates/SilverStripe/CMS/Controllers/Includes/CMSMain_Tools.ss +++ b/templates/SilverStripe/CMS/Controllers/Includes/CMSMain_Tools.ss @@ -1,26 +1,13 @@ -
-
-
- - <% include SilverStripe\\CMS\\Controllers\\CMSMain_Filter %> +<%-- If we're editing a record, include the left panel and allow it to be collapsed --%> +<% if $CurrentRecord %> +
+ <% include SilverStripe\\CMS\\Controllers\\CMSMain_LeftPanel %> +
+

$CMSTreeTitle

+
+
+ » + «
-
-
-
-
- $PageListSidebar -
-
-

$SiteConfig.Title

-
-
- » - « -
-
+<% end_if %> diff --git a/templates/SilverStripe/CMS/Controllers/Includes/CMSMain_TreeNode.ss b/templates/SilverStripe/CMS/Controllers/Includes/CMSMain_TreeNode.ss index 3a3f0e8b..12c8d361 100644 --- a/templates/SilverStripe/CMS/Controllers/Includes/CMSMain_TreeNode.ss +++ b/templates/SilverStripe/CMS/Controllers/Includes/CMSMain_TreeNode.ss @@ -1,6 +1,6 @@
  •     - {$node.TreeTitle} + {$RecordTreeMarkup($node)} $SubTree
  • diff --git a/templates/SilverStripe/CMS/Controllers/Includes/CMSMain_TreeView.ss b/templates/SilverStripe/CMS/Controllers/Includes/CMSMain_TreeView.ss index d28b1e84..05fc7dd2 100644 --- a/templates/SilverStripe/CMS/Controllers/Includes/CMSMain_TreeView.ss +++ b/templates/SilverStripe/CMS/Controllers/Includes/CMSMain_TreeView.ss @@ -1,6 +1,6 @@ -<% include SilverStripe\\CMS\\Controllers\\CMSPagesController_ContentToolActions View='Tree' %> +<% include SilverStripe\\CMS\\Controllers\\CMSMain_ContentToolActions View='Tree' %> -
    +
    $AddForm
    @@ -17,15 +17,15 @@ $ExtraTreeTools data-url-tree="$LinkWithSearch($Link('getsubtree')).ATT" data-url-savetreenode="$Link('savetreenode').ATT" data-url-updatetreenodes="$Link('updatetreenodes').ATT" - data-url-addpage="{$LinkPageAdd('AddForm/?action_doAdd=1', 'ParentID=%s&PageType=%s').ATT}" - data-url-editpage="$LinkPageEdit('%s').ATT" + data-url-addpage="{$LinkRecordAdd('AddForm/?action_doAdd=1', 'ParentID=%s&RecordType=%s').ATT}" + data-url-editpage="$LinkRecordEdit('%s').ATT" data-url-duplicate="{$Link('duplicate/%s').ATT}" data-url-duplicatewithchildren="{$Link('duplicatewithchildren/%s').ATT}" data-url-listview="{$Link('?view=list').ATT}" - data-hints="$SiteTreeHints.ATT" + data-hints="$TreeHints.ATT" data-childfilter="$Link('childfilter').ATT" data-extra-params="SecurityID=$SecurityID.ATT"> - $SiteTreeAsUL + $TreeAsUL
    <% else %> @@ -33,14 +33,14 @@ $ExtraTreeTools data-url-tree="$LinkWithSearch($Link('getsubtree')).ATT" data-url-savetreenode="$Link('savetreenode').ATT" data-url-updatetreenodes="$Link('updatetreenodes').ATT" - data-url-addpage="{$LinkPageAdd('AddForm/?action_doAdd=1', 'ParentID=%s&PageType=%s').ATT}" - data-url-editpage="$LinkPageEdit('%s').ATT" + data-url-addpage="{$LinkRecordAdd('AddForm/?action_doAdd=1', 'ParentID=%s&RecordType=%s').ATT}" + data-url-editpage="$LinkRecordEdit('%s').ATT" data-url-duplicate="{$Link('duplicate/%s').ATT}" data-url-duplicatewithchildren="{$Link('duplicatewithchildren/%s').ATT}" data-url-listview="{$Link('?view=list').ATT}" - data-hints="$SiteTreeHints.ATT" + data-hints="$TreeHints.ATT" data-childfilter="$Link('childfilter').ATT" data-extra-params="SecurityID=$SecurityID.ATT"> - $SiteTreeAsUL + $TreeAsUL
    <% end_if %> diff --git a/templates/SilverStripe/CMS/Controllers/Includes/CMSMain_ViewControls.ss b/templates/SilverStripe/CMS/Controllers/Includes/CMSMain_ViewControls.ss index c9709e9a..a91c4806 100644 --- a/templates/SilverStripe/CMS/Controllers/Includes/CMSMain_ViewControls.ss +++ b/templates/SilverStripe/CMS/Controllers/Includes/CMSMain_ViewControls.ss @@ -1,18 +1,18 @@
    <% if not $TreeIsFiltered %> - <%-- Change to data-pjax-target="Content-PageList" to enable in-edit listview --%> + <%-- Change to data-pjax-target="Content-RecordList" to enable in-edit listview --%> <% end_if %>
    diff --git a/templates/SilverStripe/CMS/Controllers/Includes/CMSPageAddController_Content.ss b/templates/SilverStripe/CMS/Controllers/Includes/CMSPageAddController_Content.ss deleted file mode 100644 index b8e50ac9..00000000 --- a/templates/SilverStripe/CMS/Controllers/Includes/CMSPageAddController_Content.ss +++ /dev/null @@ -1,45 +0,0 @@ -
    - <% with $AddForm %> -
    -
    -
    - -
    -
    - -
    - <% if $Message %> -

    $Message

    - <% else %> - - <% end_if %> - -
    - <% if $Legend %>$Legend<% end_if %> - <% loop $Fields %> - $FieldHolder - <% end_loop %> -
    -
    - -
    - <% if $Actions %> -
    - <% loop $Actions %> - $Field - <% end_loop %> -
    - <% end_if %> -
    -
    - <% end_with %> -
    diff --git a/templates/SilverStripe/CMS/Controllers/Includes/CMSPagesController_Content.ss b/templates/SilverStripe/CMS/Controllers/Includes/CMSPagesController_Content.ss deleted file mode 100644 index 956e7536..00000000 --- a/templates/SilverStripe/CMS/Controllers/Includes/CMSPagesController_Content.ss +++ /dev/null @@ -1,18 +0,0 @@ -
    -
    -
    - <% if $TreeIsFiltered %> - - <%t SilverStripe\Admin\LeftAndMain.NavigateUp "Return to Pages" %> - - <% end_if %> - <% include SilverStripe\\Admin\\CMSBreadcrumbs %> - <% include SilverStripe\\CMS\\Controllers\\CMSMain_Filter %> -
    -
    - -
    - $Tools - $PageList -
    -
    diff --git a/templates/SilverStripe/CMS/Controllers/Includes/CMSPagesController_Tools.ss b/templates/SilverStripe/CMS/Controllers/Includes/CMSPagesController_Tools.ss deleted file mode 100644 index d82c105f..00000000 --- a/templates/SilverStripe/CMS/Controllers/Includes/CMSPagesController_Tools.ss +++ /dev/null @@ -1,3 +0,0 @@ -
    -
    -
    diff --git a/tests/php/Controllers/CMSMainTest.php b/tests/php/Controllers/CMSMainTest.php index 205166b4..481ba660 100644 --- a/tests/php/Controllers/CMSMainTest.php +++ b/tests/php/Controllers/CMSMainTest.php @@ -44,15 +44,15 @@ class CMSMainTest extends FunctionalTest } } - public function testSiteTreeHints() + public function testTreeHints() { - $cache = Injector::inst()->get(CacheInterface::class . '.CMSMain_SiteTreeHints'); + $cache = Injector::inst()->get(CacheInterface::class . '.CMSMain_TreeHints'); // Login as user with root creation privileges $user = $this->objFromFixture(Member::class, 'rootedituser'); Security::setCurrentUser($user); $cache->clear(); - $rawHints = singleton(CMSMain::class)->SiteTreeHints(); + $rawHints = singleton(CMSMain::class)->TreeHints(); $this->assertNotNull($rawHints); $rawHints = preg_replace('/^"(.*)"$/', '$1', Convert::xml2raw($rawHints) ?? ''); @@ -423,7 +423,7 @@ class CMSMainTest extends FunctionalTest ); $jsonStr = $response->getBody(); $data = json_decode($jsonStr, true); - + $parser = new CSSContentParser($data['Breadcrumbs']); $crumbs = $parser->getBySelector('.breadcrumbs-wrapper .crumb'); @@ -611,7 +611,7 @@ class CMSMainTest extends FunctionalTest $this->assertEquals('Class A', $newPage->Title); } - public function testSiteTreeHintsCache() + public function testTreeHintsCache() { $cms = CMSMain::create(); /** @var Member $user */ @@ -635,31 +635,31 @@ class CMSMainTest extends FunctionalTest // Initially, cache misses (1) Injector::inst()->registerService($mockPageMissesCache, $pageClass); - $hints = $cms->SiteTreeHints(); + $hints = $cms->TreeHints(); $this->assertNotNull($hints); // Now it hits Injector::inst()->registerService($mockPageHitsCache, $pageClass); - $hints = $cms->SiteTreeHints(); + $hints = $cms->TreeHints(); $this->assertNotNull($hints); // Mutating member record invalidates cache. Misses (2) $user->FirstName = 'changed'; $user->write(); Injector::inst()->registerService($mockPageMissesCache, $pageClass); - $hints = $cms->SiteTreeHints(); + $hints = $cms->TreeHints(); $this->assertNotNull($hints); // Now it hits again Injector::inst()->registerService($mockPageHitsCache, $pageClass); - $hints = $cms->SiteTreeHints(); + $hints = $cms->TreeHints(); $this->assertNotNull($hints); // Different user. Misses. (3) $user = $this->objFromFixture(Member::class, 'allcmssectionsuser'); Security::setCurrentUser($user); Injector::inst()->registerService($mockPageMissesCache, $pageClass); - $hints = $cms->SiteTreeHints(); + $hints = $cms->TreeHints(); $this->assertNotNull($hints); } @@ -703,21 +703,21 @@ class CMSMainTest extends FunctionalTest ); } - public function testCanOrganiseSitetree() + public function testCanOrganiseTree() { $cms = CMSMain::create(); - $this->assertFalse($cms->CanOrganiseSitetree()); + $this->assertFalse($cms->CanOrganiseTree()); $this->logInWithPermission('CMS_ACCESS_CMSMain'); - $this->assertFalse($cms->CanOrganiseSitetree()); + $this->assertFalse($cms->CanOrganiseTree()); $this->logOut(); $this->logInWithPermission('SITETREE_REORGANISE'); - $this->assertTrue($cms->CanOrganiseSitetree()); + $this->assertTrue($cms->CanOrganiseTree()); $this->logOut(); $this->logInWithPermission('ADMIN'); - $this->assertTrue($cms->CanOrganiseSitetree()); + $this->assertTrue($cms->CanOrganiseTree()); } } diff --git a/tests/php/Controllers/CMSSiteTreeFilterTest.php b/tests/php/Controllers/CMSSiteTreeFilterTest.php index bf2a9253..9eefb1ce 100644 --- a/tests/php/Controllers/CMSSiteTreeFilterTest.php +++ b/tests/php/Controllers/CMSSiteTreeFilterTest.php @@ -24,8 +24,8 @@ class CMSSiteTreeFilterTest extends SapphireTest $f = new CMSSiteTreeFilter_Search(); $results = $f->pagesIncluded(); - $this->assertTrue($f->isPageIncluded($page1)); - $this->assertTrue($f->isPageIncluded($page2)); + $this->assertTrue($f->isRecordIncluded($page1)); + $this->assertTrue($f->isRecordIncluded($page2)); } public function testSearchFilterByTitle() @@ -36,8 +36,8 @@ class CMSSiteTreeFilterTest extends SapphireTest $f = new CMSSiteTreeFilter_Search(['Title' => 'Page 1']); $results = $f->pagesIncluded(); - $this->assertTrue($f->isPageIncluded($page1)); - $this->assertFalse($f->isPageIncluded($page2)); + $this->assertTrue($f->isRecordIncluded($page1)); + $this->assertFalse($f->isRecordIncluded($page2)); $this->assertEquals(1, count($results ?? [])); $this->assertEquals( ['ID' => $page1->ID, 'ParentID' => 0], @@ -50,10 +50,10 @@ class CMSSiteTreeFilterTest extends SapphireTest $page = $this->objFromFixture(SiteTree::class, 'page8'); $filter = CMSSiteTreeFilter_Search::create(['Term' => 'lake-wanaka+adventure']); - $this->assertTrue($filter->isPageIncluded($page)); + $this->assertTrue($filter->isRecordIncluded($page)); $filter = CMSSiteTreeFilter_Search::create(['URLSegment' => 'lake-wanaka+adventure']); - $this->assertTrue($filter->isPageIncluded($page)); + $this->assertTrue($filter->isRecordIncluded($page)); } public function testIncludesParentsForNestedMatches() @@ -64,8 +64,8 @@ class CMSSiteTreeFilterTest extends SapphireTest $f = new CMSSiteTreeFilter_Search(['Title' => 'Page 3b']); $results = $f->pagesIncluded(); - $this->assertTrue($f->isPageIncluded($parent)); - $this->assertTrue($f->isPageIncluded($child)); + $this->assertTrue($f->isRecordIncluded($parent)); + $this->assertTrue($f->isRecordIncluded($child)); $this->assertEquals(1, count($results ?? [])); $this->assertEquals( ['ID' => $child->ID, 'ParentID' => $parent->ID], @@ -91,8 +91,8 @@ class CMSSiteTreeFilterTest extends SapphireTest $f = new CMSSiteTreeFilter_ChangedPages(['Term' => 'Changed']); $results = $f->pagesIncluded(); - $this->assertTrue($f->isPageIncluded($changedPage)); - $this->assertFalse($f->isPageIncluded($unchangedPage)); + $this->assertTrue($f->isRecordIncluded($changedPage)); + $this->assertFalse($f->isRecordIncluded($unchangedPage)); $this->assertEquals(1, count($results ?? [])); $this->assertEquals( ['ID' => $changedPage->ID, 'ParentID' => 0], @@ -130,11 +130,11 @@ class CMSSiteTreeFilterTest extends SapphireTest ); $f = new CMSSiteTreeFilter_DeletedPages(['Term' => 'Page']); - $this->assertTrue($f->isPageIncluded($deletedPage)); + $this->assertTrue($f->isRecordIncluded($deletedPage)); // Check that only changed pages are returned $f = new CMSSiteTreeFilter_DeletedPages(['Term' => 'No Matches']); - $this->assertFalse($f->isPageIncluded($deletedPage)); + $this->assertFalse($f->isRecordIncluded($deletedPage)); } public function testStatusDraftPagesFilter() @@ -148,16 +148,16 @@ class CMSSiteTreeFilterTest extends SapphireTest // Check draft page is shown $f = new CMSSiteTreeFilter_StatusDraftPages(['Term' => 'Page']); - $this->assertTrue($f->isPageIncluded($draftPage)); + $this->assertTrue($f->isRecordIncluded($draftPage)); // Check filter respects parameters $f = new CMSSiteTreeFilter_StatusDraftPages(['Term' => 'No Match']); - $this->assertEmpty($f->isPageIncluded($draftPage)); + $this->assertEmpty($f->isRecordIncluded($draftPage)); // Ensures empty array returned if no data to show $f = new CMSSiteTreeFilter_StatusDraftPages(); $draftPage->delete(); - $this->assertEmpty($f->isPageIncluded($draftPage)); + $this->assertEmpty($f->isRecordIncluded($draftPage)); } public function testDateFromToLastSameDate() @@ -171,7 +171,7 @@ class CMSSiteTreeFilterTest extends SapphireTest 'LastEditedTo' => $date, ]); $this->assertTrue( - $filter->isPageIncluded($draftPage), + $filter->isRecordIncluded($draftPage), 'Using the same date for from and to should show find that page' ); } @@ -189,16 +189,16 @@ class CMSSiteTreeFilterTest extends SapphireTest // Check live-only page is included $f = new CMSSiteTreeFilter_StatusRemovedFromDraftPages(['LastEditedFrom' => '2000-01-01 00:00']); - $this->assertTrue($f->isPageIncluded($removedDraftPage)); + $this->assertTrue($f->isRecordIncluded($removedDraftPage)); // Check filter is respected $f = new CMSSiteTreeFilter_StatusRemovedFromDraftPages(['LastEditedTo' => '1999-01-01 00:00']); - $this->assertEmpty($f->isPageIncluded($removedDraftPage)); + $this->assertEmpty($f->isRecordIncluded($removedDraftPage)); // Ensures empty array returned if no data to show $f = new CMSSiteTreeFilter_StatusRemovedFromDraftPages(); $removedDraftPage->delete(); - $this->assertEmpty($f->isPageIncluded($removedDraftPage)); + $this->assertEmpty($f->isRecordIncluded($removedDraftPage)); } public function testStatusDeletedFilter() @@ -214,10 +214,10 @@ class CMSSiteTreeFilterTest extends SapphireTest // Check deleted page is included $f = new CMSSiteTreeFilter_StatusDeletedPages(['Title' => 'Page']); - $this->assertTrue($f->isPageIncluded($checkParentExists)); + $this->assertTrue($f->isRecordIncluded($checkParentExists)); // Check filter is respected $f = new CMSSiteTreeFilter_StatusDeletedPages(['Title' => 'Bobby']); - $this->assertFalse($f->isPageIncluded($checkParentExists)); + $this->assertFalse($f->isRecordIncluded($checkParentExists)); } } diff --git a/tests/php/Model/SiteTreeTest.php b/tests/php/Model/SiteTreeTest.php index 29476014..e482a60e 100644 --- a/tests/php/Model/SiteTreeTest.php +++ b/tests/php/Model/SiteTreeTest.php @@ -1413,6 +1413,7 @@ class SiteTreeTest extends SapphireTest public function testModifyStatusFlagByInheritance() { + //@todo move this to CMSMain test $node = new SiteTreeTest_StageStatusInherit(); $treeTitle = $node->getTreeTitle(); $this->assertStringContainsString('InheritedTitle', $treeTitle);