SLICE into independant modules

This commit is contained in:
Tony Air 2021-06-19 22:22:44 +02:00
parent 2f07ae6bf8
commit 2d03770420
168 changed files with 586 additions and 7748 deletions

View File

@ -1,39 +1 @@
<?php
use SilverStripe\Forms\HTMLEditor\HtmlEditorConfig;
use SilverStripe\Core\Manifest\ModuleResourceLoader;
use SilverStripe\ORM\Search\FulltextSearchable;
use SilverStripe\View\Parsers\ShortcodeParser;
use Site\Extensions\EmbedShortcodeProvider;
// setup TinyMCE editor
$config = HtmlEditorConfig::get('cms');
$config->enablePlugins([
'template',
'fullscreen',
'hr',
'contextmenu',
'charmap',
'visualblocks',
'lists',
'charcount' => ModuleResourceLoader::resourceURL(
'drmartingonzo/ss-tinymce-charcount:client/dist/js/bundle.js'
),
]);
$config->addButtonsToLine(2, 'hr');
$config->setOption('block_formats', 'Paragraph=p;Heading 2=h2;Heading 3=h3;Heading 4=h4;Heading 5=h5;Heading 6=h6;Address=address;Pre=pre');
$config->setOption('invalid_elements', 'h1');
$config->setOption(
'table_class_list',
[
['title' => 'Transparent Table', 'value' => 'table-none'],
['title' => 'Shaded rows', 'value' => 'table table-striped table-bordered'],
]
);
FulltextSearchable::enable();
// replace embed parser
/*$parser = ShortcodeParser::get('default');
$parser->unregister('embed');
$parser->register('embed', [EmbedShortcodeProvider::class, 'handle_shortcode']);*/

View File

@ -1,28 +0,0 @@
---
Name: webapp-base-config
---
SilverStripe\Core\Manifest\ModuleManifest:
project: app
Page:
default_container_class: 'container'
#SilverStripe\Admin\LeftAndMain:
# extra_requirements_javascript:
# - 'colymba/gridfield-bulk-editing-tools:client/dist/js/main.js'
# - 'colymba/gridfield-bulk-editing-tools:client/lang/en.js'
# extra_requirements_css:
# - 'colymba/gridfield-bulk-editing-tools:client/dist/styles/main.css'
SilverStripe\Admin\LeftAndMain:
extra_requirements_javascript:
- 'app/client/dist/js/app_cms.js'
extra_requirements_css:
- 'app/client/dist/css/app_cms.css'
SilverStripe\Forms\HTMLEditor\TinyMCEConfig:
editor_css:
- 'app/client/dist/css/app_editor.css'
SilverStripe\Control\Email\Email:
send_all_emails_from: noreply@twma.pro

View File

@ -1,47 +0,0 @@
---
Name: webapp-base-extensions
---
# Basic extensions
SilverStripe\Admin\LeftAndMain:
extensions:
- App\Extensions\LeftAndMainExtension
SilverStripe\SiteConfig\SiteConfig:
extensions:
- App\Extensions\SocialExtension
- App\Extensions\SiteConfigExtension
- App\Extensions\NotificationsExtension
SilverStripe\CMS\Model\SiteTree:
extensions:
- App\Extensions\SiteTreeExtension
Sheadawson\Linkable\Models\EmbeddedObject:
extensions:
- App\Extensions\EmbeddedObjectExtension
SilverStripe\Assets:
extensions:
- App\Extensions\ImageExtension
Dynamic\FlexSlider\Model\SlideImage:
extensions:
- App\Extensions\SlideImageExtension
SilverStripe\Core\Injector\Injector:
#SilverStripe\UserForms\Model\UserDefinedForm:
# class: App\Extensions\UserDefinedForm_HiddenClass
Sheadawson\Linkable\Forms\EmbeddedObjectField:
class: App\Extensions\EmbedObjectField
SilverStripe\Forms\CompositeField:
class: App\Extensions\CompositeFieldExtension
SilverStripe\UserForms\Form\UserForm:
extensions:
- App\Extensions\PlaceholderFormExtension
Page:
searchable_objects:
- App\Models\TeamMember
extensions:
- DNADesign\Elemental\Extensions\ElementalPageExtension

View File

@ -1,81 +0,0 @@
---
Name: webapp-base-files
---
SilverStripe\Blog\Model\BlogPost:
featured_images_directory: 'blog-posts'
SilverStripe\Assets\Upload_Validator:
allowedExtensions:
- 'stl'
SilverStripe\Assets\File:
allowed_extensions:
- 'ace'
- 'arc'
- 'arj'
- 'asf'
- 'au'
- 'avi'
- 'bmp'
- 'bz2'
- 'cab'
- 'cda'
- 'csv'
- 'dmg'
- 'doc'
- 'docx'
- 'dotx'
- 'flv'
- 'gif'
- 'gpx'
- 'gz'
- 'hqx'
- 'ico'
- 'jpeg'
- 'jpg'
- 'kml'
- 'm4a'
- 'm4v'
- 'mid'
- 'midi'
- 'mkv'
- 'mov'
- 'mp3'
- 'mp4'
- 'mpa'
- 'mpeg'
- 'mpg'
- 'ogg'
- 'ogv'
- 'pages'
- 'pcx'
- 'pdf'
- 'png'
- 'pps'
- 'ppt'
- 'pptx'
- 'potx'
- 'ra'
- 'ram'
- 'rm'
- 'rtf'
- 'sit'
- 'sitx'
- 'tar'
- 'tgz'
- 'tif'
- 'tiff'
- 'txt'
- 'wav'
- 'webm'
- 'wma'
- 'wmv'
- 'xls'
- 'xlsx'
- 'xltx'
- 'zip'
- 'zipx'
- 'stl'
app_categories:
document:
- 'stl'

View File

@ -1,38 +0,0 @@
---
Name: webapp-base-graphql
After: graphqlconfig
---
SilverStripe\Control\Director:
rules:
'graphql': '%$SilverStripe\GraphQL\Controller.default'
SilverStripe\GraphQL\Controller:
cors:
Enabled: true
Allow-Origin: '*'
Allow-Headers: 'Authorization, Content-Type, Content-Language, apikey'
Allow-Methods: 'GET, PUT, DELETE, OPTIONS, POST'
#Allow-Credentials: 'true'
Max-Age: 600 # 600 seconds = 10 minutes.
SilverStripe\GraphQL\Auth\Handler:
authenticators:
- class: App\GraphQL\APIKeyAuthenticator
priority: 30
SilverStripe\GraphQL\Manager.default:
properties:
Middlewares:
APIKeyMiddleware: App\GraphQL\APIKeyMiddleware
SilverStripe\GraphQL\Manager:
schemas:
default:
types:
member: 'App\GraphQL\MemberTypeCreator'
page: 'App\GraphQL\PageTypeCreator'
element: 'App\GraphQL\ElementTypeCreator'
queries:
readPages: 'App\GraphQL\PaginatedReadPagesQueryCreator'
readMembers: 'App\GraphQL\ReadMembersQueryCreator'
paginatedReadMembers: 'App\GraphQL\PaginatedReadMembersQueryCreator'

View File

@ -1,5 +1,7 @@
---
Name: webapp-base-logs-dev
After:
- a2nt-cms-niceties-base-logs-dev
Only:
environment: dev
---
@ -16,6 +18,8 @@ SilverStripe\Core\Injector\Injector:
CLIFormatter: '%$SilverStripe\Logging\DetailedErrorFormatter'
---
Name: webapp-base-logs-live
After:
- a2nt-cms-niceties-base-logs-live
Except:
environment: dev
---

View File

@ -1,9 +0,0 @@
---
Name: webapp-base-mimeuploadvalidator
After: '#mimeuploadvalidator'
Only:
moduleexists: 'silverstripe/mimevalidator'
---
SilverStripe\Core\Injector\Injector:
SilverStripe\Assets\Upload_Validator:
class: SilverStripe\MimeValidator\MimeUploadValidator

View File

@ -1,105 +0,0 @@
---
Name: 'webapp-base-security'
After: 'framework/*, cms/*, security_baseline'
---
SilverStripe\Core\Injector\Injector:
SilverStripe\Security\MemberAuthenticator\LostPasswordHandler:
class: App\Extensions\LostPasswordHandlerExtension
SilverStripe\Security\MemberAuthenticator\MemberLoginForm:
class: App\Extensions\SiteMemberLoginForm
---
Except:
environment: dev
---
# Secure cookies
SilverStripe\Control\Session:
cookie_secure: true
strict_user_agent_check: false
timeout: 604800
SilverStripe\Forms\PasswordField:
autocompleate: false
SilverStripe\Security\Member:
lock_out_after_incorrect_logins: 5
lock_out_delay_mins: 5
# Password expiry should only happen when the password is leaked (optionally expire automatically if PCI/NIST compliance is required)
# password_expiry_days: 90
# instead of password change, we send out a notice on change of password OR Email (notify_account_security_change)
notify_password_change: false
#######################
# Security Headers
#######################
#Controller:
# security_headers:
# # # Values may contain :security_reporting_base_url: placeholders, will be replaced with the URL to SecurityBaselineController endpoint
# # Header-Directive: "value; another value;"
# # X-Version-Alias-Of-Same-Header: "x:Header-Directive" # 'x-alias' headers may be aliased to the standard by a value starting with "x:Standard"
# # X-Another-Alias-Version-Of-Same: "different; value syntax as well;"
#
# A useful base from guttmann/silverstripe-security-headers - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers#Security:
#
# # Content-Security-Policy - https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
# # Specifies approved sources of content that the browser may load from your website
# # Useful: upgrade-insecure-requests; (Instructs browser to treat a site's insecure URLs as if they are HTTPS (eg for legacy sites)
# # Example: Allow everything but only from the same origin:
# Content-Security-Policy: "default-src 'self';"
# # Example: Allow Google Analytics, Google AJAX CDN and Same Origin
# Content-Security-Policy: "script-src 'self' www.google-analytics.com ajax.googleapis.com;"
# # Example: Starter Policy - allows images, scripts, AJAX, form actions, and CSS from the same origin, and does not allow any
# # other resources to load (eg object, frame, media, etc). It is a good starting point for many sites.
# Content-Security-Policy: "default-src 'none'; script-src 'self'; connect-src 'self'; img-src 'self'; style-src 'self';base-uri 'self';form-action 'self'"
# # Content-Security-Policy-Report-Only - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only
# # Allows web developers to experiment with policies by monitoring (but not enforcing) their effects
# # Browsers capable of enforcing CSP will send a violation report as a POST request to report-uri
# Content-Security-Policy-Report-Only: default-src https:; report-uri /security-reporting-endpoint/csp/
# Content-Security-Policy-Report-Only: "default-src https:; script-src 'self' https: 'unsafe-inline' 'unsafe-eval'; connect-src 'self'; img-src 'self' https: data:; style-src 'self' 'unsafe-inline'; base-uri 'self'; form-action 'self'; report-uri /security-reporting-endpoint/csp/;"
# # Strict-Transport-Security - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security
# # Tells the browser to ONLY interact with the site using HTTPS and never HTTP
# Strict-Transport-Security: "max-age=31536000" # time in seconds (one year=31536000) to remember that the site is only accessible over HTTPS
# # Frame-Options - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
# # Disallowes pages to render within a frame - protects against clickjacking attacks
# Frame-Options: "deny"
# # XSS-Protection - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection
# # protect against Cross-site Scripting attacks (value 1=sanitize (default in most browsers), set to "1; mode=block" to prevent rendering if attack is detected)
# # Deprecated: if you do not need to support legacy browsers, it is recommended that you use Content-Security-Policy without allowing unsafe-inline scripts instead
# X-XSS-Protection: "1; mode=block"
# # X-Content-Type-Options - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options
# # Indicate that the MIME types advertised in the Content-Type headers should not be changed and be followed
# # NOTE: Opting out of MIME sniffing can cause HTML web pages to be downloaded instead of rendered when they are
# # served with a MIME type other than text/html. Make sure to set both headers correctly.
# # Site security testers usually expect this header to be set.
# X-Content-Type-Options: "nosniff"
#
# Some more from https://help.dreamhost.com/hc/en-us/articles/360036486952-Security-headers
#
# # Referrer-Policy - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy
# # controls how much referrer information should be sent to another server
# Referrer-Policy: no-referrer
# # Feature-Policy - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Feature-Policy
# # (Experimental 2020) controls which browser features are allowed on your website, eg for sites allowing third-party content
# # CORS - Allow resource sharing with another domain (eg webfonts & ajax requests)
# # Access-Control-Allow-Origin - developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin
#
# A further selection from https://github.com/bepsvpt/secure-headers/blob/master/config/secure-headers.php
#
# Clear-Site-Data - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Clear-Site-Data
# Clears browsing data (cookies, storage, cache) associated with the requesting website
# Expect-CT - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Expect-CT
# Lets sites opt in to reporting and/or enforcement of Certificate Transparency requirements,
# to prevent the use of misissued certificates for that site from going unnoticed.
# (will likely become obsolete in June 2021)

View File

@ -1,8 +0,0 @@
---
Name: 'webapp-base-version-truncator'
---
Axllent\VersionTruncator\VersionTruncator:
keep_versions: 4 # how many (published) versions of each page to keep
keep_drafts: 2 # how many drafts of each page to keep
keep_redirects: true # keep page versions that have a different URLSegment (for redirects)
keep_old_page_types: false # keep page versions where page type (ClassName) has changed

View File

@ -1,12 +0,0 @@
---
Name: 'webapp-debugbar'
After:
- 'framework'
- 'debugbar'
Only:
environment: 'dev'
---
LeKoala\DebugBar\DebugBar:
enabled_in_admin: false
query_limit: 500
max_header_length: 2048

View File

@ -1,28 +0,0 @@
---
Name: webapp-env-check
---
SilverStripe\EnvironmentCheck\EnvironmentCheckSuite:
registered_checks:
curl:
definition: 'HasFunctionCheck("curl_init")'
title: 'is curl available?'
gd:
definition: 'HasFunctionCheck("imagecreatetruecolor")'
title: 'Does PHP have GD2 support?'
db:
definition: 'DatabaseCheck("Page")'
title: 'Is the database accessible?'
url:
definition: 'URLCheck()'
title: 'Is the homepage accessible?'
registered_suites:
check:
- curl
- gd
- db
- url
health:
- db
- url

View File

@ -4,6 +4,7 @@ After:
- webapp-extensions
- webapp-elemental
- webapp-locale
- a2nt-cms-niceties-locale-fluent
---
# Define Fluent locales
TractorCow\Fluent\Model\Locale:
@ -29,14 +30,14 @@ Page:
extensions:
- DNADesign\Elemental\TopPage\SiteTreeExtension
- DNADesign\Elemental\Extensions\ElementalPageExtension
- App\Extensions\PageFluentExtension
- A2nt\CMSNiceties\Extensions\PageFluentExtension
DNADesign\Elemental\Models\ElementalArea:
extensions:
- DNADesign\Elemental\TopPage\FluentExtension
- App\Extensions\ElementalArea
- A2nt\CMSNiceties\Extensions\ElementalArea
DNADesign\Elemental\Models\BaseElement:
extensions:
- DNADesign\Elemental\TopPage\FluentExtension
- App\Extensions\ElementRows
- A2nt\CMSNiceties\Extensions\ElementRows

View File

@ -1,59 +1,9 @@
---
Name: webapp-locale
After:
- a2nt-cms-niceties-locale
---
Symbiote\Addressable\Addressable:
allowed_countries:
'us': 'United States'
allowed_states:
'AL': 'Alabama'
'AK': 'Alaska'
'AZ': 'Arizona'
'AR': 'Arkansas'
'CA': 'California'
'CO': 'Colorado'
'CT': 'Connecticut'
'DE': 'Delaware'
'DC': 'District Of Columbia'
'FL': 'Florida'
'GA': 'Georgia'
'HI': 'Hawaii'
'ID': 'Idaho'
'IL': 'Illinois'
'IN': 'Indiana'
'IA': 'Iowa'
'KS': 'Kansas'
'KY': 'Kentucky'
'LA': 'Louisiana'
'ME': 'Maine'
'MD': 'Maryland'
'MA': 'Massachusetts'
'MI': 'Michigan'
'MN': 'Minnesota'
'MS': 'Mississippi'
'MO': 'Missouri'
'MT': 'Montana'
'NE': 'Nebraska'
'NV': 'Nevada'
'NH': 'New Hampshire'
'NJ': 'New Jersey'
'NM': 'New Mexico'
'NY': 'New York'
'NC': 'North Carolina'
'ND': 'North Dakota'
'OH': 'Ohio'
'OK': 'Oklahoma'
'OR': 'Oregon'
'PA': 'Pennsylvania'
'RI': 'Rhode Island'
'SC': 'South Carolina'
'SD': 'South Dakota'
'TN': 'Tennessee'
'TX': 'Texas'
'UT': 'Utah'
'VT': 'Vermont'
'VA': 'Virginia'
'WA': 'Washington'
'WV': 'West Virginia'
'WI': 'Wisconsin'
'WY': 'Wyoming'
'us': 'United States'

View File

@ -4,46 +4,16 @@ After:
- elemental
- elemental-list
- elementalvirtual
- elemental-basics
- a2nt-cms-niceties-options-elements
- webapp-base-extensions
---
# User Forms module
DNADesign\ElementalUserForms\Model\ElementForm:
extensions:
- App\Elements\Extensions\UserDefinedFormExtension
SilverStripe\UserForms\Model\UserDefinedForm:
show_in_sitetree: false
can_be_root: false
extensions:
- App\Elements\Extensions\UserDefinedFormExtension
##################
Page:
searchable_elements:
- DNADesign\Elemental\Models\ElementContent
extensions:
- DNADesign\Elemental\Extensions\ElementalPageExtension
SilverStripe\CMS\Controllers\ContentController:
extensions:
- DNADesign\Elemental\Extensions\ElementalContentControllerExtension
- App\Elements\ElementalContentControllerExtension
url_handlers:
'element/$ID!': 'handleElement'
DNADesign\Elemental\Models\ElementalArea:
extensions:
#- DNADesign\Elemental\TopPage\DataExtension
- App\Elements\Extensions\ElementalArea
DNADesign\Elemental\Models\BaseElement:
default_global_elements: true
extensions:
#- DNADesign\Elemental\TopPage\DataExtension
- App\Elements\Extensions\BaseElementEx
- App\Elements\Extensions\ElementRows
SilverStripe\CMS\Model\SiteTree:
allowed_elements:
- DNADesign\ElementalList\Model\ElementList
@ -53,21 +23,18 @@ SilverStripe\CMS\Model\SiteTree:
- Dynamic\Elements\Blog\Elements\ElementBlogPosts
- Dynamic\Elements\Oembed\Elements\ElementOembed
- Dynamic\Elements\Elements\ElementTestimonials
#- App\Elements\TeamMembersElement
- App\Elements\SliderElement
- App\Elements\BlockElement
- App\Elements\MapElement
#- App\Elements\AccordionElement
#- A2nt\ElementalBasics\Elements\TeamMembersElement
- A2nt\ElementalBasics\Elements\SliderElement
- A2nt\ElementalBasics\Elements\MapElement
#- A2nt\ElementalBasics\Elements\AccordionElement
- DNADesign\ElementalVirtual\Model\ElementVirtual
- App\Elements\AccordionElement
- App\Elements\CustomSnippetElement
- App\Elements\InstagramElement
- A2nt\ElementalBasics\Elements\AccordionElement
- A2nt\ElementalBasics\Elements\CustomSnippetElement
- A2nt\ElementalBasics\Elements\InstagramElement
DNADesign\ElementalList\Model\ElementList:
inline_editable: false
default_global_elements: false
extensions:
- App\Elements\ElementListExtension
allowed_elements:
- DNADesign\ElementalList\Model\ElementList
- DNADesign\Elemental\Models\ElementContent
@ -76,31 +43,12 @@ DNADesign\ElementalList\Model\ElementList:
- Dynamic\Elements\Blog\Elements\ElementBlogPosts
- Dynamic\Elements\Oembed\Elements\ElementOembed
- Dynamic\Elements\Elements\ElementTestimonials
#- App\Elements\TeamMembersElement
- App\Elements\SliderElement
- App\Elements\BlockElement
- App\Elements\MapElement
- App\Elements\AccordionElement
- App\Elements\CustomSnippetElement
- App\Elements\InstagramElement
#- A2nt\ElementalBasics\Elements\TeamMembersElement
- A2nt\ElementalBasics\Elements\SliderElement
- A2nt\ElementalBasics\Elements\MapElement
- A2nt\ElementalBasics\Elements\AccordionElement
- A2nt\ElementalBasics\Elements\CustomSnippetElement
- A2nt\ElementalBasics\Elements\InstagramElement
styles:
whiteframe: 'White Frame'
noframe: 'No Frame'
App\Elements\AccordionElement:
allowed_elements:
- DNADesign\Elemental\Models\ElementContent
DNADesign\Elemental\Models\ElementContent:
default_global_elements: false
inline_editable: false
extensions:
- App\Elements\Extensions\ElementContentWidget
frontend_searchable_fields:
- 'Title:PartialMatch'
- 'HTML:PartialMatch'
Dynamic\Elements\Image\Elements\ElementImage:
inline_editable: false
extensions:
- App\Elements\Extensions\ElementImageWidget

View File

@ -1,33 +1,5 @@
---
Name: webapp-options-widgets
---
# Blog + Widgets module extensions
Page:
extensions:
- App\Widgets\WidgetPageExtension
SilverStripe\Blog\Model\Blog:
extensions:
- App\Extensions\BlogExtension
SilverStripe\Blog\Model\BlogPost:
extensions:
- App\Extensions\BlogPostExtension
SilverStripe\Widgets\Model\Widget:
icon: '<i class="icon font-icon-p-document"></i>'
extensions:
- App\Widgets\WidgetExtension
SilverStripe\Blog\Widgets\BlogArchiveWidget:
icon: '<i class="icon font-icon-p-archive"></i>'
SilverStripe\Blog\Widgets\BlogCategoriesWidget:
icon: '<i class="icon font-icon-page-multiple"></i>'
SilverStripe\Blog\Widgets\BlogFeaturedPostsWidget:
icon: '<i class="icon font-icon-chart-line"></i>'
SilverStripe\Blog\Widgets\BlogRecentPostsWidget:
icon: '<i class="icon font-icon-back-in-time"></i>'
SilverStripe\Blog\Widgets\BlogTagsCloudWidget:
icon: '<i class="icon font-icon-tags"></i>'
SilverStripe\Blog\Widgets\BlogTagsWidget:
icon: '<i class="icon font-icon-tags"></i>'
only_available_in:
- CMSMain_HiddenClass
After:
- a2nt-cms-niceties-options-widgets
---

View File

@ -1,22 +1,24 @@
---
Name: webapp-shop
After:
- a2nt-cms-niceties-shop
---
SilverStripe\Core\Injector\Injector:
SilverShop\Checkout\SinglePageCheckoutComponentConfig:
class: App\Models\CheckoutNoDeliveryConfig
class: A2nt\CMSNiceties\Models\CheckoutNoDeliveryConfig
SilverShop\Extension\ShopConfigExtension:
base_currency: USD
SilverShop\Model\Address:
extensions:
- App\Extensions\AddressExtension
- A2nt\CMSNiceties\Extensions\AddressExtension
SilverShop\Cart\ShoppingCartController:
extensions:
- App\Extensions\ShoppingCartControllerExtension
- A2nt\CMSNiceties\Extensions\ShoppingCartControllerExtension
App\Templates\DeferedRequirements:
A2nt\CMSNiceties\Templates\DeferedRequirements:
custom_requirements:
SilverShop\Page\AccountPageController:
- SilverShop.Page.CheckoutPageController.js

View File

@ -1,7 +1,9 @@
---
Name: webapp-templates-requirements
After:
- a2nt-cms-niceties-templates-requirements
---
App\Templates\DeferredRequirements:
A2nt\CMSNiceties\Templates\DeferredRequirements:
nofontawesome: false
version: false
static_domain: false

View File

@ -2,18 +2,19 @@
Name: webapp-templates-themes
After:
- webapp-options-elements
- a2nt-cms-niceties-templates-themes
---
SilverStripe\View\SSViewer:
source_file_comments: false
source_file_comments: true
themes:
- '$public'
- '$default'
App\Elements\SliderElement:
A2nt\ElementalBasics\Elements\SliderElement:
slide_width: 2140
slide_height: 700
# 2x container width to automatically resize images for 2K display
App\Elements\Extensions\ElementRows:
A2nt\ElementalBasics\Extensions\ElementRows:
container_max_width: 2280
column_class: 'col-block col-md'

View File

@ -3,7 +3,7 @@
# with all configuration variables presented
# Cuz WebPack compiling script use it to set configuration
App\Templates\WebpackTemplateProvider:
A2nt\CMSNiceties\Templates\WebpackTemplateProvider:
APPDIR: './app'
THEMESDIR: './themes'
HOSTNAME: 127.0.0.1

File diff suppressed because one or more lines are too long

1
app/client/dist/css/app_cms.css vendored Normal file
View File

@ -0,0 +1 @@
#Menu-Dynamic-Elements-Admin-TestimonialsAdmin,#Menu-Dynamic-Elements-Promos-Admin-PromosAdmin,#Menu-Dynamic-Elements-Sponsors-Admin-SponsorsAdmin,#Menu-SilverStripe-CampaignAdmin-CampaignAdmin{display:none}#Form_ItemEditForm_MajorActions_Holder{border:0;margin-bottom:0;min-width:30%;padding-bottom:0}#Form_EditForm_MajorActions_Holder{border:0;margin-bottom:0;min-width:70%;padding-bottom:0}#Form_ItemEditForm_RightGroup_Holder{border:0;margin-bottom:0;min-width:20%;padding-bottom:0}.grid-field__icon-action.edit-link{opacity:1}.toolbar--south .btn-primary{color:#fff}.toolbar--south .btn-outline-primary{color:#999}#ActionMenus_MoreOptions .btn-primary{color:#5589a7}body.cms{flex-direction:column;overflow-x:hidden}.fields-compact .form-group{margin-bottom:.25rem;padding-bottom:.5rem}.fields-compact .form-group .form__field-label{font-weight:700}.fields-compact .form-group:after{margin-bottom:.25rem}.fields-compact .form-group:after,.fields-compact .form__divider:after{display:none}.fields-row{margin:0!important;padding:0 0 2em!important;width:100%}.fields-row .form__fieldgroup{display:flex;flex:0 0 100%!important;flex-wrap:wrap;margin:0!important;max-width:100%!important;padding:0!important;width:100%!important}.fields-row .form__fieldgroup>.form-group{flex:1 1 50%;margin:0!important;max-width:50%;padding:0 1rem}.notifications-list .alert .btn-close{display:none}

1
app/client/dist/css/app_editor.css vendored Normal file
View File

