From 91577fe012827b1d4f5aca7194f5ae6a84a7afa2 Mon Sep 17 00:00:00 2001 From: Tony Air Date: Sat, 15 Sep 2018 05:55:42 +0700 Subject: [PATCH] Bunch of Improvements --- app/_config.php | 3 +- app/_config/columns.yml | 4 ++ app/_config/config.yml | 3 - app/_config/elements.yml | 3 - app/_config/extensions.yml | 6 -- app/_config/requirements.yml | 4 -- app/_config/shop.yml_ | 19 +++++ app/client/src/js/_layout.js | 72 ++++++++++++++++++- app/client/src/scss/_layout.scss | 58 ++++++++++++++- app/client/src/scss/app.scss | 4 +- app/src/Extensions/ElementRows.php | 5 ++ app/src/Extensions/SiteConfigExtension.php | 18 +++++ app/src/Pages/PageController.php | 20 ++++-- .../{Models => Shop}/CheckoutMapComponent.php | 0 .../CheckoutNoDeliveryConfig.php | 0 app/src/Templates/WebpackTemplateProvider.php | 6 ++ app/templates/BreadcrumbsTemplate.ss | 16 +++++ app/templates/Includes/SiteWideMessage.ss | 5 ++ app/templates/Objects/Map.ss | 7 ++ app/templates/Page.ss | 3 + composer.json | 3 +- package.json | 2 + 22 files changed, 233 insertions(+), 28 deletions(-) create mode 100644 app/_config/columns.yml create mode 100644 app/_config/shop.yml_ rename app/src/{Models => Shop}/CheckoutMapComponent.php (100%) rename app/src/{Models => Shop}/CheckoutNoDeliveryConfig.php (100%) create mode 100644 app/templates/BreadcrumbsTemplate.ss create mode 100644 app/templates/Includes/SiteWideMessage.ss create mode 100644 app/templates/Objects/Map.ss diff --git a/app/_config.php b/app/_config.php index 6d8a13e..346773e 100644 --- a/app/_config.php +++ b/app/_config.php @@ -12,10 +12,11 @@ HtmlEditorConfig::get('cms')->enablePlugins([ 'charmap', 'visualblocks', 'lists', + 'anchor', 'charcount' => ModuleResourceLoader::resourceURL( 'drmartingonzo/ss-tinymce-charcount:client/dist/js/bundle.js' ), ]); +HtmlEditorConfig::get('cms')->insertButtonsAfter('sslink', 'anchor'); FulltextSearchable::enable(); - diff --git a/app/_config/columns.yml b/app/_config/columns.yml new file mode 100644 index 0000000..c10a689 --- /dev/null +++ b/app/_config/columns.yml @@ -0,0 +1,4 @@ +Site\Extensions\ElementRows: + container_max_width: 1140 + column_class: 'col-block col-md-' + diff --git a/app/_config/config.yml b/app/_config/config.yml index 4b2ce51..d82a5e1 100644 --- a/app/_config/config.yml +++ b/app/_config/config.yml @@ -20,6 +20,3 @@ SilverStripe\View\SSViewer: SilverStripe\Forms\HTMLEditor\TinyMCEConfig: editor_css: - 'app/client/dist/css/editor.css' - -SilverShop\Extension\ShopConfigExtension: - base_currency: USD diff --git a/app/_config/elements.yml b/app/_config/elements.yml index 56772db..97741da 100644 --- a/app/_config/elements.yml +++ b/app/_config/elements.yml @@ -24,9 +24,6 @@ SilverStripe\CMS\Model\SiteTree: - Dynamic\Elements\Oembed\Elements\ElementOembed - Dynamic\Elements\Elements\ElementTestimonials - Site\Elements\TeamMembersElement - - Site\Elements\SliderElement - - Site\Elements\PromotionElement - - Site\Elements\StoreElement DNADesign\ElementalList\Model\ElementList: default_global_elements: false diff --git a/app/_config/extensions.yml b/app/_config/extensions.yml index 6fcd4bd..d1b6168 100644 --- a/app/_config/extensions.yml +++ b/app/_config/extensions.yml @@ -14,9 +14,3 @@ SilverStripe\Blog\Model\BlogPost: SilverStripe\Core\Injector\Injector: SilverStripe\UserForms\Model\UserDefinedForm: class: Site\Extensions\CMSMain_HiddenClass - SilverShop\Checkout\SinglePageCheckoutComponentConfig: - class: Site\Models\CheckoutNoDeliveryConfig - -#SilverShop\Model\Address: -# extensions: -# - Site\Extensions\AddressExtension \ No newline at end of file diff --git a/app/_config/requirements.yml b/app/_config/requirements.yml index 275e978..64c0467 100644 --- a/app/_config/requirements.yml +++ b/app/_config/requirements.yml @@ -3,8 +3,4 @@ Site\Templates\DeferedRequirements: nofontawesome: false version: false static_domain: false - custom_requirements: - SilverShop\Page\AccountPageController: - - SilverShop.Page.CheckoutPageController.js - - SilverShop.Page.CheckoutPageController.css diff --git a/app/_config/shop.yml_ b/app/_config/shop.yml_ new file mode 100644 index 0000000..242c2b3 --- /dev/null +++ b/app/_config/shop.yml_ @@ -0,0 +1,19 @@ +--- +Name: shop +--- +SilverStripe\Core\Injector\Injector: + SilverShop\Checkout\SinglePageCheckoutComponentConfig: + class: Site\Models\CheckoutNoDeliveryConfig + +SilverShop\Extension\ShopConfigExtension: + base_currency: USD + +SilverShop\Model\Address: + extensions: + - Site\Extensions\AddressExtension + +Site\Templates\DeferedRequirements: + custom_requirements: + SilverShop\Page\AccountPageController: + - SilverShop.Page.CheckoutPageController.js + - SilverShop.Page.CheckoutPageController.css diff --git a/app/client/src/js/_layout.js b/app/client/src/js/_layout.js index 28f12cc..2ead165 100644 --- a/app/client/src/js/_layout.js +++ b/app/client/src/js/_layout.js @@ -1 +1,71 @@ -// your custom JS +import $ from 'jquery'; + +import Events from './_events'; +import Spinner from './_components/_ui.spinner'; + +// your custom components +import 'bootstrap-datepicker/dist/js/bootstrap-datepicker.js'; +import 'bootstrap-timepicker/js/bootstrap-timepicker.js'; + +const LayoutUI = (($) => { + // Constants + const W = window; + const D = document; + const $Body = $('body'); + + const NAME = 'LayoutUI'; + + const datepickerOptions = { + autoclose: true, + startDate: 0, + //todayBtn: true, + todayHighlight: true, + clearBtn: true, + }; + + class LayoutUI { + static init() { + this.dispose(); + + console.log(`Initializing: ${NAME}`); + // your custom UI + + const $dateFields = $Body.find('input.date'); + const $timeFields = $Body.find('input.time'); + + // datepicker + $dateFields.each((i, e) => { + const $e = $(e); + const defaultDate = ($e.attr('name').toLowerCase().indexOf('end') !== -1) ? + '+4d' : + '+3d'; + + $e.attr('readonly', 'true'); + $e.datepicker($.extend(datepickerOptions, { + defaultViewDate: defaultDate + })); + }); + + // timepicker + $timeFields.each((i, e) => { + const $e = $(e); + $e.attr('readonly', 'true'); + $e.timepicker(); + }); + } + + static dispose() { + console.log(`Destroying: ${NAME}`); + } + } + + $(W).on(`${Events.AJAX} ${Events.LOADED}`, () => { + LayoutUI.init(); + }); + + W.LayoutUI = LayoutUI; + + return LayoutUI; +})($); + +export default LayoutUI; diff --git a/app/client/src/scss/_layout.scss b/app/client/src/scss/_layout.scss index cffd280..d21024c 100644 --- a/app/client/src/scss/_layout.scss +++ b/app/client/src/scss/_layout.scss @@ -1,7 +1,9 @@ +@import "~bootstrap-datepicker/dist/css/bootstrap-datepicker.css"; +@import "~bootstrap-timepicker/css/bootstrap-timepicker.css"; + /** * Your custom style */ - // shrink elements on scroll body.shrink {} @@ -36,3 +38,57 @@ body.shrink {} opacity: 1; } } + +// SS-messages +.message { + @extend .alert; + + @extend .alert-info; +} + +.message.required, +.message.error { + @extend .alert; + + @extend .alert-danger; +} + +// date-time fields +input.date, +input.time { + &[readonly] { + background-color: $white; + } +} + +.bootstrap-timepicker-widget, +.datepicker-dropdown { + border: 1px solid #ced4da; + box-shadow: 0 0 3px #999; +} + +.bootstrap-timepicker-widget { + .glyphicon { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; + font-family: Font Awesome\ 5 Free; + font-weight: 900; + } + + .glyphicon-chevron-up:before { + content: "\f077"; + } + + .glyphicon-chevron-down:before { + content: "\f078"; + } + + input { + border: 1px solid #ced4da; + } +} diff --git a/app/client/src/scss/app.scss b/app/client/src/scss/app.scss index 3d9f20b..59c343b 100644 --- a/app/client/src/scss/app.scss +++ b/app/client/src/scss/app.scss @@ -2,7 +2,9 @@ @import "_variables"; @import "_components/_ui.bootstrap"; -@import "_components/_ui.fontawesome"; + +// By default we prefer font awesome CDN +//@import "_components/_ui.fontawesome"; @import "_components/_ui.lightbox"; @import "_components/_ui.main"; diff --git a/app/src/Extensions/ElementRows.php b/app/src/Extensions/ElementRows.php index a7365a7..c68969e 100644 --- a/app/src/Extensions/ElementRows.php +++ b/app/src/Extensions/ElementRows.php @@ -88,6 +88,11 @@ class ElementRows extends DataExtension } } + public function getWidthPercetage() + { + return $this->isColumn() ? $this->owner->getField('Size') / 12 * 100 : false; + } + public function isList() { return is_a($this->owner, ElementList::class); diff --git a/app/src/Extensions/SiteConfigExtension.php b/app/src/Extensions/SiteConfigExtension.php index 30d0fca..dcd58fe 100644 --- a/app/src/Extensions/SiteConfigExtension.php +++ b/app/src/Extensions/SiteConfigExtension.php @@ -2,6 +2,7 @@ namespace Site\Extensions; +use Innoweb\Sitemap\Pages\SitemapPage; use SilverStripe\AssetAdmin\Forms\UploadField; use SilverStripe\Assets\Image; use SilverStripe\Forms\TextareaField; @@ -22,6 +23,11 @@ class SiteConfigExtension extends DataExtension 'MapAPIKey' => 'Varchar(255)' ]; + private static $has_one = [ + 'PrivacyPolicy' => SiteTree::class, + 'Sitemap' => SiteTree::class, + ]; + private static $many_many = [ 'Navigation' => SiteTree::class, ]; @@ -38,6 +44,18 @@ class SiteConfigExtension extends DataExtension $tab->push(TextareaField::create('ExtraCode', 'Extra site-wide HTML code')); + $tab->push(DropdownField::create( + 'PrivacyPolicyID', + 'Privacy Policy Page', + SiteTree::get()->map()->toArray() + )); + + $tab->push(DropdownField::create( + 'SitemapID', + 'Sitemap Page', + SitemapPage::get()->map()->toArray() + )); + $mapTab = $fields->findOrMakeTab('Root.GoogleMaps'); $mapTab->push(TextField::create('MapAPIKey')); $mapTab->push(TextField::create('MapZoom')); diff --git a/app/src/Pages/PageController.php b/app/src/Pages/PageController.php index e09e9a3..c823fe5 100644 --- a/app/src/Pages/PageController.php +++ b/app/src/Pages/PageController.php @@ -6,20 +6,26 @@ use SilverStripe\CMS\Controllers\ContentController; use SilverStripe\ORM\FieldType\DBDatetime; -use SilverStripe\Blog\Model\BlogPost; class PageController extends ContentController { - private static $static_path = '/resources/app/client/dist/'; - - public function RecentBlogPosts() + public function setSiteWideMessage($message, $type) { - return BlogPost::get()->sort('PublishDate DESC'); + $this->getRequest()->getSession()->set( + 'SiteWideMessage', + [ + 'Message' => $message, + 'Type' => $type, + ] + ); } - public function StaticPath($path = '') + public function getSiteWideMessage() { - return self::join_links($this->config()->get('static_path'), $path); + $session = $this->getRequest()->getSession(); + $session->clear('SiteWideMessage'); + + return $session->get('SiteWideMessage'); } public function CurrentTime() diff --git a/app/src/Models/CheckoutMapComponent.php b/app/src/Shop/CheckoutMapComponent.php similarity index 100% rename from app/src/Models/CheckoutMapComponent.php rename to app/src/Shop/CheckoutMapComponent.php diff --git a/app/src/Models/CheckoutNoDeliveryConfig.php b/app/src/Shop/CheckoutNoDeliveryConfig.php similarity index 100% rename from app/src/Models/CheckoutNoDeliveryConfig.php rename to app/src/Shop/CheckoutNoDeliveryConfig.php diff --git a/app/src/Templates/WebpackTemplateProvider.php b/app/src/Templates/WebpackTemplateProvider.php index 0ad958a..f4d815e 100644 --- a/app/src/Templates/WebpackTemplateProvider.php +++ b/app/src/Templates/WebpackTemplateProvider.php @@ -38,6 +38,7 @@ class WebpackTemplateProvider implements TemplateGlobalProvider 'WebpackDevServer' => 'isActive', 'WebpackCSS' => 'loadCSS', 'WebpackJS' => 'loadJS', + 'ResoursesURL' => 'resoursesURL', ]; } @@ -59,6 +60,11 @@ class WebpackTemplateProvider implements TemplateGlobalProvider Requirements::javascript(self::_getPath($path)); } + public static function resoursesURL($link = null) + { + return Controller::join_links(Director::baseURL(), '/resources/app/client/dist/img/', $link); + } + /** * Checks if dev mode is enabled and if webpack server is online diff --git a/app/templates/BreadcrumbsTemplate.ss b/app/templates/BreadcrumbsTemplate.ss new file mode 100644 index 0000000..ccfafd2 --- /dev/null +++ b/app/templates/BreadcrumbsTemplate.ss @@ -0,0 +1,16 @@ +<% if $Pages %> + +<% end_if %> diff --git a/app/templates/Includes/SiteWideMessage.ss b/app/templates/Includes/SiteWideMessage.ss new file mode 100644 index 0000000..a48a301 --- /dev/null +++ b/app/templates/Includes/SiteWideMessage.ss @@ -0,0 +1,5 @@ +<% if $SiteWideMessage %> +
+ {$Message} +
+<% end_if %> diff --git a/app/templates/Objects/Map.ss b/app/templates/Objects/Map.ss new file mode 100644 index 0000000..0432090 --- /dev/null +++ b/app/templates/Objects/Map.ss @@ -0,0 +1,7 @@ +
+
+ +
+ $DirectionsLink.RAW +
+
\ No newline at end of file diff --git a/app/templates/Page.ss b/app/templates/Page.ss index 28c50fd..fc50fcf 100644 --- a/app/templates/Page.ss +++ b/app/templates/Page.ss @@ -15,6 +15,9 @@ <%-- Loading Spinner --%>

<%t Page.LOADINGTEXT 'LOADING ..' %>
+ <%-- Site Wide Alert Message --%> + <% include SiteWideMessage %> +