mirror of
https://github.com/a2nt/silverstripe-webpack.git
synced 2024-10-22 17:05:31 +02:00
Notifications + Openning Hours extensions
This commit is contained in:
parent
6914a47f93
commit
992e9f54fd
@ -17,6 +17,10 @@ SilverStripe\View\SSViewer:
|
|||||||
# extra_requirements_css:
|
# extra_requirements_css:
|
||||||
# - 'colymba/gridfield-bulk-editing-tools:client/dist/styles/main.css'
|
# - 'colymba/gridfield-bulk-editing-tools:client/dist/styles/main.css'
|
||||||
|
|
||||||
|
SilverStripe\Admin\LeftAndMain:
|
||||||
|
extra_requirements_css:
|
||||||
|
- 'app/client/dist/css/cms.css'
|
||||||
|
|
||||||
SilverStripe\Forms\HTMLEditor\TinyMCEConfig:
|
SilverStripe\Forms\HTMLEditor\TinyMCEConfig:
|
||||||
editor_css:
|
editor_css:
|
||||||
- 'app/client/dist/css/editor.css'
|
- 'app/client/dist/css/editor.css'
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
SilverStripe\SiteConfig\SiteConfig:
|
SilverStripe\SiteConfig\SiteConfig:
|
||||||
extensions:
|
extensions:
|
||||||
|
- Broarm\OpeningHours\OpeningHours
|
||||||
- Site\Extensions\SiteConfigExtension
|
- Site\Extensions\SiteConfigExtension
|
||||||
- Site\Extensions\SocialExtension
|
- Site\Extensions\SocialExtension
|
||||||
|
|
||||||
|
@ -43,7 +43,8 @@ const CarouselUI = (($) => {
|
|||||||
|
|
||||||
// create arrows
|
// create arrows
|
||||||
if ($e.data('arrows')) {
|
if ($e.data('arrows')) {
|
||||||
$e.prepend('<i class="carousel-control-prev" data-target="#' + id + '" role="button" data-slide="prev"><i class="fas fa-chevron-left" aria-hidden="true"></i><i class="sr-only">Previous</i></i>');
|
let $prev = $('<i class="carousel-control-prev" data-target="#' + id + '" role="button" data-slide="prev"><i class="fas fa-chevron-left" aria-hidden="true"></i><i class="sr-only">Previous</i></i>');
|
||||||
|
$e.prepend($prev);
|
||||||
$e.prepend('<i class="carousel-control-next" data-target="#' + id + '" role="button" data-slide="next"><i class="fas fa-chevron-right" aria-hidden="true"></i><i class="sr-only">Next</i></i>');
|
$e.prepend('<i class="carousel-control-next" data-target="#' + id + '" role="button" data-slide="next"><i class="fas fa-chevron-right" aria-hidden="true"></i><i class="sr-only">Next</i></i>');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -67,8 +68,8 @@ const CarouselUI = (($) => {
|
|||||||
$(event.target).carousel('prev');
|
$(event.target).carousel('prev');
|
||||||
});
|
});
|
||||||
|
|
||||||
$e.hammer().bind('tap', (event) => {
|
$e.find('img').hammer().bind('tap', (event) => {
|
||||||
$(event.target).carousel('next');
|
$e.carousel('next');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
108
app/client/src/js/_components/_ui.opening-hours.js
Normal file
108
app/client/src/js/_components/_ui.opening-hours.js
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
import $ from 'jquery';
|
||||||
|
|
||||||
|
import Events from '../_events';
|
||||||
|
|
||||||
|
const OpeningHoursUI = (($) => {
|
||||||
|
// Constants
|
||||||
|
const NAME = 'OpeningHoursUI';
|
||||||
|
|
||||||
|
class OpeningHoursUI {
|
||||||
|
// Static methods
|
||||||
|
|
||||||
|
static each(callback) {
|
||||||
|
$('.js-opening-hours').each(function(i, e) {
|
||||||
|
callback(i, $(e));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
static init() {
|
||||||
|
this.dispose();
|
||||||
|
const hours = $.parseJSON($('.oppening-hours-json').html());
|
||||||
|
const date = new Date();
|
||||||
|
const dateYMD = this.Date_toYMD(date);
|
||||||
|
const weekday = [
|
||||||
|
'Sunday',
|
||||||
|
'Monday',
|
||||||
|
'Tuesday',
|
||||||
|
'Wednesday',
|
||||||
|
'Thursday',
|
||||||
|
'Friday',
|
||||||
|
'Saturday',
|
||||||
|
];
|
||||||
|
const today = weekday[date.getDay()];
|
||||||
|
let html = '<b class="opening-hours-status opening-hours-status-closed">Closed today</b>';
|
||||||
|
|
||||||
|
if (
|
||||||
|
typeof hours['days'] !== 'undefined' &&
|
||||||
|
typeof hours['days'][today] !== 'undefined' &&
|
||||||
|
hours['days'][today].length
|
||||||
|
) {
|
||||||
|
html = 'Open today ';
|
||||||
|
$.each(hours['days'][today], (i, v) => {
|
||||||
|
if (v['DisplayStart'] || v['DisplayEnd']) {
|
||||||
|
if (
|
||||||
|
(
|
||||||
|
v['DisplayStart'] && v['DisplayStart'] <= dateYMD &&
|
||||||
|
v['DisplayEnd'] && v['DisplayEnd'] >= dateYMD
|
||||||
|
) ||
|
||||||
|
(v['DisplayStart'] && v['DisplayStart'] <= dateYMD && !v['DisplayEnd']) ||
|
||||||
|
(v['DisplayEnd'] && v['DisplayEnd'] >= dateYMD && !v['DisplayStart'])
|
||||||
|
) {
|
||||||
|
html = 'Open today from ' + v['From'] + ' to ' + v['Till'];
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (i > 0) {
|
||||||
|
html += ', <br/>';
|
||||||
|
}
|
||||||
|
html += 'from ' + v['From'] + ' to ' + v['Till'];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
html += ' <b class="opening-hours-status"></b>';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
typeof hours['holidays'] !== 'undefined' &&
|
||||||
|
typeof hours['holidays'][dateYMD] !== 'undefined'
|
||||||
|
) {
|
||||||
|
html = '<b class="opening-hours-status opening-hours-status-closed">Closed today' +
|
||||||
|
(hours['holidays'][dateYMD] ? ' for ' + hours['holidays'][dateYMD] : '') +
|
||||||
|
'</b>';
|
||||||
|
}
|
||||||
|
|
||||||
|
this.each((i, e) => {
|
||||||
|
const $e = $(e);
|
||||||
|
$e.html(html);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
static Date_toYMD(date) {
|
||||||
|
var year, month, day;
|
||||||
|
year = String(date.getFullYear());
|
||||||
|
month = String(date.getMonth() + 1);
|
||||||
|
if (month.length == 1) {
|
||||||
|
month = '0' + month;
|
||||||
|
}
|
||||||
|
day = String(date.getDate());
|
||||||
|
if (day.length == 1) {
|
||||||
|
day = '0' + day;
|
||||||
|
}
|
||||||
|
return year + '-' + month + '-' + day;
|
||||||
|
}
|
||||||
|
|
||||||
|
static dispose() {
|
||||||
|
this.each((i, e) => {
|
||||||
|
$(e).html('');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$(window).on(`${Events.AJAX} ${Events.LOADED}`, () => {
|
||||||
|
OpeningHoursUI.init();
|
||||||
|
});
|
||||||
|
|
||||||
|
return OpeningHoursUI;
|
||||||
|
})($);
|
||||||
|
|
||||||
|
export default OpeningHoursUI;
|
3
app/client/src/scss/types/cms.scss
Normal file
3
app/client/src/scss/types/cms.scss
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
#Menu-SilverStripe-CampaignAdmin-CampaignAdmin {
|
||||||
|
display: none;
|
||||||
|
}
|
@ -6,16 +6,18 @@
|
|||||||
&.left {
|
&.left {
|
||||||
float: left;
|
float: left;
|
||||||
clear: left;
|
clear: left;
|
||||||
|
margin: 0 1rem 1rem 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.center {
|
&.center {
|
||||||
display: block;
|
display: block;
|
||||||
margin: 0 auto;
|
margin: 1rem auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.right {
|
&.right {
|
||||||
float: right;
|
float: right;
|
||||||
clear: right;
|
clear: right;
|
||||||
|
margin: 1rem 0 0 1rem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
94
app/src/Extensions/NotificationsExtension.php
Normal file
94
app/src/Extensions/NotificationsExtension.php
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Site\Extensions;
|
||||||
|
|
||||||
|
use Dynamic\Elements\Blog\Elements\ElementBlogPosts;
|
||||||
|
use Innoweb\Sitemap\Pages\SitemapPage;
|
||||||
|
use Sheadawson\Linkable\Forms\LinkField;
|
||||||
|
use Sheadawson\Linkable\Models\Link;
|
||||||
|
use SilverStripe\AssetAdmin\Forms\UploadField;
|
||||||
|
use SilverStripe\Assets\Image;
|
||||||
|
use SilverStripe\Forms\CheckboxField;
|
||||||
|
use SilverStripe\Forms\DropdownField;
|
||||||
|
use SilverStripe\Forms\GridField\GridField;
|
||||||
|
use SilverStripe\Forms\GridField\GridFieldConfig;
|
||||||
|
use SilverStripe\Forms\GridField\GridFieldDeleteAction;
|
||||||
|
use SilverStripe\Forms\GridField\GridFieldToolbarHeader;
|
||||||
|
use SilverStripe\Forms\HeaderField;
|
||||||
|
use SilverStripe\Forms\LiteralField;
|
||||||
|
use SilverStripe\Forms\TextareaField;
|
||||||
|
use SilverStripe\Forms\TextField;
|
||||||
|
use SilverStripe\ORM\DataExtension;
|
||||||
|
use SilverStripe\CMS\Model\SiteTree;
|
||||||
|
use SilverStripe\Forms\FieldList;
|
||||||
|
use SilverStripe\Forms\TreeMultiselectField;
|
||||||
|
use BetterBrief\GoogleMapField;
|
||||||
|
use Site\Models\Holiday;
|
||||||
|
use Site\Models\Notification;
|
||||||
|
use Site\Models\OpeningHour;
|
||||||
|
use Symbiote\GridFieldExtensions\GridFieldAddNewInlineButton;
|
||||||
|
use Symbiote\GridFieldExtensions\GridFieldEditableColumns;
|
||||||
|
use Symbiote\GridFieldExtensions\GridFieldTitleHeader;
|
||||||
|
|
||||||
|
class NotificationsExtension extends DataExtension
|
||||||
|
{
|
||||||
|
private static $db = [
|
||||||
|
'ShowNotifications' => 'Boolean(1)',
|
||||||
|
];
|
||||||
|
|
||||||
|
private static $has_many = [
|
||||||
|
'Notifications' => Notification::class,
|
||||||
|
];
|
||||||
|
|
||||||
|
public function updateCMSFields(FieldList $fields)
|
||||||
|
{
|
||||||
|
$tab = $fields->findOrMakeTab('Root.Notifications');
|
||||||
|
|
||||||
|
if(!$this->owner->exists()) {
|
||||||
|
$tab->push(LiteralField::create(
|
||||||
|
'NotificationsNotice',
|
||||||
|
'<p class="message notice">The object must be saved before notifications can be added</p>'
|
||||||
|
));
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$items = $this->owner->Notifications();
|
||||||
|
|
||||||
|
$config = GridFieldConfig::create();
|
||||||
|
$config->addComponents([
|
||||||
|
new GridFieldToolbarHeader(),
|
||||||
|
new GridFieldTitleHeader(),
|
||||||
|
new GridFieldEditableColumns(),
|
||||||
|
new GridFieldAddNewInlineButton('toolbar-header-right'),
|
||||||
|
new GridFieldDeleteAction(),
|
||||||
|
]);
|
||||||
|
|
||||||
|
$tab->setChildren(FieldList::create(
|
||||||
|
HeaderField::create('NotificationsHeader','Notifications'),
|
||||||
|
LiteralField::create(
|
||||||
|
'CurrentNotifications',
|
||||||
|
'<b>Current:</b>'
|
||||||
|
.$this->owner->renderWith('Site\\Objects\\NotificationsList')
|
||||||
|
),
|
||||||
|
CheckboxField::create('ShowNotifications'),
|
||||||
|
GridField::create(
|
||||||
|
'Notifications',
|
||||||
|
'',
|
||||||
|
$items,
|
||||||
|
$config
|
||||||
|
)
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function NotificationsToday()
|
||||||
|
{
|
||||||
|
$items = $this->owner->Notifications();
|
||||||
|
$time = time();
|
||||||
|
|
||||||
|
return $items->filter([
|
||||||
|
'DateOn:LessThanOrEqual' => date('Y-m-d', $time),
|
||||||
|
'DateOff:GreaterThanOrEqual' => date('Y-m-d', $time),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
189
app/src/Extensions/OpenningHoursExtension.php
Normal file
189
app/src/Extensions/OpenningHoursExtension.php
Normal file
@ -0,0 +1,189 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Site\Extensions;
|
||||||
|
|
||||||
|
use Dynamic\Elements\Blog\Elements\ElementBlogPosts;
|
||||||
|
use Innoweb\Sitemap\Pages\SitemapPage;
|
||||||
|
use Sheadawson\Linkable\Forms\LinkField;
|
||||||
|
use Sheadawson\Linkable\Models\Link;
|
||||||
|
use SilverStripe\AssetAdmin\Forms\UploadField;
|
||||||
|
use SilverStripe\Assets\Image;
|
||||||
|
use SilverStripe\Forms\CheckboxField;
|
||||||
|
use SilverStripe\Forms\DropdownField;
|
||||||
|
use SilverStripe\Forms\GridField\GridField;
|
||||||
|
use SilverStripe\Forms\GridField\GridFieldConfig;
|
||||||
|
use SilverStripe\Forms\GridField\GridFieldDeleteAction;
|
||||||
|
use SilverStripe\Forms\GridField\GridFieldToolbarHeader;
|
||||||
|
use SilverStripe\Forms\HeaderField;
|
||||||
|
use SilverStripe\Forms\LiteralField;
|
||||||
|
use SilverStripe\Forms\TextareaField;
|
||||||
|
use SilverStripe\Forms\TextField;
|
||||||
|
use SilverStripe\ORM\DataExtension;
|
||||||
|
use SilverStripe\CMS\Model\SiteTree;
|
||||||
|
use SilverStripe\Forms\FieldList;
|
||||||
|
use SilverStripe\Forms\TreeMultiselectField;
|
||||||
|
use BetterBrief\GoogleMapField;
|
||||||
|
use Site\Models\Holiday;
|
||||||
|
use Site\Models\OpeningHour;
|
||||||
|
use Symbiote\GridFieldExtensions\GridFieldAddNewInlineButton;
|
||||||
|
use Symbiote\GridFieldExtensions\GridFieldEditableColumns;
|
||||||
|
use Symbiote\GridFieldExtensions\GridFieldTitleHeader;
|
||||||
|
|
||||||
|
class OpenningHoursExtension extends DataExtension
|
||||||
|
{
|
||||||
|
private static $db = [
|
||||||
|
'ShowOpeningHours' => 'Boolean(1)',
|
||||||
|
'OpenningHoursNote' => 'Varchar(255)',
|
||||||
|
];
|
||||||
|
|
||||||
|
private static $has_one = [
|
||||||
|
'OpeningHoursPage' => SiteTree::class,
|
||||||
|
];
|
||||||
|
|
||||||
|
private static $has_many = [
|
||||||
|
'OpeningHours' => OpeningHour::class,
|
||||||
|
'Holidays' => Holiday::class,
|
||||||
|
];
|
||||||
|
|
||||||
|
public function HoursLink()
|
||||||
|
{
|
||||||
|
return $this->owner->OpeningHoursPage()->Link();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function updateCMSFields(FieldList $fields)
|
||||||
|
{
|
||||||
|
$tab = $fields->findOrMakeTab('Root.OpeningHours');
|
||||||
|
|
||||||
|
if(!$this->owner->exists()) {
|
||||||
|
$tab->push(LiteralField::create(
|
||||||
|
'OpeningHoursNotice',
|
||||||
|
'<p class="message notice">The object must be saved before opening hours can be added</p>'
|
||||||
|
));
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$hours = $this->owner->OpeningHours();
|
||||||
|
|
||||||
|
$config = GridFieldConfig::create();
|
||||||
|
$config->addComponents([
|
||||||
|
new GridFieldToolbarHeader(),
|
||||||
|
new GridFieldTitleHeader(),
|
||||||
|
new GridFieldEditableColumns(),
|
||||||
|
new GridFieldAddNewInlineButton('toolbar-header-right'),
|
||||||
|
new GridFieldDeleteAction(),
|
||||||
|
]);
|
||||||
|
|
||||||
|
$tab->setChildren(FieldList::create(
|
||||||
|
HeaderField::create('OpeningHours','Opening Hours'),
|
||||||
|
LiteralField::create(
|
||||||
|
'CurrentOpeningHour',
|
||||||
|
'<b>Today:</b>'
|
||||||
|
.'<p class="message notice">'
|
||||||
|
.$this->owner->renderWith('Site\\Objects\\OpeningHoursList')
|
||||||
|
.'</p>'
|
||||||
|
),
|
||||||
|
CheckboxField::create('ShowOpeningHours'),
|
||||||
|
DropdownField::create(
|
||||||
|
'OpeningHoursPageID',
|
||||||
|
'Opening Hours Page',
|
||||||
|
SiteTree::get()->map()->toArray()
|
||||||
|
),
|
||||||
|
/*TextareaField::create('OpenningHoursNote'),
|
||||||
|
LiteralField::create(
|
||||||
|
'OpeningHoursNote',
|
||||||
|
'<p><b>Please, specify time ranges. For example:</b><br/>'
|
||||||
|
.'Monday 10:00 AM - 2:00 PM<br/>'
|
||||||
|
.'Monday 3:00 PM - 6:00 PM<br/>'
|
||||||
|
.'Tuesday 12:00 AM - 2:00 PM<br/>'
|
||||||
|
.'Tuesday 3:00 PM - 4:00 PM<br/>'
|
||||||
|
.'...<br/>'
|
||||||
|
.'<b>Short day example durring holidays:</b><br/>'
|
||||||
|
.'Monday 12:00 AM - 2:00 PM 12/31/2018 - 01/06/2019'
|
||||||
|
.'</p>'
|
||||||
|
),*/
|
||||||
|
GridField::create(
|
||||||
|
'OpeningHours',
|
||||||
|
'Opening Hours',
|
||||||
|
$hours,
|
||||||
|
$config
|
||||||
|
)
|
||||||
|
));
|
||||||
|
|
||||||
|
$tab = $fields->findOrMakeTab('Root.Holidays');
|
||||||
|
$tab->push(GridField::create(
|
||||||
|
'Holidays',
|
||||||
|
'Holidays',
|
||||||
|
$this->owner->Holidays(),
|
||||||
|
$config
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the opening hours
|
||||||
|
*
|
||||||
|
* @return OpeningHour|DataObject|null
|
||||||
|
*/
|
||||||
|
public function OpeningHoursToday()
|
||||||
|
{
|
||||||
|
$hours = $this->owner->OpeningHours();
|
||||||
|
$time = time();
|
||||||
|
|
||||||
|
$today = $hours->filter([
|
||||||
|
'Day' => date('l', $time),
|
||||||
|
'DisplayStart:LessThanOrEqual' => date('Y-m-d', $time),
|
||||||
|
'DisplayEnd:GreaterThanOrEqual' => date('Y-m-d', $time),
|
||||||
|
]);
|
||||||
|
|
||||||
|
return $today->exists() ? $today : $hours->filter([
|
||||||
|
'Day' => date('l', $time),
|
||||||
|
'DisplayStart' => null,
|
||||||
|
'DisplayEnd' => null,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function OpeningHoursJSON()
|
||||||
|
{
|
||||||
|
$hours = $this->owner->OpeningHours();
|
||||||
|
$result = [];
|
||||||
|
foreach ($hours as $hour) {
|
||||||
|
$from = str_replace(':00', '', date('g:i a', strtotime($hour->getField('From'))));
|
||||||
|
$till = str_replace(':00', '', date('g:i a', strtotime($hour->getField('Till'))));
|
||||||
|
|
||||||
|
$result['days'][$hour->getField('Day')][] = [
|
||||||
|
'From' => $from,
|
||||||
|
'Till' => $till,
|
||||||
|
'DisplayStart' => $hour->getField('DisplayStart'),
|
||||||
|
'DisplayEnd' => $hour->getField('DisplayEnd'),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
$holidays = $this->owner->Holidays();
|
||||||
|
foreach ($holidays as $holiday) {
|
||||||
|
$result['holidays'][$holiday->getField('Date')] = $holiday->getField('Title');
|
||||||
|
}
|
||||||
|
|
||||||
|
return json_encode($result);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function onBeforeWrite()
|
||||||
|
{
|
||||||
|
parent::onBeforeWrite();
|
||||||
|
if ($this->owner->exists() && !$this->owner->OpeningHours()->exists()) {
|
||||||
|
$this->createOpeningHours();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set up the opening hours for each day of the week
|
||||||
|
*/
|
||||||
|
private function createOpeningHours()
|
||||||
|
{
|
||||||
|
$days = OpeningHour::singleton()->dbObject('Day')->enumValues();
|
||||||
|
foreach ($days as $day) {
|
||||||
|
$openingHour = OpeningHour::create();
|
||||||
|
$openingHour->Day = $day;
|
||||||
|
$this->owner->OpeningHours()->add($openingHour);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
57
app/src/Models/Holiday.php
Normal file
57
app/src/Models/Holiday.php
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Created by PhpStorm.
|
||||||
|
* User: tony
|
||||||
|
* Date: 9/12/18
|
||||||
|
* Time: 2:55 AM
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Site\Models;
|
||||||
|
|
||||||
|
use Dynamic\FlexSlider\Model\SlideImage;
|
||||||
|
use Sheadawson\Linkable\Forms\LinkField;
|
||||||
|
use Sheadawson\Linkable\Models\Link;
|
||||||
|
use SilverStripe\ORM\DataObject;
|
||||||
|
use SilverStripe\ORM\ValidationResult;
|
||||||
|
use SilverStripe\SiteConfig\SiteConfig;
|
||||||
|
|
||||||
|
class Holiday extends DataObject
|
||||||
|
{
|
||||||
|
private static $table_name = 'Holiday';
|
||||||
|
|
||||||
|
private static $db = [
|
||||||
|
'Title' => 'Varchar(255)',
|
||||||
|
'Date' => 'Date',
|
||||||
|
];
|
||||||
|
|
||||||
|
private static $has_one = [
|
||||||
|
'Parent' => SiteConfig::class,
|
||||||
|
];
|
||||||
|
|
||||||
|
|
||||||
|
private static $summary_fields = [
|
||||||
|
'Title' => 'Title',
|
||||||
|
'Date' => 'Date',
|
||||||
|
];
|
||||||
|
|
||||||
|
private static $default_sort = 'Date ASC, Title ASC';
|
||||||
|
|
||||||
|
public function validate()
|
||||||
|
{
|
||||||
|
$result = parent::validate();
|
||||||
|
|
||||||
|
$exists = self::get()->filter([
|
||||||
|
'ID:not' => $this->ID,
|
||||||
|
'Date' => $this->getField('Date'),
|
||||||
|
])->exists();
|
||||||
|
|
||||||
|
if($exists) {
|
||||||
|
return $result->addError(
|
||||||
|
'Holiday was defined already.',
|
||||||
|
ValidationResult::TYPE_ERROR
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
}
|
63
app/src/Models/Notification.php
Normal file
63
app/src/Models/Notification.php
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Created by PhpStorm.
|
||||||
|
* User: tony
|
||||||
|
* Date: 9/12/18
|
||||||
|
* Time: 2:55 AM
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Site\Models;
|
||||||
|
|
||||||
|
use Dynamic\FlexSlider\Model\SlideImage;
|
||||||
|
use Sheadawson\Linkable\Forms\LinkField;
|
||||||
|
use Sheadawson\Linkable\Models\Link;
|
||||||
|
use SilverStripe\ORM\DataObject;
|
||||||
|
use SilverStripe\ORM\ValidationResult;
|
||||||
|
use SilverStripe\SiteConfig\SiteConfig;
|
||||||
|
|
||||||
|
class Notification extends DataObject
|
||||||
|
{
|
||||||
|
private static $table_name = 'Notification';
|
||||||
|
|
||||||
|
private static $db = [
|
||||||
|
'Title' => 'Varchar(255)',
|
||||||
|
'Content' => 'Text',
|
||||||
|
'DateOn' => 'Date',
|
||||||
|
'DateOff' => 'Date',
|
||||||
|
];
|
||||||
|
|
||||||
|
private static $has_one = [
|
||||||
|
'Parent' => SiteConfig::class,
|
||||||
|
];
|
||||||
|
|
||||||
|
|
||||||
|
private static $summary_fields = [
|
||||||
|
'Title' => 'Title',
|
||||||
|
'Content' => 'Text',
|
||||||
|
'DateOn' => 'Turn on date',
|
||||||
|
'DateOff' => 'Turn off date',
|
||||||
|
];
|
||||||
|
|
||||||
|
private static $default_sort = 'DateOn DESC, DateOff DESC, Title ASC';
|
||||||
|
|
||||||
|
public function validate()
|
||||||
|
{
|
||||||
|
$result = parent::validate();
|
||||||
|
|
||||||
|
if(!$this->getField('DateOn') || !$this->getField('DateOff')) {
|
||||||
|
return $result->addError(
|
||||||
|
'Turn on and turn off dates are required.',
|
||||||
|
ValidationResult::TYPE_ERROR
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!$this->getField('Content')) {
|
||||||
|
return $result->addError(
|
||||||
|
'Text field required.',
|
||||||
|
ValidationResult::TYPE_ERROR
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
}
|
90
app/src/Models/OpeningHour.php
Normal file
90
app/src/Models/OpeningHour.php
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Created by PhpStorm.
|
||||||
|
* User: tony
|
||||||
|
* Date: 9/12/18
|
||||||
|
* Time: 2:55 AM
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Site\Models;
|
||||||
|
|
||||||
|
use Dynamic\FlexSlider\Model\SlideImage;
|
||||||
|
use Sheadawson\Linkable\Forms\LinkField;
|
||||||
|
use Sheadawson\Linkable\Models\Link;
|
||||||
|
use SilverStripe\ORM\DataObject;
|
||||||
|
use SilverStripe\ORM\ValidationResult;
|
||||||
|
use SilverStripe\SiteConfig\SiteConfig;
|
||||||
|
|
||||||
|
class OpeningHour extends DataObject
|
||||||
|
{
|
||||||
|
private static $table_name = 'OpeningHour';
|
||||||
|
|
||||||
|
private static $db = [
|
||||||
|
'Day' => 'Enum("Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday", "Monday")',
|
||||||
|
'From' => 'Time',
|
||||||
|
'Till' => 'Time',
|
||||||
|
'Comment' => 'Varchar(255)',
|
||||||
|
'DisplayStart' => 'Date',
|
||||||
|
'DisplayEnd' => 'Date',
|
||||||
|
];
|
||||||
|
|
||||||
|
private static $has_one = [
|
||||||
|
'Parent' => SiteConfig::class,
|
||||||
|
];
|
||||||
|
|
||||||
|
private static $defaults = [
|
||||||
|
'From' => '09:00:00',
|
||||||
|
'Till' => '22:00:00',
|
||||||
|
];
|
||||||
|
|
||||||
|
private static $summary_fields = [
|
||||||
|
'Day' => 'Day *',
|
||||||
|
'From' => 'From *',
|
||||||
|
'Till' => 'Till *',
|
||||||
|
//'Comment' => 'Comment',
|
||||||
|
'DisplayStart' => 'Display Start',
|
||||||
|
'DisplayEnd' => 'Display End',
|
||||||
|
];
|
||||||
|
|
||||||
|
private static $default_sort = 'Day ASC, From ASC';
|
||||||
|
|
||||||
|
public function validate()
|
||||||
|
{
|
||||||
|
$result = parent::validate();
|
||||||
|
|
||||||
|
|
||||||
|
if(
|
||||||
|
!$this->getField('Day')
|
||||||
|
|| !$this->getField('From')
|
||||||
|
|| !$this->getField('Till')
|
||||||
|
|| $this->getField('From') > $this->getField('Till')
|
||||||
|
) {
|
||||||
|
return $result->addError(
|
||||||
|
'Day, From and Till fields are required or wrong time range was specified.',
|
||||||
|
ValidationResult::TYPE_ERROR
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$exists = self::get()->filter([
|
||||||
|
'ID:not' => $this->ID,
|
||||||
|
'ParentID' => $this->getField('ParentID'),
|
||||||
|
'Day' => $this->getField('Day'),
|
||||||
|
'From:GreaterThanOrEqual' => $this->getField('From'),
|
||||||
|
'Till:LessThanOrEqual' => $this->getField('Till'),
|
||||||
|
])->exists();
|
||||||
|
|
||||||
|
if($exists) {
|
||||||
|
return $result->addError(
|
||||||
|
'Hours were defined already for specified range.',
|
||||||
|
ValidationResult::TYPE_ERROR
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function forTemplate()
|
||||||
|
{
|
||||||
|
return $this->renderWith(__CLASS__);
|
||||||
|
}
|
||||||
|
}
|
@ -1,10 +1,9 @@
|
|||||||
<% if $SiteWideMessage %>
|
<% if $SiteWideMessage %>
|
||||||
<% with $SiteWideMessage %>
|
|
||||||
<div class="alert alert-fixed-top alert-{$Type}">
|
<div class="alert alert-fixed-top alert-{$Type}">
|
||||||
{$Message}
|
{$Message}
|
||||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
|
|
||||||
<i class="fas fa-times"></i>
|
|
||||||
</button>
|
|
||||||
</div>
|
</div>
|
||||||
<% end_with %>
|
|
||||||
<% end_if %>
|
<% end_if %>
|
||||||
|
|
||||||
|
<% with $SiteConfig %>
|
||||||
|
<% include Site\Objects\NotificationsList %>
|
||||||
|
<% end_with %>
|
1
app/templates/Site/Models/OpeningHour.ss
Normal file
1
app/templates/Site/Models/OpeningHour.ss
Normal file
@ -0,0 +1 @@
|
|||||||
|
<b>$Day:</b> $From.Nice - $Till.Nice
|
10
app/templates/Site/Objects/NotificationsList.ss
Normal file
10
app/templates/Site/Objects/NotificationsList.ss
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<% if $ShowNotifications && $NotificationsToday %>
|
||||||
|
<% loop $NotificationsToday %>
|
||||||
|
<div class="alert alert-warning">
|
||||||
|
<% if $Title %>
|
||||||
|
<b>$Title:</b>
|
||||||
|
<% end_if %>
|
||||||
|
$Content
|
||||||
|
</div>
|
||||||
|
<% end_loop %>
|
||||||
|
<% end_if %>
|
7
app/templates/Site/Objects/OpeningHoursList.ss
Normal file
7
app/templates/Site/Objects/OpeningHoursList.ss
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<% if $OpeningHoursToday %>
|
||||||
|
<% loop $OpeningHoursToday %>
|
||||||
|
$forTemplate<br/>
|
||||||
|
<% end_loop %>
|
||||||
|
<% else %>
|
||||||
|
<b class="hours hous-closed">Closed</b>
|
||||||
|
<% end_if %>
|
@ -31,7 +31,8 @@
|
|||||||
"stevie-mayhew/silverstripe-svg": "^2.1",
|
"stevie-mayhew/silverstripe-svg": "^2.1",
|
||||||
"betterbrief/silverstripe-googlemapfield": "^2.1",
|
"betterbrief/silverstripe-googlemapfield": "^2.1",
|
||||||
"innoweb/silverstripe-sitemap": "^2.0",
|
"innoweb/silverstripe-sitemap": "^2.0",
|
||||||
"silverstripe/multiuser-editing-alert": "^2.0"
|
"silverstripe/multiuser-editing-alert": "^2.0",
|
||||||
|
"bramdeleeuw/silverstripe-openinghours": "^1.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"phpunit/phpunit": "^5.7",
|
"phpunit/phpunit": "^5.7",
|
||||||
|
Loading…
Reference in New Issue
Block a user