@ -0,0 +1 @@
.table,table{--bs-table-bg:transparent;--bs-table-striped-color:#212529;--bs-table-striped-bg:rgba(0,0,0,0.05);--bs-table-active-color:#212529;--bs-table-active-bg:rgba(0,0,0,0.1);--bs-table-hover-color:#212529;--bs-table-hover-bg:rgba(0,0,0,0.075);border-color:#dee2e6;color:#212529;margin-bottom:1rem;vertical-align:top;width:100%}.table>:not(caption)>*>*,table>:not(caption)>*>*{background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg);padding:.5rem}.table>tbody,table>tbody{vertical-align:inherit}.table>thead,table>thead{vertical-align:bottom}.table>:not(:last-child)>:last-child>*,table>:not(:last-child)>:last-child>*{border-bottom-color:currentColor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem}.table-bordered>:not(caption)>*,table>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*,table>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*,table.table-none>:not(caption)>*>*{border-bottom-width:0}.table-striped>tbody>tr:nth-of-type(odd),table>tbody>tr:nth-of-type(odd){--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-bg:#cfe2ff;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;border-color:#bacbe6;color:#000}.table-secondary{--bs-table-bg:#e2e3e5;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;border-color:#cbccce;color:#000}.table-success{--bs-table-bg:#d1e7dd;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;border-color:#bcd0c7;color:#000}.table-info{--bs-table-bg:#cff4fc;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;border-color:#badce3;color:#000}.table-warning{--bs-table-bg:#fff3cd;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;border-color:#e6dbb9;color:#000}.table-danger{--bs-table-bg:#f8d7da;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;border-color:#dfc2c4;color:#000}.table-light{--bs-table-bg:#f8f9fa;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;border-color:#dfe0e1;color:#000}.table-dark{--bs-table-bg:#212529;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;border-color:#373b3e;color:#fff}.table-responsive{-webkit-overflow-scrolling:touch;overflow-x:auto}@media (max-width:575.98px){.table-responsive-sm{-webkit-overflow-scrolling:touch;overflow-x:auto}}@media (max-width:767.98px){.table-responsive-md{-webkit-overflow-scrolling:touch;overflow-x:auto}}@media (max-width:991.98px){.table-responsive-lg{-webkit-overflow-scrolling:touch;overflow-x:auto}}@media (max-width:1167.98px){.table-responsive-xl{-webkit-overflow-scrolling:touch;overflow-x:auto}}body,html{background:#fff;color:#212529}.captionImage,.image,.ss-htmleditorfield-file,img{display:block;margin-bottom:var(--body-gutter-reduced-y);margin-top:var(--body-gutter-reduced-y);max-width:100%}@media (min-width:576px){.captionImage,.image,.ss-htmleditorfield-file,img{margin-left:var(--body-gutter-reduced-x);margin-right:var(--body-gutter-reduced-x)}}.captionImage.center,.image.center,.ss-htmleditorfield-file.center,img.center{margin-left:auto;margin-right:auto;text-align:center}.captionImage.w-100,.image.w-100,.ss-htmleditorfield-file.w-100,img.w-100{margin-left:0;margin-right:0;text-align:center}.captionImage.left,.captionImage.leftAlone,.captionImage.start,.image.left,.image.leftAlone,.image.start,.ss-htmleditorfield-file.left,.ss-htmleditorfield-file.leftAlone,.ss-htmleditorfield-file.start,img.left,img.leftAlone,img.start{clear:left;float:left}@media (min-width:576px){.captionImage.left,.captionImage.leftAlone,.captionImage.start,.image.left,.image.leftAlone,.image.start,.ss-htmleditorfield-file.left,.ss-htmleditorfield-file.leftAlone,.ss-htmleditorfield-file.start,img.left,img.leftAlone,img.start{margin:0 var(--body-gutter-reduced-x) var(--body-gutter-reduced-y) 0}}.captionImage.end,.captionImage.right,.captionImage.rightAlone,.image.end,.image.right,.image.rightAlone,.ss-htmleditorfield-file.end,.ss-htmleditorfield-file.right,.ss-htmleditorfield-file.rightAlone,img.end,img.right,img.rightAlone{clear:right;float:right}@media (min-width:576px){.captionImage.end,.captionImage.right,.captionImage.rightAlone,.image.end,.image.right,.image.rightAlone,.ss-htmleditorfield-file.end,.ss-htmleditorfield-file.right,.ss-htmleditorfield-file.rightAlone,img.end,img.right,img.rightAlone{margin:var(--body-gutter-reduced-y) 0 0 var(--body-gutter-reduced-x)}}.captionImage iframe,.image iframe,.ss-htmleditorfield-file iframe,img iframe{height:100%!important;width:100%!important}.captionImage img{margin-bottom:var(--body-gutter-reduced-y)!important}.captionImage .caption{font-size:.8rem}.left,.text-left,.text-start{text-align:left}.center,.text-center{text-align:center}.right,.text-end,.text-right{text-align:right}.text-justify{text-align:justify}table{border-collapse:collapse;max-width:100%;width:100%}table.table-none{border:0}table.table-none td,table.table-none th,table.table-none tr{background:none!important;border:0;box-shadow:none!important}ol,ul{padding-left:1rem}ol li,ul li{margin:.5em 0;padding-left:.5em;position:relative}ul,ul li{list-style:none}ul li{padding-left:0}ul li:before{content:"\2022";display:inline-block;font-size:1em;left:-.75em;margin-right:.5em;opacity:.5;position:absolute;top:-.1em}iframe,img,p,table,td,th,tr{max-width:100%!important}@media (max-width:575px){iframe,img,p,table,td,th,tr{border:0!important;display:block;padding-left:0!important;padding-right:0!important;width:100%!important}img,p,table,td,th,tr{height:auto!important}.d-typography-breakpoint-none{clip:rect(0,0,0,0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}thead{display:block;text-align:center}thead>tr{display:flex}tbody{display:block}td{display:flex;flex-direction:column}td:before{content:attr(data-label);display:block;font-weight:700;min-width:50%;padding:0 .5rem;width:50%}}img{border:1px dashed}a{color:#0d6efd}img{border:1px dashed #dedede}

1
app/client/dist/css/app_order.css vendored Normal file
View File

@ -0,0 +1 @@
h1.title{border-bottom:1px solid #dee2e6;display:block;line-height:1.5em;text-align:right;text-transform:uppercase}.warningMessage{background-color:#fff3cd;border:1px solid #ffeeba;border-radius:.25rem;color:#856404;margin-bottom:1rem;padding:1rem;position:relative}#Content{margin:auto;padding-left:20px;text-align:left}#Content .emailTitle{font-size:2.5rem;font-weight:400}#Content .emailTitle,#Content .PageTitle{font-family:Roboto,system-ui,-apple-system,Segoe UI,Helvetica Neue,Arial,Noto Sans,Liberation Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}#Content .PageTitle{color:#212529;font-size:14px;padding:5px}#Content .footer td{padding:10px}#Content .footer td.right{text-align:right}#Content .typography{padding:0 10px}#Content .typography a{font-size:1em;text-decoration:underline}#Content .typography a:hover{text-decoration:none}#Content .typography ul{padding:2px 15px}#Content .typography ul li{padding:2px 5px}#Content .typography p{color:#212529;margin:.75em 0}table#SenderTable .meta,table#SenderTable .sender{width:50%}table#MetaTable{margin-left:auto}table#MetaTable .label{font-weight:700}#ShippingTable td,#ShippingTable th{width:50%}table.infotable{background:#fff;border:1px solid #dee2e6;border-collapse:collapse;margin-top:10px;width:100%}table.infotable td.product.title{color:#0d6efd;font-family:Roboto,system-ui,-apple-system,Segoe UI,Helvetica Neue,Arial,Noto Sans,Liberation Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:1.75rem;font-weight:400}table.infotable tr td,table.infotable tr th{border:1px solid #dee2e6;color:#212529;padding:5px}table.infotable td{vertical-align:middle}table.infotable tr.summary{font-weight:700}table.infotable td.ordersummary{border-bottom:1px solid #dee2e6;font-size:1em}table.infotable tr th{font-weight:700}table.infotable tr td a{color:#0d6efd;text-decoration:underline}table.infotable tr td a:hover{text-decoration:none}table.infotable .modifierRow,table.infotable .right,table.infotable .threeColHeader{text-align:right}table.infotable .center{text-align:center}table.infotable .left,table.infotable th{text-align:left}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

0
app/client/dist/js/app_cms.js vendored Normal file
View File

0
app/client/dist/js/app_editor.js vendored Normal file
View File

0
app/client/dist/js/app_order.js vendored Normal file
View File

File diff suppressed because one or more lines are too long

View File

@ -4,14 +4,20 @@
"app": 143,
"app_SilverShop.Page.CheckoutPageController": 193,
"app_Site.Controllers.MapElementController": 133,
"app_cms": 498,
"app_dev": 206,
"app_editor": 831,
"app_order": 299,
"sample": 148
},
"bySource": {
"0 app": 143,
"0 app_SilverShop.Page.CheckoutPageController": 193,
"0 app_Site.Controllers.MapElementController": 133,
"0 app_cms": 498,
"0 app_dev": 206,
"0 app_editor": 831,
"0 app_order": 299,
"0 sample": 148
},
"usedIds": [
@ -19,10 +25,13 @@
143,
148,
193,
206
206,
299,
498,
831
]
},
"mini-css-extract-plugin /mnt/data/srv/dist/repositories/silverstripe-webpack/node_modules/.pnpm/css-loader@5.2.4_webpack@5.36.2/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/.pnpm/resolve-url-loader@3.1.3/node_modules/resolve-url-loader/index.js!./node_modules/.pnpm/sass-loader@11.0.1_node-sass@5.0.0+webpack@5.36.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].use[3]!./app/client/src/scss/app.scss": [
"mini-css-extract-plugin /mnt/data/srv/dist/web/emmaus/node_modules/.pnpm/css-loader@5.2.6_webpack@5.39.1/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/.pnpm/resolve-url-loader@3.1.3/node_modules/resolve-url-loader/index.js!./node_modules/.pnpm/sass-loader@12.1.0_node-sass@6.0.0+webpack@5.39.1/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].use[3]!./app/client/src/scss/app.scss": [
{
"chunks": {
"byName": {
@ -37,17 +46,17 @@
},
"modules": {
"byIdentifier": {
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/css-loader@5.2.4_webpack@5.36.2/node_modules/css-loader/dist/runtime/api.js": 741,
"./node_modules/.pnpm/css-loader@5.2.4_webpack@5.36.2/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/.pnpm/resolve-url-loader@3.1.3/node_modules/resolve-url-loader/index.js!./node_modules/.pnpm/sass-loader@11.0.1_node-sass@5.0.0+webpack@5.36.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].use[3]!./app/client/src/scss/app.scss": 517
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/css-loader@5.2.6_webpack@5.39.1/node_modules/css-loader/dist/runtime/api.js": 376,
"./node_modules/.pnpm/css-loader@5.2.6_webpack@5.39.1/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/.pnpm/resolve-url-loader@3.1.3/node_modules/resolve-url-loader/index.js!./node_modules/.pnpm/sass-loader@12.1.0_node-sass@6.0.0+webpack@5.39.1/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].use[3]!./app/client/src/scss/app.scss": 178
},
"usedIds": [
517,
741
178,
376
]
}
}
],
"mini-css-extract-plugin /mnt/data/srv/dist/repositories/silverstripe-webpack/node_modules/.pnpm/css-loader@5.2.4_webpack@5.36.2/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/.pnpm/resolve-url-loader@3.1.3/node_modules/resolve-url-loader/index.js!./node_modules/.pnpm/sass-loader@11.0.1_node-sass@5.0.0+webpack@5.36.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].use[3]!./app/client/src/scss/types/dev.scss": [
"mini-css-extract-plugin /mnt/data/srv/dist/web/emmaus/node_modules/.pnpm/css-loader@5.2.6_webpack@5.39.1/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/.pnpm/resolve-url-loader@3.1.3/node_modules/resolve-url-loader/index.js!./node_modules/.pnpm/sass-loader@12.1.0_node-sass@6.0.0+webpack@5.39.1/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].use[3]!./app/client/src/scss/types/cms.scss": [
{
"chunks": {
"byName": {
@ -62,17 +71,17 @@
},
"modules": {
"byIdentifier": {
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/css-loader@5.2.4_webpack@5.36.2/node_modules/css-loader/dist/runtime/api.js": 741,
"./node_modules/.pnpm/css-loader@5.2.4_webpack@5.36.2/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/.pnpm/resolve-url-loader@3.1.3/node_modules/resolve-url-loader/index.js!./node_modules/.pnpm/sass-loader@11.0.1_node-sass@5.0.0+webpack@5.36.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].use[3]!./app/client/src/scss/types/dev.scss": 236
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/css-loader@5.2.6_webpack@5.39.1/node_modules/css-loader/dist/runtime/api.js": 376,
"./node_modules/.pnpm/css-loader@5.2.6_webpack@5.39.1/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/.pnpm/resolve-url-loader@3.1.3/node_modules/resolve-url-loader/index.js!./node_modules/.pnpm/sass-loader@12.1.0_node-sass@6.0.0+webpack@5.39.1/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].use[3]!./app/client/src/scss/types/cms.scss": 999
},
"usedIds": [
236,
741
376,
999
]
}
}
],
"mini-css-extract-plugin /mnt/data/srv/dist/repositories/silverstripe-webpack/node_modules/.pnpm/css-loader@5.2.4_webpack@5.36.2/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/.pnpm/resolve-url-loader@3.1.3/node_modules/resolve-url-loader/index.js!./node_modules/.pnpm/sass-loader@11.0.1_node-sass@5.0.0+webpack@5.36.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].use[3]!./themes/sample/client/src/scss/app.scss": [
"mini-css-extract-plugin /mnt/data/srv/dist/web/emmaus/node_modules/.pnpm/css-loader@5.2.6_webpack@5.39.1/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/.pnpm/resolve-url-loader@3.1.3/node_modules/resolve-url-loader/index.js!./node_modules/.pnpm/sass-loader@12.1.0_node-sass@6.0.0+webpack@5.39.1/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].use[3]!./app/client/src/scss/types/dev.scss": [
{
"chunks": {
"byName": {
@ -87,12 +96,87 @@
},
"modules": {
"byIdentifier": {
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/css-loader@5.2.4_webpack@5.36.2/node_modules/css-loader/dist/runtime/api.js": 741,
"./node_modules/.pnpm/css-loader@5.2.4_webpack@5.36.2/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/.pnpm/resolve-url-loader@3.1.3/node_modules/resolve-url-loader/index.js!./node_modules/.pnpm/sass-loader@11.0.1_node-sass@5.0.0+webpack@5.36.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].use[3]!./themes/sample/client/src/scss/app.scss": 535
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/css-loader@5.2.6_webpack@5.39.1/node_modules/css-loader/dist/runtime/api.js": 376,
"./node_modules/.pnpm/css-loader@5.2.6_webpack@5.39.1/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/.pnpm/resolve-url-loader@3.1.3/node_modules/resolve-url-loader/index.js!./node_modules/.pnpm/sass-loader@12.1.0_node-sass@6.0.0+webpack@5.39.1/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].use[3]!./app/client/src/scss/types/dev.scss": 759
},
"usedIds": [
535,
741
376,
759
]
}
}
],
"mini-css-extract-plugin /mnt/data/srv/dist/web/emmaus/node_modules/.pnpm/css-loader@5.2.6_webpack@5.39.1/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/.pnpm/resolve-url-loader@3.1.3/node_modules/resolve-url-loader/index.js!./node_modules/.pnpm/sass-loader@12.1.0_node-sass@6.0.0+webpack@5.39.1/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].use[3]!./app/client/src/scss/types/editor.scss": [
{
"chunks": {
"byName": {
"child": 396
},
"bySource": {
"0 child": 396
},
"usedIds": [
396
]
},
"modules": {
"byIdentifier": {
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/css-loader@5.2.6_webpack@5.39.1/node_modules/css-loader/dist/runtime/api.js": 376,
"./node_modules/.pnpm/css-loader@5.2.6_webpack@5.39.1/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/.pnpm/resolve-url-loader@3.1.3/node_modules/resolve-url-loader/index.js!./node_modules/.pnpm/sass-loader@12.1.0_node-sass@6.0.0+webpack@5.39.1/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].use[3]!./app/client/src/scss/types/editor.scss": 619
},
"usedIds": [
376,
619
]
}
}
],
"mini-css-extract-plugin /mnt/data/srv/dist/web/emmaus/node_modules/.pnpm/css-loader@5.2.6_webpack@5.39.1/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/.pnpm/resolve-url-loader@3.1.3/node_modules/resolve-url-loader/index.js!./node_modules/.pnpm/sass-loader@12.1.0_node-sass@6.0.0+webpack@5.39.1/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].use[3]!./app/client/src/scss/types/order.scss": [
{
"chunks": {
"byName": {
"child": 396
},
"bySource": {
"0 child": 396
},
"usedIds": [
396
]
},
"modules": {
"byIdentifier": {
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/css-loader@5.2.6_webpack@5.39.1/node_modules/css-loader/dist/runtime/api.js": 376,
"./node_modules/.pnpm/css-loader@5.2.6_webpack@5.39.1/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/.pnpm/resolve-url-loader@3.1.3/node_modules/resolve-url-loader/index.js!./node_modules/.pnpm/sass-loader@12.1.0_node-sass@6.0.0+webpack@5.39.1/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].use[3]!./app/client/src/scss/types/order.scss": 264
},
"usedIds": [
264,
376
]
}
}
],
"mini-css-extract-plugin /mnt/data/srv/dist/web/emmaus/node_modules/.pnpm/css-loader@5.2.6_webpack@5.39.1/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/.pnpm/resolve-url-loader@3.1.3/node_modules/resolve-url-loader/index.js!./node_modules/.pnpm/sass-loader@12.1.0_node-sass@6.0.0+webpack@5.39.1/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].use[3]!./themes/sample/client/src/scss/app.scss": [
{
"chunks": {
"byName": {
"child": 396
},
"bySource": {
"0 child": 396
},
"usedIds": [
396
]
},
"modules": {
"byIdentifier": {
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/css-loader@5.2.6_webpack@5.39.1/node_modules/css-loader/dist/runtime/api.js": 376,
"./node_modules/.pnpm/css-loader@5.2.6_webpack@5.39.1/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/.pnpm/resolve-url-loader@3.1.3/node_modules/resolve-url-loader/index.js!./node_modules/.pnpm/sass-loader@12.1.0_node-sass@6.0.0+webpack@5.39.1/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].use[3]!./themes/sample/client/src/scss/app.scss": 726
},
"usedIds": [
376,
726
]
}
}
@ -100,195 +184,157 @@
"modules": {
"byIdentifier": {
"./app/client/src/img|sync|nonrecursive|../../../../../../\\.(png|jpe?g|svg)$/": 6999,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./app/client/src/js/app.js|a5917c09a0f6659a1f0bf38df57f514b": 2806,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./app/client/src/js/types/SilverShop.Page.CheckoutPageController.js": 9942,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./app/client/src/js/types/Site.Controllers.MapElementController.js": 8436,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@a2nt+ss-bootstrap-ui-webpack-boilerplate-react@3.2.1/node_modules/@a2nt/ss-bootstrap-ui-webpack-boilerplate-react/src/js/_components/_main.funcs.js": 1882,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.16_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/cache/index.js|2e8c7cb0a9b4c4989c86d6def0daa7b9": 4662,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.16_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/cache/inmemory/types.js": 9178,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.16_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/core/ApolloClient.js|2f9da32edbed0a5a619faf681e7206ea": 639,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.16_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/core/ObservableQuery.js|332cb52eb8612d08f6eaf2790bb6d1fd": 6950,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.16_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/core/index.js": 361,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.16_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/core/networkStatus.js": 4304,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.16_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/core/types.js": 2631,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.16_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/errors/index.js": 3344,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.16_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/index.js": 4747,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.16_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/link/core/ApolloLink.js": 678,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.16_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/link/core/concat.js": 1648,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.16_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/link/core/empty.js": 3960,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.16_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/link/core/execute.js": 7128,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.16_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/link/core/from.js": 244,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.16_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/link/core/index.js": 159,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.16_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/link/core/split.js": 3954,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.16_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/link/core/types.js": 549,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.16_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/link/http/index.js|d5cf1fa735c7dc13e6a141d818199f93": 8845,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.16_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/link/utils/index.js|299345fd9c3d65fd9bdf1fae2498f686": 5766,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.16_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/react/context/index.js|e01051d8efd099e307c26098deba46d5": 5812,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.16_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/react/hooks/index.js|6ba8000a4ce641970b398174e3692801": 6550,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.16_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/react/index.js": 3165,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.16_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/react/parser/index.js": 8062,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.16_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/react/types/types.js": 1305,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.16_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/utilities/index.js|901864c80b6fcfe76164853ea9ac75d9": 3423,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@wry+equality@0.4.0/node_modules/@wry/equality/lib/equality.esm.js": 1429,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/index.js": 9614,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/adapters/xhr.js": 7205,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/axios.js": 5392,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/cancel/Cancel.js": 476,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/cancel/CancelToken.js": 8418,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/cancel/isCancel.js": 8976,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/core/Axios.js": 9706,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/core/InterceptorManager.js": 3509,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/core/buildFullPath.js": 1124,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/core/createError.js": 9747,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/core/dispatchRequest.js": 9041,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/core/enhanceError.js": 9215,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/core/mergeConfig.js": 8200,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/core/settle.js": 7401,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/core/transformData.js": 249,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/defaults.js": 4095,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/helpers/bind.js": 1802,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/helpers/buildURL.js": 2197,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/helpers/combineURLs.js": 4578,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/helpers/cookies.js": 6303,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/helpers/isAbsoluteURL.js": 6597,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/helpers/isAxiosError.js": 8523,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/helpers/isURLSameOrigin.js": 1970,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/helpers/normalizeHeaderName.js": 3988,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/helpers/parseHeaders.js": 8414,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/helpers/spread.js": 2048,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/utils.js": 3985,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/balanced-match@2.0.0/node_modules/balanced-match/index.js": 2913,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/brace-expansion@2.0.1/node_modules/brace-expansion/index.js": 3936,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/fast-json-stable-stringify@2.1.0/node_modules/fast-json-stable-stringify/index.js": 7301,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/github.com+jsanahuja+instagramfeed@a865251c54154106cc132f3617bea1e7bdfbce72/node_modules/@jsanahuja/instagramfeed/src/InstagramFeed.js": 6062,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/graphql-tag@2.12.4_graphql@15.5.0/node_modules/graphql-tag/lib/index.js|c305563add7b1eeacd8a89da9244ebc6": 9756,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/keyboardjs@2.6.4/node_modules/keyboardjs/dist/keyboard.js": 5035,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/minimatch@3.0.4/node_modules/minimatch/minimatch.js": 9110,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/prop-types@15.7.2/node_modules/prop-types/factoryWithThrowingShims.js": 5901,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/prop-types@15.7.2/node_modules/prop-types/index.js": 5295,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/prop-types@15.7.2/node_modules/prop-types/lib/ReactPropTypesSecret.js": 9125,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/react-easy-swipe@0.0.21/node_modules/react-easy-swipe/lib/index.js": 2981,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/react-easy-swipe@0.0.21/node_modules/react-easy-swipe/lib/react-swipe.js": 4921,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/react-tiny-oembed@1.0.1_react-dom@17.0.2+react@17.0.2/node_modules/react-tiny-oembed/lib/index.js": 3427,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/symbol-observable@4.0.0/node_modules/symbol-observable/es/index.js|d685847f199ef80ce2965d080bc5ad49": 9743,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/ts-invariant@0.7.3/node_modules/ts-invariant/lib/invariant.esm.js": 394,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/tslib@2.2.0/node_modules/tslib/tslib.es6.js": 2965,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/zen-observable@0.8.15/node_modules/zen-observable/index.js": 6339,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/zen-observable@0.8.15/node_modules/zen-observable/lib/Observable.js": 8379,
"./node_modules/.pnpm/babel-loader@8.2.2_90f0e7531115e738439b96a1279188c2/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./themes/sample/client/src/js/app.js": 9097,
"./node_modules/.pnpm/graphql@15.5.0/node_modules/graphql/jsutils/inspect.mjs": 6430,
"./node_modules/.pnpm/graphql@15.5.0/node_modules/graphql/jsutils/nodejsCustomInspectSymbol.mjs": 5332,
"./node_modules/.pnpm/graphql@15.5.0/node_modules/graphql/language/ast.mjs|bbc8eee65fe5c74a5bd5089105512412": 8265,
"./node_modules/.pnpm/graphql@15.5.0/node_modules/graphql/language/blockString.mjs": 2464,
"./node_modules/.pnpm/graphql@15.5.0/node_modules/graphql/language/visitor.mjs": 4893,
"./node_modules/.pnpm/img-optimize-loader@1.0.7_file-loader@6.2.0+webpack@5.36.2/node_modules/img-optimize-loader/dist/index.js??ruleSet[1].rules[4].use[0]!./app/client/src/img/bg.png": 3300,
"./node_modules/.pnpm/img-optimize-loader@1.0.7_file-loader@6.2.0+webpack@5.36.2/node_modules/img-optimize-loader/dist/index.js??ruleSet[1].rules[4].use[0]!./app/client/src/img/logo.png": 8864,
"./node_modules/.pnpm/img-optimize-loader@1.0.7_file-loader@6.2.0+webpack@5.36.2/node_modules/img-optimize-loader/dist/index.js??ruleSet[1].rules[4].use[0]!./app/client/src/img/logo.svg": 625,
"./node_modules/.pnpm/img-optimize-loader@1.0.7_file-loader@6.2.0+webpack@5.36.2/node_modules/img-optimize-loader/dist/index.js??ruleSet[1].rules[4].use[0]!./app/client/src/img/original.png": 6843,
"./node_modules/.pnpm/img-optimize-loader@1.0.7_file-loader@6.2.0+webpack@5.36.2/node_modules/img-optimize-loader/dist/index.js??ruleSet[1].rules[4].use[0]!./app/client/src/img/original2.png": 4730,
"./node_modules/.pnpm/img-optimize-loader@1.0.7_file-loader@6.2.0+webpack@5.36.2/node_modules/img-optimize-loader/dist/index.js??ruleSet[1].rules[4].use[0]!./app/client/src/img/photo1.png": 9272,
"./node_modules/.pnpm/img-optimize-loader@1.0.7_file-loader@6.2.0+webpack@5.36.2/node_modules/img-optimize-loader/dist/index.js??ruleSet[1].rules[4].use[0]!./app/client/src/img/photo2.jpg": 8616,
"./node_modules/.pnpm/img-optimize-loader@1.0.7_file-loader@6.2.0+webpack@5.36.2/node_modules/img-optimize-loader/dist/index.js??ruleSet[1].rules[4].use[0]!./app/client/src/img/photo3.svg": 5802,
"./node_modules/.pnpm/mini-css-extract-plugin@1.6.0_webpack@5.36.2/node_modules/mini-css-extract-plugin/dist/loader.js!./node_modules/.pnpm/css-loader@5.2.4_webpack@5.36.2/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/.pnpm/resolve-url-loader@3.1.3/node_modules/resolve-url-loader/index.js!./node_modules/.pnpm/sass-loader@11.0.1_node-sass@5.0.0+webpack@5.36.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].use[3]!./app/client/src/scss/types/dev.scss": 8833,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./app/client/src/js/app.js|72705d77d619901052c22d90e4bd8674": 1095,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./app/client/src/js/types/SilverShop.Page.CheckoutPageController.js": 8433,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./app/client/src/js/types/Site.Controllers.MapElementController.js": 9116,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@a2nt+ss-bootstrap-ui-webpack-boilerplate-react@3.2.4/node_modules/@a2nt/ss-bootstrap-ui-webpack-boilerplate-react/src/js/_components/_main.funcs.js": 2172,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.20_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/cache/inmemory/types.js": 4570,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.20_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/core/index.js": 1673,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.20_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/core/types.js": 9010,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.20_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/index.js": 9997,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.20_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/link/core/ApolloLink.js|6e734b001f5ab11803b6ecd00f909d9b": 3227,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.20_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/link/core/index.js|ce33e0f09de4616d680737696ef5ce5e": 2621,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.20_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/react/index.js": 2780,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.20_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/react/types/types.js": 8823,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.20_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/utilities/graphql/fragments.js": 3970,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.20_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/utilities/graphql/getFromAST.js": 2264,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/@apollo+client@3.3.20_graphql@15.5.0+react@17.0.2/node_modules/@apollo/client/utilities/graphql/storeUtils.js": 1379,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/index.js": 2967,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/adapters/xhr.js": 6306,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/axios.js": 7525,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/cancel/Cancel.js": 2403,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/cancel/CancelToken.js": 8732,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/cancel/isCancel.js": 9136,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/core/Axios.js": 6264,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/core/InterceptorManager.js": 1553,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/core/buildFullPath.js": 3398,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/core/createError.js": 8830,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/core/dispatchRequest.js": 6689,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/core/enhanceError.js": 8365,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/core/mergeConfig.js": 4000,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/core/settle.js": 7717,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/core/transformData.js": 4422,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/defaults.js": 7276,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/helpers/bind.js": 994,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/helpers/buildURL.js": 3093,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/helpers/combineURLs.js": 5197,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/helpers/cookies.js": 6204,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/helpers/isAbsoluteURL.js": 1576,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/helpers/isAxiosError.js": 1585,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/helpers/isURLSameOrigin.js": 2330,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/helpers/normalizeHeaderName.js": 8968,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/helpers/parseHeaders.js": 2097,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/helpers/spread.js": 191,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/axios@0.21.1/node_modules/axios/lib/utils.js": 8257,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/balanced-match@2.0.0/node_modules/balanced-match/index.js": 2939,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/brace-expansion@2.0.1/node_modules/brace-expansion/index.js": 2937,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/fast-json-stable-stringify@2.1.0/node_modules/fast-json-stable-stringify/index.js": 878,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/github.com+jsanahuja+instagramfeed@a865251c54154106cc132f3617bea1e7bdfbce72/node_modules/@jsanahuja/instagramfeed/src/InstagramFeed.js": 4734,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/keyboardjs@2.6.4/node_modules/keyboardjs/dist/keyboard.js": 8996,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/minimatch@3.0.4/node_modules/minimatch/minimatch.js": 6429,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/prop-types@15.7.2/node_modules/prop-types/factoryWithThrowingShims.js": 2380,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/prop-types@15.7.2/node_modules/prop-types/index.js": 2450,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/prop-types@15.7.2/node_modules/prop-types/lib/ReactPropTypesSecret.js": 7292,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/react-easy-swipe@0.0.21/node_modules/react-easy-swipe/lib/index.js": 1428,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/react-easy-swipe@0.0.21/node_modules/react-easy-swipe/lib/react-swipe.js": 9878,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/react-tiny-oembed@1.0.1_react-dom@17.0.2+react@17.0.2/node_modules/react-tiny-oembed/lib/index.js": 5239,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/ts-invariant@0.7.5/node_modules/ts-invariant/lib/invariant.esm.js": 9073,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/tslib@2.3.0/node_modules/tslib/tslib.es6.js": 9099,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/zen-observable@0.8.15/node_modules/zen-observable/index.js": 1117,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./node_modules/.pnpm/zen-observable@0.8.15/node_modules/zen-observable/lib/Observable.js": 3182,
"./node_modules/.pnpm/babel-loader@8.2.2_45ce778302d7701309b6da7f1a1707f7/node_modules/babel-loader/lib/index.js??ruleSet[1].rules[0].use!./themes/sample/client/src/js/app.js": 6867,
"./node_modules/.pnpm/img-optimize-loader@1.0.7_file-loader@6.2.0+webpack@5.39.1/node_modules/img-optimize-loader/dist/index.js??ruleSet[1].rules[4].use[0]!./app/client/src/img/bg.png": 4658,
"./node_modules/.pnpm/img-optimize-loader@1.0.7_file-loader@6.2.0+webpack@5.39.1/node_modules/img-optimize-loader/dist/index.js??ruleSet[1].rules[4].use[0]!./app/client/src/img/logo.png": 8374,
"./node_modules/.pnpm/img-optimize-loader@1.0.7_file-loader@6.2.0+webpack@5.39.1/node_modules/img-optimize-loader/dist/index.js??ruleSet[1].rules[4].use[0]!./app/client/src/img/logo.svg": 2326,
"./node_modules/.pnpm/img-optimize-loader@1.0.7_file-loader@6.2.0+webpack@5.39.1/node_modules/img-optimize-loader/dist/index.js??ruleSet[1].rules[4].use[0]!./app/client/src/img/original.png": 2966,
"./node_modules/.pnpm/img-optimize-loader@1.0.7_file-loader@6.2.0+webpack@5.39.1/node_modules/img-optimize-loader/dist/index.js??ruleSet[1].rules[4].use[0]!./app/client/src/img/original2.png": 4299,
"./node_modules/.pnpm/img-optimize-loader@1.0.7_file-loader@6.2.0+webpack@5.39.1/node_modules/img-optimize-loader/dist/index.js??ruleSet[1].rules[4].use[0]!./app/client/src/img/photo1.png": 9185,
"./node_modules/.pnpm/img-optimize-loader@1.0.7_file-loader@6.2.0+webpack@5.39.1/node_modules/img-optimize-loader/dist/index.js??ruleSet[1].rules[4].use[0]!./app/client/src/img/photo2.jpg": 2901,
"./node_modules/.pnpm/img-optimize-loader@1.0.7_file-loader@6.2.0+webpack@5.39.1/node_modules/img-optimize-loader/dist/index.js??ruleSet[1].rules[4].use[0]!./app/client/src/img/photo3.svg": 5770,
"./node_modules/.pnpm/mini-css-extract-plugin@1.6.0_webpack@5.39.1/node_modules/mini-css-extract-plugin/dist/loader.js!./node_modules/.pnpm/css-loader@5.2.6_webpack@5.39.1/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/.pnpm/resolve-url-loader@3.1.3/node_modules/resolve-url-loader/index.js!./node_modules/.pnpm/sass-loader@12.1.0_node-sass@6.0.0+webpack@5.39.1/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].use[3]!./app/client/src/scss/types/cms.scss": 8851,
"./node_modules/.pnpm/mini-css-extract-plugin@1.6.0_webpack@5.39.1/node_modules/mini-css-extract-plugin/dist/loader.js!./node_modules/.pnpm/css-loader@5.2.6_webpack@5.39.1/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/.pnpm/resolve-url-loader@3.1.3/node_modules/resolve-url-loader/index.js!./node_modules/.pnpm/sass-loader@12.1.0_node-sass@6.0.0+webpack@5.39.1/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].use[3]!./app/client/src/scss/types/dev.scss": 5980,
"./node_modules/.pnpm/mini-css-extract-plugin@1.6.0_webpack@5.39.1/node_modules/mini-css-extract-plugin/dist/loader.js!./node_modules/.pnpm/css-loader@5.2.6_webpack@5.39.1/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/.pnpm/resolve-url-loader@3.1.3/node_modules/resolve-url-loader/index.js!./node_modules/.pnpm/sass-loader@12.1.0_node-sass@6.0.0+webpack@5.39.1/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].use[3]!./app/client/src/scss/types/editor.scss": 8910,
"./node_modules/.pnpm/mini-css-extract-plugin@1.6.0_webpack@5.39.1/node_modules/mini-css-extract-plugin/dist/loader.js!./node_modules/.pnpm/css-loader@5.2.6_webpack@5.39.1/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/.pnpm/resolve-url-loader@3.1.3/node_modules/resolve-url-loader/index.js!./node_modules/.pnpm/sass-loader@12.1.0_node-sass@6.0.0+webpack@5.39.1/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].use[3]!./app/client/src/scss/types/order.scss": 4805,
"./node_modules/font-awesome|sync|nonrecursive|../../../../../../\\.(otf|eot|ttf|woff|woff2)$/": 3429,
"external \"React\"": 3804,
"ignored|./node_modules/.pnpm/minimatch@3.0.4/node_modules/minimatch|path": 2061
},
"usedIds": [
159,
244,
249,
361,
394,
476,
549,
625,
639,
678,
1124,
1305,
1429,
1648,
1802,
1882,
1970,
2048,
191,
878,
994,
1095,
1117,
1379,
1428,
1553,
1576,
1585,
1673,
2061,
2197,
2464,
2631,
2806,
2913,
2965,
2981,
3165,
3300,
3344,
3423,
3427,
2097,
2172,
2264,
2326,
2330,
2380,
2403,
2450,
2621,
2780,
2901,
2937,
2939,
2966,
2967,
3093,
3182,
3227,
3398,
3429,
3509,
3804,
3936,
3954,
3960,
3985,
3988,
4095,
4304,
4578,
4662,
4730,
4747,
4893,
4921,
5035,
5295,
5332,
5392,
5766,
5802,
5812,
5901,
6062,
6303,
6339,
6430,
6550,
6597,
6843,
6950,
3970,
4000,
4299,
4422,
4570,
4658,
4734,
4805,
5197,
5239,
5770,
5980,
6204,
6264,
6306,
6429,
6689,
6867,
6999,
7128,
7205,
7301,
7401,
8062,
8200,
8265,
8379,
8414,
8418,
8436,
8523,
8616,
8833,
8845,
8864,
8976,
9041,
9097,
9110,
9125,
9178,
9215,
9272,
9614,
9706,
9743,
9747,
9756,
9942
7276,
7292,
7525,
7717,
8257,
8365,
8374,
8433,
8732,
8823,
8830,
8851,
8910,
8968,
8996,
9010,
9073,
9099,
9116,
9136,
9185,
9878,
9997
]
}
}

File diff suppressed because one or more lines are too long

View File

@ -1,220 +0,0 @@
@import '~@a2nt/ss-bootstrap-ui-webpack-boilerplate-react/src/scss/_components/_ui.elemental';
/* style elements here */
/*.element {
background-size: cover;
background-repeat: no-repeat;
}
.element.page-header-element + .element {
margin-top: -$grid-gutter-element-height;
}
.element.page-header-element {
padding-top: $grid-gutter-element-height;
.page-header {
margin: 0;
}
}
.site__elements__sliderelement {
.element-container {
width: 100%;
padding: 0;
max-width: none;
}
&:first-child {
margin-top: -(2 * $grid-gutter-element-height);
}
}
.carousel-item-Image,
.carousel-item-Video {
.carousel-slide {
flex-direction: column;
max-height: 70vh;
max-height: calc(100vh - 10.5rem);
height: 70vh;
height: calc(100vh - 10.5rem);
align-items: center;
justify-content: center;
.img {
height: 100%;
width: auto;
min-width: 100%;
img {
min-height: 100%;
min-width: 100%;
max-width: inherit;
width: auto !important;
@media (min-height: 700px) {
width: auto !important;
}
@media (min-width: 2140px) {
width: 100% !important;
}
}
}
.video {
padding-bottom: 56.25%;
position: relative;
iframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
}
@media (max-width: map-get($grid-breakpoints, 'sm') - 1) {
padding-bottom: 54rem;
}
}
.carousel-title {
font-size: 4.375rem;
a {
color: $white;
}
}
.carousel-caption {
width: 100%;
right: 0;
left: 0;
bottom: 5vh;
}
.slide-link {
color: $white;
}
.carousel-caption-container {
position: absolute;
top: auto;
bottom: 0;
left: auto;
right: 0;
background: transparentize($black, 0.5);
max-width: 60%;
padding: 1rem;
}
@media (max-width: $full-body-min-width - 1) {
.carousel-title,
.carousel-caption,
.slide-link {
color: $black;
}
.carousel-title {
font-size: 1.6rem;
a {
color: $body-color;
}
}
.carousel-caption {
position: static;
padding: 0;
.container {
padding: 0;
}
.carousel-caption-container {
position: relative;
background: $bg-alt;
color: $black;
max-width: 100%;
width: 100%;
}
}
}
}
.carousel-item-Video {
.carousel-slide {
height: auto !important;
@media (max-width: map-get($grid-breakpoints, 'sm') - 1) {
padding-bottom: 0;
}
}
}
.carousel-slide .video {
height: 100%;
background: $black;
iframe {
height: 100% !important;
}
}
.dynamic__elements__image__elements__elementimage {
text-align: center;
img {
min-width: 100%;
}
.image-element__image {
background: $black;
}
.image-element__caption {
position: absolute;
bottom: 1rem;
left: 1rem;
right: 1rem;
background: $black;
color: $white;
}
.image-element__title {
margin-bottom: 0;
line-height: 2em;
}
&:hover,
&:focus {
img {
filter: grayscale(1);
}
.image-element__caption {
color: $primary;
}
}
}
.site__elements__accordion {
.card {
padding-left: 0;
padding-right: 0;
.card-header {
@extend .bg-dark;
}
}
}
.page-content-sidebar {
}
.Site_Widgets_SubmenuWidget {
.nav-link {
width: 100%;
}
}
.site__elements__instagramelement {
.jsInstagramFeed-item {
flex: 25%;
padding-top: 1rem;
padding-bottom: 1rem;
img {
display: block;
width: 100%;
height: 100%;
background-size: contain;
background-repeat: no-repeat;
}
}
}
*/

View File

@ -0,0 +1,12 @@
.carousel-caption {
padding: 6rem 0;
font-size: 3rem;
.carousel-title {
font-size: 4rem;
}
.carousel-content {
font-style: italic;
}
}

View File

@ -0,0 +1,2 @@
@import '~@a2nt/ss-bootstrap-ui-webpack-boilerplate-react/src/scss/_components/_ui.elemental';
@import '_carousel';

View File

@ -1,546 +0,0 @@
/**
* Your custom style
*/
body {
--header-bg: #{inspect($body-header-bg)};
--header-color: #{inspect($body-header-color)};
--header-link: #{inspect($body-header-link)};
--main-nav-link-color:#{inspect($body-main-nav-link-color)};
--main-nav-link-hover-color:#{inspect($body-main-nav-link-hover-color)};
--main-nav-dropdown-hover-bg:#{inspect($body-main-nav-dropdown-hover-bg)};
--footer-footer-bg:#{inspect($body-footer-footer-bg)};
}
.carousel-caption {
padding: 6rem 0;
font-size: 3rem;
.carousel-title {
font-size: 4rem;
}
.carousel-content {
font-style: italic;
}
}
#SiteWideMessage {
text-align: center;
.alert {
margin-bottom: 0;
.btn-close {
margin-top: -0.5rem;
float: right;
}
}
}
#Header {
background-color: $header-bg;
color: $header-color;
a {
color: $header-link;
}
.nav-container {
display: flex;
justify-content: flex-end;
align-items: center;
position: static;
}
.logo {
img {
width: 6.5vw;
@media (orientation: portrait) {
width: 20vw;
}
}
}
.tagline {
display: inline-block;
font-size: 1.2rem;
margin-left: 2em;
}
}
#Navigation {
letter-spacing: .25em;
text-transform: uppercase;
width: 100%;
background: $header-bg;
.navbar-nav {
width: 100%;
justify-content: flex-end;
}
.navbar-toggler {
color: $main-nav-link-color;
font-size: $main-nav-toggler-size;
}
.nav-item,
.nav-link {
flex-direction: column;
/*@media (min-width: $full-body-min-width) {
align-items: center;
justify-content: center;
text-align: center;
}*/
}
.nav-link {
color: $main-nav-link-color;
background: $main-nav-link-bg;
&:focus,
&:hover,
&.active {
background: $main-nav-link-hover-bg;
color: $main-nav-link-hover-color;
}
}
.active {
>.nav-link {
background: $main-nav-link-hover-bg;
color: $main-nav-link-hover-color;
}
}
.nav-item .nav-dropdown {
.fa-chevron-right //&:after
{
display: none;
}
}
.dropdown-menu {
border-color: $main-nav-dropdown-bg;
background: $main-nav-dropdown-bg;
margin-top: 0;
border-top: 0;
min-width: 100%;
.nav-item-link {
color: $main-nav-dropdown-color;
}
}
.dropdown-item {
&.active,
&:active,
&:focus,
&:hover {
background: $main-nav-dropdown-hover-bg;
.nav-item-link {
color: $main-nav-dropdown-hover-color;
}
}
.nav-item-link {
width: 100%;
justify-content: flex-start;
align-items: flex-start;
}
}
@media (min-width: $full-body-min-width) {
.navbar-nav>.nav-item {
padding-right: 2rem;
padding-left: 2rem;
}
.dropdown-item .nav-item-link {
padding-left: 1rem;
padding-right: 1rem;
}
}
}
/*#MainContent {
padding-top: 2 * $element-reduced-spacer-y;
padding-bottom: 2 * $element-reduced-spacer-y;
}*/
#PageBreadcumbs {
position: relative;
z-index: 2;
}
#Footer {
border-top: 1px solid #ebebeb;
display: flex;
flex-direction: column;
background-color: $footer-bg;
color: $footer-color;
>.wrapper {
padding-top: $element-reduced-spacer-y;
padding-bottom: $element-reduced-spacer-y;
}
a,
.a {
color: $footer-link;
}
.footer {
padding-top: $element-reduced-spacer-y;
padding-bottom: $element-reduced-spacer-y;
background-color: $footer-footer-bg;
.copyright {
padding-right: 0.5rem;
}
li {
padding: 0 0.5rem;
}
}
}
/**
* Your custom style
*/
/*
.a.active,
.a:focus,
.a:hover,
.a[aria-expanded='true'],
.btn.active,
.btn:focus,
.btn:hover,
.btn[aria-expanded='true'],
[data-toggle].active,
[data-toggle]:focus,
[data-toggle]:hover,
[data-toggle][aria-expanded='true'],
a.active,
a:focus,
a:hover,
a[aria-expanded='true'],
button.active,
button:focus,
button:hover,
button[aria-expanded='true'] {
opacity: 1;
img,
.img {
filter: grayscale(1);
}
}
body {
position: relative;
}
.field {
margin: 2rem 0;
&.required:after {
display: none;
}
}
.breadcrumb {
margin-bottom: 0;
}
.form-control,
.select2-container--default .select2-selection,
.select2-dropdown .select2-search__field {
border-width: 0 0 1px 0;
}
.bg-alt {
@extend .bg-dark;
background-color: $bg-alt !important;
}
.bootstrap-select .dropdown-toggle .filter-option .option {
background: #dedede;
padding: 0.2rem 0.5rem;
margin: 0.2rem;
color: #212529;
}
$full-body-min-width: map-get($grid-breakpoints, 'sm') !default;
@media (max-width: $full-body-min-width - 1) {
.jsSidebarUI__inner {
width: auto !important;
transform: none !important;
position: static !important;
}
}
.dropdown-menu {
padding: 0;
border-radius: 0;
.dropdown-list {
@extend .list-unstyled;
}
.dropdown-menu {
top: 0;
left: 100%;
}
}
.nav-link {
@include fix-bold();
&:focus,
&:hover,
&.active {
background: $nav-link-hover-bg;
color: $nav-link-hover-color;
font-weight: bold;
}
}
.active {
.nav-link {
background: $nav-link-hover-bg;
color: $nav-link-hover-color;
}
}
// shrink elements on scroll
body.shrink {
@media (max-width: map-get($grid-breakpoints, 'lg') - 1) {
padding-top: 100px;
#Header {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 2;
}
}
@media (min-width: map-get($grid-breakpoints, 'lg')) and (max-width: map-get($grid-breakpoints, 'xl') - 1) {
padding-top: 146px;
#Header {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 2;
}
}
}
.sidebar__col {
position: relative;
margin-top: $grid-gutter-element-height;
margin-bottom: $grid-gutter-element-height * 2;
}
.content-holder__sidebar {
> .container {
padding: 0;
}
}
#SiteWideMessage {
text-align: center;
.alert {
margin-bottom: 0;
.btn-close {
margin-top: -0.5rem;
float: right;
}
}
}
#Header {
background-color: $header-bg;
color: $header-color;
a {
color: $header-link;
}
.nav-container {
display: flex;
justify-content: flex-end;
align-items: flex-end;
position: static;
}
.logo {
filter: invert(100%);
}
.tagline {
display: inline-block;
font-size: 1.2rem;
margin-left: 2em;
}
}
#Navigation {
font-size: 1.5rem;
padding: 0;
text-transform: uppercase;
letter-spacing: 0.25rem;
position: fixed;
top: 0;
right: 0;
z-index: 4;
width: 100%;
background: $header-bg;
@media (min-width: map-get($grid-breakpoints, 'md')) {
position: static;
width: auto;
background: none;
}
.navbar-toggler {
color: $main-nav-link-color;
position: absolute;
top: 0;
right: 0;
font-size: $main-nav-toggler-size;
}
.nav-item,
.nav-link {
display: flex;
align-items: center;
justify-content: center;
}
.nav-link {
color: $main-nav-link-color;
background: $main-nav-link-bg;
&:focus,
&:hover,
&.active {
background: $main-nav-link-hover-bg;
color: $main-nav-link-hover-color;
}
}
.active {
.nav-link {
background: $main-nav-link-hover-bg;
color: $main-nav-link-hover-color;
}
}
.nav-item .nav-dropdown {
.fa-chevron-right
//&:after
{
display: none;
}
}
.dropdown-menu {
border-color: $main-nav-dropdown-bg;
background: $main-nav-dropdown-bg;
margin-top: 0;
border-top: 0;
width: 100%;
.nav-item-link {
color: $main-nav-dropdown-color;
}
}
.dropdown-item {
padding: 0;
&:focus,
&:hover {
background: $main-nav-dropdown-hover-bg;
.nav-item-link {
color: $main-nav-dropdown-hover-color;
}
}
.nav-item-link {
width: 100%;
justify-content: flex-start;
align-items: flex-start;
}
}
@media (min-width: map-get($grid-breakpoints, 'md')) {
.navbar-nav > .nav-item {
padding-right: 2rem;
padding-left: 2rem;
}
.dropdown-item .nav-item-link {
padding-left: 1rem;
padding-right: 1rem;
}
}
}
#MainContent {
padding-top: 2 * $grid-gutter-element-height;
padding-bottom: 2 * $grid-gutter-element-height;
}
#PageBreadcumbs {
position: relative;
z-index: 2;
}
#Footer {
background-color: $footer-bg;
color: $footer-color;
> .wrapper {
padding-top: $grid-gutter-element-height;
}
a {
color: $footer-link;
}
ul {
margin-bottom: 0;
}
.field:first-child {
margin-top: 0;
}
.footer {
background-color: $footer-footer-bg;
.copyright {
padding-right: 0.5rem;
}
li {
padding: 0 0.5rem;
}
}
@media (min-width: $full-body-min-width) {
.wrapper {
padding-bottom: $footer-bar-size;
}
.footer {
height: $footer-bar-size;
margin-top: -$footer-bar-size;
line-height: $footer-bar-size;
}
}
}
*/

View File

@ -0,0 +1,18 @@
/**
* Your custom style
*/
body {
--header-bg: #{inspect($body-header-bg)};
--header-color: #{inspect($body-header-color)};
--header-link: #{inspect($body-header-link)};
--main-nav-link-color:#{inspect($body-main-nav-link-color)};
--main-nav-link-hover-color:#{inspect($body-main-nav-link-hover-color)};
--main-nav-dropdown-hover-bg:#{inspect($body-main-nav-dropdown-hover-bg)};
--footer-footer-bg:#{inspect($body-footer-footer-bg)};
}
/*#MainContent {
padding-top: 2 * $element-reduced-spacer-y;
padding-bottom: 2 * $element-reduced-spacer-y;
}*/

View File

@ -0,0 +1,31 @@
#Footer {
border-top: 1px solid #ebebeb;
display: flex;
flex-direction: column;
background-color: $footer-bg;
color: $footer-color;
>.wrapper {
padding-top: $element-reduced-spacer-y;
padding-bottom: $element-reduced-spacer-y;
}
a,
.a {
color: $footer-link;
}
.footer {
padding-top: $element-reduced-spacer-y;
padding-bottom: $element-reduced-spacer-y;
background-color: $footer-footer-bg;
.copyright {
padding-right: 0.5rem;
}
li {
padding: 0 0.5rem;
}
}
}

