diff --git a/_config/config.yml b/_config/config.yml index e9fdc92..a503696 100644 --- a/_config/config.yml +++ b/_config/config.yml @@ -61,3 +61,8 @@ SilverStripe\Forms\FieldList: extensions: - SilverWare\Extensions\Forms\StatusMessageExtension +# Paginated List Extensions: + +SilverStripe\ORM\PaginatedList: + extensions: + - SilverWare\Extensions\Model\PaginatedListExtension diff --git a/client/dist/styles/bundle.css b/client/dist/styles/bundle.css index 8de08b1..4f56c90 100644 --- a/client/dist/styles/bundle.css +++ b/client/dist/styles/bundle.css @@ -1 +1 @@ -.baselistcomponent .items>article.item{margin-bottom:2rem}.baselistcomponent .items>article.item>div.image{position:relative}.baselistcomponent .items>article.item>div.image a{display:block}.baselistcomponent .items>article.item>div.image div.image-overlay{top:0;left:0;right:0;bottom:0;width:100%;height:100%;opacity:0;overflow:hidden;position:absolute;-webkit-transition:.5s ease;transition:.5s ease;background-color:rgba(33,37,41,.5)}.baselistcomponent .items>article.item>div.image div.image-overlay>div.inner{top:50%;left:0;width:100%;position:absolute;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.baselistcomponent .items>article.item>div.image div.image-overlay>div.inner>div.icon{font-size:32px;text-align:center;color:#fff}.baselistcomponent .items>article.item>div.image div.image-overlay>div.inner>div.text{text-align:center;padding:0 1rem}.baselistcomponent .items>article.item>div.image div.image-overlay>div.inner>div.text>*{margin:0;padding:0;font-size:1.25rem;color:#fff}.baselistcomponent .items>article.item>div.image:hover div.image-overlay,.baselistcomponent .items>article.item>div.image a:focus div.image-overlay{opacity:1}.baselistcomponent .items>article.item>section.content{margin-top:1rem}.baselistcomponent .items>article.item>section.content header{margin-bottom:.5rem}.baselistcomponent .items>article.item>section.content header>*{margin-bottom:0}.baselistcomponent .items>article.item>section.content header a{color:inherit}.baselistcomponent .items>article.item>section.content div.details{color:#868e96}.baselistcomponent .items>article.item>section.content div.details>span{margin-right:.5rem}.baselistcomponent .items>article.item>section.content div.details a{color:inherit}.baselistcomponent .items>article.item>section.content footer{margin-top:1rem}.baselistcomponent .items>article.item>section.content>div{margin-bottom:.5rem}.featurecomponent article.feature>a.feature{display:block;text-decoration:none;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out}.featurecomponent article.feature>a.feature:focus,.featurecomponent article.feature>a.feature:hover{text-decoration:none}.featurecomponent article.feature div.icon{margin-bottom:.5rem}.featurecomponent article.feature div.summary>p:last-child{margin-bottom:0}.featurecomponent article.feature footer{margin-top:1rem}.imagecomponent figure{width:100%;margin-bottom:0}.imagecomponent figure>figcaption>p:last-child{margin-bottom:0}.imagecomponent a.image{display:block}@media (min-width:768px){.listcomponent .items>article.item{display:block}.listcomponent .items.image-align-left>article.item,.listcomponent .items.image-align-right>article.item,.listcomponent .items.image-align-stagger>article.item{display:-webkit-box;display:-ms-flexbox;display:flex}.listcomponent .items.image-align-left>article.item>div.image,.listcomponent .items.image-align-right>article.item>div.image,.listcomponent .items.image-align-stagger>article.item>div.image{margin-bottom:0}.listcomponent .items.image-align-left>article.item.has-image>div.image,.listcomponent .items.image-align-stagger>article.item.has-image:nth-child(odd)>div.image{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.listcomponent .items.image-align-left>article.item.has-image>section.content,.listcomponent .items.image-align-stagger>article.item.has-image:nth-child(odd)>section.content{-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;margin-left:1rem}.listcomponent .items.image-align-right>article.item.has-image>div.image,.listcomponent .items.image-align-stagger>article.item.has-image:nth-child(2n)>div.image,.listcomponent .items>div.image{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.listcomponent .items.image-align-right>article.item.has-image>section.content,.listcomponent .items.image-align-stagger>article.item.has-image:nth-child(2n)>section.content,.listcomponent .items>section.content{-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1;margin-right:1rem}}.mediacomponent figure{width:100%;margin-bottom:0}.mediacomponent figure>figcaption>p:last-child{margin-bottom:0}.mediacomponent a.text{display:block}.mediacomponent a.text:hover{text-decoration:none}.mediacomponent a.text:hover span{text-decoration:underline}.mediacomponent a.text>i.fa{color:#868e96}.mediacomponent a.image{display:block}.mediacomponent a.image+a.text{margin-top:.5rem}.mediacomponent .rich>iframe{margin:0!important}.mediacomponent .video{width:100%;height:0;display:block;position:relative}.mediacomponent .video.four-three{padding-bottom:75%}.mediacomponent .video.sixteen-nine{padding-bottom:56.25%}.mediacomponent .video>iframe{top:0;left:0;border:0;width:100%;height:100%;position:absolute}.pagecomponent.page-title-hidden .content-container>article>header{display:none}.pagecomponent .content-container>article>div{margin-bottom:1rem}.scrolltotopbutton{opacity:0;outline:0;right:1rem;bottom:1rem;width:4rem;height:4rem;z-index:1000;position:fixed;display:block;overflow:hidden;visibility:hidden;white-space:nowrap;text-align:center;font-size:16px;line-height:4rem;-webkit-box-shadow:0 0 20px rgba(0,0,0,.2);box-shadow:0 0 20px rgba(0,0,0,.2);-webkit-transition:opacity .3s 0s,visibility 0s .3s,color .15s ease-in-out 0s,background-color .15s ease-in-out 0s;transition:opacity .3s 0s,visibility 0s .3s,color .15s ease-in-out 0s,background-color .15s ease-in-out 0s}.scrolltotopbutton.is-visible{opacity:1;visibility:visible}.scrolltotopbutton.fade-out{opacity:.5}.scrolltotopbutton:hover{opacity:1}@media (min-width:768px){.scrolltotopbutton{width:5rem;height:5rem;right:2rem;bottom:2rem;line-height:5rem}}@media (min-width:992px){.scrolltotopbutton{width:6rem;height:6rem;font-size:20px;line-height:6rem}}.tilecomponent .items{-webkit-box-orient:horizontal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch}.tilecomponent .items,.tilecomponent .items>article.item{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-direction:normal}.tilecomponent .items>article.item{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;-webkit-box-flex:1;-ms-flex:1 100%;flex:1 100%;padding:2%}.tilecomponent .items>article.item>section.content{margin-top:auto}.tilecomponent .items>article.item>section.content div.details>span{display:block;margin-right:0;margin-bottom:.25rem}@media (min-width:576px){.tilecomponent .items>article.item{-webkit-box-flex:1;-ms-flex:1 50%;flex:1 50%}}@media (min-width:768px){.tilecomponent .items>article.item{-webkit-box-flex:1;-ms-flex:1 33.3%;flex:1 33.3%}}@media (min-width:992px){.tilecomponent .items>article.item{-webkit-box-flex:1;-ms-flex:1 25%;flex:1 25%}}div.detail-fields a{color:inherit}div.detail-fields>ul{margin:0;padding:0;list-style:none}div.detail-fields>ul>li>dl,div.detail-fields>ul>li>dl>dd{margin:0;padding:0}div.detail-fields.block>ul>li{margin-bottom:1rem}div.detail-fields.block>ul>li dl dt{font-size:1rem;font-weight:700}div.detail-fields.block>ul>li dl dd{font-size:1rem}div.detail-fields.inline>ul>li{color:#868e96;display:inline-block;margin-right:.5rem}div.detail-fields.inline>ul>li dl dd,div.detail-fields.inline>ul>li dl dt{display:inline-block;font-size:1rem}div.detail-fields.hide-header>header,div.detail-fields.hide-icons>ul>li dl>dt>i,div.detail-fields.hide-names>ul>li dl>dt>span.name{display:none}.component.link{text-decoration:none}.component.link,.component.link>i.fa{display:inline-block}.component.link:active,.component.link:focus,.component.link:hover{text-decoration:none}.show-icons.hide-text .component.link{overflow:hidden;text-align:center;-webkit-transition:color .15s ease-in-out 0s,background-color .15s ease-in-out 0s,border-color .15s ease-in-out 0s;transition:color .15s ease-in-out 0s,background-color .15s ease-in-out 0s,border-color .15s ease-in-out 0s}.show-icons.hide-text .component.link>i.fa{display:block}.show-icons.hide-text .component.link.size-16{width:16px;height:16px;font-size:8px;line-height:16px}.show-icons.hide-text .component.link.size-16>i.fa{top:50%;position:relative;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.show-icons.hide-text .component.link.size-24{width:24px;height:24px;font-size:12px;line-height:24px}.show-icons.hide-text .component.link.size-24>i.fa{top:50%;position:relative;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.show-icons.hide-text .component.link.size-32{width:32px;height:32px;font-size:16px;line-height:32px}.show-icons.hide-text .component.link.size-32>i.fa{top:50%;position:relative;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.show-icons.hide-text .component.link.size-48{width:48px;height:48px;font-size:24px;line-height:48px}.show-icons.hide-text .component.link.size-48>i.fa{top:50%;position:relative;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.show-icons.hide-text .component.link.size-64{width:64px;height:64px;font-size:32px;line-height:64px}.show-icons.hide-text .component.link.size-64>i.fa{top:50%;position:relative;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.show-icons.hide-text .component.link.size-96{width:96px;height:96px;font-size:48px;line-height:96px}.show-icons.hide-text .component.link.size-96>i.fa{top:50%;position:relative;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.show-icons.hide-text .component.link.size-128{width:128px;height:128px;font-size:64px;line-height:128px}.show-icons.hide-text .component.link.size-128>i.fa{top:50%;position:relative;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.hide-icons .component.link>i.fa,.hide-text .component.link>span.text{display:none}.component.slide .slide-caption.title-after>h1,.component.slide .slide-caption.title-after>h2,.component.slide .slide-caption.title-after>h3,.component.slide .slide-caption.title-after>h4,.component.slide .slide-caption.title-after>h5,.component.slide .slide-caption.title-after>h6{margin-bottom:0} \ No newline at end of file +.baselistcomponent .items>article.item{margin-bottom:2rem}.baselistcomponent .items>article.item:last-child{margin-bottom:0}.baselistcomponent .items>article.item>div.image{position:relative}.baselistcomponent .items>article.item>div.image a{display:block}.baselistcomponent .items>article.item>div.image div.image-overlay{top:0;left:0;right:0;bottom:0;width:100%;height:100%;opacity:0;overflow:hidden;position:absolute;-webkit-transition:.5s ease;transition:.5s ease;background-color:rgba(33,37,41,.5)}.baselistcomponent .items>article.item>div.image div.image-overlay>div.inner{top:50%;left:0;width:100%;position:absolute;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.baselistcomponent .items>article.item>div.image div.image-overlay>div.inner>div.icon{font-size:32px;text-align:center;color:#fff}.baselistcomponent .items>article.item>div.image div.image-overlay>div.inner>div.text{text-align:center;padding:0 1rem}.baselistcomponent .items>article.item>div.image div.image-overlay>div.inner>div.text>*{margin:0;padding:0;font-size:1.25rem;color:#fff}.baselistcomponent .items>article.item>div.image:hover div.image-overlay,.baselistcomponent .items>article.item>div.image a:focus div.image-overlay{opacity:1}.baselistcomponent .items>article.item>section.content{margin-top:1rem}.baselistcomponent .items>article.item>section.content header{margin-bottom:.5rem}.baselistcomponent .items>article.item>section.content header>*{margin-bottom:0}.baselistcomponent .items>article.item>section.content header a{color:inherit}.baselistcomponent .items>article.item>section.content div.details{color:#868e96}.baselistcomponent .items>article.item>section.content div.details>span{margin-right:.5rem}.baselistcomponent .items>article.item>section.content div.details a{color:inherit}.baselistcomponent .items>article.item>section.content footer{margin-top:1rem}.baselistcomponent .items>article.item>section.content>div{margin-bottom:.5rem}.baselistcomponent ul.pagination{margin-top:2rem;margin-bottom:0}.featurecomponent article.feature>a.feature{display:block;text-decoration:none;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out}.featurecomponent article.feature>a.feature:focus,.featurecomponent article.feature>a.feature:hover{text-decoration:none}.featurecomponent article.feature div.icon{margin-bottom:.5rem}.featurecomponent article.feature div.summary>p:last-child{margin-bottom:0}.featurecomponent article.feature footer{margin-top:1rem}.imagecomponent figure{width:100%;margin-bottom:0}.imagecomponent figure>figcaption>p:last-child{margin-bottom:0}.imagecomponent a.image{display:block}@media (min-width:768px){.listcomponent .items>article.item{display:block}.listcomponent .items.image-align-left>article.item,.listcomponent .items.image-align-right>article.item,.listcomponent .items.image-align-stagger>article.item{display:-webkit-box;display:-ms-flexbox;display:flex}.listcomponent .items.image-align-left>article.item>div.image,.listcomponent .items.image-align-right>article.item>div.image,.listcomponent .items.image-align-stagger>article.item>div.image{margin-bottom:0}.listcomponent .items.image-align-left>article.item.has-image>div.image,.listcomponent .items.image-align-stagger>article.item.has-image:nth-child(odd)>div.image{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.listcomponent .items.image-align-left>article.item.has-image>section.content,.listcomponent .items.image-align-stagger>article.item.has-image:nth-child(odd)>section.content{-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;margin-left:1rem}.listcomponent .items.image-align-right>article.item.has-image>div.image,.listcomponent .items.image-align-stagger>article.item.has-image:nth-child(2n)>div.image,.listcomponent .items>div.image{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.listcomponent .items.image-align-right>article.item.has-image>section.content,.listcomponent .items.image-align-stagger>article.item.has-image:nth-child(2n)>section.content,.listcomponent .items>section.content{-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1;margin-right:1rem}}.mediacomponent figure{width:100%;margin-bottom:0}.mediacomponent figure>figcaption>p:last-child{margin-bottom:0}.mediacomponent a.text{display:block}.mediacomponent a.text:hover{text-decoration:none}.mediacomponent a.text:hover span{text-decoration:underline}.mediacomponent a.text>i.fa{color:#868e96}.mediacomponent a.image{display:block}.mediacomponent a.image+a.text{margin-top:.5rem}.mediacomponent .rich>iframe{margin:0!important}.mediacomponent .video{width:100%;height:0;display:block;position:relative}.mediacomponent .video.four-three{padding-bottom:75%}.mediacomponent .video.sixteen-nine{padding-bottom:56.25%}.mediacomponent .video>iframe{top:0;left:0;border:0;width:100%;height:100%;position:absolute}.pagecomponent.page-title-hidden .content-container>article>header{display:none}.pagecomponent .content-container>article>div{margin-bottom:1rem}.scrolltotopbutton{opacity:0;outline:0;right:1rem;bottom:1rem;width:4rem;height:4rem;z-index:1000;position:fixed;display:block;overflow:hidden;visibility:hidden;white-space:nowrap;text-align:center;font-size:16px;line-height:4rem;-webkit-box-shadow:0 0 20px rgba(0,0,0,.2);box-shadow:0 0 20px rgba(0,0,0,.2);-webkit-transition:opacity .3s 0s,visibility 0s .3s,color .15s ease-in-out 0s,background-color .15s ease-in-out 0s;transition:opacity .3s 0s,visibility 0s .3s,color .15s ease-in-out 0s,background-color .15s ease-in-out 0s}.scrolltotopbutton.is-visible{opacity:1;visibility:visible}.scrolltotopbutton.fade-out{opacity:.5}.scrolltotopbutton:hover{opacity:1}@media (min-width:768px){.scrolltotopbutton{width:5rem;height:5rem;right:2rem;bottom:2rem;line-height:5rem}}@media (min-width:992px){.scrolltotopbutton{width:6rem;height:6rem;font-size:20px;line-height:6rem}}.tilecomponent .items{-webkit-box-orient:horizontal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch}.tilecomponent .items,.tilecomponent .items>article.item{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-direction:normal}.tilecomponent .items>article.item{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;-webkit-box-flex:1;-ms-flex:1 100%;flex:1 100%;padding:2%}.tilecomponent .items>article.item>section.content{margin-top:auto}.tilecomponent .items>article.item>section.content div.details>span{display:block;margin-right:0;margin-bottom:.25rem}@media (min-width:576px){.tilecomponent .items>article.item{-webkit-box-flex:1;-ms-flex:1 50%;flex:1 50%}}@media (min-width:768px){.tilecomponent .items>article.item{-webkit-box-flex:1;-ms-flex:1 33.3%;flex:1 33.3%}}@media (min-width:992px){.tilecomponent .items>article.item{-webkit-box-flex:1;-ms-flex:1 25%;flex:1 25%}}div.detail-fields a{color:inherit}div.detail-fields>ul{margin:0;padding:0;list-style:none}div.detail-fields>ul>li>dl,div.detail-fields>ul>li>dl>dd{margin:0;padding:0}div.detail-fields.block>ul>li{margin-bottom:1rem}div.detail-fields.block>ul>li dl dt{font-size:1rem;font-weight:700}div.detail-fields.block>ul>li dl dd{font-size:1rem}div.detail-fields.inline>ul>li{color:#868e96;display:inline-block;margin-right:.5rem}div.detail-fields.inline>ul>li dl dd,div.detail-fields.inline>ul>li dl dt{display:inline-block;font-size:1rem}div.detail-fields.hide-header>header,div.detail-fields.hide-icons>ul>li dl>dt>i,div.detail-fields.hide-names>ul>li dl>dt>span.name{display:none}.component.link{text-decoration:none}.component.link,.component.link>i.fa{display:inline-block}.component.link:active,.component.link:focus,.component.link:hover{text-decoration:none}.show-icons.hide-text .component.link{overflow:hidden;text-align:center;-webkit-transition:color .15s ease-in-out 0s,background-color .15s ease-in-out 0s,border-color .15s ease-in-out 0s;transition:color .15s ease-in-out 0s,background-color .15s ease-in-out 0s,border-color .15s ease-in-out 0s}.show-icons.hide-text .component.link>i.fa{display:block}.show-icons.hide-text .component.link.size-16{width:16px;height:16px;font-size:8px;line-height:16px}.show-icons.hide-text .component.link.size-16>i.fa{top:50%;position:relative;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.show-icons.hide-text .component.link.size-24{width:24px;height:24px;font-size:12px;line-height:24px}.show-icons.hide-text .component.link.size-24>i.fa{top:50%;position:relative;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.show-icons.hide-text .component.link.size-32{width:32px;height:32px;font-size:16px;line-height:32px}.show-icons.hide-text .component.link.size-32>i.fa{top:50%;position:relative;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.show-icons.hide-text .component.link.size-48{width:48px;height:48px;font-size:24px;line-height:48px}.show-icons.hide-text .component.link.size-48>i.fa{top:50%;position:relative;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.show-icons.hide-text .component.link.size-64{width:64px;height:64px;font-size:32px;line-height:64px}.show-icons.hide-text .component.link.size-64>i.fa{top:50%;position:relative;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.show-icons.hide-text .component.link.size-96{width:96px;height:96px;font-size:48px;line-height:96px}.show-icons.hide-text .component.link.size-96>i.fa{top:50%;position:relative;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.show-icons.hide-text .component.link.size-128{width:128px;height:128px;font-size:64px;line-height:128px}.show-icons.hide-text .component.link.size-128>i.fa{top:50%;position:relative;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.hide-icons .component.link>i.fa,.hide-text .component.link>span.text{display:none}.component.slide .slide-caption.title-after>h1,.component.slide .slide-caption.title-after>h2,.component.slide .slide-caption.title-after>h3,.component.slide .slide-caption.title-after>h4,.component.slide .slide-caption.title-after>h5,.component.slide .slide-caption.title-after>h6{margin-bottom:0} \ No newline at end of file diff --git a/client/src/styles/components/BaseListComponent.scss b/client/src/styles/components/BaseListComponent.scss index 418b12a..2d0c5d3 100644 --- a/client/src/styles/components/BaseListComponent.scss +++ b/client/src/styles/components/BaseListComponent.scss @@ -9,6 +9,10 @@ margin-bottom: $spacer-double; + &:last-child { + margin-bottom: 0; + } + > div.image { position: relative; @@ -120,4 +124,9 @@ } + ul.pagination { + margin-top: $spacer-double; + margin-bottom: 0; + } + } diff --git a/src/Extensions/Admin/CropPriorityFileFormExtension.php b/src/Extensions/Admin/CropPriorityFileFormExtension.php index 436c408..3b9b2f6 100644 --- a/src/Extensions/Admin/CropPriorityFileFormExtension.php +++ b/src/Extensions/Admin/CropPriorityFileFormExtension.php @@ -47,14 +47,13 @@ public function updateFormFields(FieldList $fields, Controller $controller, $nam { // Update Field Objects: - $fields->addFieldToTab( - 'Editor.Details', + $fields->insertAfter( + 'ParentID', DropdownField::create( 'CropPriority', _t(__CLASS__ . '.CROPPRIORITY', 'Crop priority'), $this->getCropPriorityOptions() - ), - 'Path' + ) ); } diff --git a/src/Extensions/Lists/ListSourceExtension.php b/src/Extensions/Lists/ListSourceExtension.php index 15c280d..533288b 100644 --- a/src/Extensions/Lists/ListSourceExtension.php +++ b/src/Extensions/Lists/ListSourceExtension.php @@ -28,6 +28,8 @@ use SilverStripe\Forms\TextField; use SilverStripe\ORM\ArrayList; use SilverStripe\ORM\DataExtension; +use SilverStripe\ORM\DataList; +use SilverStripe\ORM\DB; use SilverStripe\ORM\PaginatedList; use SilverStripe\ORM\SS_List; use SilverWare\Forms\FieldSection; @@ -48,6 +50,12 @@ */ class ListSourceExtension extends DataExtension { + /** + * Define sort constants. + */ + const SORT_DEFAULT = 'default'; + const SORT_RANDOM = 'random'; + /** * Maps field names to field types for this object. * @@ -57,6 +65,7 @@ class ListSourceExtension extends DataExtension private static $db = [ 'ItemsPerPage' => 'AbsoluteInt', 'NumberOfItems' => 'AbsoluteInt', + 'SortItemsBy' => 'Varchar(32)', 'PaginateItems' => 'Boolean', 'ReverseItems' => 'Boolean', 'ImageItems' => 'Boolean' @@ -79,6 +88,7 @@ class ListSourceExtension extends DataExtension * @config */ private static $defaults = [ + 'SortItemsBy' => self::SORT_DEFAULT, 'ItemsPerPage' => 10, 'PaginateItems' => 0, 'ReverseItems' => 0, @@ -130,6 +140,11 @@ public function updateCMSFields(FieldList $fields) 'NumberOfItems', $this->owner->fieldLabel('NumberOfItems') ), + DropdownField::create( + 'SortItemsBy', + $this->owner->fieldLabel('SortItemsBy'), + $this->owner->getSortItemsByOptions() + ), CheckboxField::create( 'ReverseItems', $this->owner->fieldLabel('ReverseItems') @@ -146,7 +161,7 @@ public function updateCMSFields(FieldList $fields) if ($this->owner->canPaginate()) { - $fields->insertAfter( + $fields->insertBefore( SelectionGroup::create( 'PaginateItems', [ @@ -165,7 +180,7 @@ public function updateCMSFields(FieldList $fields) ) ] )->setTitle($this->owner->fieldLabel('PaginateItems')), - 'NumberOfItems' + 'ReverseItems' ); } @@ -184,6 +199,7 @@ public function updateFieldLabels(&$labels) $labels['Disabled'] = _t(__CLASS__ . '.DISABLED', 'Disabled'); $labels['ListSource'] = $labels['ListSourceID'] = _t(__CLASS__ . '.LISTSOURCE', 'List Source'); $labels['ImageItems'] = _t(__CLASS__ . '.IMAGEITEMS', 'Show only items with images'); + $labels['SortItemsBy'] = _t(__CLASS__ . '.SORTITEMSBY', 'Sort items by'); $labels['ReverseItems'] = _t(__CLASS__ . '.REVERSEITEMS', 'Reverse items'); $labels['ItemsPerPage'] = _t(__CLASS__ . '.ITEMSPERPAGE', 'Items per page'); $labels['PaginateItems'] = _t(__CLASS__ . '.PAGINATEITEMS', 'Paginate items'); @@ -232,6 +248,12 @@ public function getListItems() } + // Sort Items (if applicable): + + if ($this->owner->SortItemsBy) { + $items = $this->sort($items); + } + // Remove Items without Images (if applicable): if ($this->owner->ImageItems) { @@ -256,7 +278,7 @@ public function getListItems() // Paginate Items (if applicable): - if ($this->owner->PaginateItems) { + if ($this->owner->PaginateItems && $this->owner->SortItemsBy != self::SORT_RANDOM) { $items = PaginatedList::create($items, $this->getRequest()); @@ -345,6 +367,19 @@ public function getListSourceOptions() return ClassTools::singleton()->getImplementorMap(ListSource::class); } + /** + * Answers an array of options for the sort items by field. + * + * @return array + */ + public function getSortItemsByOptions() + { + return [ + self::SORT_DEFAULT => _t(__CLASS__ . '.DEFAULT', 'Default'), + self::SORT_RANDOM => _t(__CLASS__ . '.RANDOM', 'Random'), + ]; + } + /** * Answers the name of the GET var to use for paginating the extended object. * @@ -359,6 +394,40 @@ public function getPaginationGetVar() return 'start'; } + /** + * Sorts the given list of items. + * + * @param SS_List $list + * + * @return SS_List + */ + protected function sort(SS_List $list) + { + switch ($this->owner->SortItemsBy) { + + // Random Sort Order: + + case self::SORT_RANDOM: + + if ($list instanceof DataList) { + return $list->sort(DB::get_conn()->random()); + } + + $items = $list->toArray(); + + shuffle($items); + + return ArrayList::create($items); + + // Default Sort Order: + + default: + + return $list; + + } + } + /** * Answers the request object from the current controller. * diff --git a/src/Extensions/Model/MetaDataExtension.php b/src/Extensions/Model/MetaDataExtension.php index 4ef8d9f..dd724bc 100644 --- a/src/Extensions/Model/MetaDataExtension.php +++ b/src/Extensions/Model/MetaDataExtension.php @@ -1028,6 +1028,20 @@ public function getMetaImageCaptionClassNames() return $classes; } + /** + * Answers the footer text for a meta image popup. + * + * @return string + */ + public function getMetaImageFooter() + { + if ($this->owner->hasMetaImageCaption()) { + return $this->owner->obj('MetaImageCaption')->Plain(); + } + + return $this->owner->getMetaSummaryLimited(); + } + /** * Answers a string of meta image wrapper class names for the template. * diff --git a/src/Extensions/Model/PaginatedListExtension.php b/src/Extensions/Model/PaginatedListExtension.php new file mode 100644 index 0000000..f2ad481 --- /dev/null +++ b/src/Extensions/Model/PaginatedListExtension.php @@ -0,0 +1,54 @@ +=5.6.0 + * + * For full copyright and license information, please view the + * LICENSE.md file that was distributed with this source code. + * + * @package SilverWare\Extensions\Model + * @author Colin Tucker + * @copyright 2017 Praxis Interactive + * @license https://opensource.org/licenses/BSD-3-Clause BSD-3-Clause + * @link https://github.com/praxisnetau/silverware + */ + +namespace SilverWare\Extensions\Model; + +use SilverStripe\Core\Extension; + +/** + * An extension which works around a URL ampersand-encoding bug with paginated lists. + * + * @package SilverWare\Extensions\Model + * @author Colin Tucker + * @copyright 2017 Praxis Interactive + * @license https://opensource.org/licenses/BSD-3-Clause BSD-3-Clause + * @link https://github.com/praxisnetau/silverware + */ +class PaginatedListExtension extends Extension +{ + /** + * Answers a summarised pagination for the extended object (fixes a bug with URL ampersands). + * + * @param integer $context + * + * @return ArrayList + */ + public function PageSummary($context = 4) + { + $summary = $this->owner->PaginationSummary($context); + + foreach ($summary as $page) { + + if ($page->Link) { + $page->Link = str_replace('&', '&', $page->Link); + } + + } + + return $summary; + } +}