├── .editorconfig ├── .gitattributes ├── .gitignore ├── LICENSE ├── README.md ├── app ├── Console │ └── Kernel.php ├── Events │ └── ContactUsFeedback.php ├── Exceptions │ └── Handler.php ├── Helpers │ ├── auth.php │ ├── form_helpers.php │ ├── upload_helpers.php │ ├── url_helpers.php │ └── view_helpers.php ├── Http │ ├── Controllers │ │ ├── Admin │ │ │ ├── Accounts │ │ │ │ ├── AdministratorsController.php │ │ │ │ └── ClientsController.php │ │ │ ├── AdminController.php │ │ │ ├── AnalyticsController.php │ │ │ ├── Articles │ │ │ │ ├── ArticlesController.php │ │ │ │ └── CategoriesController.php │ │ │ ├── Banners │ │ │ │ ├── BannersController.php │ │ │ │ └── OrderController.php │ │ │ ├── Comments │ │ │ │ └── CommentsController.php │ │ │ ├── DashboardController.php │ │ │ ├── FAQ │ │ │ │ ├── CategoriesController.php │ │ │ │ ├── FAQsController.php │ │ │ │ └── OrderController.php │ │ │ ├── LatestActivities │ │ │ │ └── LatestActivitiesController.php │ │ │ ├── Locations │ │ │ │ ├── CitiesController.php │ │ │ │ ├── ContinentsController.php │ │ │ │ ├── CountriesController.php │ │ │ │ ├── ProvincesController.php │ │ │ │ └── SuburbsController.php │ │ │ ├── Pages │ │ │ │ ├── OrderController.php │ │ │ │ └── PagesController.php │ │ │ ├── ProfileController.php │ │ │ ├── Reports │ │ │ │ ├── ContactUsController.php │ │ │ │ └── SummaryController.php │ │ │ ├── Resources │ │ │ │ ├── CategoriesController.php │ │ │ │ ├── ContentController.php │ │ │ │ ├── CropResourceController.php │ │ │ │ ├── CropperController.php │ │ │ │ ├── DocumentsController.php │ │ │ │ ├── DocumentsOrderController.php │ │ │ │ ├── PhotosController.php │ │ │ │ ├── PhotosOrderController.php │ │ │ │ ├── ResourceController.php │ │ │ │ ├── SectionsController.php │ │ │ │ ├── VideosController.php │ │ │ │ └── VideosOrderController.php │ │ │ ├── Settings │ │ │ │ ├── LayoutsController.php │ │ │ │ ├── NavigationOrderController.php │ │ │ │ ├── NavigationsController.php │ │ │ │ ├── RolesController.php │ │ │ │ ├── SettingsController.php │ │ │ │ └── TemplatesController.php │ │ │ └── Shop │ │ │ │ ├── CategoriesController.php │ │ │ │ ├── CategoriesOrderController.php │ │ │ │ ├── CheckoutsController.php │ │ │ │ ├── FeaturesController.php │ │ │ │ ├── ProductsController.php │ │ │ │ ├── SearchesController.php │ │ │ │ ├── StatusesController.php │ │ │ │ └── TransactionsController.php │ │ ├── Api │ │ │ ├── AnalyticsController.php │ │ │ ├── ApiController.php │ │ │ ├── NotificationsController.php │ │ │ └── SharesController.php │ │ ├── Auth │ │ │ ├── AuthController.php │ │ │ ├── ConfirmPasswordController.php │ │ │ ├── ForgotPasswordController.php │ │ │ ├── LoginController.php │ │ │ ├── RegisterController.php │ │ │ ├── ResetPasswordController.php │ │ │ └── VerificationController.php │ │ ├── Controller.php │ │ ├── Traits │ │ │ ├── CRUDNotify.php │ │ │ ├── DataTableHelpers.php │ │ │ ├── GoogleAnalyticsHelper.php │ │ │ ├── GoogleCaptcha.php │ │ │ ├── PrintOrderHelper.php │ │ │ ├── ReportChartTable.php │ │ │ ├── SearchShopHelper.php │ │ │ └── UploadImageHelper.php │ │ └── Website │ │ │ ├── Account │ │ │ ├── AccountController.php │ │ │ ├── ProfileController.php │ │ │ └── ShippingAddressController.php │ │ │ ├── ArticlesController.php │ │ │ ├── CommentsController.php │ │ │ ├── ContactUsController.php │ │ │ ├── FAQ │ │ │ └── FAQController.php │ │ │ ├── HomeController.php │ │ │ ├── PagesController.php │ │ │ ├── Shop │ │ │ ├── BasketController.php │ │ │ ├── BasketHelper.php │ │ │ └── ShopController.php │ │ │ └── WebsiteController.php │ ├── Kernel.php │ ├── Middleware │ │ ├── Authenticate.php │ │ ├── AuthenticateAdmin.php │ │ ├── EncryptCookies.php │ │ ├── PreventRequestsDuringMaintenance.php │ │ ├── RedirectIfAuthenticated.php │ │ ├── TrimStrings.php │ │ ├── TrustHosts.php │ │ ├── TrustProxies.php │ │ ├── ValidateRole.php │ │ ├── ValidateSignature.php │ │ └── VerifyCsrfToken.php │ └── Requests │ │ ├── Auth │ │ └── LoginRequest.php │ │ └── ProfileUpdateRequest.php ├── Listeners │ ├── EmailContactUsToAdmin.php │ └── EmailContactUsToClient.php ├── Mail │ └── ClientContactUs.php ├── Models │ ├── AdminModel.php │ ├── Article.php │ ├── ArticleCategory.php │ ├── Banner.php │ ├── Checkout.php │ ├── City.php │ ├── Comment.php │ ├── Content.php │ ├── Continent.php │ ├── Country.php │ ├── Document.php │ ├── FAQ.php │ ├── FAQCategory.php │ ├── FeedbackContactUs.php │ ├── Layout.php │ ├── LogLogin.php │ ├── LogProductSearch.php │ ├── Navigation.php │ ├── Notification.php │ ├── Page.php │ ├── Photo.php │ ├── Product.php │ ├── ProductCategory.php │ ├── ProductFeature.php │ ├── ProductStatus.php │ ├── Province.php │ ├── ResourceCategory.php │ ├── Role.php │ ├── Section.php │ ├── Settings.php │ ├── ShippingAddress.php │ ├── Suburb.php │ ├── Template.php │ ├── Traits │ │ ├── ActiveTrait.php │ │ ├── Commentable.php │ │ ├── Contactable.php │ │ ├── Documentable.php │ │ ├── ImageThumb.php │ │ ├── ModifyBy.php │ │ ├── PageHelper.php │ │ ├── Photoable.php │ │ ├── RecursiveParent.php │ │ ├── Sectionable.php │ │ ├── UserAdmin.php │ │ ├── UserHelper.php │ │ ├── UserRoles.php │ │ └── Videoable.php │ ├── Transaction.php │ ├── User.php │ └── Video.php ├── Notifications │ ├── Admin │ │ ├── CommentSubmitted.php │ │ └── ProductsPurchased.php │ ├── Client │ │ └── ProductsPurchased.php │ ├── ContactUsSubmitted.php │ ├── UserConfirmedAccount.php │ └── UserRegistered.php └── Providers │ ├── AppServiceProvider.php │ ├── AuthServiceProvider.php │ ├── BroadcastServiceProvider.php │ ├── EventServiceProvider.php │ ├── HelperServiceProvider.php │ ├── RouteServiceProvider.php │ └── ViewServiceProvider.php ├── artisan ├── bootstrap ├── app.php └── cache │ └── .gitignore ├── composer.json ├── composer.lock ├── config ├── app.php ├── auth.php ├── broadcasting.php ├── cache.php ├── cors.php ├── database.php ├── filesystems.php ├── hashing.php ├── logging.php ├── mail.php ├── queue.php ├── sanctum.php ├── services.php ├── session.php └── view.php ├── database ├── .gitignore ├── factories │ ├── BannerFactory.php │ ├── FaqCategoryFactory.php │ ├── FaqFactory.php │ ├── LogActivityFactory.php │ ├── LogModelActivityFactory.php │ ├── NavigationFactory.php │ ├── PageFactory.php │ ├── PhotoFactory.php │ ├── ProductCategoryFactory.php │ ├── ProductFactory.php │ ├── ProductFeatureFactory.php │ ├── ProductStatusFactory.php │ ├── RoleFactory.php │ ├── SettingsFactory.php │ └── UserFactory.php ├── migrations │ ├── 2014_10_12_000000_create_users_table.php │ ├── 2014_10_12_100000_create_password_reset_tokens_table.php │ ├── 2014_10_12_100000_create_password_resets_table.php │ ├── 2019_08_19_000000_create_failed_jobs_table.php │ ├── 2019_12_03_124353_create_jobs_table.php │ ├── 2019_12_05_131024_alter_users_table.php │ ├── 2019_12_10_065955_create_notifications_table.php │ ├── 2019_12_14_000001_create_personal_access_tokens_table.php │ ├── 2019_12_15_141543_create_log_logins_table.php │ ├── 2019_12_20_151143_create_roles_table.php │ ├── 2019_12_20_151151_create_role_user_pivot_table.php │ ├── 2020_01_05_141724_create_log_activities_table.php │ ├── 2020_01_05_151724_create_log_model_activities_table.php │ ├── 2020_01_15_065006_create_navigations_table.php │ ├── 2020_01_15_083010_create_navigation_role_pivot_table.php │ ├── 2020_01_27_140120_create_settings_table.php │ ├── 2020_01_29_063155_create_banners_table.php │ ├── 2020_02_03_154748_create_pages_table.php │ ├── 2020_02_03_184930_create_banner_page_pivot_table.php │ ├── 2020_02_04_082639_create_photos_table.php │ ├── 2020_02_04_090115_create_videos_table.php │ ├── 2020_02_04_141424_create_documents_table.php │ ├── 2020_04_16_122143_create_resource_categories_table.php │ ├── 2020_04_25_204158_create_feedback_contact_us_table.php │ ├── 2020_04_25_204350_create_articles_table.php │ ├── 2020_04_25_204415_create_article_categories_table.php │ ├── 2020_04_25_204443_create_products_table.php │ ├── 2020_04_25_204458_create_product_categories_table.php │ ├── 2020_04_25_204738_create_product_features_table.php │ ├── 2020_04_25_204758_create_product_feature_pivot_table.php │ ├── 2020_04_25_204825_create_checkouts_table.php │ ├── 2020_04_25_205404_create_checkout_product_pivot_table.php │ ├── 2020_04_25_205512_create_transactions_table.php │ ├── 2020_04_25_205540_create_product_transaction_pivot_table.php │ ├── 2020_04_25_205620_create_log_product_searches_table.php │ ├── 2020_04_25_205659_create_shipping_addresses_table.php │ ├── 2020_04_25_205731_create_product_statuses_table.php │ ├── 2020_05_03_194805_create_faqs_table.php │ ├── 2020_05_03_194835_create_faq_categories_table.php │ ├── 2020_05_22_130055_create_continents_table.php │ ├── 2020_05_22_130125_create_countries_table.php │ ├── 2020_05_22_130145_create_provinces_table.php │ ├── 2020_05_22_130157_create_cities_table.php │ ├── 2020_05_22_130235_create_suburbs_table.php │ ├── 2020_12_09_073453_update_pages_table.php │ ├── 2020_12_09_074146_create_comments_table.php │ ├── 2020_12_14_093823_create_templates_table.php │ ├── 2020_12_16_091634_create_sections_table.php │ ├── 2020_12_16_092031_create_content_table.php │ ├── 2020_12_16_143624_create_content_section_table.php │ ├── 2021_03_18_115830_create_layouts_table.php │ └── 2021_03_18_115854_create_layout_template_table.php └── seeders │ ├── BannersTableSeeder.php │ ├── BasicSeeder.php │ ├── DatabaseSeeder.php │ ├── LayoutsTableSeeder.php │ ├── NavigationsTableSeeder.php │ ├── PagesTableSeeder.php │ ├── RolesTableSeeder.php │ ├── SectionsTableSeeder.php │ ├── SettingsTableSeeder.php │ ├── TemplatesTableSeeder.php │ ├── UsersTableSeeder.php │ └── csv │ ├── layout_template.csv │ ├── layouts.csv │ ├── navigation_role.csv │ ├── navigations.csv │ ├── pages.csv │ ├── roles.csv │ ├── sections.csv │ └── templates.csv ├── package-lock.json ├── package.json ├── phpunit.xml ├── public ├── .htaccess ├── css │ └── .gitignore ├── favicon.ico ├── fonts │ └── .gitignore ├── images │ ├── avatars │ │ ├── default.png │ │ ├── female.png │ │ ├── male.png │ │ └── ninja.png │ ├── logo-secondary.png │ ├── logo.png │ ├── logo_small.png │ ├── share.jpg │ └── vendor │ │ └── lightbox2 │ │ └── dist │ │ ├── close.png │ │ ├── loading.gif │ │ ├── next.png │ │ └── prev.png ├── index.php ├── js │ └── .gitignore ├── mix-manifest.json ├── robots.txt ├── sounds │ ├── danger.mp3 │ └── info.mp3 └── uploads │ ├── documents │ └── .gitignore │ └── images │ └── .gitignore ├── resources ├── assets │ ├── js │ │ ├── admin.js │ │ ├── bootstrap.js │ │ ├── titan │ │ │ ├── buttons.js │ │ │ ├── datatables.js │ │ │ ├── forms.js │ │ │ ├── google_maps.js │ │ │ ├── notifications.js │ │ │ ├── notify.js │ │ │ ├── pagination.js │ │ │ ├── social_media.js │ │ │ ├── titan.js │ │ │ └── utils.js │ │ ├── website.js │ │ └── website │ │ │ └── utils.js │ └── sass │ │ ├── admin.scss │ │ ├── titan │ │ ├── google_maps.scss │ │ └── notify.scss │ │ ├── website.scss │ │ └── website │ │ └── _overrides.scss └── views │ ├── admin │ ├── accounts │ │ ├── administrators │ │ │ └── index.blade.php │ │ └── clients │ │ │ ├── create_edit.blade.php │ │ │ └── index.blade.php │ ├── admin.blade.php │ ├── analytics │ │ ├── demographics.blade.php │ │ ├── devices.blade.php │ │ ├── engagement.blade.php │ │ ├── partials │ │ │ ├── age.blade.php │ │ │ ├── analytics_header.blade.php │ │ │ ├── browsers.blade.php │ │ │ ├── devices.blade.php │ │ │ ├── devices_category.blade.php │ │ │ ├── engagement_views.blade.php │ │ │ ├── event_count_name.blade.php │ │ │ ├── gender.blade.php │ │ │ ├── locations.blade.php │ │ │ ├── referrers.blade.php │ │ │ ├── resolution.blade.php │ │ │ ├── session_group.blade.php │ │ │ ├── visited_pages.blade.php │ │ │ └── visitors_views.blade.php │ │ ├── summary.blade.php │ │ └── visits_referrals.blade.php │ ├── articles │ │ ├── categories │ │ │ ├── create_edit.blade.php │ │ │ └── index.blade.php │ │ ├── create_edit.blade.php │ │ ├── index.blade.php │ │ └── show.blade.php │ ├── banners │ │ ├── create_edit.blade.php │ │ ├── index.blade.php │ │ ├── order.blade.php │ │ └── show.blade.php │ ├── comments │ │ ├── create_edit.blade.php │ │ ├── index.blade.php │ │ └── show.blade.php │ ├── dashboard.blade.php │ ├── faqs │ │ ├── categories │ │ │ ├── create_edit.blade.php │ │ │ └── index.blade.php │ │ ├── create_edit.blade.php │ │ ├── index.blade.php │ │ ├── order.blade.php │ │ └── show.blade.php │ ├── latest_activities │ │ ├── admin.blade.php │ │ └── website.blade.php │ ├── locations │ │ ├── cities │ │ │ ├── create_edit.blade.php │ │ │ ├── index.blade.php │ │ │ └── show.blade.php │ │ ├── continents │ │ │ ├── create_edit.blade.php │ │ │ ├── index.blade.php │ │ │ └── show.blade.php │ │ ├── countries │ │ │ ├── create_edit.blade.php │ │ │ ├── index.blade.php │ │ │ └── show.blade.php │ │ ├── provinces │ │ │ ├── create_edit.blade.php │ │ │ ├── index.blade.php │ │ │ └── show.blade.php │ │ └── suburbs │ │ │ ├── create_edit.blade.php │ │ │ ├── index.blade.php │ │ │ └── show.blade.php │ ├── pages │ │ ├── create_edit.blade.php │ │ ├── index.blade.php │ │ ├── order.blade.php │ │ └── show.blade.php │ ├── partials │ │ ├── boxes │ │ │ ├── datatable_toolbar.blade.php │ │ │ └── toolbar.blade.php │ │ ├── breadcrumb.blade.php │ │ ├── card │ │ │ ├── buttons.blade.php │ │ │ └── info.blade.php │ │ ├── datatables.blade.php │ │ ├── form │ │ │ └── form_footer.blade.php │ │ ├── header.blade.php │ │ ├── modals.blade.php │ │ ├── navigation.blade.php │ │ ├── navigation │ │ │ └── navigation_list.blade.php │ │ ├── pagecrumb.blade.php │ │ ├── pagination_footer.blade.php │ │ ├── sortable.blade.php │ │ └── summernote │ │ │ └── document.blade.php │ ├── profile.blade.php │ ├── reports │ │ ├── contactus.blade.php │ │ └── summary.blade.php │ ├── resources │ │ ├── categories │ │ │ ├── create_edit.blade.php │ │ │ └── index.blade.php │ │ ├── create_edit.blade.php │ │ ├── crop_resource.blade.php │ │ ├── cropper.blade.php │ │ ├── documents │ │ │ ├── attach.blade.php │ │ │ ├── create_edit.blade.php │ │ │ ├── documentable.blade.php │ │ │ ├── index.blade.php │ │ │ └── order.blade.php │ │ ├── photos │ │ │ ├── attach.blade.php │ │ │ ├── create_edit.blade.php │ │ │ ├── index.blade.php │ │ │ ├── order.blade.php │ │ │ └── photoable.blade.php │ │ ├── resourceable.blade.php │ │ ├── sections │ │ │ ├── collapse.blade.php │ │ │ ├── components.blade.php │ │ │ ├── components │ │ │ │ ├── components.blade.php │ │ │ │ ├── content.blade.php │ │ │ │ ├── form_content.blade.php │ │ │ │ ├── form_heading.blade.php │ │ │ │ └── index.blade.php │ │ │ ├── create_edit.blade.php │ │ │ ├── index.blade.php │ │ │ └── section_components.blade.php │ │ └── videos │ │ │ ├── attach.blade.php │ │ │ ├── create_edit.blade.php │ │ │ ├── index.blade.php │ │ │ ├── order.blade.php │ │ │ └── videoable.blade.php │ ├── settings │ │ ├── layouts │ │ │ ├── create_edit.blade.php │ │ │ ├── index.blade.php │ │ │ └── show.blade.php │ │ ├── navigations │ │ │ ├── create_edit.blade.php │ │ │ ├── index.blade.php │ │ │ ├── order.blade.php │ │ │ └── show.blade.php │ │ ├── roles │ │ │ ├── create_edit.blade.php │ │ │ ├── index.blade.php │ │ │ └── show.blade.php │ │ ├── settings │ │ │ ├── create_edit.blade.php │ │ │ └── index.blade.php │ │ └── templates │ │ │ ├── create_edit.blade.php │ │ │ ├── index.blade.php │ │ │ └── show.blade.php │ └── shop │ │ ├── categories │ │ ├── create_edit.blade.php │ │ ├── index.blade.php │ │ └── order.blade.php │ │ ├── checkouts │ │ ├── index.blade.php │ │ └── show.blade.php │ │ ├── features │ │ ├── create_edit.blade.php │ │ └── index.blade.php │ │ ├── product_list.blade.php │ │ ├── products │ │ ├── create_edit.blade.php │ │ ├── index.blade.php │ │ └── show.blade.php │ │ ├── searches │ │ ├── index.blade.php │ │ └── show.blade.php │ │ ├── statuses │ │ ├── create_edit.blade.php │ │ └── index.blade.php │ │ └── transactions │ │ ├── index.blade.php │ │ └── show.blade.php │ ├── auth │ ├── auth.blade.php │ ├── login.blade.php │ ├── passwords │ │ ├── email.blade.php │ │ └── reset.blade.php │ ├── register.blade.php │ └── verify.blade.php │ ├── dashboard.blade.php │ ├── emails │ └── contactus_client.blade.php │ ├── errors │ └── 503.blade.php │ ├── partials │ ├── analytics.blade.php │ └── facebook.blade.php │ ├── pdf │ ├── order.blade.php │ └── pdf.blade.php │ ├── vendor │ ├── mail │ │ ├── html │ │ │ ├── button.blade.php │ │ │ ├── footer.blade.php │ │ │ ├── header.blade.php │ │ │ ├── layout.blade.php │ │ │ ├── message.blade.php │ │ │ ├── panel.blade.php │ │ │ ├── subcopy.blade.php │ │ │ ├── table.blade.php │ │ │ └── themes │ │ │ │ └── default.css │ │ └── text │ │ │ ├── button.blade.php │ │ │ ├── footer.blade.php │ │ │ ├── header.blade.php │ │ │ ├── layout.blade.php │ │ │ ├── message.blade.php │ │ │ ├── panel.blade.php │ │ │ ├── subcopy.blade.php │ │ │ └── table.blade.php │ └── notifications │ │ └── email.blade.php │ ├── website │ ├── account │ │ ├── account.blade.php │ │ ├── profile.blade.php │ │ ├── shipping_address.blade.php │ │ ├── transaction_show.blade.php │ │ └── transactions.blade.php │ ├── articles │ │ ├── index.blade.php │ │ ├── pagination.blade.php │ │ └── show.blade.php │ ├── contact.blade.php │ ├── faq │ │ ├── faq.blade.php │ │ └── index.blade.php │ ├── home.blade.php │ ├── pages │ │ ├── page.blade.php │ │ ├── page_components.blade.php │ │ ├── page_content.blade.php │ │ ├── page_documents.blade.php │ │ ├── page_gallery.blade.php │ │ ├── page_heading.blade.php │ │ └── page_videos.blade.php │ ├── partials │ │ ├── banners.blade.php │ │ ├── breadcrumb.blade.php │ │ ├── comments.blade.php │ │ ├── footer.blade.php │ │ ├── form │ │ │ ├── captcha.blade.php │ │ │ ├── contact_form.blade.php │ │ │ └── feedback.blade.php │ │ ├── header.blade.php │ │ ├── navigation │ │ │ ├── sub_level.blade.php │ │ │ └── top_level.blade.php │ │ ├── page_header.blade.php │ │ ├── page_side.blade.php │ │ ├── paginator_footer.blade.php │ │ ├── side_articles.blade.php │ │ └── social_share.blade.php │ ├── shop │ │ ├── basket │ │ │ ├── address.blade.php │ │ │ ├── checkout.blade.php │ │ │ ├── feedback.blade.php │ │ │ └── index.blade.php │ │ ├── index.blade.php │ │ ├── list_item.blade.php │ │ ├── pagination.blade.php │ │ └── show.blade.php │ └── website.blade.php │ └── welcome.blade.php ├── routes ├── admin.php ├── api.php ├── channels.php ├── console.php └── web.php ├── storage ├── app │ ├── .gitignore │ └── public │ │ └── .gitignore ├── framework │ ├── .gitignore │ ├── cache │ │ ├── .gitignore │ │ └── data │ │ │ └── .gitignore │ ├── sessions │ │ └── .gitignore │ ├── testing │ │ └── .gitignore │ └── views │ │ └── .gitignore └── logs │ └── .gitignore ├── tests ├── CreatesApplication.php ├── Feature │ ├── Auth │ │ ├── AuthenticationTest.php │ │ ├── EmailVerificationTest.php │ │ ├── PasswordConfirmationTest.php │ │ ├── PasswordResetTest.php │ │ ├── PasswordUpdateTest.php │ │ └── RegistrationTest.php │ ├── Controllers │ │ ├── Admin │ │ │ ├── Accounts │ │ │ │ ├── AdministratorsTest.php │ │ │ │ └── ClientsTest.php │ │ │ ├── Banners │ │ │ │ └── BannersControllersTest.php │ │ │ ├── FAQ │ │ │ │ ├── CategoriesControllerTest.php │ │ │ │ └── FAQControllerTest.php │ │ │ ├── LatestActivity │ │ │ │ ├── AdminActivitiesTest.php │ │ │ │ └── WebsiteActivitiesTest.php │ │ │ ├── Products │ │ │ │ ├── CategoriesControllerTest.php │ │ │ │ ├── FeaturesControllerTest.php │ │ │ │ ├── ProductsControllerTest.php │ │ │ │ └── StatusesControllerTest.php │ │ │ └── Settings │ │ │ │ ├── NavigationOrderTest.php │ │ │ │ ├── NavigationTest.php │ │ │ │ ├── RolesTest.php │ │ │ │ └── SettingsTest.php │ │ ├── Auth │ │ │ ├── EmailVerificationTest.php │ │ │ ├── ForgotPasswordTest.php │ │ │ ├── LoginTest.php │ │ │ ├── RegisterTest.php │ │ │ └── ResetPasswordTest.php │ │ └── VisitWebsitePagesTest.php │ ├── ExampleTest.php │ └── ProfileTest.php ├── TestCase.php └── Unit │ ├── ExampleTest.php │ ├── Models │ ├── BannerTest.php │ ├── NavigationTest.php │ └── RoleTest.php │ └── Traits │ ├── ActiveTraitTest.php │ └── ImageThumbTest.php ├── vite.config.js └── webpack.mix.js /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_size = 4 7 | indent_style = space 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | 14 | [*.{yml,yaml}] 15 | indent_size = 2 16 | 17 | [docker-compose.yml] 18 | indent_size = 4 19 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf 2 | 3 | *.blade.php diff=html 4 | *.css diff=css 5 | *.html diff=html 6 | *.md diff=markdown 7 | *.php diff=php 8 | 9 | /.github export-ignore 10 | CHANGELOG.md export-ignore 11 | .styleci.yml export-ignore 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.phpunit.cache 2 | /node_modules 3 | /public/build 4 | /public/hot 5 | /public/storage 6 | /storage/*.key 7 | /vendor 8 | .env 9 | .env.backup 10 | .env.production 11 | .phpunit.result.cache 12 | Homestead.json 13 | Homestead.yaml 14 | auth.json 15 | npm-debug.log 16 | yarn-error.log 17 | /.fleet 18 | /.idea 19 | /.vscode 20 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Ben-Piet O'Callaghan 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /app/Console/Kernel.php: -------------------------------------------------------------------------------- 1 | command('inspire')->hourly(); 16 | } 17 | 18 | /** 19 | * Register the commands for the application. 20 | */ 21 | protected function commands(): void 22 | { 23 | $this->load(__DIR__.'/Commands'); 24 | 25 | require base_path('routes/console.php'); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/Events/ContactUsFeedback.php: -------------------------------------------------------------------------------- 1 | type = $row->contactable_name; 26 | $this->eloquent = $row; 27 | 28 | log_activity($row->contactable_name, "{$row->fullname} submitted a feedback form.", $row); 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /app/Exceptions/Handler.php: -------------------------------------------------------------------------------- 1 | 14 | */ 15 | protected $dontFlash = [ 16 | 'current_password', 17 | 'password', 18 | 'password_confirmation', 19 | ]; 20 | 21 | /** 22 | * Register the exception handling callbacks for the application. 23 | */ 24 | public function register(): void 25 | { 26 | $this->reportable(function (Throwable $e) { 27 | // 28 | }); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/Http/Controllers/Admin/Accounts/AdministratorsController.php: -------------------------------------------------------------------------------- 1 | whereRole(Role::$ADMIN)->get(); 21 | 22 | return $this->view('accounts.administrators.index', compact('items')); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/Http/Controllers/Admin/AnalyticsController.php: -------------------------------------------------------------------------------- 1 | view('analytics.summary'); 12 | } 13 | 14 | public function devices() 15 | { 16 | return $this->view('analytics.devices'); 17 | } 18 | 19 | public function visitsReferrals() 20 | { 21 | return $this->view('analytics.visits_referrals'); 22 | } 23 | 24 | public function engagement() 25 | { 26 | return $this->view('analytics.engagement'); 27 | } 28 | 29 | public function demographics() 30 | { 31 | return $this->view('analytics.demographics'); 32 | } 33 | } -------------------------------------------------------------------------------- /app/Http/Controllers/Admin/Banners/OrderController.php: -------------------------------------------------------------------------------- 1 | orderBy('list_order')->get(); 20 | 21 | return $this->view('banners.order')->with('items', $items); 22 | } 23 | 24 | /** 25 | * Update the order 26 | * @param Request $request 27 | * @return array 28 | */ 29 | public function update(Request $request) 30 | { 31 | $items = json_decode($request->get('list'), true); 32 | 33 | foreach ($items as $key => $item) { 34 | Banner::find($item['id'])->update(['list_order' => ($key + 1)]); 35 | } 36 | 37 | return ['result' => 'success']; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/Http/Controllers/Admin/DashboardController.php: -------------------------------------------------------------------------------- 1 | view('dashboard'); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/Http/Controllers/Admin/FAQ/OrderController.php: -------------------------------------------------------------------------------- 1 | orderBy('name')->get(); 20 | 21 | //$items = FAQ::with('category')->orderBy('list_order')->get(); 22 | 23 | return $this->view('faqs.order')->with('items', $items); 24 | } 25 | 26 | /** 27 | * Update the order 28 | */ 29 | public function update() 30 | { 31 | $items = json_decode(request()->get('list'), true); 32 | 33 | foreach ($items as $key => $item) { 34 | if(isset($item['id'])) { 35 | FAQ::findOrFail($item['id'])->update(['list_order' => ($key + 1)]); 36 | } 37 | } 38 | 39 | return ['result' => 'success']; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/Http/Controllers/Admin/LatestActivities/LatestActivitiesController.php: -------------------------------------------------------------------------------- 1 | view('latest_activities.website')->with('items', $items); 17 | } 18 | 19 | public function admin() 20 | { 21 | $items = LogModelActivity::getLatest(); 22 | 23 | return $this->view('latest_activities.admin')->with('items', $items); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/Http/Controllers/Admin/Reports/SummaryController.php: -------------------------------------------------------------------------------- 1 | getData(); 16 | 17 | return $this->view('reports.summary', compact('items')); 18 | } 19 | 20 | private function getData() 21 | { 22 | 23 | $result = []; 24 | 25 | $result[] = ['', '']; 26 | $result[] = ['Feedback Forms', '']; 27 | $result[] = ['Contact Us', FeedbackContactUs::count()]; 28 | 29 | 30 | $result[] = ['', '']; 31 | $total = FeedbackContactUs::count(); 32 | $result[] = ['Total', $total]; 33 | 34 | return $result; 35 | } 36 | } -------------------------------------------------------------------------------- /app/Http/Controllers/Admin/Shop/CheckoutsController.php: -------------------------------------------------------------------------------- 1 | with('transaction') 20 | ->with('products')->orderBy('created_at')->get()->take(200); 21 | 22 | return $this->view('shop.checkouts.index', compact('items')); 23 | } 24 | 25 | /** 26 | * Show Checkout 27 | * @param Checkout $checkout 28 | * @return mixed 29 | */ 30 | public function show(Checkout $checkout) 31 | { 32 | return $this->view('shop.checkouts.show')->with('item', $checkout); 33 | } 34 | } -------------------------------------------------------------------------------- /app/Http/Controllers/Api/AnalyticsController.php: -------------------------------------------------------------------------------- 1 | $item) { 40 | $items[$k] = []; 41 | $items[$k][0] = $item['country']; 42 | $items[$k][1] = intval($item['sessions']); 43 | } 44 | } 45 | 46 | return json_response($items); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /app/Http/Controllers/Api/ApiController.php: -------------------------------------------------------------------------------- 1 | increment('social_shares'); 19 | } 20 | } 21 | 22 | log_activity('Social Share', 'URL was shared: ' . input('url')); 23 | 24 | return json_response(); 25 | } 26 | } -------------------------------------------------------------------------------- /app/Http/Controllers/Auth/AuthController.php: -------------------------------------------------------------------------------- 1 | $request->get('email'), 22 | 'status' => $status, 23 | 'role' => 'website', 24 | 'client_ip' => $request->getClientIp(), 25 | 'client_agent' => $request->userAgent(), 26 | ]); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/Http/Controllers/Auth/ConfirmPasswordController.php: -------------------------------------------------------------------------------- 1 | middleware('auth'); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/Http/Controllers/Auth/ForgotPasswordController.php: -------------------------------------------------------------------------------- 1 | middleware('auth'); 39 | $this->middleware('signed')->only('verify'); 40 | $this->middleware('throttle:6,1')->only('verify', 'resend'); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/Http/Controllers/Traits/GoogleCaptcha.php: -------------------------------------------------------------------------------- 1 | verify(input('g-recaptcha-response'), $request->getClientIp()); 24 | 25 | return $response; 26 | } 27 | 28 | /** 29 | * Get the captcha json responses 30 | * @param $response 31 | * @return JsonResponse 32 | */ 33 | private function captchaResponse($response) 34 | { 35 | $errors = ['g-recaptcha-response' => ['Oops, something went wrong']]; 36 | foreach ($response->getErrorCodes() as $k => $code) { 37 | if ($code == 'missing-input-response') { 38 | $code = 'Please confirm you are not a robot.'; 39 | } 40 | $errors['g-recaptcha-response'][$k] = $code; 41 | } 42 | 43 | return new JsonResponse($errors, 422); 44 | } 45 | } -------------------------------------------------------------------------------- /app/Http/Controllers/Traits/PrintOrderHelper.php: -------------------------------------------------------------------------------- 1 | with('item', $transaction); 13 | 14 | // debug - show pdf 15 | if ($format == 'web') { 16 | return $view; 17 | } 18 | 19 | // show pdf 20 | $name = "Order - {$transaction->order_number}.pdf"; 21 | 22 | return \PDF::loadHTML($view)->stream($name); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/Http/Controllers/Website/CommentsController.php: -------------------------------------------------------------------------------- 1 | validate(Comment::$rules); 19 | 20 | $commentable = input('commentable_type')::find(input('commentable_id')); 21 | 22 | if (!$commentable) { 23 | return json_response_error('Whoops', 'We could not find the commentable.'); 24 | } 25 | 26 | // validate google captcha 27 | $response = $this->validateCaptcha($request); 28 | if ($response->isSuccess()) { 29 | 30 | $row = $this->createEntry(Comment::class, $attributes); 31 | notify_admins(CommentSubmitted::class, $row); 32 | 33 | return json_response('Thank you for your comment, an administrator will review your comment in due time.'); 34 | } 35 | 36 | return $this->captchaResponse($response); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/Http/Controllers/Website/FAQ/FAQController.php: -------------------------------------------------------------------------------- 1 | orderBy('name')->get(); 20 | 21 | return $this->view('faq.index', compact('items', 'categories')); 22 | } 23 | 24 | /** 25 | * Increments the total views 26 | * @param FAQ $faq 27 | * @param string $type 28 | * @return \Illuminate\Http\JsonResponse 29 | */ 30 | public function incrementClick(FAQ $faq, $type = 'total_read'): \Illuminate\Http\JsonResponse 31 | { 32 | if ($type === 'total_read' || $type === 'helpful_yes' || $type === 'helpful_no') { 33 | $faq->increment($type); 34 | } 35 | 36 | return json_response(''); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/Http/Controllers/Website/HomeController.php: -------------------------------------------------------------------------------- 1 | showPageBanner = true; 17 | 18 | $articles = Article::whereHas('photos')->with('photos')->isActiveDates()->orderBy('active_from', 'DESC')->get(); 19 | 20 | return $this->view('home') 21 | ->with('articles', $articles); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/Http/Middleware/Authenticate.php: -------------------------------------------------------------------------------- 1 | expectsJson() ? null : route('login'); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/Http/Middleware/AuthenticateAdmin.php: -------------------------------------------------------------------------------- 1 | isAdmin()) { 22 | \Auth::logout(); 23 | 24 | return redirect()->route('login'); 25 | } 26 | 27 | return $next($request); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/Http/Middleware/EncryptCookies.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | // 16 | ]; 17 | } 18 | -------------------------------------------------------------------------------- /app/Http/Middleware/PreventRequestsDuringMaintenance.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | // 16 | ]; 17 | } 18 | -------------------------------------------------------------------------------- /app/Http/Middleware/RedirectIfAuthenticated.php: -------------------------------------------------------------------------------- 1 | check()) { 24 | return redirect(RouteServiceProvider::HOME); 25 | } 26 | } 27 | 28 | return $next($request); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/Http/Middleware/TrimStrings.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | 'current_password', 16 | 'password', 17 | 'password_confirmation', 18 | ]; 19 | } 20 | -------------------------------------------------------------------------------- /app/Http/Middleware/TrustHosts.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | public function hosts(): array 15 | { 16 | return [ 17 | $this->allSubdomainsOfApplicationUrl(), 18 | ]; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/Http/Middleware/TrustProxies.php: -------------------------------------------------------------------------------- 1 | |string|null 14 | */ 15 | protected $proxies; 16 | 17 | /** 18 | * The headers that should be used to detect proxies. 19 | * 20 | * @var int 21 | */ 22 | protected $headers = 23 | Request::HEADER_X_FORWARDED_FOR | 24 | Request::HEADER_X_FORWARDED_HOST | 25 | Request::HEADER_X_FORWARDED_PORT | 26 | Request::HEADER_X_FORWARDED_PROTO | 27 | Request::HEADER_X_FORWARDED_AWS_ELB; 28 | } 29 | -------------------------------------------------------------------------------- /app/Http/Middleware/ValidateRole.php: -------------------------------------------------------------------------------- 1 | getRolesList(); 27 | $navValid = $selectedNavigation->roles()->whereIn('roles.id', $userRoles)->first(); 28 | 29 | if (!$navValid) { 30 | return redirect(user()->roles()->first()->slug); 31 | } 32 | 33 | return $next($request); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/Http/Middleware/ValidateSignature.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | // 'fbclid', 16 | // 'utm_campaign', 17 | // 'utm_content', 18 | // 'utm_medium', 19 | // 'utm_source', 20 | // 'utm_term', 21 | ]; 22 | } 23 | -------------------------------------------------------------------------------- /app/Http/Middleware/VerifyCsrfToken.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | // 16 | ]; 17 | } 18 | -------------------------------------------------------------------------------- /app/Http/Requests/ProfileUpdateRequest.php: -------------------------------------------------------------------------------- 1 | 15 | */ 16 | public function rules(): array 17 | { 18 | return [ 19 | 'name' => ['string', 'max:255'], 20 | 'email' => ['email', 'max:255', Rule::unique(User::class)->ignore($this->user()->id)], 21 | ]; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/Listeners/EmailContactUsToAdmin.php: -------------------------------------------------------------------------------- 1 | eloquent; 23 | 24 | notify_admins(ContactUsSubmitted::class, $data); 25 | 26 | log_activity($data->contactable->name, $data->fullname . ' submitted feedback form.', $data); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/Listeners/EmailContactUsToClient.php: -------------------------------------------------------------------------------- 1 | eloquent; 22 | 23 | \Mail::send(new ClientContactUs($data)); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/Mail/ClientContactUs.php: -------------------------------------------------------------------------------- 1 | contactUs = $contactUs; 28 | } 29 | 30 | /** 31 | * Build the message. 32 | * 33 | * @return $this 34 | */ 35 | public function build() 36 | { 37 | return $this->subject($this->contactUs->contactable_name.' - ' . config('app.name')) 38 | ->to($this->contactUs->email, $this->contactUs->fullname) 39 | ->markdown('emails.contactus_client'); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/Models/AdminModel.php: -------------------------------------------------------------------------------- 1 | 'required|min:3|max:191', 25 | ]; 26 | 27 | /** 28 | * Get all the rows as an array (ready for dropdowns) 29 | * 30 | * @return array 31 | */ 32 | public static function getAllList() 33 | { 34 | return self::orderBy('name')->get()->pluck('name', 'id')->toArray(); 35 | } 36 | 37 | /** 38 | * Get the articles 39 | */ 40 | public function articles() 41 | { 42 | return $this->hasMany(Article::class, 'category_id', 'id'); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /app/Models/Checkout.php: -------------------------------------------------------------------------------- 1 | belongsToMany(Product::class)->withPivot('quantity'); 26 | } 27 | 28 | /** 29 | * Get the user 30 | */ 31 | public function user() 32 | { 33 | return $this->belongsTo(User::class); 34 | } 35 | 36 | /** 37 | * Get the transaction 38 | */ 39 | public function transaction() 40 | { 41 | return $this->belongsTo(Transaction::class); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/Models/City.php: -------------------------------------------------------------------------------- 1 | 'required|min:3|max:191', 25 | 'province_id' => 'required|exists:provinces,id', 26 | 'zoom_level' => 'nullable', 27 | 'latitude' => 'nullable', 28 | 'longitude' => 'nullable', 29 | ]; 30 | 31 | /** 32 | * Get the province 33 | */ 34 | public function province() 35 | { 36 | return $this->belongsTo(Province::class); 37 | } 38 | 39 | /** 40 | * Get all the rows as an array (ready for dropdowns) 41 | * 42 | * @return array 43 | */ 44 | public static function getAllLists() 45 | { 46 | return self::orderBy('name')->get()->pluck('name', 'id')->toArray(); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /app/Models/Continent.php: -------------------------------------------------------------------------------- 1 | 'required|min:3|max:191', 25 | 'zoom_level' => 'nullable', 26 | 'latitude' => 'nullable', 27 | 'longitude' => 'nullable', 28 | ]; 29 | 30 | /** 31 | * Get the provinces 32 | */ 33 | public function countries() 34 | { 35 | return $this->hasMany(Country::class); 36 | } 37 | 38 | /** 39 | * Get all the rows as an array (ready for dropdowns) 40 | * 41 | * @return array 42 | */ 43 | public static function getAllList() 44 | { 45 | return self::orderBy('name')->get()->pluck('name', 'id')->toArray(); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/Models/Country.php: -------------------------------------------------------------------------------- 1 | 'required|min:3|max:191', 25 | 'zoom_level' => 'nullable', 26 | 'latitude' => 'nullable', 27 | 'longitude' => 'nullable', 28 | 'continent_id' => 'required|exists:continents,id', 29 | ]; 30 | 31 | /** 32 | * Get the continent 33 | */ 34 | public function continent() 35 | { 36 | return $this->belongsTo(Continent::class); 37 | } 38 | 39 | /** 40 | * Get all the rows as an array (ready for dropdowns) 41 | * 42 | * @return array 43 | */ 44 | public static function getAllList() 45 | { 46 | return self::orderBy('name')->get()->pluck('name', 'id')->toArray(); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /app/Models/Document.php: -------------------------------------------------------------------------------- 1 | 'required|file|max:5000|mimes:pdf' 28 | ]; 29 | 30 | public function getUrlAttribute() 31 | { 32 | //return "/uploads/documents/{$this->filename}"; 33 | // for summernote - 'full' url 34 | return url("/uploads/documents/{$this->filename}"); 35 | } 36 | 37 | public function documentable() 38 | { 39 | return $this->morphTo(); 40 | } 41 | 42 | /** 43 | * Get all the rows as an array (ready for dropdowns) 44 | * 45 | * @return array 46 | */ 47 | public static function getAllList() 48 | { 49 | return self::with('documentable')->orderBy('name')->get()->pluck('name', 'id')->toArray(); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /app/Models/FAQ.php: -------------------------------------------------------------------------------- 1 | 'required|min:3|max:191', 28 | 'answer' => 'required|min:5|max:1500', 29 | 'category_id' => 'required|exists:faq_categories,id', 30 | ]; 31 | 32 | protected function getSlugOptions(): SlugOptions 33 | { 34 | return SlugOptions::create()->generateSlugFrom('question'); 35 | } 36 | 37 | /** 38 | * Get the summary text 39 | * 40 | * @return mixed 41 | */ 42 | public function getAnswerSummaryAttribute() 43 | { 44 | return substr(strip_tags($this->attributes['answer']), 0, 80) . '...'; 45 | } 46 | 47 | /** 48 | * Get the category 49 | */ 50 | public function category(): \Illuminate\Database\Eloquent\Relations\BelongsTo 51 | { 52 | return $this->belongsTo(FAQCategory::class, 'category_id', 'id'); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /app/Models/FAQCategory.php: -------------------------------------------------------------------------------- 1 | 'required|min:3|max:191', 27 | ]; 28 | 29 | /** 30 | * Get the faqs 31 | */ 32 | public function faqs(): \Illuminate\Database\Eloquent\Relations\HasMany 33 | { 34 | return $this->hasMany(FAQ::class, 'category_id')->orderBy('list_order'); 35 | } 36 | 37 | /** 38 | * Get all the rows as an array (ready for dropdowns) 39 | * @return array 40 | */ 41 | public static function getAllList(): array 42 | { 43 | return (new self)->orderBy('name')->get()->pluck('name', 'id')->toArray(); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/Models/FeedbackContactUs.php: -------------------------------------------------------------------------------- 1 | attributes['firstname'] . ' ' . $this->attributes['lastname']; 17 | } 18 | 19 | /** 20 | * Validation custom messages for this model 21 | */ 22 | static public $rules = [ 23 | 'firstname' => 'required|min:2|max:191', 24 | 'lastname' => 'required|min:2|max:191', 25 | 'email' => 'required|min:2|max:191|email', 26 | 'content' => 'required|min:2|max:1000', 27 | 'phone' => 'nullable|max:20', 28 | 'contactable_id' => 'required', 29 | 'contactable_type' => 'required', 30 | 'contactable_type_name' => 'required', 31 | 'contactable_name' => 'required', 32 | ]; 33 | 34 | 35 | /** 36 | * Get the parent contactable model (pages or articles). 37 | */ 38 | public function contactable() 39 | { 40 | return $this->morphTo(); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/Models/LogLogin.php: -------------------------------------------------------------------------------- 1 | limit(200)->get(); 25 | } 26 | } -------------------------------------------------------------------------------- /app/Models/Notification.php: -------------------------------------------------------------------------------- 1 | 'array', 26 | 'read_at' => 'datetime', 27 | ]; 28 | 29 | /** 30 | * Get the notifiable entity that the notification belongs to. 31 | */ 32 | public function notifiable() 33 | { 34 | return $this->morphTo(); 35 | } 36 | 37 | /** 38 | * Mark the notification as read. 39 | * 40 | * @return void 41 | */ 42 | public function markAsRead() 43 | { 44 | if (is_null($this->read_at)) { 45 | $this->forceFill(['read_at' => $this->freshTimestamp()])->save(); 46 | } 47 | } 48 | } -------------------------------------------------------------------------------- /app/Models/ProductFeature.php: -------------------------------------------------------------------------------- 1 | 'required|min:3|max:191', 26 | 'slug' => 'nullable', 27 | ]; 28 | 29 | /** 30 | * Get the Product many to many 31 | */ 32 | public function products() 33 | { 34 | return $this->belongsToMany(Product::class); 35 | } 36 | 37 | /** 38 | * Get all the rows as an array (ready for dropdowns) 39 | * 40 | * @param bool $addAll 41 | * @return array 42 | */ 43 | public static function getAllList($addAll = false) 44 | { 45 | $items = self::all(); 46 | if ($addAll) { 47 | $items->push((object) ['id' => 'all', 'name' => 'All']); 48 | } 49 | 50 | $items = $items->sortBy('name')->pluck('name', 'id')->toArray(); 51 | 52 | return $items; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /app/Models/ProductStatus.php: -------------------------------------------------------------------------------- 1 | 'required|min:3|max:191', 26 | 'category' => 'required|min:3|max:191', 27 | ]; 28 | 29 | public function getBadgeAttribute() 30 | { 31 | return "{$this->name}"; 32 | } 33 | 34 | /** 35 | * Get all the rows as an array (ready for dropdowns) 36 | * 37 | * @return array 38 | */ 39 | public static function getAllList() 40 | { 41 | return self::orderBy('name')->get()->pluck('name', 'id')->toArray(); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/Models/Province.php: -------------------------------------------------------------------------------- 1 | 'required|min:3|max:191', 25 | 'country_id' => 'required|exists:countries,id', 26 | ]; 27 | 28 | /** 29 | * Get the Country 30 | */ 31 | public function country() 32 | { 33 | return $this->belongsTo(Country::class); 34 | } 35 | 36 | /** 37 | * Get all the rows as an array (ready for dropdowns) 38 | * 39 | * @return array 40 | */ 41 | public static function getAllLists() 42 | { 43 | return self::orderBy('name')->get()->pluck('name', 'id')->toArray(); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/Models/ResourceCategory.php: -------------------------------------------------------------------------------- 1 | 'required|min:3|max:191', 28 | ]; 29 | 30 | /** 31 | * Get all the rows as an array (ready for dropdowns) 32 | * 33 | * @return array 34 | */ 35 | public static function getAllList(): array 36 | { 37 | return self::orderBy('name')->get()->pluck('name', 'id')->toArray(); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/Models/Settings.php: -------------------------------------------------------------------------------- 1 | 'required|min:3|max:191', 25 | 'slogan' => 'nullable', 26 | 'description' => 'required|min:3|max:2000', 27 | 'keywords' => 'nullable', 28 | 'author' => 'required', 29 | 30 | // contact 31 | 'email' => 'nullable', 32 | 'cellphone' => 'nullable', 33 | 'telephone' => 'nullable', 34 | 'address' => 'nullable', 35 | 'po_box' => 'nullable', 36 | 37 | // social media 38 | 'facebook' => 'nullable', 39 | 'twitter' => 'nullable', 40 | 'googleplus' => 'nullable', 41 | 'linkedin' => 'nullable', 42 | 'youtube' => 'nullable', 43 | 'instagram' => 'nullable', 44 | 45 | // google maps 46 | 'zoom_level' => 'nullable', 47 | 'latitude' => 'nullable', 48 | 'longitude' => 'nullable', 49 | ]; 50 | 51 | static public $messages = []; 52 | } 53 | -------------------------------------------------------------------------------- /app/Models/ShippingAddress.php: -------------------------------------------------------------------------------- 1 | belongsTo(User::class); 26 | } 27 | 28 | /** 29 | * Get the Transaction 30 | */ 31 | public function transaction() 32 | { 33 | return $this->belongsTo(Transaction::class, 'transaction_id', 'id'); 34 | } 35 | 36 | public function getLabelAttribute() 37 | { 38 | $address = $this->attributes['address']; 39 | if($this->attributes['city']) { 40 | $address .= ", " . $this->attributes['city']; 41 | } 42 | if($this->attributes['province']) { 43 | $address .= ", " . $this->attributes['province']; 44 | } 45 | if($this->attributes['country']) { 46 | $address .= ", " . $this->attributes['country']; 47 | } 48 | return $address; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /app/Models/Suburb.php: -------------------------------------------------------------------------------- 1 | 'required|min:3|max:191', 25 | 'city_id' => 'required|exists:cities,id', 26 | ]; 27 | 28 | /** 29 | * Get the city 30 | */ 31 | public function city() 32 | { 33 | return $this->belongsTo(City::class); 34 | } 35 | 36 | /** 37 | * Get all the rows as an array (ready for dropdowns) 38 | * 39 | * @return array 40 | */ 41 | public static function getAllLists() 42 | { 43 | return self::orderBy('name')->get()->pluck('name', 'id')->toArray(); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/Models/Template.php: -------------------------------------------------------------------------------- 1 | 'required|min:3|max:191', 25 | 'template' => 'required|min:3|max:191', 26 | 'controller_action' => 'nullable|min:3|max:191', 27 | ]; 28 | 29 | /** 30 | * Get all the rows as an array (ready for dropdowns) 31 | * 32 | * @return array 33 | */ 34 | public static function getAllList() 35 | { 36 | return self::orderBy('name')->get()->pluck('name', 'id')->toArray(); 37 | } 38 | 39 | /** 40 | * Get the layouts 41 | * @return \Eloquent 42 | */ 43 | public function layouts() 44 | { 45 | return $this->belongsToMany(Layout::class, 'layout_template'); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/Models/Traits/Commentable.php: -------------------------------------------------------------------------------- 1 | morphMany(Comment::class, 'commentable')->where('is_approved', 1); 15 | } 16 | 17 | /** 18 | * Scope filter to only allow where has photos 19 | * 20 | * @param $query 21 | * @return mixed 22 | */ 23 | public function scopeHasComments($query) 24 | { 25 | return $query->whereHas('comments'); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/Models/Traits/Contactable.php: -------------------------------------------------------------------------------- 1 | contacts()->first(); 16 | } 17 | 18 | /** 19 | * Get all of the sections. 20 | */ 21 | public function contacts() 22 | { 23 | return $this->morphMany(FeedbackContactUs::class, 'contactable'); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/Models/Traits/Documentable.php: -------------------------------------------------------------------------------- 1 | documents()->first(); 16 | } 17 | 18 | public function getDocumentUrlAttribute() 19 | { 20 | return url("/uploads/documents/{$this->document->filename}"); 21 | } 22 | 23 | /** 24 | * Get all of the documentable documents. 25 | */ 26 | public function documents() 27 | { 28 | return $this->morphMany(Document::class, 'documentable'); 29 | } 30 | 31 | /** 32 | * Get all documents. 33 | */ 34 | public function getAllDocumentsAttribute() 35 | { 36 | return Document::getAllList(); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/Models/Traits/ModifyBy.php: -------------------------------------------------------------------------------- 1 | created_by = user()->id; 18 | $model->updated_by = user()->id; 19 | }); 20 | 21 | static::updating(function ($model) 22 | { 23 | // if cronjob / no user 24 | if(user()->id >= 1) { 25 | $model->updated_by = user()->id; 26 | } 27 | }); 28 | 29 | static::deleting(function ($model) 30 | { 31 | $model->deleted_by = user()->id; 32 | $model->save(); 33 | }); 34 | } 35 | } -------------------------------------------------------------------------------- /app/Models/Traits/UserAdmin.php: -------------------------------------------------------------------------------- 1 | hasRole(Role::$ADMIN); 17 | } 18 | 19 | /** 20 | * If User is admin 21 | * @return bool 22 | */ 23 | public function isSuperAdmin() 24 | { 25 | return $this->hasRole(Role::$ADMIN); 26 | } 27 | 28 | /** 29 | * If User is admin 30 | * @return bool 31 | */ 32 | public function isDeveloper() 33 | { 34 | return $this->hasRole(Role::$DEVELOPER); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/Models/Traits/UserHelper.php: -------------------------------------------------------------------------------- 1 | attributes['firstname'] . ' ' . $this->attributes['lastname']; 15 | } 16 | 17 | public function getIsEmailVerifiedBadgeAttribute() 18 | { 19 | return $this->email_verified_at ? '' . $this->email_verified_at->format('d M Y') . '' : 'not yet'; 20 | } 21 | } -------------------------------------------------------------------------------- /app/Providers/AppServiceProvider.php: -------------------------------------------------------------------------------- 1 | 14 | */ 15 | protected $policies = [ 16 | // 17 | ]; 18 | 19 | /** 20 | * Register any authentication / authorization services. 21 | */ 22 | public function boot(): void 23 | { 24 | $this->registerPolicies(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/Providers/BroadcastServiceProvider.php: -------------------------------------------------------------------------------- 1 | > 17 | */ 18 | protected $listen = [ 19 | Registered::class => [ 20 | SendEmailVerificationNotification::class, 21 | ], 22 | 23 | Verified::class => [], 24 | 25 | 'App\Events\ContactUsFeedback' => [ 26 | 'App\Listeners\EmailContactUsToClient', 27 | 'App\Listeners\EmailContactUsToAdmin', 28 | ], 29 | ]; 30 | 31 | /** 32 | * Register any events for your application. 33 | */ 34 | public function boot(): void 35 | { 36 | // 37 | } 38 | 39 | /** 40 | * Determine if events and listeners should be automatically discovered. 41 | */ 42 | public function shouldDiscoverEvents(): bool 43 | { 44 | return false; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/Providers/HelperServiceProvider.php: -------------------------------------------------------------------------------- 1 | ['api/*', 'sanctum/csrf-cookie'], 19 | 20 | 'allowed_methods' => ['*'], 21 | 22 | 'allowed_origins' => ['*'], 23 | 24 | 'allowed_origins_patterns' => [], 25 | 26 | 'allowed_headers' => ['*'], 27 | 28 | 'exposed_headers' => [], 29 | 30 | 'max_age' => 0, 31 | 32 | 'supports_credentials' => false, 33 | 34 | ]; 35 | -------------------------------------------------------------------------------- /config/services.php: -------------------------------------------------------------------------------- 1 | [ 18 | 'domain' => env('MAILGUN_DOMAIN'), 19 | 'secret' => env('MAILGUN_SECRET'), 20 | 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'), 21 | 'scheme' => 'https', 22 | ], 23 | 24 | 'postmark' => [ 25 | 'token' => env('POSTMARK_TOKEN'), 26 | ], 27 | 28 | 'ses' => [ 29 | 'key' => env('AWS_ACCESS_KEY_ID'), 30 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 31 | 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 32 | ], 33 | 34 | ]; 35 | -------------------------------------------------------------------------------- /config/view.php: -------------------------------------------------------------------------------- 1 | [ 17 | resource_path('views'), 18 | ], 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Compiled View Path 23 | |-------------------------------------------------------------------------- 24 | | 25 | | This option determines where all the compiled Blade templates will be 26 | | stored for your application. Typically, this is within the storage 27 | | directory. However, as usual, you are free to change this value. 28 | | 29 | */ 30 | 31 | 'compiled' => env( 32 | 'VIEW_COMPILED_PATH', 33 | realpath(storage_path('framework/views')) 34 | ), 35 | 36 | ]; 37 | -------------------------------------------------------------------------------- /database/.gitignore: -------------------------------------------------------------------------------- 1 | *.sqlite* 2 | -------------------------------------------------------------------------------- /database/factories/BannerFactory.php: -------------------------------------------------------------------------------- 1 | 'Example Banner', 26 | 'description' => $this->faker->sentence, 27 | 'image' => 'banner-1.jpg', 28 | 'active_from' => now()->subWeek(), 29 | 'active_to' => now()->addWeek(), 30 | ]; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /database/factories/FaqCategoryFactory.php: -------------------------------------------------------------------------------- 1 | 'FAQ Category' 26 | ]; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /database/factories/FaqFactory.php: -------------------------------------------------------------------------------- 1 | 'Question', 27 | 'answer' => 'Answer', 28 | 'category_id' => FAQCategory::factory()->create(), 29 | ]; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /database/factories/LogActivityFactory.php: -------------------------------------------------------------------------------- 1 | $this->faker->name, 26 | 'description' => $this->faker->sentence, 27 | ]; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /database/factories/LogModelActivityFactory.php: -------------------------------------------------------------------------------- 1 | 1, 26 | 'subject_type' => 'App\Models\User', 27 | 'name' => 'user_created', 28 | 'before' => 'before', 29 | 'after' => 'after', 30 | 'user_id' => 1, 31 | ]; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /database/factories/NavigationFactory.php: -------------------------------------------------------------------------------- 1 | 'home', 26 | 'name' => 'Click Me', 27 | 'slug' => 'click-me', 28 | 'description' => 'Lorem Ipsum', 29 | 'url' => '/click-me', 30 | 'help_index_title' => '', 31 | 'help_index_content' => '', 32 | 'help_create_title' => '', 33 | 'help_create_content' => '', 34 | 'help_edit_title' => '', 35 | 'help_edit_content' => '', 36 | 'list_order' => 1, 37 | 'is_hidden' => 0, 38 | 'parent_id' => 0, 39 | 'url_parent_id' => 0, 40 | 'created_by' => 1, 41 | 'updated_by' => 1, 42 | ]; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /database/factories/PageFactory.php: -------------------------------------------------------------------------------- 1 | 'Click Me', 26 | ]; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /database/factories/PhotoFactory.php: -------------------------------------------------------------------------------- 1 | define(Photo::class, function (Faker $faker) { 9 | return [ 10 | // 11 | ]; 12 | }); 13 | -------------------------------------------------------------------------------- /database/factories/ProductCategoryFactory.php: -------------------------------------------------------------------------------- 1 | 'Example Category', 26 | 'image' => 'image-1.png', 27 | ]; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /database/factories/ProductFactory.php: -------------------------------------------------------------------------------- 1 | $this->faker->name, 27 | 'slug' => $this->faker->name, 28 | 'reference' => $this->faker->numberBetween(100000, 999999), 29 | 'amount' => 100, 30 | //'active_from' => now()->subDay(), 31 | //'active_to' => null, 32 | 'special_amount' => null, 33 | 'special_from' => null, 34 | 'special_to' => null, 35 | 'available' => null, 36 | 'content' => $this->faker->sentence, 37 | 'category_id' => ProductCategory::factory()->create()->id, 38 | ]; 39 | } 40 | 41 | //$factory->afterCreating(Product::class, function ($user, $faker) { 42 | // $user->features()->save(factory(ProductFeature::class)->make()); 43 | //}); 44 | } 45 | -------------------------------------------------------------------------------- /database/factories/ProductFeatureFactory.php: -------------------------------------------------------------------------------- 1 | 'Example Category', 27 | 'slug' => 'example-slug', 28 | ]; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /database/factories/ProductStatusFactory.php: -------------------------------------------------------------------------------- 1 | 'Example Name', 28 | 'category' => 'Example Category', 29 | 'slug' => 'example-slug', 30 | ]; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /database/factories/RoleFactory.php: -------------------------------------------------------------------------------- 1 | 'Example Role', 26 | 'slug' => '/slug', 27 | 'keyword' => 'example_role', 28 | ]; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /database/factories/SettingsFactory.php: -------------------------------------------------------------------------------- 1 | 'Titan Starter', 27 | 'description' => 'A Laravel Website with Admin access Starter project with AdminLTE theme and basic features.', 28 | 'author' => 'Ben-Piet O\'Callaghan', 29 | 'keywords' => 'cms, admin, titan, laravel, bpocallaghan', 30 | ]; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /database/migrations/2014_10_12_000000_create_users_table.php: -------------------------------------------------------------------------------- 1 | id(); 16 | $table->string('name'); 17 | $table->string('email')->unique(); 18 | $table->timestamp('email_verified_at')->nullable(); 19 | $table->string('password'); 20 | $table->rememberToken(); 21 | $table->timestamps(); 22 | }); 23 | } 24 | 25 | /** 26 | * Reverse the migrations. 27 | */ 28 | public function down(): void 29 | { 30 | Schema::dropIfExists('users'); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /database/migrations/2014_10_12_100000_create_password_reset_tokens_table.php: -------------------------------------------------------------------------------- 1 | string('email')->primary(); 16 | $table->string('token'); 17 | $table->timestamp('created_at')->nullable(); 18 | }); 19 | } 20 | 21 | /** 22 | * Reverse the migrations. 23 | */ 24 | public function down(): void 25 | { 26 | Schema::dropIfExists('password_reset_tokens'); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2014_10_12_100000_create_password_resets_table.php: -------------------------------------------------------------------------------- 1 | string('email')->index(); 18 | $table->string('token'); 19 | $table->timestamp('created_at')->nullable(); 20 | }); 21 | } 22 | 23 | /** 24 | * Reverse the migrations. 25 | * 26 | * @return void 27 | */ 28 | public function down() 29 | { 30 | Schema::dropIfExists('password_resets'); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /database/migrations/2019_08_19_000000_create_failed_jobs_table.php: -------------------------------------------------------------------------------- 1 | id(); 16 | $table->string('uuid')->unique(); 17 | $table->text('connection'); 18 | $table->text('queue'); 19 | $table->longText('payload'); 20 | $table->longText('exception'); 21 | $table->timestamp('failed_at')->useCurrent(); 22 | }); 23 | } 24 | 25 | /** 26 | * Reverse the migrations. 27 | */ 28 | public function down(): void 29 | { 30 | Schema::dropIfExists('failed_jobs'); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /database/migrations/2019_12_03_124353_create_jobs_table.php: -------------------------------------------------------------------------------- 1 | bigIncrements('id'); 18 | $table->string('queue')->index(); 19 | $table->longText('payload'); 20 | $table->unsignedTinyInteger('attempts'); 21 | $table->unsignedInteger('reserved_at')->nullable(); 22 | $table->unsignedInteger('available_at'); 23 | $table->unsignedInteger('created_at'); 24 | }); 25 | } 26 | 27 | /** 28 | * Reverse the migrations. 29 | * 30 | * @return void 31 | */ 32 | public function down() 33 | { 34 | Schema::dropIfExists('jobs'); 35 | } 36 | }; 37 | -------------------------------------------------------------------------------- /database/migrations/2019_12_10_065955_create_notifications_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 18 | $table->string('type'); 19 | $table->morphs('notifiable'); 20 | $table->text('data'); 21 | $table->timestamp('read_at')->nullable(); 22 | $table->timestamps(); 23 | }); 24 | } 25 | 26 | /** 27 | * Reverse the migrations. 28 | * 29 | * @return void 30 | */ 31 | public function down() 32 | { 33 | Schema::dropIfExists('notifications'); 34 | } 35 | }; 36 | -------------------------------------------------------------------------------- /database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php: -------------------------------------------------------------------------------- 1 | id(); 16 | $table->morphs('tokenable'); 17 | $table->string('name'); 18 | $table->string('token', 64)->unique(); 19 | $table->text('abilities')->nullable(); 20 | $table->timestamp('last_used_at')->nullable(); 21 | $table->timestamp('expires_at')->nullable(); 22 | $table->timestamps(); 23 | }); 24 | } 25 | 26 | /** 27 | * Reverse the migrations. 28 | */ 29 | public function down(): void 30 | { 31 | Schema::dropIfExists('personal_access_tokens'); 32 | } 33 | }; 34 | -------------------------------------------------------------------------------- /database/migrations/2019_12_15_141543_create_log_logins_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('username', 50); 19 | $table->string('status'); // success, no-user, inactive, disabled 20 | $table->string('role'); // website, admin 21 | $table->string('client_ip'); 22 | $table->text('client_agent'); 23 | $table->timestamp('created_at'); 24 | }); 25 | } 26 | 27 | /** 28 | * Reverse the migrations. 29 | * 30 | * @return void 31 | */ 32 | public function down() 33 | { 34 | Schema::drop('log_logins'); 35 | } 36 | }; 37 | -------------------------------------------------------------------------------- /database/migrations/2019_12_20_151143_create_roles_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('icon')->nullable(); 19 | $table->string('name', 50); 20 | $table->string('slug', 50); 21 | $table->string('keyword', 50)->unique(); 22 | $table->string('summary')->nullable(); 23 | $table->timestamps(); 24 | $table->softDeletes(); 25 | $table->integer('created_by')->unsigned(); 26 | $table->integer('updated_by')->unsigned()->nullable(); 27 | $table->integer('deleted_by')->unsigned()->nullable(); 28 | }); 29 | } 30 | 31 | /** 32 | * Reverse the migrations. 33 | * 34 | * @return void 35 | */ 36 | public function down() 37 | { 38 | Schema::dropIfExists('roles'); 39 | } 40 | }; 41 | -------------------------------------------------------------------------------- /database/migrations/2019_12_20_151151_create_role_user_pivot_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->integer('role_id')->unsigned()->index(); 19 | $table->integer('user_id')->unsigned()->index(); 20 | 21 | //$table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade'); 22 | //$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); 23 | //$table->primary(['role_id', 'user_id']); 24 | $table->timestamps(); 25 | }); 26 | } 27 | 28 | /** 29 | * Reverse the migrations. 30 | * 31 | * @return void 32 | */ 33 | public function down() 34 | { 35 | Schema::drop('role_user'); 36 | } 37 | }; 38 | -------------------------------------------------------------------------------- /database/migrations/2020_01_05_141724_create_log_activities_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name', 50); 19 | $table->text('description'); 20 | $table->bigInteger('subject_id')->unsigned()->nullable(); 21 | $table->string('subject_type', 150)->nullable(); 22 | $table->bigInteger('user_id')->unsigned()->index()->nullable(); 23 | $table->timestamps(); 24 | }); 25 | } 26 | 27 | /** 28 | * Reverse the migrations. 29 | * 30 | * @return void 31 | */ 32 | public function down() 33 | { 34 | Schema::drop('log_activities'); 35 | } 36 | }; 37 | -------------------------------------------------------------------------------- /database/migrations/2020_01_05_151724_create_log_model_activities_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->integer('subject_id')->unsigned()->index(); 19 | $table->string('subject_type', 150)->index(); 20 | $table->string('name', 191); 21 | $table->text('before')->nullable(); 22 | $table->text('after')->nullable(); 23 | $table->integer('user_id')->unsigned()->index(); 24 | $table->timestamps(); 25 | }); 26 | } 27 | 28 | /** 29 | * Reverse the migrations. 30 | * 31 | * @return void 32 | */ 33 | public function down() 34 | { 35 | Schema::drop('log_model_activities'); 36 | } 37 | }; 38 | -------------------------------------------------------------------------------- /database/migrations/2020_01_15_083010_create_navigation_role_pivot_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->integer('navigation_id')->unsigned()->index(); 19 | $table->integer('role_id')->unsigned()->index(); 20 | $table->timestamps(); 21 | 22 | //$table->integer('navigation_id')->unsigned()->index(); 23 | //$table->foreign('navigation_id')->references('id')->on('navigations')->onDelete('cascade'); 24 | //$table->integer('role_id')->unsigned()->index(); 25 | //$table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade'); 26 | //$table->primary(['navigation_id', 'role_id']); 27 | }); 28 | } 29 | 30 | /** 31 | * Reverse the migrations. 32 | * 33 | * @return void 34 | */ 35 | public function down() 36 | { 37 | Schema::drop('navigation_role'); 38 | } 39 | }; 40 | -------------------------------------------------------------------------------- /database/migrations/2020_02_03_184930_create_banner_page_pivot_table.php: -------------------------------------------------------------------------------- 1 | integer('banner_id')->unsigned()->index(); 18 | //$table->foreign('banner_id')->references('id')->on('banners')->onDelete('cascade'); 19 | $table->integer('page_id')->unsigned()->index(); 20 | //$table->foreign('page_id')->references('id')->on('pages')->onDelete('cascade'); 21 | $table->primary(['banner_id', 'page_id']); 22 | }); 23 | } 24 | 25 | /** 26 | * Reverse the migrations. 27 | * 28 | * @return void 29 | */ 30 | public function down() 31 | { 32 | Schema::drop('banner_page'); 33 | } 34 | }; 35 | -------------------------------------------------------------------------------- /database/migrations/2020_02_04_082639_create_photos_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->boolean('is_cover')->default(false); 19 | $table->string('name'); 20 | $table->string('filename'); 21 | $table->bigInteger('photoable_id')->unsigned()->index(); 22 | $table->string('photoable_type')->index(); 23 | $table->integer('list_order')->default(999); 24 | $table->timestamps(); 25 | $table->softDeletes(); 26 | $table->integer('created_by')->unsigned(); 27 | $table->integer('updated_by')->unsigned()->nullable(); 28 | $table->integer('deleted_by')->unsigned()->nullable(); 29 | }); 30 | } 31 | 32 | /** 33 | * Reverse the migrations. 34 | * 35 | * @return void 36 | */ 37 | public function down() 38 | { 39 | Schema::drop('photos'); 40 | } 41 | }; 42 | -------------------------------------------------------------------------------- /database/migrations/2020_02_04_141424_create_documents_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name'); 19 | $table->string('filename'); 20 | $table->bigInteger('documentable_id')->unsigned()->index(); 21 | $table->string('documentable_type')->index(); 22 | $table->integer('list_order')->default(999); 23 | $table->timestamps(); 24 | $table->softDeletes(); 25 | $table->integer('created_by')->unsigned(); 26 | $table->integer('updated_by')->unsigned()->nullable(); 27 | $table->integer('deleted_by')->unsigned()->nullable(); 28 | }); 29 | } 30 | 31 | /** 32 | * Reverse the migrations. 33 | * 34 | * @return void 35 | */ 36 | public function down() 37 | { 38 | Schema::drop('documents'); 39 | } 40 | }; 41 | -------------------------------------------------------------------------------- /database/migrations/2020_04_16_122143_create_resource_categories_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name')->index(); 19 | $table->string('slug'); 20 | $table->timestamps(); 21 | $table->softDeletes(); 22 | $table->integer('created_by')->unsigned(); 23 | $table->integer('updated_by')->unsigned()->nullable(); 24 | $table->integer('deleted_by')->unsigned()->nullable(); 25 | }); 26 | } 27 | 28 | /** 29 | * Reverse the migrations. 30 | * 31 | * @return void 32 | */ 33 | public function down() 34 | { 35 | Schema::dropIfExists('resource_categories'); 36 | } 37 | }; 38 | -------------------------------------------------------------------------------- /database/migrations/2020_04_25_204158_create_feedback_contact_us_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('firstname'); 19 | $table->string('lastname'); 20 | $table->string('email'); 21 | $table->string('phone')->nullable(); 22 | $table->text('content')->nullable(); 23 | $table->string('client_ip'); 24 | $table->text('client_agent'); 25 | $table->integer('contactable_id')->unsigned()->index(); 26 | $table->string('contactable_type')->index(); 27 | $table->string('contactable_name'); 28 | $table->string('contactable_type_name'); 29 | $table->timestamps(); 30 | }); 31 | } 32 | 33 | /** 34 | * Reverse the migrations. 35 | * 36 | * @return void 37 | */ 38 | public function down() 39 | { 40 | Schema::dropIfExists('feedback_contact_us'); 41 | } 42 | }; 43 | -------------------------------------------------------------------------------- /database/migrations/2020_04_25_204415_create_article_categories_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name')->index(); 19 | $table->string('slug'); 20 | $table->timestamps(); 21 | $table->softDeletes(); 22 | $table->integer('created_by')->unsigned(); 23 | $table->integer('updated_by')->unsigned()->nullable(); 24 | $table->integer('deleted_by')->unsigned()->nullable(); 25 | }); 26 | } 27 | 28 | /** 29 | * Reverse the migrations. 30 | * 31 | * @return void 32 | */ 33 | public function down() 34 | { 35 | Schema::dropIfExists('article_categories'); 36 | } 37 | }; 38 | -------------------------------------------------------------------------------- /database/migrations/2020_04_25_204458_create_product_categories_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name')->index(); 19 | $table->string('slug'); 20 | $table->string('url')->nullable(); 21 | $table->integer('list_order')->unsigned()->default(99); 22 | $table->integer('parent_id')->unsigned()->default(0); 23 | $table->string('image'); 24 | $table->timestamps(); 25 | $table->softDeletes(); 26 | $table->integer('created_by')->unsigned(); 27 | $table->integer('updated_by')->unsigned()->nullable(); 28 | $table->integer('deleted_by')->unsigned()->nullable(); 29 | }); 30 | } 31 | 32 | /** 33 | * Reverse the migrations. 34 | * 35 | * @return void 36 | */ 37 | public function down() 38 | { 39 | Schema::dropIfExists('product_categories'); 40 | } 41 | }; 42 | -------------------------------------------------------------------------------- /database/migrations/2020_04_25_204738_create_product_features_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name')->index(); 19 | $table->string('slug'); 20 | $table->timestamps(); 21 | $table->softDeletes(); 22 | $table->integer('created_by')->unsigned(); 23 | $table->integer('updated_by')->unsigned()->nullable(); 24 | $table->integer('deleted_by')->unsigned()->nullable(); 25 | }); 26 | } 27 | 28 | /** 29 | * Reverse the migrations. 30 | * 31 | * @return void 32 | */ 33 | public function down() 34 | { 35 | Schema::dropIfExists('product_features'); 36 | } 37 | }; 38 | -------------------------------------------------------------------------------- /database/migrations/2020_04_25_204758_create_product_feature_pivot_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->integer('product_id')->unsigned()->index(); 19 | $table->integer('product_feature_id')->unsigned()->index(); 20 | }); 21 | } 22 | 23 | /** 24 | * Reverse the migrations. 25 | * 26 | * @return void 27 | */ 28 | public function down() 29 | { 30 | Schema::dropIfExists('product_feature_pivot'); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /database/migrations/2020_04_25_205404_create_checkout_product_pivot_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->integer('quantity'); 19 | $table->integer('checkout_id')->unsigned()->index(); 20 | $table->integer('product_id')->unsigned()->index(); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | * 27 | * @return void 28 | */ 29 | public function down() 30 | { 31 | Schema::dropIfExists('checkout_product'); 32 | } 33 | }; 34 | -------------------------------------------------------------------------------- /database/migrations/2020_04_25_205540_create_product_transaction_pivot_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->integer('quantity'); 19 | $table->integer('transaction_id')->unsigned()->index(); 20 | $table->integer('product_id')->unsigned()->index(); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | * 27 | * @return void 28 | */ 29 | public function down() 30 | { 31 | Schema::dropIfExists('product_transaction'); 32 | } 33 | }; 34 | -------------------------------------------------------------------------------- /database/migrations/2020_04_25_205620_create_log_product_searches_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('slug')->index(); 19 | $table->integer('searchable_id')->unsigned()->index()->nullable(); 20 | $table->string('searchable_type')->index()->nullable(); 21 | $table->timestamp('created_at')->nullable(); 22 | $table->integer('created_by')->unsigned(); 23 | }); 24 | } 25 | 26 | /** 27 | * Reverse the migrations. 28 | * 29 | * @return void 30 | */ 31 | public function down() 32 | { 33 | Schema::dropIfExists('log_product_searches'); 34 | } 35 | }; 36 | -------------------------------------------------------------------------------- /database/migrations/2020_04_25_205659_create_shipping_addresses_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('address'); 19 | $table->string('city'); 20 | $table->string('province')->nullable(); 21 | $table->string('country'); 22 | $table->string('postal_code')->nullable(); 23 | $table->integer('user_id'); 24 | $table->integer('transaction_id')->nullable(); 25 | $table->timestamps(); 26 | $table->softDeletes(); 27 | $table->integer('created_by')->unsigned(); 28 | $table->integer('updated_by')->unsigned()->nullable(); 29 | $table->integer('deleted_by')->unsigned()->nullable(); 30 | }); 31 | } 32 | 33 | /** 34 | * Reverse the migrations. 35 | * 36 | * @return void 37 | */ 38 | public function down() 39 | { 40 | Schema::dropIfExists('shipping_addresses'); 41 | } 42 | }; 43 | -------------------------------------------------------------------------------- /database/migrations/2020_04_25_205731_create_product_statuses_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name')->index(); 19 | $table->string('category'); 20 | $table->string('slug'); 21 | $table->timestamps(); 22 | $table->softDeletes(); 23 | $table->integer('created_by')->unsigned(); 24 | $table->integer('updated_by')->unsigned()->nullable(); 25 | $table->integer('deleted_by')->unsigned()->nullable(); 26 | }); 27 | } 28 | 29 | /** 30 | * Reverse the migrations. 31 | * 32 | * @return void 33 | */ 34 | public function down() 35 | { 36 | Schema::dropIfExists('product_statuses'); 37 | } 38 | }; 39 | -------------------------------------------------------------------------------- /database/migrations/2020_05_03_194805_create_faqs_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('question')->index(); 19 | $table->string('slug')->index(); 20 | $table->text('answer'); 21 | $table->unsignedBigInteger('total_read')->default(0); 22 | $table->unsignedBigInteger('helpful_yes')->default(0); 23 | $table->unsignedBigInteger('helpful_no')->default(0); 24 | $table->unsignedBigInteger('category_id')->index(); 25 | $table->unsignedBigInteger('list_order')->nullable(); 26 | $table->timestamps(); 27 | $table->softDeletes(); 28 | $table->integer('created_by')->unsigned(); 29 | $table->integer('updated_by')->unsigned()->nullable(); 30 | $table->integer('deleted_by')->unsigned()->nullable(); 31 | }); 32 | } 33 | 34 | /** 35 | * Reverse the migrations. 36 | * 37 | * @return void 38 | */ 39 | public function down() 40 | { 41 | Schema::dropIfExists('faqs'); 42 | } 43 | }; 44 | -------------------------------------------------------------------------------- /database/migrations/2020_05_03_194835_create_faq_categories_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name')->index(); 19 | $table->string('slug'); 20 | $table->timestamps(); 21 | $table->softDeletes(); 22 | $table->integer('created_by')->unsigned(); 23 | $table->integer('updated_by')->unsigned()->nullable(); 24 | $table->integer('deleted_by')->unsigned()->nullable(); 25 | }); 26 | } 27 | 28 | /** 29 | * Reverse the migrations. 30 | * 31 | * @return void 32 | */ 33 | public function down() 34 | { 35 | Schema::dropIfExists('faq_categories'); 36 | } 37 | }; 38 | -------------------------------------------------------------------------------- /database/migrations/2020_05_22_130055_create_continents_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name'); 19 | $table->string('slug')->index(); 20 | $table->smallInteger('zoom_level')->default(10); 21 | $table->string('latitude', '50')->nullable(); 22 | $table->string('longitude', '50')->nullable(); 23 | $table->timestamps(); 24 | $table->softDeletes(); 25 | $table->integer('created_by')->unsigned(); 26 | $table->integer('updated_by')->unsigned()->nullable(); 27 | $table->integer('deleted_by')->unsigned()->nullable(); 28 | }); 29 | } 30 | 31 | /** 32 | * Reverse the migrations. 33 | * 34 | * @return void 35 | */ 36 | public function down() 37 | { 38 | Schema::dropIfExists('continents'); 39 | } 40 | }; 41 | -------------------------------------------------------------------------------- /database/migrations/2020_05_22_130125_create_countries_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name'); 19 | $table->string('slug')->index(); 20 | $table->smallInteger('zoom_level')->default(10); 21 | $table->string('latitude', '50')->nullable(); 22 | $table->string('longitude', '50')->nullable(); 23 | $table->unsignedBigInteger('continent_id')->index(); 24 | $table->timestamps(); 25 | $table->softDeletes(); 26 | $table->integer('created_by')->unsigned(); 27 | $table->integer('updated_by')->unsigned()->nullable(); 28 | $table->integer('deleted_by')->unsigned()->nullable(); 29 | }); 30 | } 31 | 32 | /** 33 | * Reverse the migrations. 34 | * 35 | * @return void 36 | */ 37 | public function down() 38 | { 39 | Schema::dropIfExists('countries'); 40 | } 41 | }; 42 | -------------------------------------------------------------------------------- /database/migrations/2020_05_22_130145_create_provinces_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name'); 19 | $table->string('slug')->index(); 20 | $table->smallInteger('zoom_level')->default(10); 21 | $table->string('latitude', '50')->nullable(); 22 | $table->string('longitude', '50')->nullable(); 23 | $table->unsignedBigInteger('country_id')->index(); 24 | $table->timestamps(); 25 | $table->softDeletes(); 26 | $table->integer('created_by')->unsigned(); 27 | $table->integer('updated_by')->unsigned()->nullable(); 28 | $table->integer('deleted_by')->unsigned()->nullable(); 29 | }); 30 | } 31 | 32 | /** 33 | * Reverse the migrations. 34 | * 35 | * @return void 36 | */ 37 | public function down() 38 | { 39 | Schema::dropIfExists('provinces'); 40 | } 41 | }; 42 | -------------------------------------------------------------------------------- /database/migrations/2020_05_22_130157_create_cities_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name'); 19 | $table->string('slug')->index(); 20 | $table->smallInteger('zoom_level')->default(10); 21 | $table->string('latitude', '50')->nullable(); 22 | $table->string('longitude', '50')->nullable(); 23 | $table->unsignedBigInteger('province_id')->index(); 24 | $table->timestamps(); 25 | $table->softDeletes(); 26 | $table->integer('created_by')->unsigned(); 27 | $table->integer('updated_by')->unsigned()->nullable(); 28 | $table->integer('deleted_by')->unsigned()->nullable(); 29 | }); 30 | } 31 | 32 | /** 33 | * Reverse the migrations. 34 | * 35 | * @return void 36 | */ 37 | public function down() 38 | { 39 | Schema::dropIfExists('cities'); 40 | } 41 | }; 42 | -------------------------------------------------------------------------------- /database/migrations/2020_05_22_130235_create_suburbs_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name'); 19 | $table->string('slug')->index(); 20 | $table->smallInteger('zoom_level')->default(10); 21 | $table->string('latitude', '50')->nullable(); 22 | $table->string('longitude', '50')->nullable(); 23 | $table->unsignedBigInteger('city_id')->index(); 24 | $table->timestamps(); 25 | $table->softDeletes(); 26 | $table->integer('created_by')->unsigned(); 27 | $table->integer('updated_by')->unsigned()->nullable(); 28 | $table->integer('deleted_by')->unsigned()->nullable(); 29 | }); 30 | } 31 | 32 | /** 33 | * Reverse the migrations. 34 | * 35 | * @return void 36 | */ 37 | public function down() 38 | { 39 | Schema::dropIfExists('suburbs'); 40 | } 41 | }; 42 | -------------------------------------------------------------------------------- /database/migrations/2020_12_09_073453_update_pages_table.php: -------------------------------------------------------------------------------- 1 | boolean('allow_comments')->nullable(); 18 | $table->integer('template_id')->nullable(); 19 | }); 20 | } 21 | 22 | /** 23 | * Reverse the migrations. 24 | * 25 | * @return void 26 | */ 27 | public function down() 28 | { 29 | // 30 | } 31 | }; 32 | -------------------------------------------------------------------------------- /database/migrations/2020_12_09_074146_create_comments_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name')->nullable(); 19 | $table->string('email', 50)->nullable(); 20 | $table->text('content'); 21 | $table->boolean('is_approved')->nullable(); 22 | $table->integer('approved_by')->unsigned()->nullable(); 23 | $table->timestamp('approved_at')->nullable(); 24 | $table->bigInteger('commentable_id')->unsigned()->index(); 25 | $table->string('commentable_type')->index(); 26 | $table->timestamps(); 27 | $table->softDeletes(); 28 | $table->integer('created_by')->unsigned(); 29 | $table->integer('updated_by')->unsigned()->nullable(); 30 | $table->integer('deleted_by')->unsigned()->nullable(); 31 | }); 32 | } 33 | 34 | /** 35 | * Reverse the migrations. 36 | * 37 | * @return void 38 | */ 39 | public function down() 40 | { 41 | Schema::dropIfExists('comments'); 42 | } 43 | }; 44 | -------------------------------------------------------------------------------- /database/migrations/2020_12_14_093823_create_templates_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name'); 19 | $table->string('template'); 20 | $table->string('controller_action')->nullable(); 21 | $table->timestamps(); 22 | $table->softDeletes(); 23 | $table->integer('created_by')->unsigned(); 24 | $table->integer('updated_by')->unsigned()->nullable(); 25 | $table->integer('deleted_by')->unsigned()->nullable(); 26 | }); 27 | } 28 | 29 | /** 30 | * Reverse the migrations. 31 | * 32 | * @return void 33 | */ 34 | public function down() 35 | { 36 | Schema::dropIfExists('templates'); 37 | } 38 | }; 39 | -------------------------------------------------------------------------------- /database/migrations/2020_12_16_091634_create_sections_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->integer('sectionable_id')->unsigned()->index(); 19 | $table->string('sectionable_type')->index(); 20 | $table->string('name')->nullable(); 21 | $table->string('layout')->nullable(); 22 | $table->text('content')->nullable(); 23 | $table->integer('list_order')->nullable(); 24 | $table->timestamps(); 25 | $table->softDeletes(); 26 | $table->integer('created_by')->unsigned(); 27 | $table->integer('updated_by')->unsigned()->nullable(); 28 | $table->integer('deleted_by')->unsigned()->nullable(); 29 | }); 30 | } 31 | 32 | /** 33 | * Reverse the migrations. 34 | * 35 | * @return void 36 | */ 37 | public function down() 38 | { 39 | Schema::dropIfExists('sections'); 40 | } 41 | }; 42 | -------------------------------------------------------------------------------- /database/migrations/2020_12_16_143624_create_content_section_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->integer('content_id')->unsigned()->index(); 19 | $table->integer('section_id')->unsigned()->index(); 20 | $table->timestamps(); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | * 27 | * @return void 28 | */ 29 | public function down() 30 | { 31 | Schema::dropIfExists('content_section'); 32 | } 33 | }; 34 | -------------------------------------------------------------------------------- /database/migrations/2021_03_18_115830_create_layouts_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name')->index(); 19 | $table->string('layout'); 20 | $table->string('slug'); 21 | $table->timestamps(); 22 | $table->softDeletes(); 23 | $table->integer('created_by')->unsigned(); 24 | $table->integer('updated_by')->unsigned()->nullable(); 25 | $table->integer('deleted_by')->unsigned()->nullable(); 26 | }); 27 | } 28 | 29 | /** 30 | * Reverse the migrations. 31 | * 32 | * @return void 33 | */ 34 | public function down() 35 | { 36 | Schema::dropIfExists('layouts'); 37 | } 38 | }; 39 | -------------------------------------------------------------------------------- /database/migrations/2021_03_18_115854_create_layout_template_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->integer('layout_id')->unsigned()->index(); 19 | $table->integer('template_id')->unsigned()->index(); 20 | $table->timestamps(); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | * 27 | * @return void 28 | */ 29 | public function down() 30 | { 31 | Schema::dropIfExists('layout_template'); 32 | } 33 | }; 34 | -------------------------------------------------------------------------------- /database/seeders/BannersTableSeeder.php: -------------------------------------------------------------------------------- 1 | $item) 16 | { 17 | Banner::create([ 18 | 19 | ]); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /database/seeders/DatabaseSeeder.php: -------------------------------------------------------------------------------- 1 | call(RolesTableSeeder::class); 16 | $this->call(UsersTableSeeder::class); 17 | $this->call(NavigationsTableSeeder::class); 18 | $this->call(SettingsTableSeeder::class); 19 | $this->call(PagesTableSeeder::class); 20 | $this->call(SectionsTableSeeder::class); 21 | $this->call(TemplatesTableSeeder::class); 22 | $this->call(LayoutsTableSeeder::class); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /database/seeders/LayoutsTableSeeder.php: -------------------------------------------------------------------------------- 1 | importBasic('layouts.csv', \App\Models\Layout::class); 12 | $this->importBasicTable('layout_template.csv', 'layout_template'); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /database/seeders/NavigationsTableSeeder.php: -------------------------------------------------------------------------------- 1 | importBasic('navigations.csv', \App\Models\Navigation::class); 12 | $this->importBasicTable('navigation_role.csv', 'navigation_role'); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /database/seeders/PagesTableSeeder.php: -------------------------------------------------------------------------------- 1 | importBasic('pages.csv', Page::class); 13 | //$this->importBasicTable('banner_page.csv', 'banner_page'); 14 | //$this->importBasicTable('page_content.csv', 'page_content'); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /database/seeders/RolesTableSeeder.php: -------------------------------------------------------------------------------- 1 | importBasic('roles.csv', \App\Models\Role::class); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /database/seeders/SectionsTableSeeder.php: -------------------------------------------------------------------------------- 1 | importBasic('sections.csv', \App\Models\Section::class); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /database/seeders/SettingsTableSeeder.php: -------------------------------------------------------------------------------- 1 | 'Titan Starter', 17 | 'description' => 'A Laravel Website with Admin access Starter project with AdminLTE theme and basic features.', 18 | 'author' => 'Ben-Piet O\'Callaghan', 19 | 'keywords' => 'cms, admin, titan, laravel, bpocallaghan', 20 | 'email' => 'hello@example.com', 21 | 'telephone' => '123456789', 22 | 'cellphone' => 'cellphone', 23 | 'address' => 'Example Address', 24 | ]); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /database/seeders/TemplatesTableSeeder.php: -------------------------------------------------------------------------------- 1 | importBasic('templates.csv', \App\Models\Template::class); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /database/seeders/csv/layout_template.csv: -------------------------------------------------------------------------------- 1 | id,layout_id,template_id,created_at,updated_at 2 | "1","6","8","2021-03-19 09:21:35","2021-03-19 09:21:35" 3 | "2","7","10","2021-03-19 09:21:59","2021-03-19 09:21:59" 4 | -------------------------------------------------------------------------------- /database/seeders/csv/layouts.csv: -------------------------------------------------------------------------------- 1 | id,name,layout,slug,created_at,updated_at,deleted_at,created_by,updated_by,deleted_by 2 | "1","1 Column","col-12","1-column","2021-03-19 09:19:59","2021-03-19 09:19:59","","2","2", 3 | "2","2 Columns","col-md-6","2-columns","2021-03-19 09:20:15","2021-03-19 09:20:15","","2","2", 4 | "3","3 Columns","col-md-4","3-columns","2021-03-19 09:20:32","2021-03-19 09:20:32","","2","2", 5 | "4","4 Columns","col-md-3","4-columns","2021-03-19 09:20:48","2021-03-19 09:20:48","","2","2", 6 | "5","Include Contact Form & Details","contact","include-contact-form-and-details","2021-03-19 09:21:16","2021-03-19 09:21:16","","2","2", 7 | "6","Include Articles","articles","include-articles","2021-03-19 09:21:35","2021-03-19 09:21:35","","2","2", 8 | "7","Include Products","products","include-products","2021-03-19 09:21:59","2021-03-19 09:21:59","","2","2", 9 | -------------------------------------------------------------------------------- /database/seeders/csv/roles.csv: -------------------------------------------------------------------------------- 1 | id,icon,name,slug,keyword,summary,created_at,updated_at,deleted_at,created_by,updated_by,deleted_by 2 | "1","user","User","/","user",,"2020-01-23 14:23:30","2020-01-23 14:23:30",,"0","0", 3 | "2","user-secret","Admin","/admin","admin",,"2020-01-23 14:23:30","2020-01-23 14:23:30",,"0","0", 4 | "3","comments","Admin Notifications","/admin","admin_notify",,"2020-01-23 17:32:00","2020-01-23 09:55:26",,"1","1", 5 | "4","universal-access","Developer","/admin","developer",,"2020-01-23 14:23:30","2020-01-23 14:23:30",,"0","0", 6 | -------------------------------------------------------------------------------- /database/seeders/csv/sections.csv: -------------------------------------------------------------------------------- 1 | id,sectionable_id,sectionable_type,name,layout,content,list_order,created_at,updated_at,deleted_at,created_by,updated_by,deleted_by 2 | "3","6","App\Models\Page","","faq","","","2021-01-28 10:16:38","2021-01-28 10:16:48","","2","2","" 3 | "4","14","App\Models\Page","","articles","","","2021-01-28 10:35:31","2021-01-28 10:35:31","","2","2","" 4 | "5","15","App\Models\Page","","products","","","2021-01-28 10:37:48","2021-01-28 10:37:48","","2","2","" 5 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | ./tests/Unit 10 | 11 | 12 | ./tests/Feature 13 | 14 | 15 | 16 | 17 | ./app 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /public/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | 3 | Options -MultiViews -Indexes 4 | 5 | 6 | RewriteEngine On 7 | 8 | # Handle Authorization Header 9 | RewriteCond %{HTTP:Authorization} . 10 | RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 11 | 12 | # Redirect Trailing Slashes If Not A Folder... 13 | RewriteCond %{REQUEST_FILENAME} !-d 14 | RewriteCond %{REQUEST_URI} (.+)/$ 15 | RewriteRule ^ %1 [L,R=301] 16 | 17 | # Send Requests To Front Controller... 18 | RewriteCond %{REQUEST_FILENAME} !-d 19 | RewriteCond %{REQUEST_FILENAME} !-f 20 | RewriteRule ^ index.php [L] 21 | 22 | -------------------------------------------------------------------------------- /public/css/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpocallaghan/titan-starter-website/9a3facaafb9838077b6535e5243af5b2be6bd15a/public/favicon.ico -------------------------------------------------------------------------------- /public/fonts/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /public/images/avatars/default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpocallaghan/titan-starter-website/9a3facaafb9838077b6535e5243af5b2be6bd15a/public/images/avatars/default.png -------------------------------------------------------------------------------- /public/images/avatars/female.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpocallaghan/titan-starter-website/9a3facaafb9838077b6535e5243af5b2be6bd15a/public/images/avatars/female.png -------------------------------------------------------------------------------- /public/images/avatars/male.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpocallaghan/titan-starter-website/9a3facaafb9838077b6535e5243af5b2be6bd15a/public/images/avatars/male.png -------------------------------------------------------------------------------- /public/images/avatars/ninja.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpocallaghan/titan-starter-website/9a3facaafb9838077b6535e5243af5b2be6bd15a/public/images/avatars/ninja.png -------------------------------------------------------------------------------- /public/images/logo-secondary.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpocallaghan/titan-starter-website/9a3facaafb9838077b6535e5243af5b2be6bd15a/public/images/logo-secondary.png -------------------------------------------------------------------------------- /public/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpocallaghan/titan-starter-website/9a3facaafb9838077b6535e5243af5b2be6bd15a/public/images/logo.png -------------------------------------------------------------------------------- /public/images/logo_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpocallaghan/titan-starter-website/9a3facaafb9838077b6535e5243af5b2be6bd15a/public/images/logo_small.png -------------------------------------------------------------------------------- /public/images/share.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpocallaghan/titan-starter-website/9a3facaafb9838077b6535e5243af5b2be6bd15a/public/images/share.jpg -------------------------------------------------------------------------------- /public/images/vendor/lightbox2/dist/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpocallaghan/titan-starter-website/9a3facaafb9838077b6535e5243af5b2be6bd15a/public/images/vendor/lightbox2/dist/close.png -------------------------------------------------------------------------------- /public/images/vendor/lightbox2/dist/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpocallaghan/titan-starter-website/9a3facaafb9838077b6535e5243af5b2be6bd15a/public/images/vendor/lightbox2/dist/loading.gif -------------------------------------------------------------------------------- /public/images/vendor/lightbox2/dist/next.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpocallaghan/titan-starter-website/9a3facaafb9838077b6535e5243af5b2be6bd15a/public/images/vendor/lightbox2/dist/next.png -------------------------------------------------------------------------------- /public/images/vendor/lightbox2/dist/prev.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpocallaghan/titan-starter-website/9a3facaafb9838077b6535e5243af5b2be6bd15a/public/images/vendor/lightbox2/dist/prev.png -------------------------------------------------------------------------------- /public/js/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /public/mix-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "/js/vendor/admin_compiled.js": "/js/vendor/admin_compiled.js", 3 | "/js/vendor/website_compiled.js": "/js/vendor/website_compiled.js", 4 | "/css/admin.css": "/css/admin.css", 5 | "/css/website.css": "/css/website.css", 6 | "/js/admin.js": "/js/admin.js", 7 | "/js/website.js": "/js/website.js" 8 | } 9 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /public/sounds/danger.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpocallaghan/titan-starter-website/9a3facaafb9838077b6535e5243af5b2be6bd15a/public/sounds/danger.mp3 -------------------------------------------------------------------------------- /public/sounds/info.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpocallaghan/titan-starter-website/9a3facaafb9838077b6535e5243af5b2be6bd15a/public/sounds/info.mp3 -------------------------------------------------------------------------------- /public/uploads/documents/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /public/uploads/images/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /resources/assets/js/admin.js: -------------------------------------------------------------------------------- 1 | require('./bootstrap'); 2 | 3 | window.moment = require('moment'); 4 | 5 | require('pace-js'); 6 | require('select2'); 7 | require('jquery.cookie'); 8 | 9 | require('datatables.net-dt'); 10 | require('datatables.net-bs4'); 11 | require('datatables.net-responsive-dt'); 12 | 13 | require('admin-lte'); 14 | 15 | import Sortable from 'sortablejs'; 16 | window.Sortable = Sortable; 17 | 18 | const { Dropzone } = require("dropzone"); 19 | // window.Dropzone = require('dropzone'); 20 | Dropzone.autoDiscover = false; 21 | 22 | require('lightbox2'); 23 | require('summernote/dist/summernote-bs4.js'); 24 | 25 | require('pc-bootstrap4-datetimepicker'); 26 | require('daterangepicker'); 27 | 28 | require('cropperjs'); 29 | require('jquery-cropper'); 30 | 31 | require('chart.js'); 32 | /* 33 | window.Vue = require('vue'); 34 | // const files = require.context('./', true, /\.vue$/i); 35 | // files.keys().map(key => Vue.component(key.split('/').pop().split('.')[0], files(key).default)); 36 | Vue.component('example-component', require('./components/ExampleComponent.vue').default); 37 | 38 | const app = new Vue({ 39 | el: '#app' 40 | }); 41 | */ 42 | -------------------------------------------------------------------------------- /resources/assets/js/website.js: -------------------------------------------------------------------------------- 1 | require('./bootstrap'); 2 | 3 | require('pace-js'); 4 | require('select2'); 5 | require('jquery.cookie'); 6 | 7 | require('datatables.net'); 8 | require('datatables.net-bs4'); 9 | 10 | require('lightbox2/dist/js/lightbox.js'); -------------------------------------------------------------------------------- /resources/assets/sass/titan/google_maps.scss: -------------------------------------------------------------------------------- 1 | /* 2 | |------------------------------------------ 3 | | GOOGLE MAPS - SEARCH BOX 4 | |------------------------------------------ 5 | */ 6 | #pac-input { 7 | padding: 0 11px 0 13px; 8 | margin-top: 50px; 9 | left: 10px !important; 10 | outline: none; 11 | font-family: Roboto; 12 | font-size: 15px; 13 | font-weight: 300; 14 | text-overflow: ellipsis; 15 | box-sizing: border-box; 16 | -moz-box-sizing: border-box; 17 | width: 250px; 18 | height: 32px; 19 | background-color: #fff; 20 | border: 1px solid transparent; 21 | border-radius: 2px 0 0 2px; 22 | box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3); 23 | } 24 | 25 | #pac-input:focus { 26 | border-color: #4d90fe; 27 | } 28 | -------------------------------------------------------------------------------- /resources/assets/sass/website.scss: -------------------------------------------------------------------------------- 1 | $theme-colors: ( 2 | "primary": #255d78, 3 | "secondary": #1f1f1f, 4 | "dark": #191919 5 | ); 6 | 7 | //bootstrap 8 | @import "~bootstrap"; 9 | 10 | // Font Awesome 11 | @import "~@fortawesome/fontawesome-free/scss/fontawesome"; 12 | @import "~@fortawesome/fontawesome-free/scss/solid"; 13 | @import "~@fortawesome/fontawesome-free/scss/brands"; 14 | @import "~@fortawesome/fontawesome-free/scss/regular"; 15 | 16 | //vendor packages 17 | @import "~lightbox2/dist/css/lightbox.css"; 18 | @import "~datatables.net-bs4/css/dataTables.bootstrap4.css"; 19 | 20 | // Fonts - Google Font: Source Sans Pro 21 | @import url("https://fonts.googleapis.com/css2?family=Montserrat:wght@300;400;500;600;700&display=swap"); 22 | @import url("https://fonts.googleapis.com/css2?family=Roboto+Slab:wght@400;700&display=swap"); 23 | 24 | // website theme 25 | @import "website/overrides"; 26 | -------------------------------------------------------------------------------- /resources/views/admin/analytics/demographics.blade.php: -------------------------------------------------------------------------------- 1 | @extends('admin.admin') 2 | 3 | @section('content') 4 | {{-- demographics --}} 5 |
6 |
7 | @include('admin.analytics.partials.gender') 8 |
9 | 10 |
11 | @include('admin.analytics.partials.age') 12 |
13 |
14 | @endsection -------------------------------------------------------------------------------- /resources/views/admin/analytics/devices.blade.php: -------------------------------------------------------------------------------- 1 | @extends('admin.admin') 2 | 3 | @section('content') 4 | {{-- devices + browsers --}} 5 |
6 |
7 | @include('admin.analytics.partials.devices_category') 8 |
9 | 10 |
11 | @include('admin.analytics.partials.browsers') 12 |
13 |
14 | 15 |
16 |
17 | @include('admin.analytics.partials.devices') 18 |
19 |
20 | @include('admin.analytics.partials.resolution') 21 |
22 |
23 | @endsection -------------------------------------------------------------------------------- /resources/views/admin/analytics/summary.blade.php: -------------------------------------------------------------------------------- 1 | @extends('admin.admin') 2 | 3 | @section('content') 4 | @include('admin.analytics.partials.analytics_header', ['activeUsers' => true]) 5 | 6 |
7 |
8 | @include('admin.analytics.partials.visitors_views') 9 |
10 |
11 | 12 | {{-- locations + devices_category --}} 13 |
14 |
15 | @include('admin.analytics.partials.locations') 16 |
17 |
18 | @include('admin.analytics.partials.devices_category') 19 |
20 |
21 | @endsection -------------------------------------------------------------------------------- /resources/views/admin/analytics/visits_referrals.blade.php: -------------------------------------------------------------------------------- 1 | @extends('admin.admin') 2 | 3 | @section('content') 4 | {{-- most visited and referrers --}} 5 |
6 |
7 | @include('admin.analytics.partials.visited_pages') 8 |
9 | 10 |
11 | @include('admin.analytics.partials.referrers') 12 |
13 |
14 | 15 |
16 |
17 | @include('admin.analytics.partials.session_group') 18 |
19 |
20 | @endsection -------------------------------------------------------------------------------- /resources/views/admin/articles/categories/index.blade.php: -------------------------------------------------------------------------------- 1 | @extends('admin.admin') 2 | 3 | @section('content') 4 | 5 |
6 |
7 |

List All Article Categories

8 |
9 | 10 |
11 | 12 | @include('admin.partials.card.info') 13 | 14 | @include('admin.partials.card.buttons') 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | @foreach ($items as $item) 27 | 28 | 29 | 30 | 31 | 32 | 33 | @endforeach 34 | 35 |
NameSlugCreatedAction
{{ $item->name }}{{ $item->slug }}{{ format_date($item->created_at) }}{!! action_row($selectedNavigation->url, $item->id, $item->name, ['edit', 'delete']) !!}
36 |
37 |
38 | 39 | @endsection 40 | -------------------------------------------------------------------------------- /resources/views/admin/dashboard.blade.php: -------------------------------------------------------------------------------- 1 | @extends('admin.admin') 2 | 3 | @section('content') 4 | @include('admin.analytics.partials.analytics_header') 5 | 6 |
7 |
8 | @include('admin.analytics.partials.visitors_views') 9 |
10 |
11 | 12 | {{-- locations + most visited pages --}} 13 |
14 |
15 | @include('admin.analytics.partials.visited_pages') 16 |
17 | 18 |
19 | @include('admin.analytics.partials.locations') 20 |
21 |
22 | 23 |
24 |
25 | @include('admin.analytics.partials.devices') 26 |
27 |
28 | @include('admin.analytics.partials.browsers') 29 |
30 |
31 | @endsection 32 | -------------------------------------------------------------------------------- /resources/views/admin/partials/boxes/datatable_toolbar.blade.php: -------------------------------------------------------------------------------- 1 |

2 | {{ isset($title)? $title:'DataTable' }} 3 | ({{ $fromDate->format('l, d F') }} - {{ $toDate->format('l, d F') }}) 4 | 5 |

6 | 7 |
8 | 9 | 10 | 11 | 12 | 15 | 16 | 19 |
20 | 21 | @section('scripts') 22 | @parent 23 | 39 | @endsection -------------------------------------------------------------------------------- /resources/views/admin/partials/boxes/toolbar.blade.php: -------------------------------------------------------------------------------- 1 |
2 | 5 | 6 | 9 |
-------------------------------------------------------------------------------- /resources/views/admin/partials/breadcrumb.blade.php: -------------------------------------------------------------------------------- 1 | @if(isset($breadcrumbItems)) 2 |

Breadcrumb

3 |
4 | 25 |
26 | @endif 27 | -------------------------------------------------------------------------------- /resources/views/admin/partials/card/buttons.blade.php: -------------------------------------------------------------------------------- 1 |
2 | 3 | Create {{ ucfirst($resource) }} 4 | 5 | 6 | @if(isset($order) && $order === true) 7 | 8 | {{ ucfirst($resource) }} 9 | Order 10 | 11 | @endif 12 |
-------------------------------------------------------------------------------- /resources/views/admin/partials/card/info.blade.php: -------------------------------------------------------------------------------- 1 | @if($selectedNavigation) 2 | @if($selectedNavigation->{'help_'.$selectedNavigation->mode.'_title'}) 3 |
4 |

{{ $selectedNavigation->{'help_'.$selectedNavigation->mode.'_title'} }}

5 |

{!! $selectedNavigation->{'help_'.$selectedNavigation->mode.'_content'} !!}

6 |
7 | @endif 8 | @endif 9 | -------------------------------------------------------------------------------- /resources/views/admin/partials/datatables.blade.php: -------------------------------------------------------------------------------- 1 | @section('scripts') 2 | @parent 3 | 22 | @endsection -------------------------------------------------------------------------------- /resources/views/admin/partials/form/form_footer.blade.php: -------------------------------------------------------------------------------- 1 | 18 | -------------------------------------------------------------------------------- /resources/views/admin/partials/navigation.blade.php: -------------------------------------------------------------------------------- 1 |

Navigation

2 | 16 | -------------------------------------------------------------------------------- /resources/views/admin/partials/navigation/navigation_list.blade.php: -------------------------------------------------------------------------------- 1 | @foreach ($collection as $nav) 2 | 19 | @endforeach 20 | -------------------------------------------------------------------------------- /resources/views/admin/partials/pagecrumb.blade.php: -------------------------------------------------------------------------------- 1 | @if(isset($pagecrumbItems)) 2 |

Pagecrumb

3 |
4 |

5 | @foreach($pagecrumbItems as $nav) 6 | 7 | @if($loop->first) 8 | @if(strlen($nav->icon) > 2) 9 | 10 | @endif 11 | {{ $nav->name }} 12 | @else 13 | 14 | @if(strlen($nav->icon) > 2) 15 | 16 | @endif 17 | {{ $nav->name }} 18 | 19 | @endif 20 | @endforeach 21 |

22 |
23 | @endif 24 | -------------------------------------------------------------------------------- /resources/views/admin/reports/summary.blade.php: -------------------------------------------------------------------------------- 1 | @extends('admin.admin') 2 | 3 | @section('content') 4 | 5 |
6 |
7 |

8 | 9 | Summaries 10 |

11 |
12 | 13 |
14 | 15 | @include('admin.partials.card.info') 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | @foreach ($items as $item) 26 | 27 | 28 | 29 | 30 | @endforeach 31 | 32 |
DescriptionTotal
{!! $item[0] !!}{!! $item[1] !!}
33 |
34 |
35 | 36 | @endsection 37 | -------------------------------------------------------------------------------- /resources/views/admin/resources/create_edit.blade.php: -------------------------------------------------------------------------------- 1 | @extends('admin.admin') 2 | 3 | @section('content') 4 | @include('admin.resources.resourceable') 5 | @endsection -------------------------------------------------------------------------------- /resources/views/admin/resources/documents/create_edit.blade.php: -------------------------------------------------------------------------------- 1 | @extends('admin.admin') 2 | 3 | @section('content') 4 | 5 | @include('admin.resources.documents.documentable') 6 | 7 | @endsection 8 | -------------------------------------------------------------------------------- /resources/views/admin/resources/photos/create_edit.blade.php: -------------------------------------------------------------------------------- 1 | @extends('admin.admin') 2 | 3 | @section('content') 4 | 5 | @include('admin.resources.photos.photoable') 6 | 7 | @endsection 8 | -------------------------------------------------------------------------------- /resources/views/admin/resources/sections/components/form_heading.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 5 | 6 | {!! form_error_message('heading', $errors) !!} 7 |
8 |
9 | 10 |
11 |
12 | 13 | {!! form_select('heading_element', ([ 'h2' => 'Heading 2', 'h3' => 'Heading 3', 'h4' => 'Heading 4', 'h5' => 'Heading 5']), ($errors && $errors->any()? old('heading_element') : (isset($item)? $item->heading_element : 'h2')), ['class' => 'select2 form-control ' . form_error_class('heading_element', $errors)]) !!} 14 | {!! form_error_message('heading_element', $errors) !!} 15 |
16 |
17 |
18 | -------------------------------------------------------------------------------- /resources/views/admin/resources/sections/create_edit.blade.php: -------------------------------------------------------------------------------- 1 | @extends('admin.admin') 2 | 3 | @section('content') 4 | 5 |
6 |
7 | 8 | 9 | {{ isset($item)? 'Edit the ' . $item->title . ' entry': 'Create a new Section' }} 10 | 11 |
12 |
13 | 14 | @include('admin.resources.sections.collapse') 15 |
16 |
17 | 18 | @endsection 19 | -------------------------------------------------------------------------------- /resources/views/admin/resources/sections/section_components.blade.php: -------------------------------------------------------------------------------- 1 | @extends('admin.admin') 2 | 3 | @section('content') 4 | @include('admin.resources.sections.components') 5 | @endsection 6 | -------------------------------------------------------------------------------- /resources/views/admin/resources/videos/create_edit.blade.php: -------------------------------------------------------------------------------- 1 | @extends('admin.admin') 2 | 3 | @section('content') 4 | 5 | @include('admin.resources.videos.videoable') 6 | 7 | @endsection 8 | -------------------------------------------------------------------------------- /resources/views/admin/shop/features/index.blade.php: -------------------------------------------------------------------------------- 1 | @extends('admin.admin') 2 | 3 | @section('content') 4 | 5 |
6 |
7 |

8 | List All Product Features 9 |

10 |
11 | 12 |
13 | 14 | @include('admin.partials.card.info') 15 | 16 | @include('admin.partials.card.buttons') 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | @foreach ($items as $item) 28 | 29 | 30 | 31 | 32 | 33 | @endforeach 34 | 35 |
FeatureCreatedAction
{{ $item->name }}{{ $item->created_at->format('d M Y') }}{!! action_row($selectedNavigation->url, $item->id, $item->name, ['edit', 'delete']) !!}
36 |
37 |
38 | 39 | @endsection 40 | -------------------------------------------------------------------------------- /resources/views/admin/shop/searches/index.blade.php: -------------------------------------------------------------------------------- 1 | @extends('admin.admin') 2 | 3 | @section('content') 4 | 5 |
6 |
7 | @include('admin.partials.boxes.datatable_toolbar', [ 8 | 'title' => 'Top Keywords for Product searches' 9 | ]) 10 |
11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |
SlugTotal
23 |
24 |
25 | 26 | @endsection 27 | 28 | @include('admin.partials.datatables', [ 29 | 'action' => false, 30 | 'displayLength' => 25, 31 | 'options' => [ 32 | ['data' => 'slug', 'name' => 'slug'], 33 | ['data' => 'total', 'name' => 'total'], 34 | ]]) -------------------------------------------------------------------------------- /resources/views/auth/auth.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | {{ $HTMLTitle ?? config('app.name') }} 13 | 14 | 15 | 16 | @yield('styles') 17 | 18 | 19 | 20 | @yield('content') 21 | 22 | 23 | 24 | @yield('scripts') 25 | 26 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /resources/views/auth/verify.blade.php: -------------------------------------------------------------------------------- 1 | @extends('auth.auth') 2 | 3 | @section('content') 4 |
5 |
6 |
7 |
8 |
{{ __('Verify Your Email Address') }}
9 | 10 |
11 | @if (session('resent')) 12 | 15 | @endif 16 | 17 | {{ __('Before proceeding, please check your email for a verification link.') }} 18 | {{ __('If you did not receive the email') }}, 19 |
20 | @csrf 21 | . 22 |
23 |
24 |
25 |
26 |
27 |
28 | @endsection 29 | -------------------------------------------------------------------------------- /resources/views/dashboard.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 |

4 | {{ __('Dashboard') }} 5 |

6 |
7 | 8 |
9 |
10 |
11 |
12 | {{ __("You're logged in!") }} 13 |
14 |
15 |
16 |
17 |
18 | -------------------------------------------------------------------------------- /resources/views/emails/contactus_client.blade.php: -------------------------------------------------------------------------------- 1 | @component('mail::message') 2 | # Dear {!! $contactUs->fullname !!} 3 |
4 | Thank you for getting in touch!
5 | 6 | We appreciate you contacting us. We have received your message and will respond as soon as possible.
7 | 8 | Regards,
{{ config('app.name') }} 9 | @endcomponent 10 | -------------------------------------------------------------------------------- /resources/views/partials/analytics.blade.php: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/views/partials/facebook.blade.php: -------------------------------------------------------------------------------- 1 |
2 | 24 | -------------------------------------------------------------------------------- /resources/views/pdf/pdf.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | {{ isset($HTMLTitle) ? $HTMLTitle : config('app.name') }} 9 | 10 | 11 | 12 | 13 | 14 | @yield('content') 15 | 16 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/html/button.blade.php: -------------------------------------------------------------------------------- 1 | @props([ 2 | 'url', 3 | 'color' => 'primary', 4 | 'align' => 'center', 5 | ]) 6 | 7 | 8 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/html/footer.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/html/header.blade.php: -------------------------------------------------------------------------------- 1 | @props(['url']) 2 | 3 | 4 | 5 | @if (trim($slot) === config('app.name')) 6 | {{ config('app.name') }} Logo 7 | @else 8 | {{ $slot }} 9 | @endif 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/html/message.blade.php: -------------------------------------------------------------------------------- 1 | 2 | {{-- Header --}} 3 | 4 | 5 | {{ config('app.name') }} 6 | 7 | 8 | 9 | {{-- Body --}} 10 | {!! $slot !!} 11 | 12 | {{-- Subcopy --}} 13 | @isset($subcopy) 14 | 15 | 16 | {!! $subcopy !!} 17 | 18 | 19 | @endisset 20 | 21 | {{-- Footer --}} 22 | 23 | 24 | © {{ date('Y') }} {{ config('app.name') }}. @lang('All rights reserved.') 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/html/panel.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/html/subcopy.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/html/table.blade.php: -------------------------------------------------------------------------------- 1 |
2 | {{ Illuminate\Mail\Markdown::parse($slot) }} 3 |
4 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/text/button.blade.php: -------------------------------------------------------------------------------- 1 | {{ $slot }}: {{ $url }} 2 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/text/footer.blade.php: -------------------------------------------------------------------------------- 1 | {{ $slot }} 2 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/text/header.blade.php: -------------------------------------------------------------------------------- 1 | [{{ $slot }}]({{ $url }}) 2 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/text/layout.blade.php: -------------------------------------------------------------------------------- 1 | {!! strip_tags($header) !!} 2 | 3 | {!! strip_tags($slot) !!} 4 | @isset($subcopy) 5 | 6 | {!! strip_tags($subcopy) !!} 7 | @endisset 8 | 9 | {!! strip_tags($footer) !!} 10 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/text/message.blade.php: -------------------------------------------------------------------------------- 1 | 2 | {{-- Header --}} 3 | 4 | 5 | {{ config('app.name') }} 6 | 7 | 8 | 9 | {{-- Body --}} 10 | {{ $slot }} 11 | 12 | {{-- Subcopy --}} 13 | @isset($subcopy) 14 | 15 | 16 | {{ $subcopy }} 17 | 18 | 19 | @endisset 20 | 21 | {{-- Footer --}} 22 | 23 | 24 | © {{ date('Y') }} {{ config('app.name') }}. @lang('All rights reserved.') 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/text/panel.blade.php: -------------------------------------------------------------------------------- 1 | {{ $slot }} 2 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/text/subcopy.blade.php: -------------------------------------------------------------------------------- 1 | {{ $slot }} 2 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/text/table.blade.php: -------------------------------------------------------------------------------- 1 | {{ $slot }} 2 | -------------------------------------------------------------------------------- /resources/views/vendor/notifications/email.blade.php: -------------------------------------------------------------------------------- 1 | 2 | {{-- Greeting --}} 3 | @if (! empty($greeting)) 4 | # {{ $greeting }} 5 | @else 6 | @if ($level === 'error') 7 | # @lang('Whoops!') 8 | @else 9 | # @lang('Hello!') 10 | @endif 11 | @endif 12 | 13 | {{-- Intro Lines --}} 14 | @foreach ($introLines as $line) 15 | {!! $line !!}
16 | @endforeach 17 | 18 | {{-- Action Button --}} 19 | @isset($actionText) 20 | $level, 23 | default => 'primary', 24 | }; 25 | ?> 26 | 27 | {{ $actionText }} 28 | 29 | @endisset 30 | 31 | {{-- Outro Lines --}} 32 | @foreach ($outroLines as $line) 33 | {!! $line !!}
34 | @endforeach 35 | 36 | {{-- Salutation --}} 37 | @if (! empty($salutation)) 38 | {!! $salutation !!} 39 | @else 40 | @lang('Regards'),
41 | {{ config('app.name') }} 42 | @endif 43 | 44 | {{-- Subcopy --}} 45 | @isset($actionText) 46 | 47 | @lang( 48 | "If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\n". 49 | 'into your web browser:', 50 | [ 51 | 'actionText' => $actionText, 52 | ] 53 | ) [{{ $displayableActionUrl }}]({{ $actionUrl }}) 54 | 55 | @endisset 56 |
57 | -------------------------------------------------------------------------------- /resources/views/website/articles/index.blade.php: -------------------------------------------------------------------------------- 1 | @extends('website.website') 2 | 3 | @section('content') 4 |
5 | 6 | @include('website.partials.page_header') 7 | 8 |
9 |
10 | 11 | @include('website.pages.page_components', ['item' => $page]) 12 | 13 |
14 | 15 | @include('website.partials.page_side') 16 |
17 | 18 |
19 | 20 | @endsection 21 | 22 | @section('scripts') 23 | @parent 24 | 30 | @endsection 31 | -------------------------------------------------------------------------------- /resources/views/website/articles/pagination.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
3 | @foreach($paginator as $item) 4 |
5 |
6 | {{ $item->name }} 7 |
8 |

{!! $item->name !!}

9 |

{!! $item->summary !!}

10 | 11 |
12 | 20 |
21 |
22 | @endforeach 23 |
24 | @include('website.partials.paginator_footer') 25 |
26 | -------------------------------------------------------------------------------- /resources/views/website/pages/page_content.blade.php: -------------------------------------------------------------------------------- 1 | @if(!$content->media) 2 | @if($content->content && strlen($content->content) > 15) 3 | 4 | {!! $content->content !!} 5 | 6 | @endif 7 | @else 8 |
9 |
10 |
11 | 12 | 13 | 14 |
{!! $content->caption !!}
15 |
16 |
17 | 18 | @if($content->content && strlen($content->content) > 15) 19 |
20 | {!! $content->content !!} 21 |
22 | @endif 23 |
24 | 25 | @endif 26 | -------------------------------------------------------------------------------- /resources/views/website/pages/page_documents.blade.php: -------------------------------------------------------------------------------- 1 | @if($content->documents && $content->documents->count() > 0) 2 | 12 | @endif 13 | -------------------------------------------------------------------------------- /resources/views/website/pages/page_gallery.blade.php: -------------------------------------------------------------------------------- 1 | @if($content->photos && $content->photos->count() > 0) 2 | 16 | @endif 17 | -------------------------------------------------------------------------------- /resources/views/website/pages/page_heading.blade.php: -------------------------------------------------------------------------------- 1 | @if($content->heading) 2 | <{{$content->heading_element}}> 3 | {!! $content->heading !!} 4 | heading_element}}> 5 | @endif -------------------------------------------------------------------------------- /resources/views/website/pages/page_videos.blade.php: -------------------------------------------------------------------------------- 1 | @if($content->videos && $content->videos->count() > 0) 2 | 26 | @endif 27 | -------------------------------------------------------------------------------- /resources/views/website/partials/breadcrumb.blade.php: -------------------------------------------------------------------------------- 1 | @if(isset($breadcrumbItems)) 2 | @if($page->id != 1) 3 | 14 | @endif 15 | @endif 16 | -------------------------------------------------------------------------------- /resources/views/website/partials/form/feedback.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
3 | 6 |
7 |
-------------------------------------------------------------------------------- /resources/views/website/partials/navigation/sub_level.blade.php: -------------------------------------------------------------------------------- 1 | @foreach ($collection as $nav) 2 | 3 | @if($nav->icon) 4 | 5 | @endif 6 | {!! $nav->name !!} 7 | 8 | 9 | @if (isset($navigation[$nav->id])) 10 | 13 | @endif 14 | @endforeach 15 | -------------------------------------------------------------------------------- /resources/views/website/partials/navigation/top_level.blade.php: -------------------------------------------------------------------------------- 1 | @foreach ($collection as $nav) 2 | 16 | @endforeach 17 | 18 | -------------------------------------------------------------------------------- /resources/views/website/partials/page_header.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
6 | @include('website.partials.breadcrumb') 7 |
8 |
-------------------------------------------------------------------------------- /resources/views/website/partials/page_side.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

Popular Links

5 | 10 |
11 |
12 | 13 | @include('website.partials.side_articles') 14 |
15 | -------------------------------------------------------------------------------- /resources/views/website/partials/paginator_footer.blade.php: -------------------------------------------------------------------------------- 1 | @if($paginator->total() > 0) 2 | 26 | @endif -------------------------------------------------------------------------------- /resources/views/website/partials/social_share.blade.php: -------------------------------------------------------------------------------- 1 |
2 |

SHARE: 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |

11 |
-------------------------------------------------------------------------------- /resources/views/website/shop/pagination.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
3 | @foreach($paginator as $item) 4 | @include('website.shop.list_item', ['product' => $item, 'productClass' => 'col-sm-6 col-lg-4', 'backgroundImage' => true]) 5 | @endforeach 6 |
7 | @if($paginator->total() > 0) 8 | @include('website.partials.paginator_footer') 9 | @endif 10 |
11 | -------------------------------------------------------------------------------- /routes/channels.php: -------------------------------------------------------------------------------- 1 | id === (int) $id; 18 | }); 19 | -------------------------------------------------------------------------------- /routes/console.php: -------------------------------------------------------------------------------- 1 | comment(Inspiring::quote()); 19 | })->purpose('Display an inspiring quote'); 20 | -------------------------------------------------------------------------------- /storage/app/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !public/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /storage/app/public/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/.gitignore: -------------------------------------------------------------------------------- 1 | compiled.php 2 | config.php 3 | down 4 | events.scanned.php 5 | maintenance.php 6 | routes.php 7 | routes.scanned.php 8 | schedule-* 9 | services.json 10 | -------------------------------------------------------------------------------- /storage/framework/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !data/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /storage/framework/cache/data/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/sessions/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/testing/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/views/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/logs/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /tests/CreatesApplication.php: -------------------------------------------------------------------------------- 1 | make(Kernel::class)->bootstrap(); 18 | 19 | return $app; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /tests/Feature/Auth/AuthenticationTest.php: -------------------------------------------------------------------------------- 1 | get('/login'); 17 | 18 | $response->assertStatus(200); 19 | } 20 | 21 | public function test_users_can_authenticate_using_the_login_screen(): void 22 | { 23 | $user = User::factory()->create(); 24 | 25 | $response = $this->post('/login', [ 26 | 'email' => $user->email, 27 | 'password' => 'password', 28 | ]); 29 | 30 | $this->assertAuthenticated(); 31 | $response->assertRedirect(RouteServiceProvider::HOME); 32 | } 33 | 34 | public function test_users_can_not_authenticate_with_invalid_password(): void 35 | { 36 | $user = User::factory()->create(); 37 | 38 | $this->post('/login', [ 39 | 'email' => $user->email, 40 | 'password' => 'wrong-password', 41 | ]); 42 | 43 | $this->assertGuest(); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /tests/Feature/Auth/PasswordConfirmationTest.php: -------------------------------------------------------------------------------- 1 | create(); 16 | 17 | $response = $this->actingAs($user)->get('/confirm-password'); 18 | 19 | $response->assertStatus(200); 20 | } 21 | 22 | public function test_password_can_be_confirmed(): void 23 | { 24 | $user = User::factory()->create(); 25 | 26 | $response = $this->actingAs($user)->post('/confirm-password', [ 27 | 'password' => 'password', 28 | ]); 29 | 30 | $response->assertRedirect(); 31 | $response->assertSessionHasNoErrors(); 32 | } 33 | 34 | public function test_password_is_not_confirmed_with_invalid_password(): void 35 | { 36 | $user = User::factory()->create(); 37 | 38 | $response = $this->actingAs($user)->post('/confirm-password', [ 39 | 'password' => 'wrong-password', 40 | ]); 41 | 42 | $response->assertSessionHasErrors(); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /tests/Feature/Auth/RegistrationTest.php: -------------------------------------------------------------------------------- 1 | get('/register'); 16 | 17 | $response->assertStatus(200); 18 | } 19 | 20 | public function test_new_users_can_register(): void 21 | { 22 | $response = $this->post('/register', [ 23 | 'name' => 'Test User', 24 | 'email' => 'test@example.com', 25 | 'password' => 'password', 26 | 'password_confirmation' => 'password', 27 | ]); 28 | 29 | $this->assertAuthenticated(); 30 | $response->assertRedirect(RouteServiceProvider::HOME); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /tests/Feature/Controllers/Admin/Accounts/AdministratorsTest.php: -------------------------------------------------------------------------------- 1 | get($this->path)->assertRedirect($this->loginPath); 22 | } 23 | 24 | /** @test */ 25 | public function authenticated_user_can_view() 26 | { 27 | $this->signInAdmin(); 28 | 29 | $this->get($this->path)->assertStatus(200)->assertViewIs($this->viewPath); 30 | } 31 | 32 | /** @test */ 33 | public function list_items() 34 | { 35 | $this->signInAdmin(); 36 | $user = User::find(1); 37 | 38 | $response = $this->get($this->path); 39 | 40 | $response->assertStatus(200); 41 | $response->assertViewHas('items'); 42 | $response->assertSee($user->fullname); 43 | $response->assertSee($user->cellphone); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /tests/Feature/ExampleTest.php: -------------------------------------------------------------------------------- 1 | get('/'); 16 | 17 | $response->assertStatus(200); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /tests/Unit/ExampleTest.php: -------------------------------------------------------------------------------- 1 | assertTrue(true); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /tests/Unit/Models/BannerTest.php: -------------------------------------------------------------------------------- 1 | count(5)->create(); 18 | 19 | $rolesList = Banner::getAllList(); 20 | 21 | $this->assertCount(5, $rolesList); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /tests/Unit/Models/RoleTest.php: -------------------------------------------------------------------------------- 1 | make([ 16 | 'name' => 'Role', 17 | 'slug' => '/role', 18 | ]); 19 | 20 | $this->assertEquals('Role (/role)', $role->name_slug); 21 | } 22 | 23 | /** @test */ 24 | public function can_get_icon_title() 25 | { 26 | $role = Role::factory()->make([ 27 | 'name' => 'Role', 28 | 'icon' => 'smile', 29 | ]); 30 | 31 | $this->assertEquals(' Role', $role->icon_title); 32 | } 33 | 34 | ///** @test */ 35 | //public function can_get_all_list() 36 | //{ 37 | // $roles = factory(Role::class, 5)->make(); 38 | // 39 | // $rolesList = Role::getAllLists(); 40 | // 41 | // $this->assertCount(5, $rolesList); 42 | //} 43 | } 44 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite'; 2 | import laravel from 'laravel-vite-plugin'; 3 | 4 | export default defineConfig({ 5 | plugins: [ 6 | laravel({ 7 | input: [ 8 | 'resources/css/app.css', 9 | 'resources/js/app.js', 10 | ], 11 | refresh: true, 12 | }), 13 | ], 14 | }); 15 | --------------------------------------------------------------------------------