View File

@ -0,0 +1,44 @@
#SiteWideMessage {
text-align: center;
.alert {
margin-bottom: 0;
.btn-close {
margin-top: -0.5rem;
float: right;
}
}
}
#Header {
background-color: $header-bg;
color: $header-color;
a {
color: $header-link;
}
.nav-container {
display: flex;
justify-content: flex-end;
align-items: center;
position: static;
}
.logo {
img {
width: 6.5vw;
@media (orientation: portrait) {
width: 20vw;
}
}
}
.tagline {
display: inline-block;
font-size: 1.2rem;
margin-left: 2em;
}
}

View File

@ -0,0 +1,4 @@
@import '_base';
@import '_header';
@import '_navigation';
@import '_footer';

View File

@ -0,0 +1,102 @@
#Navigation {
letter-spacing: .25em;
text-transform: uppercase;
width: 100%;
background: $header-bg;
.navbar-nav {
width: 100%;
justify-content: flex-end;
}
.navbar-toggler {
color: $main-nav-link-color;
font-size: $main-nav-toggler-size;
}
.nav-item,
.nav-link {
flex-direction: column;
/*@media (min-width: $full-body-min-width) {
align-items: center;
justify-content: center;
text-align: center;
}*/
}
.nav-link {
color: $main-nav-link-color;
background: $main-nav-link-bg;
&:focus,
&:hover,
&.active {
background: $main-nav-link-hover-bg;
color: $main-nav-link-hover-color;
}
}
.active {
>.nav-link {
background: $main-nav-link-hover-bg;
color: $main-nav-link-hover-color;
}
}
.nav-item .nav-dropdown {
.fa-chevron-right //&:after
{
display: none;
}
}
.dropdown-menu {
border-color: $main-nav-dropdown-bg;
background: $main-nav-dropdown-bg;
margin-top: 0;
border-top: 0;
min-width: 100%;
.nav-item-link {
color: $main-nav-dropdown-color;
}
}
.dropdown-item {
&.active,
&:active,
&:focus,
&:hover {
background: $main-nav-dropdown-hover-bg;
.nav-item-link {
color: $main-nav-dropdown-hover-color;
}
}
.nav-item-link {
width: 100%;
justify-content: flex-start;
align-items: flex-start;
}
}
@media (min-width: $full-body-min-width) {
.navbar-nav>.nav-item {
padding-right: 2rem;
padding-left: 2rem;
}
.dropdown-item .nav-item-link {
padding-left: 1rem;
padding-right: 1rem;
}
}
}
#PageBreadcumbs {
position: relative;
z-index: 2;
}

View File

@ -1,2 +1,2 @@
@import '~@a2nt/ss-bootstrap-ui-webpack-boilerplate-react/src/scss/types/cms';
@import '../_variables';
@import '~@a2nt/ss-bootstrap-ui-webpack-boilerplate-react/src/scss/types/cms';

View File

@ -1,11 +1,11 @@
@import '~@a2nt/ss-bootstrap-ui-webpack-boilerplate-react/src/scss/types/editor';
@import '../_variables';
@import '~@a2nt/ss-bootstrap-ui-webpack-boilerplate-react/src/scss/types/editor';
// Add content editor (only) typography styling
a {
color: $link-color;
color: $link-color;
}
img {
border: 1px dashed #dedede;
border: 1px dashed #dedede;
}

View File

@ -1,31 +0,0 @@
en:
SilverStripe\Security\Member:
SURNAME: 'Last Name'
db_Surname: 'Last Name'
SUBJECTPASSWORDRESET: 'Your password reset link'
ENTEREMAIL: 'Please enter an email address to get a password reset link.'
PASSWORDRESETSENTHEADER: 'Password reset link sent'
PASSWORDRESETSENTTEXT: 'Thank you. A reset link has been sent, provided an account exists for this email address.'
Page:
LOADINGTEXT: 'LOADING ..'
JAVASCRIPTREQUIRED: 'Please, enable javascript!'
UPGRADEBROWSER: 'Upgrade your browser'
OUTDATEDBROWSER: 'You are using an outdated browser. For a faster, safer browsing experience, upgrade for free today.'
SilverShop\Model\Address:
db_Surname: 'Last Name'
SilverShop\Model\Order:
db_Surname: 'Last Name'
SilverShop\Page\CheckoutPage:
ProceedToPayment: 'Send Order to Store'
UndefinedOffset\NoCaptcha\Forms\NocaptchaField:
EMPTY: 'Please prove you are human - check the Captcha box.'
NOSCRIPT: 'You must enable JavaScript to submit this form'
VALIDATE_ERROR: 'Captcha could not be validated'
Dynamic\FlexSlider\Model\SlideImage:
SINGULARNAME: 'Slide'
PLURALNAME: 'Slides'
Addressable:
SUBURB: 'City'
Symbiote\AddressableAddressable:
SUBURB: 'City'

View File

@ -1,19 +0,0 @@
ru:
Page:
LOADINGTEXT: "ЗАГРУЗКА .."
JAVASCRIPTREQUIRED: "Для корректной работы страницы требуется включить Javascript!"
UPGRADEBROWSER: "Обновите браузер!"
OUTDATEDBROWSER: "Вы используете устаревшую версию браузера. Обновите ваш браузер сейчас для повышения уровня безопасности вашей системы."
PaginationLabel: "Переключение страниц"
PaginationPrevious: "Назад"
PaginationNext: "Вперед"
SilverStripe\Blog\Model\Blog:
PostedIn: "Категории"
Tagged: "Отметки"
Comments: "Коментарии"
Posted: "Опубликовано"
By: " - "
AND: "и"
LessThanAMinuteToRead: "Меньше минуты на чтение"
MinutesToRead: "Минут на чтение"
READMORE: "Подробнее"

View File

@ -1,21 +0,0 @@
<?php
namespace App\Controllers;
use DNADesign\Elemental\Controllers\ElementController;
use App\Templates\DeferredRequirements;
class MapElementController extends ElementController
{
public function init()
{
parent::init();
DeferredRequirements::loadCSS('https://api.tiles.mapbox.com/mapbox-gl-js/v0.48.0/mapbox-gl.css');
DeferredRequirements::loadJS('https://api.tiles.mapbox.com/mapbox-gl-js/v0.48.0/mapbox-gl.js');
DeferredRequirements::loadCSS('app_Site.Controllers.MapElementController.css');
DeferredRequirements::loadJS('app_Site.Controllers.MapElementController.js');
}
}

View File

@ -1,32 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: tony
* Date: 6/30/18
* Time: 11:54 PM
*/
namespace App\Elements;
use DNADesign\ElementalList\Model\ElementList;
class AccordionElement extends ElementList
{
private static $singular_name = 'Accordion Element';
private static $plural_name = 'Accordion Element';
private static $description = 'Displays Accordion of Elements';
private static $table_name = 'AccordionElement';
public function getType()
{
return self::$singular_name;
}
public function Accordion()
{
return $this->Elements()->renderWith(static::class.'_AccordionArea');
}
}

View File

@ -1,50 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: tony
* Date: 6/30/18
* Time: 11:54 PM
*/
namespace App\Elements;
use Sheadawson\Linkable\Forms\LinkField;
use Sheadawson\Linkable\Models\Link;
use SilverStripe\FontAwesome\FontAwesomeField;
use DNADesign\Elemental\Models\ElementContent;
class BlockElement extends ElementContent
{
private static $singular_name = 'Block Element';
private static $plural_name = 'Block Element';
private static $description = 'Displays Block';
private static $table_name = 'BlockElement';
public function getType()
{
return self::$singular_name;
}
private static $db = [
'BlockIcon' => 'Varchar(255)',
];
private static $has_one = [
'BlockLink' => Link::class,
];
public function getCMSFields()
{
$fields = parent::getCMSFields();
$fields->addFieldsToTab('Root.Main', [
FontAwesomeField::create('BlockIcon'),
LinkField::create('BlockLinkID', 'Link'),
]);
return $fields;
}
}

View File

@ -1,42 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: tony
* Date: 6/30/18
* Time: 11:54 PM
*/
namespace App\Elements;
use DNADesign\Elemental\Models\ElementContent;
use SilverStripe\AssetAdmin\Forms\UploadField;
use SilverStripe\Assets\Image;
use SilverStripe\Forms\TextareaField;
class CustomSnippetElement extends ElementContent
{
private static $singular_name = 'Custom Snippet';
private static $plural_name = 'Custom Snippets';
private static $description = 'Displays Custom Snippet';
private static $table_name = 'CustomSnippetElement';
public function getType()
{
return self::$singular_name;
}
public function getCMSFields()
{
$fields = parent::getCMSFields();
$fields->replaceField(
'HTML',
TextareaField::create('HTML')
);
return $fields;
}
}

View File

@ -1,15 +0,0 @@
<?php
namespace App\Elements;
use SilverStripe\ORM\DataExtension;
class ElementListExtension extends DataExtension
{
public function getControllerName()
{
return EmptyPageController::class;
}
}

View File

@ -1,44 +0,0 @@
<?php
namespace App\Elements;
use DNADesign\Elemental\Models\BaseElement;
use SilverStripe\CMS\Model\SiteTree;
class ElementalContentControllerExtension extends \DNADesign\Elemental\Extensions\ElementalContentControllerExtension
{
private static $allowed_actions = array(
'handleElement'
);
public function handleElement()
{
$id = $this->owner->getRequest()->param('ID');
if (!$id) {
user_error('No element ID supplied', E_USER_ERROR);
return false;
}
/** @var SiteTree $elementOwner */
//$elementOwner = $this->owner->data();
/*$elementalAreaRelations = $this->owner->getElementalRelations();
if (!$elementalAreaRelations) {
user_error(get_class($this->owner) . ' has no ElementalArea relationships', E_USER_ERROR);
return false;
}*/
$element = BaseElement::get()->byID($id);
if ($element) {
return $element->getController();
}
user_error('Element $id not found', E_USER_ERROR);
return false;
}
}

View File

@ -1,23 +0,0 @@
<?php
namespace App\Elements;
use SilverStripe\SiteConfig\SiteConfig;
class EmptyPageController extends \PageController
{
public function __construct($dataRecord = null)
{
parent::__construct();
$this->dataRecord->Title = SiteConfig::current_site_config()->getField('Title');
$this->setFailover($this->dataRecord);
}
public static function DefaultContainer()
{
return \Page::DefaultContainer();
}
}

View File

@ -1,68 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: tony
* Date: 6/23/18
* Time: 1:23 PM
*/
namespace App\Elements\Extensions;
use DNADesign\Elemental\Models\BaseElement;
use SilverStripe\CMS\Model\SiteTree;
use SilverStripe\Forms\TreeDropdownField;
use SilverStripe\ORM\DataExtension;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\LiteralField;
class BaseElementEx extends DataExtension
{
public function updateCMSFields(FieldList $fields)
{
$obj = $this->owner;
parent::updateCMSFields($fields);
$tab = $fields->findOrMakeTab('Root.Settings');
$tab->push(LiteralField::create(
'ClassName',
'<div class="form-group field text">'
.'<div class="form__field-label">Class</div>'
.'<div class="form__field-holder">'.$obj->getField('ClassName').'</div>'
.'</div>'
));
if($this->owner->ID) {
$tab->push(TreeDropdownField::create(
'MoveElementIDToPage',
'Move an element to page',
SiteTree::class
)->setEmptyString('(select an element to move)'));
}
}
public static function MoveElementToPage($ID, $moveToID)
{
$el = BaseElement::get()->byID($ID);
$page = SiteTree::get()->byID($moveToID);
if (!$page || !$el) {
return false;
}
$el->setField('ParentID', $page->ElementalArea()->ID);
$el->write();
return true;
}
public function onBeforeWrite()
{
parent::onBeforeWrite();
$moveID = $this->owner->getField('MoveElementIDToPage');
if($this->owner->ID && $moveID) {
self::MoveElementToPage($this->owner->ID, $moveID);
}
}
}

View File

@ -1,15 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: tony
* Date: 6/24/18
* Time: 2:35 PM
*/
namespace App\Elements\Extensions;
use SilverStripe\ORM\DataExtension;
class ElementContentWidget extends DataExtension
{
}

View File

@ -1,186 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: tony
* Date: 6/24/18
* Time: 1:46 AM
*/
namespace App\Elements\Extensions;
use Dynamic\Elements\Image\Elements\ElementImage;
use Sheadawson\Linkable\Forms\LinkField;
use Sheadawson\Linkable\Models\Link;
use SilverStripe\Core\Config\Config;
use SilverStripe\Forms\CheckboxField;
use SilverStripe\Forms\CompositeField;
use SilverStripe\Forms\DropdownField;
use SilverStripe\Forms\FieldList;
use SilverStripe\ORM\DataExtension;
class ElementImageWidget extends DataExtension
{
private static $available_heights = [
'300' => 'Small (300px)',
'400' => 'Medium (400px)',
'600' => 'Big (600px)',
];
private static $available_widths = [
'300' => 'Small (300px)',
'400' => 'Medium (400px)',
'600' => 'Big (600px)',
];
private static $available_ratios = [
'1:1' => '1:1',
'3:2' => '3:2',
'2:3' => '2:3',
'16:9' => '16:9'
];
private static $db = [
'Resize' => 'Boolean(1)',
'ManualWidth' => 'Boolean(0)',
'ImageHeight' => 'Float',
'ImageWidth' => 'Float',
'ImageAspectRatio' => 'Text',
'Content' => 'HTMLText',
];
private static $has_one = [
'ImageLink' => Link::class,
];
public function updateCMSFields(FieldList $fields)
{
parent::updateCMSFields($fields);
$fields->insertBefore(
'Image',
LinkField::create('ImageLinkID', 'Link')
);
$this->owner->ImageHeight = $this->getHeight();
$heights = Config::inst()->get(__CLASS__, 'available_heights');
$widths = Config::inst()->get(__CLASS__, 'available_widths');
$ratios = Config::inst()->get(__CLASS__, 'available_ratios');
$fields->replaceField('Resize', CheckboxField::create(
'Resize',
'Would you like to scale image?'
));
$fields->removeByName(['ManualWidth','ImageWidth','ImageAspectRatio',]);
if (count($heights)) {
$fields->replaceField(
'ImageHeight',
CompositeField::create(
CheckboxField::create(
'ManualAspectRatio',
'Set Aspect Ratio',
($this->owner->getField('ImageAspectRatio') ? '1' : '0')
),
DropdownField::create(
'ImageAspectRatio',
'Image Aspect Ratio (width:height)',
$ratios
)
->setEmptyString('(original)')
->displayIf('ManualAspectRatio')->isChecked()
->andIf('ManualWidth')->isNotChecked()
->end(),
DropdownField::create(
'ImageHeight',
'Image Height',
$heights,
$this->getHeight()
)
->setEmptyString('(auto)')
->displayIf('Resize')->isChecked()->end(),
CheckboxField::create('ManualWidth', 'Set Width Manually')
->displayIf('Resize')->isChecked()
->andIf('ManualAspectRatio')->isNotChecked()
->end(),
DropdownField::create(
'ImageWidth',
'Image Width',
$widths
)
->setEmptyString('(auto)')
->displayIf('ManualWidth')->isChecked()
->end()
)
);
} else {
$fields->dataFieldByName('ImageHeight')
->setValue($this->getHeight());
}
}
public function ImageResized()
{
$image = $this->owner->Image();
if (!$this->owner->Resize) {
return $image;
}
$width = $this->getWidth();
$height = $this->getHeight();
$ratio = $this->owner->getField('ImageAspectRatio');
if ($ratio) {
$v = explode(':', $this->owner->getField('ImageAspectRatio'));
$x = $v[0];
$y = $v[1];
if ($width > 0 && $width !== 'auto') {
$height = $width*$y/$x;
echo 'a1';
} elseif ($height && $height > 0) {
$width = $height*$x/$y;
echo 'a2';
}
var_dump($width);
var_dump($height);
}
if (!$width || $width === 'auto') {
return $height > 0
? $image->ScaleHeight($height)
: $image;
}
return $height > 0
? $image->FocusFill($width, $height)
: $image->ScaleWidth($width);
}
public function getWidth()
{
$obj = $this->owner;
return $obj->getField('ManualWidth') && $obj->getField('ImageWidth')
? $obj->getField('ImageWidth')
: $obj->getColumnWidthRecursive();
}
public function getHeight()
{
$height = $this->owner->getField('ImageHeight');
if ($height > 0) {
return $height;
}
$sibling = $this->owner->getSibling(false, [
'ImageHeight:GreaterThan' => '0'
]);
if ($sibling && $sibling->getField('ImageHeight')) {
return $sibling->getField('ImageHeight');
}
return 0;
}
}

View File

@ -1,303 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: tony
* Date: 6/23/18
* Time: 1:23 PM
*/
namespace App\Elements\Extensions;
use DNADesign\Elemental\Models\BaseElement;
use DNADesign\ElementalList\Model\ElementList;
use SilverStripe\Core\Config\Config;
use SilverStripe\Forms\CheckboxField;
use SilverStripe\Forms\DropdownField;
use SilverStripe\ORM\DataExtension;
use SilverStripe\Forms\FieldList;
use App\Elements\AccordionElement;
class ElementRows extends DataExtension
{
private static $container_max_width = 1140;
private static $column_class = 'col-block col-md';
private static $container_styles = [
'container' => 'Fixed container',
'container-fluid' => 'Fluid Container',
];
private static $db = [
'ContainerType' => 'Varchar(254)',
//'SidebarOnly' => 'Boolean(0)',
'Size' => 'Enum("1,2,3,4,5,6,7,8,9,10,11,12,auto","auto")',
];
public function updateCMSFields(FieldList $fields)
{
$obj = $this->owner;
parent::updateCMSFields($fields);
$fields->removeByName(['AvailableGlobally', 'TopPageLocale', 'TopPageID']);
//$fields->removeByName('SidebarOnly');
// move available globaly to main tab
$tab = $fields->findOrMakeTab('Root.Main');
$tab->push(CheckboxField::create('AvailableGlobally'));
//$tab->push(CheckboxField::create('SidebarOnly', 'Hidden (Sidebar Only)'));
// container type
if ($this->isRoot()) {
$tab->push(DropdownField::create(
'ContainerType',
_t(__CLASS__.'.CONTAINERTYPE', 'Container Type'),
self::$container_styles
));
} else {
$fields->removeByName('ContainerType');
}
// site-specific
$fields->removeByName('ContainerType');
// column size
if ($this->isColumn()) {
$sizes = $obj->dbObject('Size');
$sizeDropdown = DropdownField::create(
'Size',
_t(
__CLASS__.'.SIZE',
'Column Width (max 12 cols)'
),
array_combine(
array_values($sizes->enumValues()),
[
'8.3% (1 of 12)',
'16.6% (2 of 12)',
'25% (3 of 12)',
'33% (4 of 12)',
'41.6% (5 of 12)',
'50% (6 of 12)',
'58.3% (7 of 12)',
'66.4% (8 of 12)',
'74.7% (9 of 12)',
'83% (10 of 12)',
'91.3% (11 of 12)',
'100% (12 of 12)',
'auto',
]
)
);
$tab->push($sizeDropdown);
// set default size if size field wasn't set or if it's new object without title set and the size is default
$size = $obj->getField('Size');
if (!$size || (!$obj->getField('Title') && $size === 'auto')) {
$sibling = $this->getSibling();
$defaultSize = $sizes->getDefaultValue();
$defaultSize = $sibling ? $sibling->getField('Size') : $defaultSize;
$obj->setField('Size', $defaultSize);
$sizeDropdown->setValue($defaultSize);
}
} else {
$fields->removeByName('Size');
}
// move parent elements
if ($this->isList()) {
$currEls = $obj->getField('Elements')->Elements();
if ($currEls->count()) {
$tab->push(DropdownField::create(
'MoveElementIDToParent',
'Move an element from the current list to parent',
$currEls->map('ID', 'Title')
)->setEmptyString('(select an element to move)'));
}
$parentEls = $obj->Parent()->Elements()->exclude('ID', $obj->ID);
if ($parentEls->count()) {
$tab->push(DropdownField::create(
'MoveElementIDFromParent',
'Move an element from the parent to the current list',
$parentEls->map('ID', 'Title')
)->setEmptyString('(select an element to move)'));
}
}
}
public function getWidthPercetage()
{
return $this->isColumn() ? $this->owner->getField('Size') / self::colsNumber() * 100 : false;
}
public function isList()
{
return is_a($this->owner, ElementList::class) && !is_a($this->owner, AccordionElement::class);
}
public function isRow()
{
if (!$this->isList()) {
return false;
}
return true;
}
public function isColumn()
{
if (!$this->isRoot()) {
return true;
}
return false;
}
public function isRoot()
{
$parent = $this->owner->Parent()->getOwnerPage();
if (is_a($parent, 'Page')) {
return true;
}
return false;
}
public function getSibling($any = true, $filter = [], $exclude = [])
{
$class = $any ? $this->owner->baseClass() : $this->owner->ClassName;
return $class::get()->filter(array_merge(
['ParentID' => $this->owner->Parent()->ID],
$filter
))->exclude(array_merge(
['ID' => $this->owner->ID],
$exclude
))->last();
}
public function getColumnSizeRecursive($object = null)
{
$object = $object ? $object : $this->owner;
if ($object->isColumn() && $object->getField('Size')) {
return $object->getField('Size');
}
$parent = $object->Parent()->getOwnerPage();
if (is_a($parent, 'Page')) {
return ($this->owner->getField('ContainerType') === 'container-fluid') ? false : self::colsNumber();
}
return $object->getColumnSizeRecursive($parent);
}
public function getColumnWidthRecursive($object = null, $max = null)
{
$max = $max ? $max : self::maxWidth();
$object = $object ? $object : $this->owner;
if (!$object->isRoot()) {
$size = $object->getField('Size');
$cols = self::colsNumber();
if ($size === 'auto') {
return $size;
}
$max = $size ? $max / ($cols / $size) : $max;
$parent = $object->Parent()->getOwnerPage();
return $this->getColumnWidthRecursive($parent, $max);
}
return $max;
}
public static function colsNumber()
{
$db = Config::inst()->get(self::class, 'db');
$sizes = $db['Size'];
$sizes = preg_replace('!Enum\("([0-9A-z,]+)","([0-9A-z]+)"\)!i', '$1', $sizes);
$sizes = explode(',', $sizes);
// remove auto
$k = array_search('auto', $sizes);
if ($k !== false) {
unset($sizes[$k]);
}
return max($sizes);
}
public static function maxWidth()
{
return Config::inst()->get(self::class, 'container_max_width');
}
public function ExtraClass()
{
$object = $this->owner;
return $object->getField('ExtraClass')
.(
$this->isColumn()
? ' '.Config::inst()->get(self::class, 'column_class')
.($object->getField('Size') === 'auto' ? '' : '-'.$object->getField('Size'))
: ''
);
}
/*
* if it's root element and it doesn't contain any container styles
* add the first one
*/
public function ContainerClass()
{
$type = $this->owner->getField('ContainerType');
$container_styles = array_keys(self::$container_styles);
if (!$type && $this->isRoot()) {
$type = \Page::DefaultContainer();
}
return $type;
}
public static function MoveElement($moveID, $targetID)
{
$el = BaseElement::get_by_id($moveID);
if (!$el) {
return false;
}
$el->setField('ParentID', $targetID);
$el->write();
return true;
}
public function onBeforeWrite()
{
parent::onBeforeWrite();
$moveID = $this->owner->getField('MoveElementIDFromParent');
$targetID = $moveID ? $this->owner->Elements()->ID : null;
if ($moveID && $targetID) {
self::MoveElement($moveID, $targetID);
}
$moveID = $this->owner->getField('MoveElementIDToParent');
$targetID = $moveID ? $this->owner->Parent()->ID : null;
if ($moveID && $targetID) {
self::MoveElement($moveID, $targetID);
}
}
}

View File

@ -1,49 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: tony
* Date: 6/23/18
* Time: 1:23 PM
*/
namespace App\Elements\Extensions;
use DNADesign\Elemental\Models\BaseElement;
use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\DataExtension;
use SilverStripe\ORM\HasManyList;
use SilverStripe\ORM\UnsavedRelationList;
class ElementalArea extends DataExtension
{
public function ElementFilteredControllers()
{
// Don't try and process unsaved lists
if ($this->Elements() instanceof UnsavedRelationList) {
return ArrayList::create();
}
$controllers = ArrayList::create();
$items = $this->Elements()->filterByCallback(static function (BaseElement $item) {
return $item->canView();
});
if ($items !== null) {
foreach ($items as $element) {
$controller = $element->getController();
$controllers->push($controller);
}
}
return $controllers;
}
/**
* A cache-aware accessor for the elements
* @return ArrayList|HasManyList|BaseElement[]
*/
public function Elements()
{
return $this->owner->Elements();//->exclude('SidebarOnly', true);
}
}

View File

@ -1,73 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: tony
* Date: 8/26/18
* Time: 12:55 PM
*/
namespace App\Elements\Extensions;
use SilverStripe\Core\Extension;
use SilverStripe\Forms\CompositeField;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridFieldConfig_RelationEditor;
use SilverStripe\Forms\GridField\GridFieldDataColumns;
use SilverStripe\Forms\NumericField;
use SilverStripe\ORM\DataExtension;
use App\Models\MapPin;
class MapExtension extends DataExtension
{
private static $db = [
'MapZoom' => 'Int',
];
private static $many_many = [
'Locations' => MapPin::class,
];
private static $owns = [
'Locations',
];
public function updateCMSFields(FieldList $fields): void
{
parent::updateCMSFields($fields);
$fields->removeByName('Locations');
$fields->addFieldsToTab('Root.MapPins', [
NumericField::create('MapZoom', 'Initial Map Zoom (enter a number from 0 to 24)'),
GridField::create(
'Locations',
'Locations',
$this->owner->Locations(),
$cfg = GridFieldConfig_RelationEditor::create(100)
)
]);
$cfg->getComponentByType(GridFieldDataColumns::class)->setFieldFormatting([
'ShowAtMap' => static function ($v, $obj) {
return $v ? 'YES' : 'NO';
}
]);
$fields->findOrMakeTab('Root.MapPins')->setTitle('Locations');
}
public function getGeoJSON(): string
{
$locs = $this->owner->Locations()->filter('ShowAtMap', true);
$pins = [];
foreach ($locs as $off) {
$pins[] = $off->getGeo();
}
return json_encode([
'type' => 'MarkerCollection',
'features' => $pins
]);
}
}

View File

@ -1,79 +0,0 @@
<?php
namespace App\Elements\Extensions;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\GridField\GridFieldDataColumns;
use SilverStripe\Forms\GridField\GridFieldPaginator;
use SilverStripe\Forms\ListboxField;
use SilverStripe\Forms\TextareaField;
use SilverStripe\ORM\DataExtension;
use SilverStripe\UserForms\Model\EditableFormField;
class UserDefinedFormExtension extends DataExtension
{
/*private static $db = [
'CustomThankYouCode' => 'HTMLText',
'RedirectOnComplete' => 'Boolean(0)',
'RedirectOnCompleteURL' => 'Varchar(255)',
];*/
private static $many_many = [
'SubmissionColumns' => EditableFormField::class,
];
public function updateCMSFields(FieldList $fields)
{
parent::updateCMSFields($fields);
$fields->removeByName('RedirectOnComplete');
$fields->removeByName('RedirectOnCompleteURL');
$fields->removeByName('SubmissionColumns');
$fields->addFieldToTab(
'Root.Main',
ListboxField::create(
'SubmissionColumns',
'Display following columns at submissions list',
$this->owner->Fields()->map('ID', 'Title')
)
);
$tab = $fields->findOrMakeTab('Root.FormOptions');
/*$tab->push(CheckboxField::create('RedirectOnComplete'));
$tab->push(TextField::create('RedirectOnCompleteURL'));*/
//$tab->push(TextareaField::create('CustomThankYouCode'));
$grid = $fields->dataFieldByName('Submissions');
$config = $grid->getConfig();
$config->getComponentByType(GridFieldPaginator::class)->setItemsPerPage(100);
$cols = $this->owner->SubmissionColumns();
if ($grid && $cols->count()) {
$dataCols = $config->getComponentByType(GridFieldDataColumns::class);
$columns = [
'ID' => 'ID',
'Created' => 'Created',
];
foreach ($cols as $col) {
$title = $col->getField('Title');
$name = $col->getField('Name');
$columns[$name] = [
'title' => $title,
'callback' => function ($item) use ($name) {
return $item->relField($name);
}
];
}
$columns['Actions'] = 'Actions';
$dataCols->setDisplayFields($columns);
}
}
}

View File

@ -1,103 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: tony
* Date: 6/30/18
* Time: 11:54 PM
*/
namespace App\Elements;
use DNADesign\Elemental\Models\BaseElement;
use SilverStripe\Core\Convert;
class InstagramElement extends BaseElement
{
private static $singular_name = 'Instagram';
private static $plural_name = 'Instagram Elements';
private static $description = 'Displays Instagram posts';
private static $table_name = 'InstagramElement';
private static $db = [
'Username' => 'Varchar(255)',
'Tag' => 'Varchar(255)',
'DisplayProfile' => 'Boolean(0)',
'DisplayBiography' => 'Boolean(0)',
'DisplayGallery' => 'Boolean(0)',
'DisplayCaptions' => 'Boolean(0)',
];
private static $defaults = [
'DisplayGallery' => true,
];
public function getType()
{
return self::$singular_name;
}
/**
* @return array
*/
public function getAttributes(): array
{
return [
'data-username' => $this->Username,
'data-display-profile' => $this->DisplayProfile,
'data-display-biography' => $this->DisplayBiography,
'data-display-gallery' => $this->DisplayGallery,
'data-display-captions' => $this->DisplayCaptions,
'data-items' => 12,
];
}
/**
* Custom attributes to process.
*
* @param array $attributes
*
* @return string
*/
public function AttributesHTML($attributes = null): string
{
if (!$attributes) {
$attributes = $this->getAttributes();
}
$attributes = (array) $attributes;
$attributes = array_filter($attributes, static function ($v) {
return ($v || $v === 0 || $v === '0');
});
// Create markup
$parts = [];
foreach ($attributes as $name => $value) {
if ($value === true) {
$value = $name;
} else if (is_scalar($value)) {
$value = (string) $value;
} else {
$value = json_encode($value);
}
$parts[] = sprintf('%s=%s', Convert::raw2att($name), Convert::raw2att($value));
}
return implode(' ', $parts);
}
public function FeedLink()
{
return 'https://www.instagram.com/'.($this->Username ? $this->Username : 'explore/tags/'.$this->Tag).'/';
}
public function FeedTitle()
{
return ($this->Username ? '@'.$this->Username : '#'.$this->Tag);
}
}

View File

@ -1,98 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: tony
* Date: 6/30/18
* Time: 11:54 PM
*/
namespace App\Elements;
use A2nt\SilverStripeMapboxField\MapboxField;
use BetterBrief\GoogleMapField;
use Colymba\BulkManager\BulkManager;
use DNADesign\Elemental\Models\ElementContent;
use SilverStripe\Core\Config\Config;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridFieldConfig_RelationEditor;
use SilverStripe\Forms\HTMLEditor\HTMLEditorField;
use SilverStripe\Forms\NumericField;
use App\Controllers\MapElementController;
use App\Elements\Extensions\MapExtension;
use SilverStripe\Forms\GridField\GridFieldDataColumns;
class MapElement extends ElementContent
{
private static $icon = 'font-icon-globe-1';
private static $singular_name = 'Map Element';
private static $plural_name = 'Map Element';
private static $description = 'Displays dynamic map';
private static $table_name = 'MapElement';
private static $controller_class = MapElementController::class;
private static $map_type = 'mapbox';
private static $extensions = [
MapExtension::class,
];
public function getType():string
{
return self::$singular_name;
}
public function getCMSFields(): FieldList
{
$fields = parent::getCMSFields();
$fields->remove('HTML');
$tab = $fields->findOrMakeTab('Root.MapPins');
$tab->setTitle('Description');
$tab->push(HTMLEditorField::create('HTML', 'Content'));
$fields->addFieldsToTab('Root.Main', [
NumericField::create('MapZoom', 'Initial Map Zoom (enter a number from 0 to 24)'),
GridField::create(
'Locations',
'Locations',
$this->owner->Locations(),
$cfg = GridFieldConfig_RelationEditor::create(100)
)
]);
$cfg->getComponentByType(GridFieldDataColumns::class)->setFieldFormatting([
'ShowAtMap' => static function ($v, $obj) {
return $v ? 'YES' : 'NO';
}
]);
$cfg->addComponent(new BulkManager());
return $fields;
}
public static function MapAPIKey(): string
{
$type = self::config()->get('map_type');
switch ($type) {
case 'mapbox':
$key = MapboxField::getAccessToken();
break;
case 'google-maps':
$cfg = Config::inst()->get(GoogleMapField::class, 'default_options');
$key = $cfg['api_key'];
break;
default:
$key = '';
break;
}
return $key;
}
}

View File

@ -1,133 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: tony
* Date: 6/30/18
* Time: 11:54 PM
*/
namespace App\Elements;
use Dynamic\Elements\Flexslider\Elements\ElementSlideshow;
use Dynamic\FlexSlider\Model\SlideImage;
use Dynamic\FlexSlider\ORM\FlexSlider;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Forms\CheckboxField;
use SilverStripe\Forms\LiteralField;
use SilverStripe\Forms\NumericField;
use SilverStripe\Forms\ReadonlyField;
use Symbiote\GridFieldExtensions\GridFieldEditableColumns;
class SliderElement extends ElementSlideshow
{
private static $singular_name = 'Slider';
private static $plural_name = 'Sliders';
private static $description = 'Displays slide show';
private static $table_name = 'SliderElement';
private static $slide_width = 2140;
private static $slide_height = 700;
private static $db = [
'Interval' => 'Int',
];
private static $extensions = [
FlexSlider::class,
];
private static $owns = [
'Slides',
];
private $items;
public function getType()
{
return self::$singular_name;
}
public function getSlideWidth()
{
return self::config()->get('slide_width');
}
public function getSlideHeight()
{
return self::config()->get('slide_height');
}
public function getCMSFields()
{
$fields = parent::getCMSFields();
// remove in case you don't need to provide this functionality
$fields->removeByName([
'ConfigHD',
'Animation',
'Loop',
'Animate',
'ThumbnailNav',
'SliderControlNav',
'SliderDirectionNav',
'CarouselControlNav',
'CarouselDirectionNav',
'CarouselThumbnailCt',
]);
$fields->addFieldsToTab('Root.Settings', [
NumericField::create('Interval', 'Auto-play Interval'),
]);
$grid = $fields->dataFieldByName('Slides');
if ($grid) {
$config = $grid->getConfig();
$columns = new GridFieldEditableColumns();
$columns->setDisplayFields([
'Hide' => [
'title' => 'Hide it?',
'field' => CheckboxField::class,
],
]);
$config->addComponent($columns);
}
return $fields;
}
/**
* @return mixed
*/
public function getSlideShow()
{
if ($this->items) {
return $this->items;
}
$date = date('Y-m-d H:i:s');
$this->items = $this->Slides()->filter([
'Hide' => '0',
])->filterByCallback(static function ($item, $list) use ($date) {
$on = $item->getField('DateOn');
$off = $item->getField('DateOff');
return ($on <= $date) && (!$off || $off > $date);
})->sort('SortOrder');
return $this->items;
}
public function onBeforeWrite()
{
parent::onBeforeWrite();
if (!$this->getField('Interval')) {
$this->setField('Interval', 5000);
}
}
}

View File

@ -1,30 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: tony
* Date: 6/30/18
* Time: 11:54 PM
*/
namespace App\Elements;
use DNADesign\Elemental\Models\BaseElement;
use App\Models\TeamMember;
class TeamMembersElement extends BaseElement
{
private static $singular_name = 'Team Members';
private static $plural_name = 'Team Members';
private static $description = 'Displays random Team Members';
public function getType()
{
return self::$singular_name;
}
public function Members()
{
return TeamMember::get()->sort('RAND()');
}
}

View File

@ -1,29 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: tony
* Date: 8/26/18
* Time: 12:55 PM
*/
namespace App\Extensions;
use SilverStripe\Core\Extension;
use SilverStripe\Forms\CompositeField;
use SilverStripe\Forms\FieldList;
class AddressExtension extends Extension
{
public function updateFormFields(FieldList $fields)
{
$holder = CompositeField::create();
foreach ($fields as $field) {
$holder->push($field);
$fields->remove($field);
}
$holder->addExtraClass('col-sm-6');
$fields->push($holder);
}
}

View File

@ -1,19 +0,0 @@
<?php
namespace App\Extensions;
use SilverStripe\Blog\Forms\GridField\GridFieldConfigBlogPost;
use SilverStripe\Forms\FieldList;
use SilverStripe\ORM\DataExtension;
class BlogExtension extends DataExtension
{
public function updateCMSFields(FieldList $fields)
{
$f = $fields->dataFieldByName('ChildPages');
if ($f) {
$f->setConfig(GridFieldConfigBlogPost::create(75));
}
}
}

View File

@ -1,27 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: tony
* Date: 7/2/18
* Time: 12:10 AM
*/
namespace App\Extensions;
use DNADesign\Elemental\Models\ElementContent;
use SilverStripe\Forms\CheckboxField;
use SilverStripe\Forms\FieldList;
use SilverStripe\ORM\DataExtension;
class BlogPostExtension extends DataExtension
{
private static $db = [
'Featured' => 'Boolean(0)',
];
public function updateCMSFields(FieldList $fields)
{
$mainTab = $fields->findOrMakeTab('Root.Main');
$mainTab->push(CheckboxField::create('Featured'));
}
}

View File

@ -1,17 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: tony
* Date: 7/2/18
* Time: 1:05 AM
*/
namespace App\Extensions;
use SilverStripe\ORM\HiddenClass;
use Page;
class CMSMain_HiddenClass extends Page implements HiddenClass
{
}

View File

@ -1,26 +0,0 @@
<?php
namespace App\Extensions;
use SilverStripe\Blog\Forms\GridField\GridFieldConfigBlogPost;
use SilverStripe\Core\Extension;
use SilverStripe\Forms\CompositeField;
use SilverStripe\Forms\FieldList;
use SilverStripe\ORM\DataExtension;
class CompositeFieldExtension extends CompositeField
{
public function extraClass()
{
return 'composite '.parent::extraClass();
}
public function getAttributes()
{
$attrs = parent::getAttributes();
unset($attrs['name'], $attrs['type'], $attrs['disabled'], $attrs['readonly'], $attrs['autofocus']);
return $attrs;
}
}

View File

@ -1,47 +0,0 @@
<?php
namespace App\Extensions;
use Sheadawson\Linkable\Forms\EmbeddedObjectField;
use SilverStripe\Forms\CheckboxField;
use SilverStripe\Forms\CompositeField;
use SilverStripe\Forms\LiteralField;
use SilverStripe\ORM\FieldType\DBHTMLText;
class EmbedObjectField extends EmbeddedObjectField
{
/**
* @param array $properties
* @return mixed|DBHTMLText
*/
public function FieldHolder($properties = [])
{
$name = $this->getName();
$fields = [
CheckboxField::create(
$name . '[autoplay]',
_t(self::CLASS.'AUTOPLAY', 'Autoplay video?')
)->setValue($this->object->getField('Autoplay')),
CheckboxField::create(
$name . '[loop]',
_t(self::CLASS.'LOOP', 'Loop video?')
)->setValue($this->object->getField('Loop')),
CheckboxField::create(
$name.'[controls]',
_t(self::CLASS.'CONTROLS', 'Show player controls?')
)->setValue($this->object->getField('Controls'))
];
return CompositeField::create(array_merge([
LiteralField::create(
$name.'Options',
parent::FieldHolder($properties)
)
], $fields));
}
}

View File

@ -1,52 +0,0 @@
<?php
namespace App\Extensions;
use SilverStripe\Core\Convert;
use SilverStripe\View\HTML;
class EmbedShortcodeProvider extends \SilverStripe\View\Shortcodes\EmbedShortcodeProvider
{
/**
* Build video embed tag
*
* @param array $arguments
* @param string $content Raw HTML content
* @return string
*/
protected static function videoEmbed($arguments, $content)
{
// Ensure outer div has given width (but leave height auto)
if (!empty($arguments['width'])) {
$arguments['style'] = 'width:' . (int) $arguments['width'] . 'px';
//.';height:' . (int) $arguments['height'] . 'px';
}
// Convert caption to <p>
if (!empty($arguments['caption'])) {
$xmlCaption = Convert::raw2xml($arguments['caption']);
$content .= "\n<p class=\"caption\">{$xmlCaption}</p>";
}
// Convert arguments to data-*argument_name*
foreach ($arguments as $k => $v) {
if($k === 'class' || $k === 'style') {
continue;
}
unset($arguments[$k]);
$arguments['data-'.$k] = $v;
}
$arguments['class'] .= ' embed-youtube embed-responsive embed-responsive-16by9';
$iframe = strpos($content, 'iframe');
if($iframe >= 0) {
$content = substr($content, 0, $iframe+6).' class="embed-responsive-item" '.substr($content, $iframe +7);
}
return HTML::createTag('div', $arguments, $content);
}
}

View File

@ -1,136 +0,0 @@
<?php
namespace App\Extensions;
use SilverStripe\Forms\CheckboxField;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\NumericField;
use SilverStripe\Forms\TextareaField;
use SilverStripe\Forms\TextField;
use SilverStripe\ORM\DataExtension;
class EmbeddedObjectExtension extends DataExtension
{
private static $db = [
'Autoplay' => 'Boolean(0)',
'Loop' => 'Boolean(0)',
'Controls' => 'Boolean(1)',
];
public function Embed()
{
$this->owner->Embed();
$this->setEmbedParams();
return $this->owner;
}
public function setEmbedParams($params = [])
{
$iframe_params = [];
if ($this->owner->getField('Autoplay')) {
$iframe_params[] = 'allow="autoplay"';
}
// YouTube params
if (stripos($this->owner->EmbedHTML, 'https://www.youtube.com/embed/') > 0) {
$url = $this->owner->getField('SourceURL');
preg_match(
'/^(?:http(?:s)?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)\/))([^\?&"\'>]+)/',
$url,
$matches
);
if (isset($matches[1])) {
$videoID = $matches[1];
$params = array_merge($params, [
'feature=oembed',
'wmode=transparent',
'enablejsapi=1',
'disablekb=1',
'iv_load_policy=3',
'modestbranding=1',
'rel=0',
'showinfo=0',
//'controls='.($this->owner->getField('Controls') ? '1': '0')
]);
if ($this->owner->getField('Autoplay')) {
$params[] = 'autoplay=1';
$params[] = 'mute=1';
}
if ($this->owner->getField('Loop')) {
$params[] = 'loop=1';
$params[] = 'playlist=' . $videoID;
}
$this->owner->EmbedHTML = preg_replace(
'/src="([A-z0-9:\/\.]+)\??(.*?)"/',
'src="https://www.youtube.com/embed/' . $videoID . '?' . implode('&', $params) . '" '
. implode(' ', $iframe_params),
$this->owner->EmbedHTML
);
}
}
if (stripos($this->owner->EmbedHTML, 'https://player.vimeo.com/video/') > 0) {
$url = $this->owner->getField('SourceURL');
preg_match(
'/^https:\/\/vimeo\.com\/([A-z0-9]+)/',
$url,
$matches
);
$videoID = $matches[1];
$params = array_merge($params, [
'controls='.($this->owner->getField('Controls') ? '1': '0'),
'background=1',
]);
if ($this->owner->getField('Autoplay')) {
$params[] = 'autoplay=1';
}
if ($this->owner->getField('Loop')) {
$params[] = 'loop=1';
}
$this->owner->EmbedHTML = preg_replace(
'/src="([A-z0-9:\/\.]+)\??(.*?)"/',
'src="https://player.vimeo.com/video/'.$videoID.'?' . implode('&', $params) . '" '
.implode(' ', $iframe_params),
$this->owner->EmbedHTML
);
}
}
public function updateCMSFields(FieldList $fields)
{
parent::updateCMSFields($fields);
$fields->removeByName([
'Width', 'Height', 'EmbedHTML', 'ThumbURL',
'Autoplay', 'Loop', 'Controls',
'ExtraClass', 'Type',
]);
$fields->addFieldsToTab('Root.Extra', [
CheckboxField::create('Autoplay'),
CheckboxField::create('Loop'),
CheckboxField::create('Controls'),
NumericField::create('Width'),
NumericField::create('Height'),
TextareaField::create('EmbedHTML'),
TextField::create('ThumbURL'),
TextField::create('ExtraClass'),
TextField::create('Type'),
]);
}
public function onBeforeWrite()
{
parent::onBeforeWrite();
$this->setEmbedParams();
}
}

View File

@ -1,19 +0,0 @@
<?php
namespace App\Extensions;
use SilverStripe\CMS\Model\SiteTree;
use SilverStripe\Forms\Form;
use SilverStripe\ORM\DataExtension;
class HtmlEditorFieldExtension extends DataExtension
{
public function updateMediaForm(Form $form)
{
$page_id = $_SESSION['CMSMain']['currentPage'];
$page_urlsegment = SiteTree::get()->byID($page_id)->URLSegment;
$computerUploadField = $form->Fields()->dataFieldByName('AssetUploadField');
$computerUploadField->setFolderName(sprintf("%s/images/%s", 'Uploads', $page_urlsegment));
}
}

View File

@ -1,23 +0,0 @@
<?php
namespace App\Extensions;
use SilverStripe\Forms\CheckboxField;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\NumericField;
use SilverStripe\Forms\TextareaField;
use SilverStripe\Forms\TextField;
use SilverStripe\ORM\DataExtension;
class ImageExtension extends DataExtension
{
public function updateCMSFields(FieldList $fields)
{
parent::updateCMSFields($fields);
/*$fields->removeByName([
'Filename',
]);*/
}
}

View File

@ -1,26 +0,0 @@
<?php
namespace App\Extensions;
use SilverStripe\Core\Config\Config;
use SilverStripe\Core\Extension;
use SilverStripe\FontAwesome\FontAwesomeField;
use SilverStripe\View\Requirements;
use App\Templates\DeferredRequirements;
class LeftAndMainExtension extends Extension
{
public function init()
{
$config = Config::inst()->get(DeferredRequirements::class);
// App libs
if (!$config['nofontawesome']) {
$v = !isset($config['fontawesome_version']) || !$config['fontawesome_version']
? Config::inst()->get(FontAwesomeField::class, 'version')
: $config['fontawesome_version'];
Requirements::css('//use.fontawesome.com/releases/v'.$v.'/css/all.css');
}
}
}

View File

@ -1,69 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: tony
* Date: 6/30/18
* Time: 11:37 PM
*/
namespace App\Extensions;
use Sheadawson\Linkable\Forms\LinkField;
use Sheadawson\Linkable\Models\Link;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\TextField;
use SilverStripe\ORM\DataExtension;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\Security\MemberAuthenticator\LostPasswordHandler;
class LostPasswordHandlerExtension extends LostPasswordHandler
{
private static $url_handlers = [
'passwordsent' => 'passwordsent',
];
private static $allowed_actions = [
'passwordsent',
];
/**
* Show the "password sent" page, after a user has requested
* to reset their password.
*
* @return array
*/
public function passwordsent()
{
$message = _t(
'SilverStripe\\Security\\Security.PASSWORDRESETSENTTEXT',
"Thank you. A reset link has been sent, provided an account exists for this email address."
);
$email = $this->getRequest()->getVar('email');
$message = $email
? 'Thank you! A reset link has been sent to \''.$email.'\', provided an account exists for this email address.'
: $message;
return [
'Title' => _t(
'SilverStripe\\Security\\Security.PASSWORDRESETSENTHEADER',
"Password reset link sent".($email ? ' to \''.$email.'\'' : '')
),
'ElementalArea' => DBField::create_field('HTMLFragment', "<p>$message</p>"),
];
}
/**
* Avoid information disclosure by displaying the same status, regardless wether the email address actually exists
*
* @param array $data
* @return HTTPResponse
*/
protected function redirectToSuccess(array $data)
{
$link = $this->link('passwordsent').'?email='.$data['Email'];
return $this->redirect($this->addBackURLParam($link));
}
}

View File

@ -1,98 +0,0 @@
<?php
namespace App\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\GridFieldDetailForm;
use SilverStripe\Forms\GridField\GridFieldEditButton;
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 App\Models\Holiday;
use App\Models\Notification;
use App\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 GridFieldDetailForm(),
new GridFieldEditButton(),
new GridFieldDeleteAction(),
]);
$tab->setChildren(FieldList::create(
HeaderField::create('NotificationsHeader','Notifications'),
LiteralField::create(
'CurrentNotifications',
'<b>Current:</b>'
.$this->owner->renderWith('App\\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),
]);
}
}

View File

@ -1,189 +0,0 @@
<?php
namespace App\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 App\Models\Holiday;
use App\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('App\\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);
}
}
}

View File

@ -1,28 +0,0 @@
<?php
namespace App\Extensions;
use SilverStripe\Blog\Forms\GridField\GridFieldConfigBlogPost;
use SilverStripe\Forms\FieldList;
use SilverStripe\ORM\DataExtension;
use TractorCow\Fluent\Model\Locale;
class PageFluentExtension extends DataExtension
{
/**
* Override default Fluent fallback
*
* @param string $query
* @param string $table
* @param string $field
* @param Locale $locale
*/
public function updateLocaliseSelect(&$query, $table, $field, Locale $locale)
{
// disallow elemental data inheritance in the case that published localised page instance already exists
if ($field == 'ElementalAreaID' && $this->owner->isPublishedInLocale()) {
$query = '"' . $table . '_Localised_' . $locale->getLocale() . '"."' . $field . '"';
}
}
}

View File

@ -1,37 +0,0 @@
<?php
namespace App\Extensions;
use SilverStripe\Core\Extension;
use SilverStripe\Forms\CompositeField;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\TextField;
class PlaceholderFormExtension extends Extension
{
public function updateFormFields(FieldList $fields)
{
foreach ($fields as $field) {
$this->setPlaceholder($field);
}
}
private function setPlaceholder($field)
{
if (is_a($field, TextField::class)) {
$field->setAttribute(
'placeholder',
$field->Title()
.($field->hasClass('requiredField') ? '*' : '')
);
$field->setTitle('');
}
if (is_a($field, CompositeField::class)) {
$children = $field->getChildren();
foreach ($children as $child) {
$this->setPlaceholder($child);
}
}
}
}

View File

@ -1,24 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: tony
* Date: 6/23/18
* Time: 1:23 PM
*/
namespace App\Extensions;
use SilverStripe\ORM\DataExtension;
class ShoppingCartControllerExtension extends DataExtension
{
public function updateAddResponse($request, $response, $product, $quantity)
{
\PageController::setSiteWideMessage('+'.$quantity.' item(s) was added into the cart', 'success', $request);
}
public function updateRemoveResponse($request, $response, $product, $quantity)
{
\PageController::setSiteWideMessage(''.$quantity.' item(s) was removed from the cart', 'success', $request);
}
}

View File

@ -1,139 +0,0 @@
<?php
namespace App\Extensions;
use A2nt\SilverStripeMapboxField\MapboxField;
use Innoweb\Sitemap\Pages\SitemapPage;
use SilverStripe\AssetAdmin\Forms\UploadField;
use SilverStripe\Assets\Image;
use SilverStripe\Blog\Model\BlogPost;
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 SilverStripe\Forms\DropdownField;
//use BetterBrief\GoogleMapField;
class SiteConfigExtension extends DataExtension
{
private static $db = [
'ExtraCode' => 'Text',
'Longitude' => 'Decimal(10, 8)',
'Latitude' => 'Decimal(11, 8)',
'MapZoom' => 'Int',
//'MapAPIKey' => 'Varchar(255)',
'Description' => 'Varchar(255)',
'Address' => 'Varchar(255)',
'Suburb' => 'Varchar(255)',
'State' => 'Varchar(255)',
'ZipCode' => 'Varchar(6)',
];
private static $has_one = [
'PrivacyPolicy' => SiteTree::class,
'Sitemap' => SiteTree::class,
];
private static $many_many = [
'Navigation' => SiteTree::class,
];
public function updateCMSFields(FieldList $fields)
{
$img = Image::get()->filter([
'ParentID' => 0,
'FileFilename' => 'qrcode.png',
])->first();
if ($img) {
$fields->addFieldsToTab('Root.Main', [
LiteralField::create('QRCode', '<img src="'.$img->Link().'" alt="QR code" width="200" style="float:left" />'),
]);
}
$fields->addFieldsToTab('Root.Main', [
TreeMultiselectField::create(
'Navigation',
'Navigation',
SiteTree::class
)->setDisableFunction(static function ($el) {
return $el->getField('ParentID') !== 0;
}),
TextareaField::create('Description', 'Website Description'),
TextareaField::create('ExtraCode', 'Extra site-wide HTML code'),
DropdownField::create(
'PrivacyPolicyID',
'Privacy Policy Page',
SiteTree::get()->map()->toArray()
)->setEmptyString('(Select one)'),
DropdownField::create(
'SitemapID',
'Sitemap Page',
SitemapPage::get()->map()->toArray()
)->setEmptyString('(Select one)'),
]);
$mapTab = $fields->findOrMakeTab('Root.Maps');
$mapTab->setTitle('Address / Map');
$fields->addFieldsToTab('Root.Maps', [
TextField::create('Address'),
TextField::create('Suburb', 'City'),
TextField::create('State'),
TextField::create('ZipCode'),
]);
if (MapboxField::getAccessToken()) {
$fields->addFieldsToTab('Root.Maps', [
//TextField::create('MapAPIKey'),
TextField::create('MapZoom'),
MapboxField::create('Map', 'Choose a location', 'Latitude', 'Longitude'),
]);
} else {
$fields->addFieldsToTab('Root.Maps', [
LiteralField::create('MapNotice', '<p class="alert alert-info">No Map API keys specified.</p>')
]);
}
/*GoogleMapField::create(
$this->owner,
'Location',
[
'show_search_box' => true,
]
)*/
}
public function MapAPIKey()
{
return MapboxField::config()->get('access_token');
}
public function MapStyle()
{
return MapboxField::config()->get('map_style');
}
public function getGeoJSON()
{
return '{"type": "MarkerCollection","features": [{"type": "Feature","icon": "<i class=\'fas fa-map-marker-alt\'></i>",'
.'"properties": {"content": "'.$this->owner->getTitle().'"},"geometry": {"type": "Point",'
.'"coordinates": ['.$this->owner->getField('Longitude').','.$this->owner->getField('Latitude').']}}]}';
}
public function DirectionsLink()
{
return '<a href="https://www.google.com/maps/dir/Current+Location/'
.$this->owner->getField('Latitude').','
.$this->owner->getField('Longitude').'" class="btn btn-primary btn-directions" target="_blank">'
.'<i class="fas fa-road"></i> Get Directions</a>';
}
public function getLatestBlogPosts()
{
return BlogPost::get()->sort('PublishDate DESC');
}
}

View File

@ -1,51 +0,0 @@
<?php
namespace App\Extensions;
use SilverStripe\Control\Director;
use SilverStripe\Security\MemberAuthenticator\MemberLoginForm;
class SiteMemberLoginForm extends MemberLoginForm
{
public function __construct(
$controller,
$authenticatorClass,
$name,
$fields = null,
$actions = null,
$checkCurrentUser = true
) {
parent::__construct($controller, $authenticatorClass, $name, $fields, $actions, $checkCurrentUser);
$fields = $this->Fields();
$actions = $this->Actions();
$email = $fields->fieldByName('Email');
if ($email) {
$email
->setAttribute('placeholder', 'your@email.com')
->setAttribute('autocomplete', 'email')
->setAttribute('type', 'email');
}
$pass = $fields->fieldByName('Password');
if($pass) {
//$pass->setAttribute('autocomplete', 'current-password');
$pass->setAttribute('placeholder', '**********');
$pass->setAutofocus(true);
}
$btn = $actions->fieldByName('action_doLogin');
if($btn) {
$btn->setUseButtonTag(true);
$btn->setButtonContent('<i class="fas fa-check"></i> '.$btn->Title());
$btn->addExtraClass('btn-lg');
}
if (Director::isLive()) {
$this->enableSpamProtection();
}
}
}

View File

@ -1,24 +0,0 @@
<?php
namespace App\Extensions;
use SilverStripe\Forms\TextareaField;
use SilverStripe\ORM\DataExtension;
use SilverStripe\Forms\FieldList;
class SiteTreeExtension extends DataExtension
{
private static $db = [
'ExtraCode' => 'Text',
];
public function updateSettingsFields(FieldList $fields)
{
$fields->addFieldsToTab('Root.Settings', [
TextareaField::create(
'ExtraCode',
'Extra page specific HTML code'
),
]);
}
}

View File

@ -1,74 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: tony
* Date: 6/30/18
* Time: 11:37 PM
* Ref: Dynamic\FlexSlider\Model\SlideImage
*/
namespace App\Extensions;
use SilverStripe\Forms\CheckboxField;
use SilverStripe\Forms\DatetimeField;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\ToggleCompositeField;
use SilverStripe\ORM\DataExtension;
class SlideImageExtension extends DataExtension
{
private static $db = [
'Hide' => 'Boolean(0)',
'DateOn' => 'Datetime',
'DateOff' => 'Datetime',
];
private $_cache = [];
public function getElement()
{
if(!isset($this->_cache['element'])) {
$this->_cache['element'] = $this->owner->SlideshowElement();
}
return $this->_cache['element'];
}
public function getSlideWidth()
{
$element = $this->getElement();
return $element->getSlideWidth();
}
public function getSlideHeight()
{
$element = $this->getElement();
return $element->getSlideHeight();
}
public function updateCMSFields(FieldList $fields)
{
parent::updateCMSFields($fields);
$fields->removeByName([
'PageLinkID',
'Hide',
'DateOn',
'DateOff',
]);
$fields->dataFieldByName('Image')
->setTitle('Image ('.$this->getSlideWidth().' x '.$this->getSlideHeight().' px)');
$fields->addFieldToTab('Root.Main', ToggleCompositeField::create(
'ConfigHD',
'Slide Settings',
[
CheckboxField::create('Hide', 'Hide this slide? (That will hide the slide regardless of start/end fields)'),
DatetimeField::create('DateOn', 'When would you like to start showing the slide?'),
DatetimeField::create('DateOff', 'When would you like to stop showing the slide?'),
]
));
}
}

View File

@ -1,75 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: tony
* Date: 6/30/18
* Time: 11:37 PM
*/
namespace App\Extensions;
use Sheadawson\Linkable\Forms\LinkField;
use Sheadawson\Linkable\Models\Link;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\TextField;
use SilverStripe\ORM\DataExtension;
use SilverStripe\Security\Member;
class SocialExtension extends DataExtension
{
private static $db = [
//'PhoneNumber' => 'Varchar(255)',
];
private static $has_one = [
'Facebook' => Link::class,
'LinkedIn' => Link::class,
'Pinterest' => Link::class,
'Instagram' => Link::class,
'Twitter' => Link::class,
'PublicEmail' => Link::class,
'PhoneNumber' => Link::class,
];
public function updateCMSFields(FieldList $fields)
{
parent::updateCMSFields($fields);
$linkFields = [
LinkField::create('FacebookID'),
LinkField::create('LinkedInID'),
LinkField::create('PinterestID'),
LinkField::create('InstagramID'),
LinkField::create('TwitterID'),
];
foreach ($linkFields as $field) {
$field->setAllowedTypes(['URL']);
}
$fields->findOrMakeTab('Root.Social');
$fields->addFieldsToTab('Root.Social', [
LinkField::create('PublicEmailID', 'Public Email')
->setAllowedTypes(['Email']),
LinkField::create('PhoneNumberID', 'Phone Number')
->setAllowedTypes(['Phone']),
]);
$fields->addFieldsToTab('Root.Social', $linkFields);
}
public static function byPhone($phone)
{
$links = Link::get()->filter('Phone', $phone);
if ($links->exists()) {
return Member::get()->filter(
'PhoneNumberID',
array_keys($links->map('ID', 'Title')->toArray())
)->first();
}
return null;
}
}

View File

@ -1,10 +0,0 @@
<?php
namespace App\Extensions;
use SilverStripe\ORM\HiddenClass;
use SilverStripe\UserForms\Model\UserDefinedForm;
class UserDefinedForm_HiddenClass extends UserDefinedForm implements HiddenClass
{
}

View File

@ -1,140 +0,0 @@
<?php namespace Milkyway\SS\GridFieldUtils;
/**
* Milkyway Multimedia
* SaveAllButton.php
*
* @package milkyway-multimedia/ss-gridfield-utils
* @author Mellisa Hankins <mell@milkywaymultimedia.com.au>
*/
use GridField;
use GridField_HTMLProvider;
use GridField_ActionProvider;
use GridField_FormAction;
use GridField_SaveHandler;
use Controller;
class SaveAllButton implements GridField_HTMLProvider, GridField_ActionProvider
{
protected $targetFragment;
protected $actionName = 'saveallrecords';
public $buttonName;
public $publish = true;
public $completeMessage;
public $removeChangeFlagOnFormOnSave = false;
public function setButtonName($name)
{
$this->buttonName = $name;
return $this;
}
public function setRemoveChangeFlagOnFormOnSave($flag)
{
$this->removeChangeFlagOnFormOnSave = $flag;
return $this;
}
public function __construct($targetFragment = 'before', $publish = true, $action = 'saveallrecords')
{
$this->targetFragment = $targetFragment;
$this->publish = $publish;
$this->actionName = $action;
}
public function getHTMLFragments($gridField)
{
$singleton = singleton($gridField->getModelClass());
if (!$singleton->canEdit() && !$singleton->canCreate()) {
return [];
}
if (!$this->buttonName) {
if ($this->publish && $singleton->hasExtension('Versioned')) {
$this->buttonName = _t('GridField.SAVE_ALL_AND_PUBLISH', 'Save all and publish');
} else {
$this->buttonName = _t('GridField.SAVE_ALL', 'Save all');
}
}
$button = GridField_FormAction::create(
$gridField,
$this->actionName,
$this->buttonName,
$this->actionName,
null
);
$button->setAttribute('data-icon', 'disk')->addExtraClass('new new-link ui-button-text-icon-primary');
if ($this->removeChangeFlagOnFormOnSave) {
$button->addExtraClass('js-mwm-gridfield--saveall');
}
return [
$this->targetFragment => $button->Field(),
];
}
public function getActions($gridField)
{
return [$this->actionName];
}
public function handleAction(GridField $gridField, $actionName, $arguments, $data)
{
if ($actionName == $this->actionName) {
return $this->saveAllRecords($gridField, $arguments, $data);
}
}
protected function saveAllRecords(GridField $grid, $arguments, $data)
{
if (isset($data[$grid->Name])) {
$currValue = $grid->Value();
$grid->setValue($data[$grid->Name]);
$model = singleton($grid->List->dataClass());
foreach ($grid->getConfig()->getComponents() as $component) {
if ($component instanceof GridField_SaveHandler) {
$component->handleSave($grid, $model);
}
}
if ($this->publish) {
// Only use the viewable list items, since bulk publishing can take a toll on the system
$list = ($paginator = $grid->getConfig()->getComponentByType('GridFieldPaginator')) ? $paginator->getManipulatedData($grid, $grid->List) : $grid->List;
$list->each(
function ($item) {
if ($item->hasExtension('Versioned')) {
$item->writeToStage('Stage');
$item->publish('Stage', 'Live');
}
}
);
}
if ($model->exists()) {
$model->delete();
$model->destroy();
}
$grid->setValue($currValue);
if (Controller::curr() && $response = Controller::curr()->Response) {
if (!$this->completeMessage) {
$this->completeMessage = _t('GridField.DONE', 'Done.');
}
$response->addHeader('X-Status', rawurlencode($this->completeMessage));
}
}
}
}

View File

@ -1,46 +0,0 @@
<?php
namespace App\GraphQL;
use SilverStripe\Control\Director;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\GraphQL\Auth\AuthenticatorInterface;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Member;
use App\Templates\WebpackTemplateProvider;
use SilverStripe\Security\Permission;
use SilverStripe\Security\Security;
class APIKeyAuthenticator implements AuthenticatorInterface
{
public function authenticate(HTTPRequest $request)
{
$member = Security::getCurrentUser();
if (Director::isLive()
&& $request->getHeader('apikey') !== WebpackTemplateProvider::config()['GRAPHQL_API_KEY']
) {
if ($member && Permission::checkMember($member, 'CMS_ACCESS')) {
return $member;
}
throw new ValidationException('Restricted resource', 401);
}
return Member::get()->first();
}
public function isApplicable(HTTPRequest $request)
{
if ($request->param('Controller') === '%$SilverStripe\GraphQL\Controller.admin') {
return false;
}
/*if($request->getHeader('apikey')){
return true;
}*/
return true;
return false;
}
}

View File

@ -1,23 +0,0 @@
<?php
namespace App\GraphQL;
use GraphQL\Type\Schema;
use SilverStripe\GraphQL\Middleware\QueryMiddleware;
use App\Templates\WebpackTemplateProvider;
class APIKeyMiddleware implements QueryMiddleware
{
public function process(Schema $schema, $query, $context, $params, callable $next)
{
var_dump($context);
die('saaddsdsads');
if($request->getHeader('apikey') === WebpackTemplateProvider::config()['GRAPHQL_API_KEY']) {
return $next($schema, $query, $context, $params);
}
throw new \Exception('Invalid API key token');
}
}

View File

@ -1,38 +0,0 @@
<?php
namespace App\GraphQL;
use GraphQL\Type\Definition\ResolveInfo;
use GraphQL\Type\Definition\Type;
use SilverStripe\GraphQL\TypeCreator;
class ElementTypeCreator extends TypeCreator
{
public function attributes()
{
return [
'name' => 'element'
];
}
public function fields()
{
return [
'_id' => ['type' => Type::nonNull(Type::id()),'resolve' => static function($object) {
return $object->ID;
}],
'ID' => ['type' => Type::nonNull(Type::id())],
'Title' => ['type' => Type::string()],
'ParentID' => ['type' => Type::id()],
'Render' => [
'type' => Type::string(),
'resolve' => static function($object, array $args, $context, ResolveInfo $info) {
//$object->forTemplate()->HTML()
return $object->getController()->forTemplate()->HTML();
}
],
];
}
}

View File

@ -1,29 +0,0 @@
<?php
namespace App\GraphQL;
use GraphQL\Type\Definition\Type;
use SilverStripe\GraphQL\TypeCreator;
use SilverStripe\GraphQL\Pagination\Connection;
class MemberTypeCreator extends TypeCreator
{
public function attributes()
{
return [
'name' => 'member'
];
}
public function fields()
{
return [
'ID' => ['type' => Type::nonNull(Type::id())],
'Email' => ['type' => Type::string()],
'FirstName' => ['type' => Type::string()],
'Surname' => ['type' => Type::string()],
];
}
}

View File

@ -1,107 +0,0 @@
<?php
namespace App\GraphQL;
use GraphQL\Type\Definition\ResolveInfo;
use GraphQL\Type\Definition\Type;
use SilverStripe\CMS\Controllers\ModelAsController;
use SilverStripe\Control\Controller;
use SilverStripe\Control\Director;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\GraphQL\TypeCreator;
use SilverStripe\GraphQL\Pagination\Connection;
use SilverStripe\View\SSViewer;
class PageTypeCreator extends TypeCreator
{
public function attributes()
{
return [
'name' => 'page'
];
}
public function fields()
{
$elementsConnection = Connection::create('Elements')
->setConnectionType($this->manager->getType('element'))
->setDescription('A list of the page elements')
->setSortableFields(['ID', 'Title']);
return [
'_id' => ['type' => Type::nonNull(Type::id()),'resolve' => static function($object) {
return $object->ID;
}],
'ID' => ['type' => Type::nonNull(Type::id())],
'Title' => ['type' => Type::string()],
'Content' => ['type' => Type::string()],
'Link' => ['type' => Type::string(), 'resolve' => static function($object) {
return $object->Link();
}],
'URLSegment' => ['type' => Type::string()],
'ParentID' => ['type' => Type::id()],
'ClassName' => ['type' => Type::string()],
'CSSClass' => ['type' => Type::string(), 'resolve' => static function($object) {
return $object->CSSClass();
}],
'Summary' => ['type' => Type::string(), 'resolve' => static function($object) {
return $object->Summary();
}],
'HTML' => ['type' => Type::string(), 'resolve' => static function($object) {
// get action from request
$action = null;
/** @var \Page $object */
Director::set_current_page($object);
/** @var \PageController $controller */
$controller = ModelAsController::controller_for($object);
// find templates
$tpl = 'Page';
$tpls = SSViewer::get_templates_by_class(
$object->ClassName,
($action ? '_'.$action : ''),
\Page::class
);
foreach ($tpls as $tpl){
if(is_array($tpl)){
continue;
}
$a_tpl = explode('\\',$tpl);
$last_name = array_pop($a_tpl);
$a_tpl[] = 'Layout';
$a_tpl[] = $last_name;
$a_tpl = implode('\\', $a_tpl);
if(SSViewer::hasTemplate($a_tpl)){
break;
}
}
//
$tpl = ($tpl !== 'Page') ? $tpl : 'Layout/Page';
$action = $action ? $action : 'index';
/** @var HTTPRequest $request */
$controller->setAction($action);
return $controller->renderWith([$tpl, 'GraphQLPage'])->HTML();
}],
'Elements' => [
'type' => $elementsConnection->toType(),
'args' => $elementsConnection->args(),
'resolve' => static function($object, array $args, $context, ResolveInfo $info) use ($elementsConnection) {
return $elementsConnection->resolveList(
$object->ElementalArea()->Elements(),
$args,
$context
);
}
]
];
}
}

View File

@ -1,44 +0,0 @@
<?php
namespace App\GraphQL;
use GraphQL\Type\Definition\ResolveInfo;
use GraphQL\Type\Definition\Type;
use SilverStripe\Security\Member;
use SilverStripe\GraphQL\Pagination\Connection;
use SilverStripe\GraphQL\Pagination\PaginatedQueryCreator;
class PaginatedReadMembersQueryCreator extends PaginatedQueryCreator
{
public function createConnection()
{
return Connection::create('paginatedReadMembers')
->setConnectionType($this->manager->getType('member'))
->setArgs([
'Email' => [
'type' => Type::string()
]
])
->setSortableFields(['ID', 'FirstName', 'Email'])
->setConnectionResolver(static function ($object, array $args, $context, ResolveInfo $info) {
$member = Member::singleton();
if (!$member->canView($context['currentUser'])) {
throw new \InvalidArgumentException(sprintf(
'%s view access not permitted',
Member::class
));
}
$list = Member::get();
// Optional filtering by properties
if (isset($args['Email'])) {
$list = $list->filter('Email', $args['Email']);
}
return $list;
});
}
}

View File

@ -1,59 +0,0 @@
<?php
namespace App\GraphQL;
use GraphQL\Type\Definition\ResolveInfo;
use GraphQL\Type\Definition\Type;
use SilverStripe\CMS\Model\SiteTree;
use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\SS_List;
use SilverStripe\Security\Member;
use SilverStripe\GraphQL\Pagination\Connection;
use SilverStripe\GraphQL\Pagination\PaginatedQueryCreator;
class PaginatedReadPagesQueryCreator extends PaginatedQueryCreator
{
public function createConnection()
{
return Connection::create('readPages')
->setConnectionType($this->manager->getType('page'))
->setArgs([
'Link' => [
'type' => Type::string()
]
])
->setSortableFields(['Sort'])
->setConnectionResolver(static function ($object, array $args, $context, ResolveInfo $info) {
if (isset($args['Link'])) {
$link = $args['Link'];
if(SiteTree::has_extension('\TractorCow\Fluent\Extension\FluentSiteTreeExtension')) {
$arr = array_filter(explode('/', $args['Link']));
$locale = \TractorCow\Fluent\Model\Locale::get()->filter('URLSegment', array_shift($arr))->first();
\TractorCow\Fluent\State\FluentState::singleton()->setLocale($locale->Locale);
$link = implode('/', $arr);
}
$list = ArrayList::create();
$page = SiteTree::get_by_link($link);
$list->add($page);
}
/*$list = \Page::get();
// Optional filtering by properties
if (isset($args['ID'])) {
$list = $list->filter('ID', $args['ID']);
}*/
return $list;
});
}
}

View File

@ -1,53 +0,0 @@
<?php
namespace App\GraphQL;
use GraphQL\Type\Definition\ResolveInfo;
use GraphQL\Type\Definition\Type;
use SilverStripe\Security\Member;
use SilverStripe\GraphQL\OperationResolver;
use SilverStripe\GraphQL\QueryCreator;
class ReadMembersQueryCreator extends QueryCreator implements OperationResolver
{
public function attributes()
{
return [
'name' => 'readMembers'
];
}
public function args()
{
return [
'Email' => ['type' => Type::string()]
];
}
public function type()
{
return Type::listOf($this->manager->getType('member'));
}
public function resolve($object, array $args, $context, ResolveInfo $info)
{
$member = Member::singleton();
if (!$member->canView($context['currentUser'])) {
throw new \InvalidArgumentException(sprintf(
'%s view access not permitted',
Member::class
));
}
$list = Member::get();
// Optional filtering by properties
if (isset($args['Email'])) {
$list = $list->filter('Email', $args['Email']);
}
return $list;
}
}

View File

@ -1,57 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: tony
* Date: 9/12/18
* Time: 2:55 AM
*/
namespace App\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;
}
}

View File

@ -1,144 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: tony
* Date: 9/12/18
* Time: 2:55 AM
*/
namespace App\Models;
use A2nt\SilverStripeMapboxField\MapboxField;
use A2nt\SilverStripeMapboxField\MarkerExtension;
use Sheadawson\Linkable\Forms\LinkField;
use Sheadawson\Linkable\Models\Link;
use SilverStripe\Forms\CheckboxField;
use SilverStripe\ORM\DataObject;
use SilverStripe\Versioned\Versioned;
use App\Elements\MapElement;
use Symbiote\Addressable\Addressable;
class MapPin extends DataObject
{
private static $table_name = 'MapPin';
private static $db = [
'Title' => 'Varchar(255)',
'ShowAtMap' => 'Boolean(1)',
];
private static $has_one = [
'PhoneNumber' => Link::class,
'Fax' => Link::class,
];
private static $extensions = [
Addressable::class,
MarkerExtension::class,
Versioned::class,
];
private static $belongs_many_many = [
'MapElements' => MapElement::class,
];
private static $default_sort = 'Title ASC, ID DESC';
private static $summary_fields = [
'Title',
'Address',
'ShowAtMap',
];
private static $defaults = [
'ShowAtMap' => '1',
'Suburb' => 'Syracuse',
'State' => 'NY',
'Postcode' => '13210',
'Country' => 'US',
];
public function getCMSFields()
{
$fields = parent::getCMSFields();
$fields->removeByName('MapElements');
$fields->replaceField(
'PhoneNumberID',
LinkField::create('PhoneNumberID', 'Phone Number')
->setAllowedTypes(['Phone'])
);
$fields->replaceField(
'FaxID',
LinkField::create('FaxID', 'FAX')
->setAllowedTypes(['Phone'])
);
$fields->removeByName(['Map', 'LatLngOverride', 'Lng','Lat']);
$fields->addFieldsToTab('Root.Main', [
CheckboxField::create('ShowAtMap', 'Show at the map?'),
CheckboxField::create('LatLngOverride', 'Override Latitude and Longitude?')
->setDescription('Check this box and save to be able to edit the latitude and longitude manually.'),
MapboxField::create('Map', 'Choose a location', 'Lat', 'Lng'),
]);
return $fields;
}
public function onBeforeWrite()
{
parent::onBeforeWrite();
$lng = $this->getField('Lng');
$lat = $this->getField('Lat');
if (!$this->getField('Country')) {
$this->setField('Country', 'us');
}
// geocode
try {
// reverse geocoding get address
if (!$this->hasAddress() && $lng && $lat) {
require_once BASE_PATH . '/app/thirdparty/geocoding-example/php/Mapbox.php';
$mapbox = new \Mapbox(MapboxField::getAccessToken());
// GET Address
$res = $mapbox->reverseGeocode($lng, $lat);
if ($res->success() && $res->getCount()) {
$res = $res->getData();
if (count($res) && isset($res[0]['place_name'])) {
$details = explode(',', $res[0]['place_name']);
$fields = [
'Address',
'City',
'State',
//'Country',
];
$n = count($fields);
for ($i = 0; $i < $n; $i++) {
if (!isset($details[$i])) {
continue;
}
$name = $fields[$i];
$val = $details[$i];
// get postal code
if ($name === 'State') {
$this->setField('PostalCode', substr($val, strrpos($val, ' ')+1));
}
$this->setField($name, $val);
}
}
}
}
} catch (\Exception $e) {
}
}
}

View File

@ -1,80 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: tony
* Date: 9/12/18
* Time: 2:55 AM
*/
namespace App\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',
'Area' => 'Enum("Site","Site")',
];
private static $has_one = [
'Parent' => SiteConfig::class,
'TargetLink' => Link::class,
];
private static $defaults = [
'Area' => 'Site',
];
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 getCMSFields()
{
$fields = parent::getCMSFields();
$fields->addFieldsToTab('Root.Main', [
LinkField::create('TargetLinkID', 'Link'),
]);
return $fields;
}
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;
}
}

View File

@ -1,90 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: tony
* Date: 9/12/18
* Time: 2:55 AM
*/
namespace App\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 = [
'Day' => 'Monday',
'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__);
}
}

View File

@ -1,63 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: tony
* Date: 6/30/18
* Time: 11:36 PM
*/
namespace App\Models;
use SilverStripe\Assets\Image;
use SilverStripe\ORM\DataObject;
use SilverStripe\Versioned\Versioned;
use App\Extensions\SocialExtension;
class TeamMember extends DataObject
{
private static $table_name = 'TeamMember';
private static $db = [
'FirstName' => 'Varchar(254)',
'LastName' => 'Varchar(254)',
'Company' => 'Varchar(254)',
'Position' => 'Varchar(254)',
'Content' => 'HTMLText',
];
private static $has_one = [
'Photo' => Image::class,
];
private static $extensions = [
SocialExtension::class,
Versioned::class,
];
private static $owns = [
'Photo',
];
private static $summary_fields = [
'Company',
'FirstName',
'LastName',
'Position',
];
private static $searchable_fields = [
'FirstName',
'LastName',
];
private static $frontend_searchable_fields = [
'FirstName:PartialMatch',
'LastName:PartialMatch',
'Content:PartialMatch',
];
public function getTitle()
{
return $this->getField('Company').' | '.$this->getField('FirstName').' '.$this->getField('LastName');
}
}

View File

@ -4,7 +4,6 @@
// extends global Page class
//namespace App\Pages;
use Sheadawson\Linkable\Forms\LinkField;
use SilverStripe\CMS\Model\SiteTree;
use DNADesign\Elemental\Models\ElementContent;
use SilverStripe\FontAwesome\FontAwesomeField;

View File

@ -22,8 +22,8 @@ use SilverStripe\ORM\ArrayList;
use DNADesign\Elemental\Models\ElementContent;
use DNADesign\Elemental\Models\ElementalArea;
use DNADesign\ElementalUserForms\Control\ElementFormController;
use App\Models\TeamMember;
use App\Templates\DeferredRequirements;
use A2nt\ElementalBasics\Models\TeamMember;
use A2nt\CMSNiceties\Templates\DeferredRequirements;
class PageController extends ContentController
{

View File

@ -1,47 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: tony
* Date: 8/26/18
* Time: 1:40 PM
*/
namespace App\Models;
use SilverShop\Checkout\Component\CheckoutComponent;
use SilverShop\Model\Order;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\HeaderField;
use SilverStripe\Forms\LiteralField;
use SilverStripe\SiteConfig\SiteConfig;
use SilverStripe\View\SSViewer;
class CheckoutMapComponent extends CheckoutComponent
{
public function getFormFields(Order $order)
{
$config = SiteConfig::current_site_config();
return FieldList::create(
HeaderField::create('MapHeader', 'Pick up location'),
LiteralField::create(
'Map',
SSViewer::create('Objects\Map')->process($config)
)
);
}
public function validateData(Order $order, array $data)
{
}
public function setData(Order $order, array $data)
{
}
public function getData(Order $order)
{
return [];
}
}

View File

@ -1,43 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: tony
* Date: 8/26/18
* Time: 1:08 PM
*/
namespace App\Models;
use SilverShop\Checkout\Checkout;
use SilverShop\Checkout\CheckoutComponentConfig;
use SilverShop\Checkout\Component\CustomerDetails;
use SilverShop\Checkout\Component\Notes;
use SilverShop\Checkout\Component\Payment;
use SilverShop\Checkout\Component\Terms;
use SilverShop\Checkout\Component\Membership;
use SilverShop\Model\Order;
use SilverStripe\Omnipay\GatewayInfo;
use SilverStripe\Security\Security;
class CheckoutNoDeliveryConfig extends CheckoutComponentConfig
{
public function __construct(Order $order)
{
parent::__construct($order);
$this->addComponent(CustomerDetails::create());
if (Checkout::member_creation_enabled() && !Security::getCurrentUser()) {
$this->addComponent(Membership::create());
}
if (count(GatewayInfo::getSupportedGateways()) > 1) {
$this->addComponent(Payment::create());
}
$this->addComponent(Notes::create());
$this->addComponent(CheckoutMapComponent::create());
$this->addComponent(Terms::create());
}
}

View File

@ -1 +0,0 @@
Remove it in case u need silvershop module

View File

@ -1,39 +0,0 @@
<?php
namespace App\Tasks;
use SilverStripe\Assets\File;
use SilverStripe\Dev\BuildTask;
class BrokenFilesTask extends BuildTask
{
protected $title = 'Broken Files Task';
protected $description = 'Broken files report';
protected $enabled = true;
public function run($request)
{
$files = File::get();
$i = 0;
foreach ($files as $file) {
if (!$file->exists()) {
echo '<b style="color:red">File name was not found at SS DB: '
.$file->getField('Name').'</b><br/>'
.PHP_EOL;
$i++;
continue;
}
}
echo ($i > 0) ?
'<h2 style="color:red">Missing '.$i.' files</h2>'
: '<h2 style="color:green">All files are ok!</h2>';
die('Done!');
}
}

View File

@ -1,78 +0,0 @@
<?php
namespace App\Tasks;
use SilverStripe\Control\HTTPRequest;
class BuildTask extends \SilverStripe\Dev\BuildTask
{
protected $title = 'Base build task interface';
protected $description = 'Base build task interface';
protected $enabled = false;
protected $messages = [];
/**
* Implement this method in the task subclass to
* execute via the TaskRunner
*
* @param HTTPRequest $request
* @return
*/
public function run($request)
{
// TODO: Implement run() method.
return $this->render();
}
public function Title()
{
return $this->title;
}
protected function setMessage($msg, string $type = 'msg')
{
if(is_array($msg)) {
$type = 'list';
}
$this->messages[] = [$type, $msg];
}
public function render()
{
echo '<style>'
.'.info{color:#053bff}'
.'.bad,.error{color:red}'
.'.good,.success{color:green}'
.'</style>';
foreach ($this->messages as $item) {
$type = $item[0];
$msg = $item[1];
switch ($type) {
case 'h2':
echo '<h2>'.$msg.'</h2>'.PHP_EOL;
break;
case 'h3':
echo '<h3>'.$msg.'</h3>'.PHP_EOL;
break;
case 'list':
echo '<ul>';
foreach ($msg as $m) {
echo '<li>'.$m.'</li>';
}
echo '</ul>';
break;
default:
echo $msg.'<br/>'.PHP_EOL;
break;
}
}
echo '<h2 class="success">Success!</h2>';
}
}

View File

@ -1,29 +0,0 @@
<?php
namespace App\Tasks;
use SilverStripe\Assets\File;
use SilverStripe\CMS\Model\SiteTree;
use SilverStripe\Dev\BuildTask;
class CleanContentTask extends BuildTask
{
protected $title = 'Clean content task';
protected $description = 'Clean content task';
protected $enabled = true;
public function run($request)
{
$pages = SiteTree::get();
foreach ($pages as $p) {
$p->setField('Content', '');
$p->write();
echo '#'.$p->ID.' '.$p->getField('Title').'<br/>';
}
die('Done!');
}
}

View File

@ -1,105 +0,0 @@
<?php
namespace App\Tasks;
use Endroid\QrCode\ErrorCorrectionLevel;
use Endroid\QrCode\LabelAlignment;
use Endroid\QrCode\QrCode;
use SilverStripe\Assets\File;
use SilverStripe\Assets\Image;
use SilverStripe\Assets\Storage\AssetStore;
use SilverStripe\Assets\Upload;
use SilverStripe\Control\Director;
use SilverStripe\Core\Injector\Injector;
class QRCodeTask extends BuildTask
{
protected $title = 'Generate website QR-code';
protected $description = 'Generate website QR-code';
protected $enabled = true;
public function run($request)
{
echo '<h1>'.$this->Title().'</h1>';
echo self::generateQR();
die('Done!');
}
public static function generateQR()
{
$qrCode = new QrCode(Director::absoluteBaseURL());
$qrCode->setSize(600);
$qrCode->setMargin(10);
$qrCode->setWriterByName('png');
$qrCode->setEncoding('UTF-8');
$qrCode->setErrorCorrectionLevel(ErrorCorrectionLevel::HIGH());
$qrCode->setForegroundColor(['r' => 0, 'g' => 0, 'b' => 0, 'a' => 0]);
$qrCode->setBackgroundColor(['r' => 255, 'g' => 255, 'b' => 255, 'a' => 0]);
$qrCode->setLabel(Director::absoluteBaseURL(), 16, null, LabelAlignment::CENTER());
/*$qrCode->setLogoPath('/'.File::join_paths(
PUBLIC_PATH,
RESOURCES_DIR,
project(),
'client', 'dist', 'icons',
'apple-touch-icon-152x152.png'
));
$qrCode->setLogoSize(152, 152);*/
$qrCode->setValidateResult(true);
// Round block sizes to improve readability and make the blocks sharper in pixel based outputs (like png).
// There are three approaches:
$qrCode->setRoundBlockSize(true, QrCode::ROUND_BLOCK_SIZE_MODE_MARGIN); // The size of the qr code is shrinked, if necessary, but the size of the final image remains unchanged due to additional margin being added (default)
$qrCode->setRoundBlockSize(true, QrCode::ROUND_BLOCK_SIZE_MODE_ENLARGE); // The size of the qr code and the final image is enlarged, if necessary
$qrCode->setRoundBlockSize(true, QrCode::ROUND_BLOCK_SIZE_MODE_SHRINK); // The size of the qr code and the final image is shrinked, if necessary
// Set additional writer options (SvgWriter example)
$qrCode->setWriterOptions(['exclude_xml_declaration' => true]);
// Directly output the QR code
/*header('Content-Type: '.$qrCode->getContentType());
echo $qrCode->writeString();
die();*/
// Save it to a file
$qrCode->writeFile(TEMP_PATH.'/qrcode.png');
$res = self::getAssetStore()->setFromLocalFile(
TEMP_PATH.'/qrcode.png',
'qrcode.png', null, null,
[
'conflict' => AssetStore::CONFLICT_OVERWRITE,
'visibility' => AssetStore::VISIBILITY_PUBLIC,
]
);
$img = Image::get()->filter([
'ParentID' => 0,
'FileFilename' => $res['Filename'],
])->first();
if(!$img) {
$img = Image::create();
}
$res['FileHash'] = $res['Hash'];
$res['FileFilename'] = $res['Filename'];
$res['ParentID'] = 0;
$img = $img->update($res);
$img->write();
$img->publishFile();
return '<img src="'.$qrCode->writeDataUri().'" width="300" alt="QR-code" /><br/>';
}
protected static function getAssetStore()
{
return Injector::inst()->get(AssetStore::class);
}
}

View File

@ -1,47 +0,0 @@
<?php
namespace App\Tasks;
use SilverStripe\Assets\File;
use SilverStripe\Dev\BuildTask;
class RestoreFilesTask extends BuildTask
{
protected $title = 'Restore Files Task';
protected $description = 'Restores file from specific folder';
protected $enabled = false;
public function run($request)
{
die('Specify path first');
$path = '*<Path to the folder with files to be restored>*';
$files = array_diff(scandir($path), ['.','..']);
foreach ($files as $fileName) {
$file = File::get()->filter('Name', $fileName);
if (!$file->count()) {
echo '<b style="color:red">File name was not found at SS DB: '.$fileName.'</b><br/>'.PHP_EOL;
continue;
}
foreach ($file as $f) {
if ($f->exists()) {
echo 'File #'.$f->ID.' already exists at SS file structure. <b style="color:green">'.$fileName.'</b><br/>' . PHP_EOL;
continue;
}
echo 'Found non existing at SS file system file and found it at SS DB.'
.' Creating the file #'.$f->ID.' at SS file system. "<b style="color:#053bff">' . $fileName . '"</b><br/>' . PHP_EOL;
$f->setFromLocalFile($path.'/'.$fileName);
$f->write();
$f->publishFile();
}
}
die('Success!');
}
}

View File

@ -1,229 +0,0 @@
<?php
/** @noinspection PhpUnusedPrivateFieldInspection */
namespace App\Templates;
use SilverStripe\Control\Controller;
use SilverStripe\View\TemplateGlobalProvider;
use SilverStripe\View\Requirements;
use SilverStripe\Core\Config\Config;
use SilverStripe\Control\Director;
use SilverStripe\Core\Path;
use SilverStripe\FontAwesome\FontAwesomeField;
class DeferredRequirements implements TemplateGlobalProvider
{
private static $css = [];
private static $js = [];
private static $deferred = false;
private static $static_domain;
private static $version;
private static $nojquery = false;
private static $jquery_version = '3.4.1';
private static $nofontawesome = false;
private static $custom_requirements = [];
/**
* @return array
*/
public static function get_template_global_variables(): array
{
return [
'AutoRequirements' => 'Auto',
'DeferedCSS' => 'loadCSS',
'DeferedJS' => 'loadJS',
'WebpackActive' => 'webpackActive',
'EmptyImgSrc' => 'emptyImageSrc',
];
}
public static function Auto($class = false): string
{
$config = Config::inst()->get(self::class);
$projectName = WebpackTemplateProvider::projectName();
$mainTheme = WebpackTemplateProvider::mainTheme();
$mainTheme = $mainTheme ?: $projectName;
$dir = Path::join(
Director::publicFolder(),
RESOURCES_DIR,
$projectName,
'client',
'dist'
);
$cssPath = Path::join($dir, 'css');
$jsPath = Path::join($dir, 'js');
// Initialization
Requirements::block(THIRDPARTY_DIR.'/jquery/jquery.js');
/*if (defined('FONT_AWESOME_DIR')) {
Requirements::block(FONT_AWESOME_DIR.'/css/lib/font-awesome.min.css');
}*/
Requirements::set_force_js_to_bottom(true);
// Main libs
if (!$config['nojquery']) {
self::loadJS(
'//ajax.googleapis.com/ajax/libs/jquery/'
.$config['jquery_version'].'/jquery.min.js'
);
}
if (!$config['noreact']) {
if (!Director::isDev()) {
self::loadJS('https://unpkg.com/react@17/umd/react.production.min.js');
self::loadJS('https://unpkg.com/react-dom@17/umd/react-dom.production.min.js');
} else {
self::loadJS('https://unpkg.com/react@17/umd/react.development.js');
self::loadJS('https://unpkg.com/react-dom@17/umd/react-dom.development.js');
}
}
// App libs
if (!$config['nofontawesome']) {
$v = !isset($config['fontawesome_version']) || !$config['fontawesome_version']
? Config::inst()->get(FontAwesomeField::class, 'version')
: $config['fontawesome_version'];
self::loadCSS('//use.fontawesome.com/releases/v'.$v.'/css/all.css');
}
self::loadCSS($mainTheme.'.css');
// hot reloading
/*if (self::webpackActive()) {
self::loadJS('hot.js');
}*/
self::loadJS($mainTheme.'.js');
// Custom controller requirements
$curr_class = $class ?: get_class(Controller::curr());
if (isset($config['custom_requirements'][$curr_class])) {
foreach ($config['custom_requirements'][$curr_class] as $file) {
if (strpos($file, '.css')) {
self::loadCSS($file);
}
if (strpos($file, '.js')) {
self::loadJS($file);
}
}
}
$curr_class = str_replace('\\', '.', $curr_class);
// Controller requirements
$themePath = Path::join($cssPath, $mainTheme.'_'.$curr_class . '.css');
$projectPath = Path::join($cssPath, $projectName.'_'.$curr_class . '.css');
if ($mainTheme && file_exists($themePath)) {
self::loadCSS($mainTheme.'_'.$curr_class . '.css');
} elseif (file_exists($projectPath)) {
self::loadCSS($projectName.'_'.$curr_class . '.css');
}
$themePath = Path::join($jsPath, $mainTheme.'_'.$curr_class . '.js');
$projectPath = Path::join($jsPath, $projectName.'_'.$curr_class . '.js');
if ($mainTheme && file_exists($themePath)) {
self::loadJS($mainTheme.'_'.$curr_class . '.js');
} elseif (file_exists($projectPath)) {
self::loadJS($projectName.'_'.$curr_class . '.js');
}
return self::forTemplate();
}
public static function loadCSS($css): void
{
$external = (mb_strpos($css, '//') === 0 || mb_strpos($css, 'http') === 0);
if ($external) {
self::$css[] = $css;
} else {
WebpackTemplateProvider::loadCSS($css);
}
}
public static function loadJS($js): void
{
/*$external = (mb_substr($js, 0, 2) === '//' || mb_substr($js, 0, 4) === 'http');
if ($external || (self::getDeferred() && !self::_webpackActive())) {*/
// webpack supposed to load external JS
if (self::getDeferred() && !self::webpackActive()) {
self::$js[] = $js;
} else {
WebpackTemplateProvider::loadJS($js);
}
}
public static function webpackActive(): bool
{
return WebpackTemplateProvider::isActive();
}
public static function setDeferred($bool): void
{
Config::inst()->set(__CLASS__, 'deferred', $bool);
}
public static function getDeferred(): bool
{
return self::config()['deferred'];
}
public static function forTemplate(): string
{
$result = '';
self::$css = array_unique(self::$css);
foreach (self::$css as $css) {
$result .= '<i class="defer-cs" data-load="' . self::get_url($css) . '"></i>';
}
self::$js = array_unique(self::$js);
foreach (self::$js as $js) {
$result .= '<i class="defer-sc" data-load="' . self::get_url($js) . '"></i>';
}
$result .=
'<script>function lsc(a,b){var c=document.createElement("script");c.readyState'
.'?c.onreadystatechange=function(){"loaded"!=c.readyState&&"complete"!=c.readyState||(c.onreadystatechange=null,b())}'
.':c.onload=function(){b()},c.src=a,document.getElementsByTagName("body")[0].appendChild(c)}'
.'function lscd(a){a<s.length-1&&(a++,lsc(s.item(a).getAttribute("data-load"),function(){lscd(a)}))}'
.'for(var s=document.getElementsByClassName("defer-cs"),i=0;i<s.length;i++){var b=document.createElement("link");b.rel="stylesheet",'
.'b.type="text/css",b.href=s.item(i).getAttribute("data-load"),b.media="all";var c=document.getElementsByTagName("body")[0];'
.'c.appendChild(b)}var s=document.getElementsByClassName("defer-sc"),i=0;if(s.item(i)!==null)lsc(s.item(i).getAttribute("data-load"),function(){lscd(i)});'
.'</script>';
return $result;
}
private static function get_url($url): string
{
$config = self::config();
// external URL
if (strpos($url, '//') !== false) {
return $url;
}
$path = WebpackTemplateProvider::toPublicPath($url);
$absolutePath = Director::getAbsFile($path);
$hash = sha1_file($absolutePath);
$version = $config['version'] ? '&v='.$config['version'] : '';
//$static_domain = $config['static_domain'];
//$static_domain = $static_domain ?: '';
return Controller::join_links(WebpackTemplateProvider::toPublicPath($url), '?m='.$hash.$version);
}
public static function emptyImageSrc(): string
{
return 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
}
public static function config(): array
{
return Config::inst()->get(__CLASS__);
}
}

View File

@ -1,153 +0,0 @@
<?php
/** @noinspection PhpUnusedPrivateFieldInspection */
/**
* Directs assets requests to Webpack server or to static files
*/
namespace App\Templates;
use SilverStripe\Core\Manifest\ModuleManifest;
use SilverStripe\View\SSViewer;
use SilverStripe\View\TemplateGlobalProvider;
use SilverStripe\View\Requirements;
use SilverStripe\Control\Director;
use SilverStripe\Control\Controller;
use SilverStripe\Core\Config\Config;
class WebpackTemplateProvider implements TemplateGlobalProvider
{
/**
* @var int port number
*/
private static $port = 3000;
/**
* @var string host name
*/
private static $hostname = 'localhost';
/**
* @var string assets static files directory
*/
private static $dist = 'client/dist';
private static $webp = false;
/**
* @return array
*/
public static function get_template_global_variables(): array
{
return [
'WebpackDevServer' => 'isActive',
'WebpackCSS' => 'loadCSS',
'WebpackJS' => 'loadJS',
'ResourcesURL' => 'resourcesURL',
'ProjectName' => 'themeName',
];
}
/**
* Load CSS file
* @param $path
*/
public static function loadCSS($path): void
{
/*if (self::isActive()) {
return;
}*/
Requirements::css(self::_getPath($path));
}
/**
* Load JS file
* @param $path
*/
public static function loadJS($path): void
{
Requirements::javascript(self::_getPath($path));
}
public static function projectName(): string
{
return Config::inst()->get(ModuleManifest::class, 'project');
}
public static function mainTheme()
{
$themes = Config::inst()->get(SSViewer::class, 'themes');
return is_array($themes) && $themes[0] !== '$public' && $themes[0] !== '$default' ? $themes[0] : false;
}
public static function resourcesURL($link = null): string
{
$cfg = self::config();
if ($cfg['webp'] && !self::isActive()) {
$link = str_replace(['.png','.jpg','.jpeg'], '.webp', $link);
}
return Controller::join_links(
Director::baseURL(),
'/resources/',
self::projectName(),
$cfg['dist'],
'img',
$link
);
}
/**
* Checks if dev mode is enabled and if webpack server is online
* @return bool
*/
public static function isActive(): bool
{
$cfg = self::config();
return Director::isDev() && @fsockopen(
$cfg['HOSTNAME'],
$cfg['PORT']
);
}
protected static function _getPath($path): string
{
return self::isActive() && strpos($path, '//') === false ?
self::_toDevServerPath($path) :
self::toPublicPath($path);
}
protected static function _toDevServerPath($path): string
{
$cfg = self::config();
return sprintf(
'%s%s:%s/%s',
($cfg['HTTPS'] ? 'https://' : 'http://'),
$cfg['HOSTNAME'],
$cfg['PORT'],
basename($path)
//Controller::join_links($cfg['APPDIR'], $cfg['SRC'], basename($path))
);
}
public static function toPublicPath($path): string
{
$cfg = self::config();
return strpos($path, '//') === false ?
Controller::join_links(
RESOURCES_DIR,
self::projectName(),
$cfg['dist'],
(strpos($path, '.css') ? 'css' : 'js'),
$path
)
: $path;
}
public static function config(): array
{
return Config::inst()->get(__CLASS__);
}
}

View File

@ -1,142 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: tony
* Date: 10/31/18
* Time: 5:31 AM
*/
namespace App\Tests;
use SilverStripe\Assets\Upload_Validator;
use SilverStripe\Core\Cache\FilesystemCacheFactory;
use SilverStripe\Core\Config\Config;
use SilverStripe\Core\Convert;
use SilverStripe\Dev\BuildTask;
use SilverStripe\Dev\Deprecation;
use SilverStripe\Assets\File;
class TestServer extends BuildTask
{
protected $title = 'Test server';
protected $description = 'Test server';
public function run($request)
{
echo '<style>table{width:100%}table td,table th{border:1px solid #dedede}</style>';
echo '<h2>Testing Server</h2>';
echo self::success('BASE_PATH: <b>'.BASE_PATH.'</b>');
echo self::success('PHP: <b>'.phpversion().'</b>');
$v = Deprecation::dump_settings()['version'];
if ($v) {
echo self::success('SilverStipe version: <b>'.$v.'</b>');
} else {
echo self::success('SilverStipe version unknown: <b>'
.(file_exists(BASE_PATH.'/framework') ? '3.x.x' : '4.x.x')
.'</b>');
}
echo self::success('Memory limit: <b>'.ini_get('memory_limit').'</b>');
if (is_writable(TEMP_FOLDER)) {
echo self::success('TMP (cache) dir <b>'.TEMP_FOLDER.'</b> dir is writable.');
} else {
echo self::error('TMP (cache) dir <b>'.TEMP_FOLDER.'</b> dir is no writable!');
}
echo '<h2>Testing Uploads</h2>';
$maxUpload = ini_get('upload_max_filesize');
$maxPost = ini_get('post_max_size');
echo self::success('PHP max upload size: '.$maxUpload);
echo self::success('PHP max post size: '.$maxPost);
echo self::success('So calculated max upload size: '.self::formatBytes(min(
self::memstring2bytes($maxUpload),
self::memstring2bytes($maxPost)
)));
$defaultSizes = Config::inst()->get(Upload_Validator::class, 'default_max_file_size');
if ($defaultSizes) {
if (!is_array($defaultSizes)) {
echo self::error('default_max_file_size miss-configuration, plz fix');
var_dump($defaultSizes);
die();
}
echo '<h3>Configured limits:</h3><table style="text-align:center">'
.'<thead><tr><th>File</th><th>Size limit</th></tr></thead><tbody>';
foreach ($defaultSizes as $k => $size) {
echo '<tr><td>'.$k.'</td><td>'.$size.'</td></tr>';
}
echo '</tbody></table>';
}
if (is_writable(ASSETS_DIR)) {
echo self::success('Assets dir <b>'.ASSETS_DIR.'</b> dir is writable.');
} else {
echo self::error('Assets dir <b>'.ASSETS_DIR.'</b> dir is no writable!');
}
if (function_exists('imagewebp')) {
echo self::success('WebP is available');
} else {
echo self::error('WebP is not available');
}
die();
}
public static function formatBytes($size, $precision = 2)
{
$base = log($size, 1024);
$suffixes = array('', 'K', 'M', 'G', 'T');
return round(pow(1024, $base - floor($base)), $precision) . $suffixes[(string)floor($base)];
}
public static function error($text)
{
return '<span style="color:red">ERROR: '.$text.'</span><br/>';
}
public static function success($text)
{
return '<span style="color:green">SUCCESS: '.$text.'</span><br/>';
}
public static function warning($text)
{
return '<span style="color:#0014ff">WARNING: '.$text.'</span><br/>';
}
public static function renderValidation($result)
{
echo '<p>';
$msgs = $result->getMessages();
foreach ($msgs as $msg) {
echo self::error($msg['fieldName'].': '.$msg['message']);
}
echo '</p>';
}
public static function memstring2bytes($memString)
{
// Remove non-unit characters from the size
$unit = preg_replace('/[^bkmgtpezy]/i', '', $memString);
// Remove non-numeric characters from the size
$size = preg_replace('/[^0-9\.]/', '', $memString);
if ($unit) {
// Find the position of the unit in the ordered string which is the power
// of magnitude to multiply a kilobyte by
return round($size * pow(1024, stripos('bkmgtpezy', $unit[0])));
}
return round($size);
}
}

View File

@ -1,18 +0,0 @@
<?php
namespace App\Traits;
trait PaginatedListing
{
private $filter = [];
public function NextPage($pageID = null)
{
$vars = $this->getRequest()->requestVars();
$vars = array_filter($vars);
$vars['page'] = $pageID ? $pageID : '2';
return $this->Link('?'.http_build_query($vars));
}
}

View File

@ -1,66 +0,0 @@
<?php
namespace App\Widgets;
use Sheadawson\Linkable\Forms\LinkField;
use Sheadawson\Linkable\Models\Link;
use SilverStripe\AssetAdmin\Forms\UploadField;
use SilverStripe\Assets\Image;
use SilverStripe\Widgets\Model\Widget;
if (!class_exists(Widget::class)) {
return;
}
class BannerWidget extends Widget
{
private static $title = 'Banner';
private static $cmsTitle = 'Banner';
private static $description = 'Shows banner with image and link.';
private static $icon = '<i class="icon font-icon-block-banner"></i>';
private static $table_name = 'BannerWidget';
private static $has_one = [
'Image' => Image::class,
'Link' => Link::class,
];
private static $owns = [
'Image',
'Link',
];
public function getCMSFields()
{
$fields = parent::getCMSFields();
$fields->push(UploadField::create('Image', 'Image (minimal width 301px)')
->setAllowedFileCategories(['image/supported']));
$fields->push(LinkField::create('LinkID', 'Link'));
return $fields;
}
private $_random;
public function Random()
{
if (!$this->_random) {
$this->_random = self::get()->filter('Enabled', true)->sort('RAND()')->first();
}
return $this->_random;
}
public function onBeforeWrite()
{
$title = $this->getField('Title');
$img = $this->Image();
if(!$title && $img) {
$this->setField('Title', $img->getTitle());
}
parent::onBeforeWrite();
}
}

View File

@ -1,37 +0,0 @@
<?php
namespace App\Widgets;
use Sheadawson\Linkable\Forms\LinkField;
use Sheadawson\Linkable\Models\Link;
use SilverStripe\AssetAdmin\Forms\UploadField;
use SilverStripe\Assets\Image;
use SilverStripe\Forms\HTMLEditor\HTMLEditorField;
use SilverStripe\Widgets\Model\Widget;
if (!class_exists(Widget::class)) {
return;
}
class ContentWidget extends Widget
{
private static $title = 'Content';
private static $cmsTitle = 'Content';
private static $description = 'Shows text content.';
private static $icon = '<i class="icon font-icon-block-content"></i>';
private static $table_name = 'ContentWidget';
private static $db = [
'Text' => 'HTMLText',
];
public function getCMSFields()
{
$fields = parent::getCMSFields();
$fields->push(HTMLEditorField::create('Text'));
return $fields;
}
}

View File

@ -1,60 +0,0 @@
<?php
namespace App\Widgets;
use DNADesign\Elemental\Models\BaseElement;
use DNADesign\ElementalList\Model\ElementList;
use SilverStripe\CMS\Model\SiteTree;
use SilverStripe\Forms\DropdownField;
use SilverStripe\Forms\TreeDropdownField;
use SilverStripe\Widgets\Model\Widget;
if (!class_exists(Widget::class)) {
return;
}
class ElementWidget extends Widget
{
private static $title = 'Virtual Element';
private static $cmsTitle = 'Virtual Element';
private static $description = 'Adds existing element to side bar';
private static $icon = '<i class="icon font-icon-block-banner"></i>';
private static $table_name = 'ElementWidget';
private static $has_one = [
'Element' => BaseElement::class,
];
public function getCMSFields()
{
$fields = parent::getCMSFields();
$fields->push(
DropdownField::create(
'ElementID',
'Displayed Element',
BaseElement::get()
->filter(['AvailableGlobally' => true])
->exclude(['ClassName' => ElementList::class])
)
/*TreeDropdownField::create(
'ElementID',
'Displayed Element',
SiteTree::class
)->setFilterFunction(static function($el){
return (bool) $el->getField('ElementalArea')->Elements()->count();
})*/
);
return $fields;
}
public function SimpleClassName()
{
$el = $this->getField('Element');
var_dump($el);
die();
return $el->getSimpleClassName();
}
}

View File

@ -1,56 +0,0 @@
<?php
namespace App\Widgets;
use Sheadawson\Linkable\Forms\LinkField;
use Sheadawson\Linkable\Models\Link;
use SilverStripe\AssetAdmin\Forms\UploadField;
use SilverStripe\Assets\Image;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridFieldConfig_RecordEditor;
use SilverStripe\Forms\LiteralField;
use SilverStripe\Widgets\Model\Widget;
if (!class_exists(Widget::class)) {
return;
}
class LinksWidget extends Widget
{
private static $title = 'Links';
private static $cmsTitle = 'Links';
private static $description = 'Shows listing of links.';
private static $icon = '<i class="icon font-icon-list"></i>';
private static $table_name = 'LinksWidget';
private static $many_many = [
'Links' => Link::class,
];
private static $owns = [
'Links',
];
public function getCMSFields()
{
$fields = parent::getCMSFields();
if($this->ID) {
$fields->push(GridField::create(
'Links',
'',
$this->Links(),
GridFieldConfig_RecordEditor::create()
));
}else{
$fields->push(LiteralField::create(
'Note',
'<p class="alert alert-warning"><b>Note:</b> The widget needs to be saved before adding a link.'
.' Enter the Title and click "+ Create" button at the bottom left corner of the screen</p>')
);
}
return $fields;
}
}

View File

@ -1,53 +0,0 @@
<?php
namespace App\Widgets;
use SilverStripe\Forms\CheckboxField;
use SilverStripe\Widgets\Model\Widget;
if (!class_exists(Widget::class)) {
return;
}
class SubmenuWidget extends Widget
{
private static $title = 'Sub-Menu';
private static $cmsTitle = 'Sub-Menu';
private static $description = 'Shows sub menu.';
private static $icon = '<i class="icon font-icon-tree"></i>';
private static $table_name = 'SubmenuWidget';
private static $db = [
'TopLevelSubmenu' => 'Boolean(1)',
];
public function getPage()
{
$area = $this->Parent();
return \Page::get()->filter('SideBarID', $area->ID)->first();
}
public function getSubmenu()
{
$page = $this->getPage();
if(!$this->getField('TopLevelSubmenu')) {
return $page->Children();
}
return $page->Level(1)->Children();
}
public function getCMSFields()
{
$fields = parent::getCMSFields();
$fields->push(CheckboxField::create(
'TopLevelSubmenu',
'Display sub-menu starting from the top level (otherwise current page children will be displayed)'
));
return $fields;
}
}

View File

@ -1,157 +0,0 @@
<?php
namespace App\Widgets;
use DNADesign\Elemental\Controllers\ElementalAreaController;
use DNADesign\Elemental\Forms\ElementalAreaConfig;
use DNADesign\Elemental\Forms\ElementalAreaField;
use DNADesign\Elemental\Models\BaseElement;
use DNADesign\Elemental\Models\ElementalArea;
use SilverStripe\Control\Controller;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Forms\CompositeField;
use SilverStripe\Forms\FieldGroup;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\FormField;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridFieldAddExistingAutocompleter;
use SilverStripe\Forms\GridField\GridFieldAddNewButton;
use SilverStripe\Forms\GridField\GridFieldConfig;
use SilverStripe\Forms\GridField\GridFieldConfig_Base;
use SilverStripe\Forms\GridField\GridFieldConfig_RelationEditor;
use SilverStripe\Forms\GridField\GridFieldDataColumns;
use SilverStripe\Forms\GridField\GridFieldDeleteAction;
use SilverStripe\Forms\GridField\GridFieldDetailForm;
use SilverStripe\Forms\GridField\GridFieldEditButton;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObjectInterface;
use SilverStripe\Widgets\Model\Widget;
use SilverStripe\Widgets\Model\WidgetArea;
use Symbiote\GridFieldExtensions\GridFieldAddNewMultiClass;
use UndefinedOffset\SortableGridField\Forms\GridFieldSortableRows;
class WidgetAreaField extends GridField
{
/**
* @var ElementalArea $area
*/
protected $area;
/**
* @var array $type
*/
protected $types = [];
/**
* @var null
*/
protected $inputType = null;
protected $modelClassName = Widget::class;
/**
* @param string $name
* @param ElementalArea $area
* @param string[] $blockTypes
*/
public function __construct($name, WidgetArea $area, array $blockTypes)
{
$this->setTypes($blockTypes);
$config = GridFieldConfig_Base::create();
$config->getComponentByType(GridFieldDataColumns::class)->setDisplayFields([
'Icon' => '',
'Title' => 'Title',
'Enabled' => 'Enabled',
])->setFieldFormatting([
'Icon' => static function ($v, Widget $item) {
return '<span style="font-size:2rem">'.$item::config()->get('icon').'</span>';
},
'Enabled' => static function ($v, Widget $item) {
return $item->getField('Enabled') ? 'Yes' : 'No';
},
]);
$config->addComponent(new GridFieldEditButton());
$config->addComponent(new GridFieldDeleteAction(false));
$config->addComponent(new GridFieldDetailForm(null, false, false));
$config->addComponent(new GridFieldSortableRows('Sort'));
if (!empty($blockTypes)) {
/** @var GridFieldAddNewMultiClass $adder */
$adder = Injector::inst()->create(GridFieldAddNewMultiClass::class);
$adder->setClasses($blockTypes);
$config->addComponent($adder);
}
// By default, no need for a title on the editor. If there is more than one area then use `setTitle` to describe
parent::__construct($name, '', $area->Widgets(), $config);
$this->area = $area;
$this->addExtraClass('element-editor__container no-change-track');
}
/**
* @param array $types
*
* @return $this
*/
public function setTypes($types)
{
$this->types = $types;
return $this;
}
/**
* @return array
*/
public function getTypes()
{
$types = $this->types;
$this->extend('updateGetTypes', $types);
return $types;
}
/**
* @return ElementalArea
*/
public function getArea()
{
return $this->area;
}
public function saveInto(DataObjectInterface $dataObject)
{
parent::saveInto($dataObject);
$elementData = $this->Value();
$idPrefixLength = strlen(sprintf(ElementalAreaController::FORM_NAME_TEMPLATE, ''));
if (!$elementData) {
return;
}
foreach ($elementData as $form => $data) {
// Extract the ID
$elementId = (int) substr($form, $idPrefixLength);
// @var BaseElement $element
$element = $this->getArea()->Widgets()->byID($elementId);
if (!$element) {
// Ignore invalid elements
continue;
}
$data = ElementalAreaController::removeNamespacesFromFields($data, $element->ID);
$element->updateFromFormData($data);
$element->write();
}
}
}

View File

@ -1,50 +0,0 @@
<?php
namespace App\Widgets;
use DNADesign\Elemental\Forms\TextCheckboxGroupField;
use SilverStripe\CMS\Model\SiteTree;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\TreeDropdownField;
use SilverStripe\ORM\DataExtension;
class WidgetExtension extends DataExtension
{
private static $db = [
'ShowTitle' => 'Boolean(1)',
];
public function updateCMSFields(FieldList $fields)
{
parent::updateCMSFields($fields);
// Add a combined field for "Title" and "Displayed" checkbox in a Bootstrap input group
$fields->removeByName('ShowTitle');
$fields->replaceField(
'Title',
TextCheckboxGroupField::create()
->setName('Title')
);
$fields->push(TreeDropdownField::create(
'MovePageID', 'Move widget to page', SiteTree::class
));
}
public function onBeforeWrite()
{
$obj = $this->owner;
$moveID = $obj->MovePageID;
if ($moveID) {
$page = \Page::get()->byID($moveID);
if($page) {
$sidebarID = $page->getField('SideBarID');
if($sidebarID) {
$obj->setField('ParentID', $sidebarID);
}
}
}
parent::onBeforeWrite();
}
}

View File

@ -1,49 +0,0 @@
<?php
namespace App\Widgets;
use DNADesign\Elemental\Forms\ElementalAreaField;
use SilverStripe\Forms\FieldList;
use SilverStripe\Widgets\Forms\WidgetAreaEditor;
use SilverStripe\Widgets\Model\Widget;
use SilverStripe\Widgets\Model\WidgetArea;
class WidgetPageExtension extends \SilverStripe\Widgets\Extensions\WidgetPageExtension
{
public function updateCMSFields(FieldList $fields)
{
parent::updateCMSFields($fields);
$tab = $fields->findOrMakeTab('Root.Widgets');
$tab->setTitle('Sidebar');
$tab->removeByName('SideBar');
$widgetTypes = WidgetAreaEditor::create('Sidebar')->AvailableWidgets();
$available = [];
/** @var Widget $type */
foreach ($widgetTypes as $type) {
$available[get_class($type)] = $type->getCMSTitle();
}
$tab->push(WidgetAreaField::create(
'SideBar',
$this->owner->Sidebar(),
$available
));
}
public function onBeforeWrite()
{
parent::onBeforeWrite();
if (!$this->owner->getField('SideBarID')) {
$area = WidgetArea::create();
$area->write();
$this->owner->setField('SideBarID', $area->ID);
}
}
}

View File

@ -1,9 +0,0 @@
<% if $ShowTitle %>
<h2 class="element__title">$Title</h2>
<% end_if %>
<div class="element__content" data-listelement-count="{$Elements.Elements.Count}">
<div id="ElementAccordion{$Elements.ID}" class="accordion">
$Accordion
</div>
</div>

View File

@ -1,25 +0,0 @@
<% if $ElementFilteredControllers %>
<% loop $ElementFilteredControllers %>
<div class="card">
<div
id="ElementHeader{$ID}"
class="card-header accordion-header a h4"
data-toggle="collapse"
data-target="#ElementContent{$ID}"
aria-expanded="false"
aria-controls="ElementContent{$ID}"
>
$Title
</div>
<div
id="ElementContent{$ID}"
class="accordion-content collapse"
aria-labelledby="ElementHeader{$ID}"
data-parent="#ElementAccordion{$Parent.ID}"
>
$Me
</div>
</div>
<% end_loop %>
<% end_if %>

View File

@ -1,22 +0,0 @@
<div
data-aos="fade-up"
class="element__content<% if $BlockLink %> has-blockLink<% end_if %><% if $BlockIcon %> has-blockIcon<% end_if %><% if $Style %> $CssStyle<% end_if %>"
>
<% if $BlockIcon %>
<i class="element__icon $BlockIcon"></i>
<% end_if %>
<% if $ShowTitle %>
<h2 class="element__title">$Title</h2>
<% end_if %>
<div class="element__html typography">
$HTML
</div>
<% if $BlockLink %>
<a href="$BlockLink.LinkURL" class="element__link btn btn-default stretched-link">
$BlockLink.Title
</a>
<% end_if %>
</div>

View File

@ -1,15 +0,0 @@
<div class="element__content<% if $Style %> $CssStyle<% end_if %>">
<% if $ShowTitle %>
<h2 class="element__title">$Title</h2>
<% end_if %>
<div class="element__html typography">
$HTML
</div>
<% if $BlockLink %>
<a href="$BlockLink.LinkURL" class="element__link btn btn-default stretched-link">
$BlockLink.Title
</a>
<% end_if %>
</div>

View File

@ -1,8 +0,0 @@
<% if $ShowTitle %>
<h2 class="element__title">$Title</h2>
<% end_if %>
<div class="element__content">
<div class="element__feed jsInstagramFeed" $AttributesHTML></div>
<div class="feed__link"><a href="{$FeedLink}" target="_blank">{$FeedTitle}</a></div>
</div>

View File

@ -1,23 +0,0 @@
<% if $ShowTitle %>
<h2 class="element__title">$Title</h2>
<% end_if %>
<% if $Content %>
<div class="element__html typography">$Content</div>
<% end_if %>
<div class="element__content">
<% include Objects\Map %>
<% if $Locations %>
<div class="locations">
<div class="row">
<% loop $Locations %>
<div class="col">
$forTemplate
</div>
<% end_loop %>
</div>
</div>
<% end_if %>
</div>

View File

@ -1,24 +0,0 @@
<% if $ShowTitle || $Content %>
<div class="slider-caption">
<% if $ShowTitle %>
<h2 class="element__title">$Title</h2>
<% end_if %>
<% if $Content %><div class="element__html typography">$Content</div><% end_if %>
</div>
<% end_if %>
<% if $SlideShow %>
<div class="element__content">
<div id="Carousel{$ID}" class="element__carousel carousel slide js-carousel"<% if $SlideShow.count > 1 %><% if $Interval %> data-interval="$Interval"<% end_if %> data-indicators="true" data-arrows="true"<% end_if %>>
<div class="carousel-inner">
<% loop $SlideShow %>
<div class="carousel-item carousel-item-{$SlideType}<% if no $Controls %> carousel-item-nocontrols<% end_if %><% if $First %> active<% end_if %>">
<div class="carousel-slide">
<% include SlideItem %>
</div>
</div>
<% end_loop %>
</div>
</div>
</div>
<% end_if %>

View File

@ -1,17 +0,0 @@
<% if $Members %>
<div class="element__content<% if $Style %> $CssStyle<% end_if %>">
<% if $ShowTitle %>
<h2 class="element__title">$Title</h2>
<% end_if %>
<div class="element__content">
<div class="row">
<% loop $Members %>
<div class="col-sm-3">
<% include Objects\HCard %>
</div>
<% end_loop %>
</div>
</div>
</div>
<% end_if %>

View File

@ -1,28 +0,0 @@
<div id="MapPin{$ID}" data-id="{$ID}" class="location">
<div class="fn">{$Title}</div>
<div class="addr">{$Address}</div>
<% if $Address2 %>
<div class="addr2">{$Address2}</div>
<% end_if %>
<% if $City || $Suburb || $PostalCode || $Postcode %>
<div class="city">
{$City}{$Suburb}, {$State} {$PostalCode}{$Postcode}
</div>
<% end_if %>
<% if $Country %>
<div class="country d-none">{$Country}</div>
<% end_if %>
<% if $PhoneNumber %>
<% with $PhoneNumber %>
T: <a href="$LinkURL" class="tel">$Title</a><br/>
<% end_with %>
<% end_if %>
<% if $Fax %>
<% with $Fax %>
F: <span class="fax">$Title</span>
<% end_with %>
<% end_if %>
<div class="dir-link">
<a href="$DirectionsURL" target="_blank">Get Directions &raquo;</a>
</div>
</div>

View File

@ -1 +0,0 @@
<b>$Day:</b> $From.Nice - $Till.Nice

View File

@ -1,32 +0,0 @@
<% if $ShowNotifications && $NotificationsToday %>
<div class="notifications-list">
<% loop $NotificationsToday %>
<div class="alert alert-warning">
<div class="container">
<% if $DisplayTitle && $Title %>
<h2>$Title</h2>
<% end_if %>
<div class="typography">
$Content
</div>
<% if $TargetLink %>
<% with $TargetLink %>
<a
class="alert-link" href="$LinkURL"
<% if $OpenInNewWindow %> target="_blank"<% end_if %>
>
$Title
</a>
<% end_with %>
<% end_if %>
<b class="btn btn-danger btn-close" data-dismiss="alert" aria-label="Close">
<i class="fas fa-times"></i>
</b>
</div>
</div>
<% end_loop %>
</div>
<% end_if %>

View File

@ -1,7 +0,0 @@
<% if $OpeningHoursToday %>
<% loop $OpeningHoursToday %>
$forTemplate<br/>
<% end_loop %>
<% else %>
<b class="hours hous-closed">Closed</b>
<% end_if %>

View File

@ -1,8 +0,0 @@
<img src="$Image.FocusFill(432,315).URL" alt="$Title" />
<% if $Link %>
<% with $Link %>
<a href="$URL"<% if $OpenInNewWindow %> target="_blank"<% end_if %> class="stretched-link">
<span class="sr-only">$Up.Title</span>
</a>
<% end_with %>
<% end_if %>

View File

@ -1,3 +0,0 @@
<% if $Text %>
<div class="typography">$Text</div>
<% end_if %>

View File

@ -1,9 +0,0 @@
<% if $Element %>
<% with $Element %>
<div class="element element__{$SimpleClassName}<% if $StyleVariant %> $StyleVariant<% end_if %><% if $ExtraClass %> $ExtraClass<% end_if %>" id="$Anchor">
<div class="element-container<% if $ContainerClass %> $ContainerClass<% end_if %>">
$forTemplate
</div>
</div>
<% end_with %>
<% end_if %>

View File

@ -1,18 +0,0 @@
<% if $Submenu %>
<nav>
<ul class="nav flex-column">
<% with $Page.Level(1) %>
<li class="nav-item-level1 nav-item {$CSSClass} $ExtraClass">
<b class="nav-link">
$MenuTitle.XML
<% if $isCurrent || $isSection %><i class="sr-only">(current)</i><% end_if %>
</b>
</li>
<% end_with %>
<% loop $Submenu %>
<% include NavItem %>
<% end_loop %>
</ul>
</nav>
<% end_if %>

View File

@ -1,21 +0,0 @@
<% if $Pages %>
<div class="$DefaultContainer">
<nav class="breadcrumbs" aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a href="/" class="breadcrumb-link">Home</a>
</li>
<% loop $Pages %>
<li
class="breadcrumb-item<% if $Last %> current active<% end_if %>"
<% if $Last %> aria-current="page"<% end_if %>
>
<% if not Up.Unlinked %><a href="$Link" class="graphql-page breadcrumb-link breadcrumb-link__$Pos"><% end_if %>
$MenuTitle.XML
<% if not Up.Unlinked %></a><% end_if %>
</li>
<% end_loop %>
</ol>
</nav>
</div>
<% end_if %>

View File

@ -1,10 +1,11 @@
<div
id="$Anchor"
class="element $SimpleClassName.LowerCase
<% if $LinkedElement %> $LinkedElement.SimpleClassName.LowerCase<% end_if %>
<% if $StyleVariant %> $StyleVariant<% end_if %><% if $ExtraClass %> $ExtraClass<% end_if %>"
id="$Anchor"
class="element $SimpleClassName.LowerCase
<% if $LinkedElement %> $LinkedElement.SimpleClassName.LowerCase<% end_if %>
<% if $StyleVariant %> $StyleVariant<% end_if %>
<% if $ExtraClass %> $ExtraClass<% end_if %>"
>
<div class="element-container<% if $ContainerClass %> $ContainerClass<% end_if %>">
<div class="element__container<% if $ContainerClass %> $ContainerClass<% end_if %>">
$Element
</div>
</div>

View File

@ -1,9 +1,4 @@
<div
class="element__content<% if $BlockLink %> has-blockLink<% end_if %><% if $BlockIcon %> has-blockIcon<% end_if %><% if $Style %> $CssStyle<% end_if %>"
>
<% if $BlockIcon %>
<i class="element__icon $BlockIcon"></i>
<% end_if %>
<div class="element__content<% if $Style %> $CssStyle<% end_if %>">
<% if $ShowTitle %>
<h2 class="element__title">$Title</h2>
<% end_if %>
@ -11,10 +6,4 @@ class="element__content<% if $BlockLink %> has-blockLink<% end_if %><% if $Block
<div class="element__html typography">
$HTML
</div>
<% if $BlockLink %>
<a href="$BlockLink.LinkURL" class="element__link btn btn-default stretched-link">
$BlockLink.Title
</a>
<% end_if %>
</div>

View File

@ -19,6 +19,6 @@
<% if $ImageLink %>
<a href="$ImageLink.LinkURL" class="element__link graphql-page stretched-link">
<b class="sr-only">$ImageLink.Title</b>
<b class="visually-hidden">$ImageLink.Title</b>
</a>
<% end_if %>

View File

@ -1 +0,0 @@
<% include MainContent Layout=$Layout %>

View File

@ -1,53 +0,0 @@
<div id="SiteWideAlerts" class="offline-message">
<div
class="alert alert-danger alert-offline alert-dismissible fade show"
role="alert"
>
<div class="typography">
The Internet connection is missing right now, but you're able to
browse previously opened pages offline.
</div>
<button
type="button"
class="btn btn-danger btn-close"
data-bs-dismiss="alert"
aria-label="Close"
>
<i class="fas fa-times"></i>
</button>
</div>
<noscript>
<div class="main-bn alert alert-fixed-top alert-danger" role="alert">
Please, enable javascript.
</div>
</noscript>
<!--[if lt IE 11
]><div class="main-bn alert alert-danger" role="alert">
<a
href="https://www.google.com/chrome/browser/desktop/"
classs="alert-link"
>
You are using an outdated browser. For a faster, safer browsing
experience, upgrade for free today.
</a>
</div><!
[endif]-->
<% if $SiteWideMessage %>
<div class="single-message">
<div class="alert alert-fixed-top alert-{$Type}">
<div class="$DefaultContainer">
<b class="btn btn-danger btn-close" data-dismiss="alert" aria-label="Close">
<i class="fas fa-times"></i>
</b>
{$Message}
</div>
</div>
</div>
<% end_if %>
<% with $SiteConfig %>
<% include App\Objects\NotificationsList NotificationsToday=$NotificationsToday.filter('Area', 'Site') %>
<% end_with %>
</div>

View File

@ -1,45 +0,0 @@
<div class="page-content page-content-main">
<% if not $ExcludeHeader %>
<% include PageHeader %>
<% end_if %>
<% if $CurrentElement %>
<div class="current-element">
$CurrentElement
</div>
<% else %>
<div class="elemental-area">
<% if $ElementalArea.Elements.Count %>
$ElementalArea
<% else_if $Content %>
<div class="element element_content_field dnadesign__elemental__models__elementcontent">
<div class="element-container {$DefaultContainer}">
<% include DNADesign\Elemental\Models\ElementContent HTML=$Content %>
</div>
</div>
<% end_if %>
</div>
<% end_if %>
<% if $Form %>
<div class="page-form-element element">
<div class="element_container">
<div class="$DefaultContainer">
$Form
</div>
</div>
</div>
<% end_if %>
<% if $ExtraCode %>
<div class="page-extra-code">
<div class="element">
<div class="element_container">
<div class="$DefaultContainer">
$ExtraCode
</div>
</div>
</div>
</div>
<% end_if %>
</div>

View File

@ -1,22 +0,0 @@
<%-- Upgrade your Browser notice --%>
<!--[if lt IE 10]><div class="main-bn"><a href="https://www.google.com/chrome/browser/desktop/" title="<%t Page.UPGRADEBROWSER 'Upgrade your browser' %>"><%t Page.OUTDATEDBROWSER 'You are using an outdated browser. For a faster, safer browsing experience, upgrade for free today.' %></a></div><![endif]-->
<%-- No JS enabled notice --%>
<noscript><div class="main-bn"><%t Page.JAVASCRIPTREQUIRED 'Please, enable javascript.' %></div></noscript>
<% include LoadingSpinner %>
<%-- if $isDev || $WebpackActive %>
<div id="DevUtilities">
$DeferedCSS('app_dev.css')
$DeferedJS('app_dev.js')
<div class="navs">
<button class="toggle-original">Toggle Original</button>
</div>
<div class="original d-none"></div>
</div>
<% end_if --%>
<%-- Site Wide Alert Message --%>
<% include Alerts %>

View File

@ -1,15 +0,0 @@
<div class="hidden-print hidden-md">
$BetterNavigator
</div>
<%-- Require CSS+JS from /public/resourses/[js,css]/[ClassName].[js,css] --%>
$AutoRequirements($ClassName).RAW
<%-- Mapbox
<script src="https://api.tiles.mapbox.com/mapbox-gl-js/v0.48.0/mapbox-gl.js"></script>
<link href="https://api.tiles.mapbox.com/mapbox-gl-js/v0.48.0/mapbox-gl.css" rel="stylesheet" />--%>
<%-- place extra requirements after this line --%>
<div class="extra-code extra-code-site">
$SiteConfig.ExtraCode
</div>

View File

@ -1,221 +0,0 @@
<style>
@keyframes lds-ellipsis1 {
0% {
transform: scale(0);
}
100% {
transform: scale(1);
}
}
@keyframes lds-ellipsis3 {
0% {
transform: scale(1);
}
100% {
transform: scale(0);
}
}
@keyframes lds-ellipsis2 {
0% {
transform: translate(0, 0);
}
100% {
transform: translate(1.35rem, 0);
}
}
body,
html {
font-size: 14px;
margin: 0;
padding: 0;
background: #fff;
color: #212529;
overflow-x: hidden;
}
@media (min-width: 2000px) {
html, body {
font-size: .9vw;
}
}
#PageLoading {
position: fixed;
left: 0;
top: 0;
margin: 0;
width: 100% !important;
height: 100% !important;
display: -ms-flexbox;
display: flex;
-ms-flex-align: center;
align-items: center;
-ms-flex-pack: center;
justify-content: center;
z-index: 2000;
will-change: opacity;
background: #fff;
color: #212529;
}
#PageLoading .logo {
width:100px;
width: 12.5vw;
}
#PageLoading .tagline {
margin-top:1rem;
margin-bottom:1rem;
color: #fff;
font-size:1.8rem;
font-size: 4vh;
letter-spacing: .25em;
}
.main-bn {
position: fixed;
top: 0;
left: 0;
width: 100%;
z-index: 99999999;
padding: 0.5rem 1rem;
text-align: center;
color: #fff;
background: #ff0000;
}
img,
iframe {
max-width: 100%;
}
.loading-spinner {
text-align: center;
}
.lds-ellipsis {
margin-top:1.5rem;
display: inline-block;
position: relative;
width: 4.57rem;
height: 1rem;
color: #fff;
}
.lds-ellipsis div {
position: absolute;
top:0.15rem;
width: 0.78rem;
height: 0.78rem;
border-radius: 50%;
background: #888;
animation-timing-function: cubic-bezier(0, 1, 1, 0);
}
.lds-ellipsis div:nth-child(1) {
left: 0.42rem;
animation: lds-ellipsis1 0.6s infinite;
}
.lds-ellipsis div:nth-child(2) {
left: 0.9rem;
animation: lds-ellipsis2 0.6s infinite;
}
.lds-ellipsis div:nth-child(3) {
left: 1.85rem;
animation: lds-ellipsis2 0.6s infinite;
}
.lds-ellipsis div:nth-child(4) {
left: 3.21rem;
animation: lds-ellipsis3 0.6s infinite;
}
@keyframes lds-text {
from {
font-size: 1em;
}
to {
font-size: 1.5em;
}
}
.lds-text {
position: absolute;
top: 50%;
left: 50%;
margin-left: -5rem;
margin-top: 8rem;
font-size: 0.8rem;
letter-spacing: 0.25em;
color: #fff;
}
.lds-text b {
font-weight: 300;
animation: lds-text 5s ease infinite alternate;
}
.lds-text b:nth-child(1) {
animation-delay: 0.5s;
}
.lds-text b:nth-child(2) {
animation-delay: 1s;
}
.lds-text b:nth-child(3) {
animation-delay: 1.5s;
}
.lds-text b:nth-child(4) {
animation-delay: 2s;
}
.lds-text b:nth-child(5) {
animation-delay: 2.5s;
}
.lds-text b:nth-child(6) {
animation-delay: 3s;
}
.lds-text b:nth-child(7) {
animation-delay: 3.5s;
}
.lds-text b:nth-child(8) {
animation-delay: 4s;
}
.lds-text b:nth-child(9) {
animation-delay: 4.5s;
}
.lds-text b:nth-child(10) {
animation-delay: 5s;
}
@media (orientation: portrait) {
#PageLoading .logo {
width:50vw;
}
#PageLoading .tagline {
font-size: 4vw;
}
}
</style>
<% with $SiteConfig %>
<div id="PageLoading">
<div class="loading-spinner">
<img
class="logo"
src="{$ResourcesURL('logo.png')}"
width="200"
alt="{$Title}"
/><br />
<div class="lds-ellipsis">
<div></div>
<div></div>
<div></div>
<div></div>
</div>
<br />
<% if $Tagline %>
<div class="tagline">
$Tagline
</div>
<% else %>
<div class="lds-placeholder">LOADING...</div>
<div class="lds-text">
<b>L</b>
<b>O</b>
<b>A</b>
<b>D</b>
<b>I</b>
<b>N</b>
<b>G</b>
<b>.</b>
<b>.</b>
<b>.</b>
</div>
<% end_if %>
</div>
</div>
<% end_with %>

View File

@ -1,16 +0,0 @@
<% cached 'LocalesNavigationFooter', List(Page).max(LastEdited), $CurrentLocale, $ID %>
<% if $Locales %>
<div id="LocaleMenu">
<nav class="primary">
<ul class="list-inline">
<% loop $Locales %>
<li class="list-inline-item $LinkingMode<% if $LinkingMode = 'current' %> active<% end_if %>">
<a href="$Link.ATT" <% if $LinkingMode != 'invalid' %>rel="alternate"
hreflang="$HrefLang"<% end_if %>>$Title.XML</a>
</li>
<% end_loop %>
</ul>
</nav>
</div>
<% end_if %>
<% end_cached %>

View File

@ -1,41 +0,0 @@
<div class="mainContent-page-{$CSSClass}">
<% if $HeroImageRecursive %>
<div class="element element__hero-image">
<div class="element-container">
<% include SlideItem Image=$HeroImageRecursive, SlideWidth='2140', SlideHeight='450' %>
</div>
</div>
<% end_if %>
<% if $URLSegment != 'home' %>
<div id="PageBreadcumbs" class="element element__breadcrumbs">
$Breadcrumbs
</div>
<% end_if %>
<% if $SideBarContent || $SideBarView && $SideBarView.Widgets.Count %>
<div class="content-holder content-holder__sidebar">
<div class="{$DefaultContainer}">
<div class="row">
<div class="col-md-9 layout__col">
$Layout
</div>
<div class="col-md-3 sidebar__col">
<div class="{$DefaultContainer}">
<div class="page-content-sidebar page-content jsSidebarUI">
<div class="jsSidebarUI__inner">
$SideBarContent
$SideBarView
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<% else %>
<div class="content-holder">
$Layout
</div>
<% end_if %>
</div>

View File

@ -1,68 +0,0 @@
<% base_tag %>
$MetaTags
<meta name="msapplication-navbutton-color" content="#000000" />
<meta name="apple-mobile-web-app-status-bar-style" content="#000000" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="mobile-web-app-capable" content="yes" />
<%-- OpenGraph --%>
<meta property="og:url" content="{$AbsoluteBaseURL}" />
<meta property="og:site_name" content="{$SiteConfig.Title}" />
<meta property="og:locale" content="$ContentLocale.ATT" />
<% if $MetaTitle %>
<meta property="og:title" content="{$MetaTitle} - {$SiteConfig.Title}" />
<meta property="og:image:alt" content="{$MetaTitle}" />
<% else %>
<meta property="og:title" content="{$Title} - {$SiteConfig.Title}" />
<meta property="og:image:alt" content="{$Title}" />
<% end_if %>
<% if $MetaDescription %>
<meta property="og:description" content="{$MetaDescription}" />
<% end_if %>
<% if $MetaImage %>
<meta property="og:image" content="{$MetaImage.Link}" />
<% end_if %>
<% if $FacebookAppID %>
<meta property="fb:app_id" content="{$FacebookAppID}" />
<% end_if %>
<meta property="og:type" content="<% if $OgType %>$OgType<% else %>article<% end_if %>" />
<%-- /OpenGraph --%>
<link rel="canonical" href="{$AbsoluteLink}" />
<link rel="author" type="text/plain" href="{$AbsoluteBaseURL}humans.txt" />
<link rel="sitemap" type="application/xml" title="Sitemap" href="{$AbsoluteBaseURL}sitemap.xml" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link rel="preconnect" href="https://maps.google.com" />
<link rel="preconnect" href="https://ajax.googleapis.com" />
<link rel="preconnect" href="https://csi.gstatic.com" />
<link rel="preconnect" href="https://maps.googleapis.com" />
<link rel="preconnect" href="https://www.youtube.com" />
<link rel="preconnect" href="https://i.ytimg.com" />
<link rel="preconnect" href="https://i9.ytimg.com" />
<link rel="preconnect" href="https://s.ytimg.com" />
<link rel="shortcut icon" type="image/x-icon" href="{$AbsoluteBaseURL}resources/app/client/dist/icons/favicon.ico" />
<link rel="apple-touch-icon" href="{$AbsoluteBaseURL}resources/app/client/dist/icons/apple-touch-icon.png" />
<link rel="apple-touch-icon-precomposed" href="{$AbsoluteBaseURL}resources/app/client/dist/icons/apple-touch-icon-precomposed.png" />
<meta name="application-name" content="{$SiteConfig.Title}" />
<meta name="msapplication-TileImage" content="{$AbsoluteBaseURL}resources/app/client/dist/icons/mstile-144x144.png" />
<meta name="msapplication-TileColor" content="#2F98F1" />
<meta content="yes" name="apple-mobile-web-app-capable" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width,user-scalable=no,initial-scale=1,maximum-scale=1" />
<link rel="manifest" href="/manifest.json" />
<meta name="swversion" content="{$SWVersion}" />
<meta name="ping" content="/Security/ping" />
<meta name="api_url" content="{$AbsoluteBaseURL}graphql" />
<meta name="api_static_domain" content="{$AbsoluteBaseURL}" />

View File

@ -1,28 +0,0 @@
<% if $Children %>
<div class="nav-item dropdown dropdown-hover<% if $SubmenuColumns %> submenu-cols-dropdown<% end_if %> {$CSSClass} {$ExtraClass}">
<% include NavItem_link ExtraClass="dropdown-toggle-fl dropdown-toggle-notouch" %>
<button
id="NavItemButton{$ID}"
class="nav-link dropdown-toggle dropdown-toggle-sm dropdown-toggle-touch<% if $RedirectionType = 'External' || $ExternalURL || $OpenInNewWindow %> external<% end_if %><% if $DropdownNoLink %> d-block<% end_if %>"
role="button"
data-bs-toggle="dropdown"
aria-expanded="false"
type="button"
>
$MenuTitle.XML
</button>
<div class="dropdown-menu<% if $SubmenuColumns %> submenu-cols<% end_if %>" aria-labelledby="NavItemButton{$ID}">
<ul class="dropdown-list">
<% loop $Children %>
<% include NavItem ExtraClass="dropdown-item" %>
<% end_loop %>
</ul>
</div>
</div>
<% else %>
<div class="nav-item {$CSSClass} $ExtraClass">
<% include NavItem_link ExtraClass='' %>
</div>
<% end_if %>

View File

@ -1,12 +0,0 @@
<a
class="nav-link graphql-page $ExtraClass <% if $LinkClass %>{$LinkClass}<% else %>nav-link<% end_if %><% if $RedirectionType = 'External' || $ExternalURL || $OpenInNewWindow %> external<% end_if %><% if $isCurrent || $isSection %> active <% end_if %><% if $isSection %> section<% end_if %>"
href="{$Link}"
<% if $RedirectionType = 'External' || $OpenInNewWindow %> target="_blank"<% end_if %>
data-text="{$MenuTitle.XML}"
>
<% if $BlockIcon %>
<i class="fa-icon $BlockIcon"></i>
<% end_if %>
$MenuTitle.XML
<% if $isCurrent || $isSection %><i class="sr-only">(current)</i><% end_if %>
</a>

View File

@ -1,15 +0,0 @@
<div class="
element
page-header-element
<% if $ElementalArea.Elements.Count < 1 %>
d-block no-elements
<% else_if not $ElementalArea.Elements.First.ShowTitle && $ElementalArea.Elements.First.ClassName != App\Elements\SliderElement %>
d-block
<% end_if %>
">
<div class="element-container $DefaultContainer">
<h1 class="page-header">
$Title
</h1>
</div>
</div>

View File

@ -1 +0,0 @@
<div></div>

View File

@ -1,27 +0,0 @@
<% include SlideItem_media %>
<% if $Content || $Headline || $CustomTitle || $Description || $SlideLinkID %>
<div class="container">
<div class="carousel-caption">
<div class="carousel-caption-container typography">
<% if $Headline %>
<h2 class="carousel-title">
$Headline
</h2>
<% end_if %>
<% if $Content %>
<div class="carousel-content">$Content</div>
<% else_if $Description %>
<p class="carousel-content">$Description</p>
<% end_if %>
<% if $SlideLinkID %>
<% with $SlideLink %>
<% include NavItem_link MenuTitle=$Title, Link=$LinkURL, LinkClass="slide-link" %>
<% end_with %>
<% end_if %>
</div>
</div>
</div>
<% end_if %>

View File

@ -1,26 +0,0 @@
<% if $Video || $Image %>
<% if $Video %>
<div class="video">
$Video.EmbedHTML.RAW
</div>
<% else %>
<% if $Image || $ImageURL %>
<span class="img">
<img class="carousel__img"
src="{$EmptyImgSrc}"
data-lazy-src="<% if $ImageURL %>$ImageURL<% else %>$Image.FocusFill($SlideWidth,$SlideHeight).URL<% end_if %>"
alt="<% if $Headline %>$Headline.XML<% end_if %>"
/>
</span>
<% end_if %>
<% if $SlideLinkID %>
<% with $SlideLink %>
<% include NavItem_link MenuTitle=$Title, Link=$LinkURL, LinkClass="stretched-link slide-link slide-link__media" %>
<% end_with %>
<% else_if $SlideLinkURL %>
<% include NavItem_link MenuTitle=$Headline, Link=$SlideLinkURL, LinkClass="stretched-link slide-link slide-link__media" %>
<% end_if %>
<% end_if %>
<% end_if %>

View File

@ -1,33 +0,0 @@
<div class="vcard h-card">
<div class="img">
<img
class="photo u-photo"
src="<% if $Photo %>{$Photo.FocusFill(300,300).Link}<% else %>https://placehold.it/300x300<% end_if %>"
alt="{$Title}"
/>
<div class="caption">
<% include Objects\SocialLinks %>
</div>
</div>
<h5 class="fn p-name">
$FirstName
$LastName
</h5>
<% if $Company || $Position %>
<div class="company">
<% if $Company %>
<span class="org p-org">$Company</span><% if $Position %>,<% end_if %>
<% end_if %>
<% if $Position %>
<span class="category p-category">$Position</span>
<% end_if %>
</div>
<% end_if %>
<span class="n p-name d-none">
<span class="given-name p-given-name">$FirstName</span>
<span class="family-name p-family-name">$LastName</span>
</span>
</div>

View File

@ -1,28 +0,0 @@
<div
class="mapAPI-map-container"
data-map-zoom="$MapZoom"
data-key="$MapAPIKey"
data-map-style="<% if $MapStyle %>$MapStyle.XML<% else %>$SiteConfig.MapStyle.XML<% end_if %>"
<% if $GeoJSON %>data-geojson="$GeoJSON.XML"<% end_if %>
<% if $ID %>
data-id="$ID"
<% end_if %>
<% if $MapIcon %>
data-icon="$Icon.XML"
<% end_if %>
<% if $MapTitle %>
data-content="$MapTitle.XML"
<% end_if %>
<% if $Lat && $Lng %>
data-lat="$Lat"
data-lng="$Lng"
<% else_if $FullAddress %>
data-address="$FullAddress.XML"
<% else_if $Address %>
data-address="$Address.XML"
<% end_if %>
data-fly-to-marker="true"
data-fly-to-bounds="false"
>
<div class="mapAPI-map"></div>
</div>

View File

@ -1,31 +0,0 @@
<%-- NOTE: Before including this, you will need to wrap the include in a with block --%>
<% if $MoreThanOnePage %>
<nav aria-label="<%t Page.PaginationLabel "Pagination" %>">
<ul class="pagination justify-content-center">
<li class="page-item<% if $FirstPage %> disabled<% end_if %>">
<a class="page-link" href="{$PrevLink}" aria-label="<%t Page.PaginationPrevious "Previous" %>">
<span aria-hidden="true">&laquo;</span>
<span class="sr-only"><%t Page.PaginationPrevious "Previous" %></span>
</a>
</li>
<% loop $PaginationSummary(12) %>
<li class="page-item<% if $CurrentBool %> active<% end_if %>">
<% if $Link %>
<a href="$Link" class="page-link">$PageNum</a>
<% else %>
<span>...</span>
<% end_if %>
</li>
<% end_loop %>
<li class="page-item<% if $LastPage %> disabled<% end_if %>">
<a class="page-link" href="{$NextLink}" aria-label="<%t Page.PaginationNext "Next" %>">
<span aria-hidden="true">&raquo;</span>
<span class="sr-only"><%t Page.PaginationNext "Next" %></span>
</a>
</li>
</ul>
</nav>
<% end_if %>

View File

@ -1,10 +0,0 @@
<div class="sc-links sc-links-share">
<a target="_blank" href="https://www.facebook.com/sharer/sharer.php?u={$AbsoluteLink}" class="fb" onclick="window.open('https://www.facebook.com/sharer/sharer.php?u={$AbsoluteLink}','sharer','toolbar=0,status=0,width=530,height=520');return false;">
<i class="fa fas fa-facebook-f"></i>
<span class="sr-only">Share Facebook</span>
</a>
<a target="_blank" href="https://twitter.com/intent/tweet?url={$AbsoluteLink}" class="tw">
<i class="fa fas fa-twitter"></i>
<span class="sr-only">Share Twitter</span>
</a>
</div>

View File

@ -1,32 +0,0 @@
<div class="sc-links">
<% if $Facebook %>
<a href="$Facebook.LinkURL" title="Facebook" target="_blank">
<i class="fab fa-facebook-f"></i>
<i class="sr-only">Facebook</i>
</a>
<% end_if %>
<% if $LinkedIn %>
<a href="$LinkedIn.LinkURL" title="LinkedIn" target="_blank">
<i class="fab fa-linkedin-in"></i>
<i class="sr-only">LinkedIn</i>
</a>
<% end_if %>
<% if $Pinterest %>
<a href="$Pinterest.LinkURL" title="Pinterest" target="_blank">
<i class="fab fa-pinterest-p"></i>
<i class="sr-only">Pinterest</i>
</a>
<% end_if %>
<% if $Instagram %>
<a href="$Instagram.LinkURL" title="Instagram" target="_blank">
<i class="fab fa-instagram"></i>
<i class="sr-only">Instagram</i>
</a>
<% end_if %>
<% if $Twitter %>
<a href="$Twitter.LinkURL" title="Twitter" target="_blank">
<i class="fab fa-twitter"></i>
<i class="sr-only">Twitter</i>
</a>
<% end_if %>
</div>

View File

@ -1,16 +0,0 @@
<div class="testimonial">
<div class="testimonial__quote">
<blockquote class="blockquote text-center">
<i class="fas fa-quote-left"></i>
<% if $Content %><p>$Content</p><% end_if %>
<% if $Name || $Affiliation %>
<footer class="blockquote-footer">
<% if $Name %><div class="fn">$Name</div><% end_if %>
<% if $Affiliation || $Position %>
<div class="company">$Affiliation<% if $Position && $Affiliation %>, $Position<% else %>$Position<% end_if %></div>
<% end_if %>
</footer>
<% end_if %>
</blockquote>
</div>
</div>

View File

@ -1,29 +0,0 @@
<!DOCTYPE html>
<html lang="$ContentLocale.ATT" dir="$i18nScriptDirection.ATT">
<%-- manifest="/cache.appcache" --%>
<head>
<% include MetaHead %>
</head>
<body<% with $SiteConfig %> data-default-lng="$Longitude" data-default-lat="$Latitude"<% end_with %>>
<div class="wrapper">
<% include First %>
<div id="MetaLightboxApp"></div>
<header id="Header">
<% include Header %>
</header>
<main id="MainContent" class="page-content" data-ajax-region="LayoutAjax">
<% include MainContent Layout=$Layout %>
</main>
</div>
<footer id="Footer" class="site-footer footer">
<% include Footer %>
</footer>
<% include Last %>
</body>
</html>

View File

@ -2,5 +2,5 @@
<b class="field-password__show-password show-password">
<i class="fas fa-eye"></i>
<span class="sr-only">Show Password</span>
<span class="visually-hidden">Show Password</span>
</b>

View File

@ -1,4 +0,0 @@
<nav class="secondary element element__widget widget__$ClassName {$SimpleClassName}">
<% if $ShowTitle && $Title %><h2 class="widget-title">$Title</h2><% end_if %>
$Content
</nav>

View File

@ -7,8 +7,7 @@
"webpack"
],
"license": "BSD-3-Clause",
"require":
{
"require": {
"php": ">=7.1.0",
"ext-json": "*",
"silverstripe/recipe-cms": "^4",
@ -43,6 +42,8 @@
"a2nt/silverstripe-font-awesome-field": "dev-master",
"a2nt/silverstripe-mapboxfield": "dev-master",
"a2nt/silverstripe-progressivewebapp": "dev-master",
"a2nt/silverstripe-elemental-basics": "*",
"a2nt/cms-niceties": "*",
"bummzack/sortablefile": "*",
"eluceo/ical": "^0.16.0",
"ezyang/htmlpurifier": "^4.13",
@ -51,23 +52,22 @@
"jonom/focuspoint": "^3.1",
"silverstripe/graphql": "^3.4"
},
"require-dev":
{
"require-dev": {
"phpunit/phpunit": "^5.7",
"lekoala/silverstripe-debugbar": "dev-master",
"silverstripe/graphql-devtools": "1.x-dev"
},
"repositories": [
{
"type": "vcs",
"url": "https://github.com/a2nt/silverstripe-font-awesome"
},
{
"type": "vcs",
"url": "https://github.com/a2nt/silverstripe-mapboxfield"
}],
"extra":
{
{
"type": "vcs",
"url": "https://github.com/a2nt/silverstripe-font-awesome"
},
{
"type": "vcs",
"url": "https://github.com/a2nt/silverstripe-mapboxfield"
}
],
"extra": {
"expose": [
"app/client/dist"
],
@ -88,8 +88,7 @@
"web.config"
]
},
"config":
{
"config": {
"process-timeout": 600
},
"prefer-stable": true,

View File

@ -32,10 +32,10 @@
],
"dependencies": {
"@a2nt/meta-lightbox-react": "^3.1.3",
"@a2nt/ss-bootstrap-ui-webpack-boilerplate-react": "^3.2.1",
"@angular/common": "^11.2.12",
"@angular/core": "^11.2.12",
"@apollo/client": "^3.3.16",
"@a2nt/ss-bootstrap-ui-webpack-boilerplate-react": "^3.2.4",
"@angular/common": "^12.0.5",
"@angular/core": "^12.0.5",
"@apollo/client": "^3.3.20",
"@jsanahuja/instagramfeed": "github:jsanahuja/instagramfeed",
"@popperjs/core": "^2.9.2",
"aos": "^2.3.4",
@ -48,13 +48,13 @@
"font-awesome": "^4.7.0",
"graphql": "^15.5.0",
"hammerjs": "^2.0.8",
"inputmask": "^5.0.5",
"inputmask": "^5.0.6",
"keyboardjs": "^2.6.4",
"localforage": "^1.9.0",
"localforage-cordovasqlitedriver": "^1.8.0",
"lodash.debounce": "^4.0.8",
"lodash.throttle": "^4.1.1",
"mapbox-gl": "^2.2.0",
"mapbox-gl": "^2.3.0",
"material-design-color": "^2.3.2",
"minimatch": "^3.0.4",
"moment": "^2.29.1",
@ -62,70 +62,70 @@
"react-dom": "^17.0.2",
"react-easy-swipe": "^0.0.21",
"react-tiny-oembed": "^1.0.1",
"rxjs": "^7.0.0",
"rxjs": "^7.1.0",
"select2": "^4.0.13",
"setimmediate": "^1.0.5"
},
"devDependencies": {
"@a2nt/image-sprite-webpack-plugin": "^0.2.5",
"@babel/core": "^7.14.0",
"@babel/eslint-parser": "^7.13.14",
"@babel/plugin-proposal-class-properties": "^7.13.0",
"@babel/plugin-proposal-object-rest-spread": "^7.13.8",
"@babel/plugin-syntax-jsx": "^7.12.13",
"@babel/plugin-syntax-top-level-await": "^7.12.13",
"@babel/plugin-transform-react-jsx": "^7.13.12",
"@babel/plugin-transform-runtime": "^7.13.15",
"@babel/preset-env": "^7.14.0",
"@babel/preset-react": "^7.13.13",
"@babel/runtime": "^7.14.0",
"@babel/core": "^7.14.6",
"@babel/eslint-parser": "^7.14.5",
"@babel/plugin-proposal-class-properties": "^7.14.5",
"@babel/plugin-proposal-object-rest-spread": "^7.14.5",
"@babel/plugin-syntax-jsx": "^7.14.5",
"@babel/plugin-syntax-top-level-await": "^7.14.5",
"@babel/plugin-transform-react-jsx": "^7.14.5",
"@babel/plugin-transform-runtime": "^7.14.5",
"@babel/preset-env": "^7.14.5",
"@babel/preset-react": "^7.14.5",
"@babel/runtime": "^7.14.6",
"@googlemaps/markerclustererplus": "*",
"@sucrase/webpack-loader": "^2.0.0",
"@ungap/global-this": "^0.4.4",
"@wry/context": "^0.6.0",
"@wry/equality": "^0.4.0",
"@wry/equality": "^0.5.1",
"@wry/trie": "^0.3.0",
"animate.css": "^4.1.1",
"ansi-html": "^0.0.7",
"ansi-regex": "^6.0.0",
"autoprefixer": "^10.2.5",
"autoprefixer": "^10.2.6",
"babel-loader": "^8.2.2",
"classnames": "^2.3.1",
"copy-webpack-plugin": "^8.1.1",
"copy-webpack-plugin": "^9.0.0",
"croppie": "^2.6.5",
"cross-env": "^7.0.3",
"css-loader": "^5.2.4",
"css-minimizer-webpack-plugin": "^2.0.0",
"eslint": "^7.25.0",
"eslint-plugin-import": "^2.22.1",
"css-loader": "^5.2.6",
"css-minimizer-webpack-plugin": "^3.0.1",
"eslint": "^7.29.0",
"eslint-plugin-import": "^2.23.4",
"eslint-plugin-jquery": "^1.5.1",
"eslint-plugin-react": "^7.23.2",
"eslint-plugin-react": "^7.24.0",
"events": "^3.3.0",
"exif-js": "^2.3.0",
"exports-loader": "^2.0.0",
"exports-loader": "^3.0.0",
"fast-json-stable-stringify": "^2.1.0",
"fast-levenshtein": "^3.0.0",
"fastest-levenshtein": "^1.0.12",
"favicons": "^6.2.1",
"favicons": "^6.2.2",
"favicons-webpack-plugin": "^5.0.2",
"file-loader": "^6.2.0",
"graphql-tag": "^2.12.4",
"hoist-non-react-statics": "^3.3.2",
"html-dom-parser": "^1.0.0",
"html-dom-parser": "^1.0.1",
"html-entities": "^2.3.2",
"html-loader": "^2.1.2",
"html-react-parser": "^1.2.6",
"html-react-parser": "^1.2.7",
"html-webpack-plugin": "^5.3.1",
"img-optimize-loader": "^1.0.7",
"loglevel": "^1.7.1",
"mini-css-extract-plugin": "^1.6.0",
"msw": "^0.28.2",
"msw": "^0.29.0",
"node-fetch": "^2.6.1",
"node-sass": "^5.0.0",
"node-sass": "^6.0.0",
"object-assign": "^4.1.1",
"optimism": "^0.15.0",
"optimize-css-assets-webpack-plugin": "^5.0.4",
"postcss-loader": "^5.2.0",
"optimism": "^0.16.1",
"optimize-css-assets-webpack-plugin": "^6.0.0",
"postcss-loader": "^6.1.0",
"prop-types": "^15.7.2",
"punycode": "^2.1.1",
"querystring": "^0.2.1",
@ -139,25 +139,25 @@
"routie": "0.0.1",
"sass-lint": "^1.13.1",
"sass-lint-fix": "^1.12.1",
"sass-loader": "^11.0.1",
"sass-loader": "^12.1.0",
"scheduler": "^0.20.2",
"shallowequal": "^1.1.0",
"strip-ansi": "^7.0.0",
"style-loader": "^2.0.0",
"sucrase": "^3.18.1",
"sucrase": "^3.18.2",
"svg-url-loader": "^7.1.1",
"symbol-observable": "^4.0.0",
"terser-webpack-plugin": "^5.1.1",
"ts-invariant": "^0.7.3",
"tslib": "^2.2.0",
"terser-webpack-plugin": "^5.1.3",
"ts-invariant": "^0.7.5",
"tslib": "^2.3.0",
"url": "^0.11.0",
"url-loader": "^4.1.1",
"webpack": "^5.36.2",
"webpack-bundle-analyzer": "^4.4.1",
"webpack-cli": "^4.6.0",
"webpack-dev-server": "^4.0.0-beta.2",
"webpack": "^5.39.1",
"webpack-bundle-analyzer": "^4.4.2",
"webpack-cli": "^4.7.2",
"webpack-dev-server": "^4.0.0-beta.3",
"webpack-manifest-plugin": "^3.1.1",
"webpack-merge": "^5.7.3",
"webpack-merge": "^5.8.0",
"yarn": "^1.22.10",
"zen-observable": "^0.8.15"
},

View File

@ -3,7 +3,7 @@
*/
const YML_PATH = '/app/_config/webpack.yml';
const CONF_VAR = 'App\\Templates\\WebpackTemplateProvider';
const CONF_VAR = 'A2nt\\CMSNiceties\\Templates\\WebpackTemplateProvider';
const path = require('path');
const fs = require('fs');
@ -120,11 +120,6 @@ const _addAppFiles = (theme) => {
_addAppFiles(conf.APPDIR);
// remove some backend includes
delete includes['app_editor'];
delete includes['app_cms'];
delete includes['app_order'];
// add themes
themes.forEach((theme) => {
_addAppFiles(theme);
@ -152,7 +147,9 @@ module.exports = {
react: require.resolve('react'),
'react-dom': require.resolve('react-dom'),
},
fallback: { path: false },
fallback: {
path: false
},
},
experiments: {
topLevelAwait: true,