├── .babelrc ├── .editorconfig ├── .env.example ├── .eslintrc.js ├── .gitattributes ├── .gitignore ├── .prettierrc.json ├── .styleci.yml ├── CODE_OF_CONDUCT.md ├── LICENSE ├── README.md ├── app ├── Actions │ ├── Fortify │ │ ├── CreateNewUser.php │ │ ├── PasswordValidationRules.php │ │ ├── ResetUserPassword.php │ │ ├── UpdateUserPassword.php │ │ └── UpdateUserProfileInformation.php │ └── Jetstream │ │ ├── AddTeamMember.php │ │ ├── CreateTeam.php │ │ ├── DeleteTeam.php │ │ ├── DeleteUser.php │ │ ├── InviteTeamMember.php │ │ ├── RemoveTeamMember.php │ │ └── UpdateTeamName.php ├── Console │ └── Kernel.php ├── Exceptions │ └── Handler.php ├── Http │ ├── Controllers │ │ ├── Controller.php │ │ ├── DemoContentController.php │ │ ├── PermissionGroupController.php │ │ └── Settings │ │ │ ├── PermissionController.php │ │ │ ├── RoleController.php │ │ │ ├── SystemController.php │ │ │ └── UserController.php │ ├── Kernel.php │ ├── Middleware │ │ ├── Authenticate.php │ │ ├── EncryptCookies.php │ │ ├── HandleInertiaRequests.php │ │ ├── LocalizationMiddleware.php │ │ ├── PreventRequestsDuringMaintenance.php │ │ ├── RedirectIfAuthenticated.php │ │ ├── TrimStrings.php │ │ ├── TrustHosts.php │ │ ├── TrustProxies.php │ │ └── VerifyCsrfToken.php │ ├── Requests │ │ ├── StorePermissionGroupRequest.php │ │ └── UpdatePermissionGroupRequest.php │ └── Resources │ │ └── DemoContentResource.php ├── Models │ ├── DemoContent.php │ ├── Membership.php │ ├── PermissionGroup.php │ ├── Team.php │ ├── TeamInvitation.php │ └── User.php ├── Policies │ ├── DemoContentPolicy.php │ ├── PermissionGroupPolicy.php │ └── TeamPolicy.php └── Providers │ ├── AppServiceProvider.php │ ├── AuthServiceProvider.php │ ├── BroadcastServiceProvider.php │ ├── EventServiceProvider.php │ ├── FortifyServiceProvider.php │ ├── JetstreamServiceProvider.php │ └── RouteServiceProvider.php ├── artisan ├── bootstrap ├── app.php └── cache │ └── .gitignore ├── composer.json ├── composer.lock ├── config ├── app.php ├── auth.php ├── broadcasting.php ├── cache.php ├── cors.php ├── database.php ├── debugbar.php ├── filesystems.php ├── fortify.php ├── hashing.php ├── jetstream.php ├── logging.php ├── mail.php ├── permission.php ├── queue.php ├── sanctum.php ├── services.php ├── session.php └── view.php ├── database ├── .gitignore ├── factories │ ├── DemoContentFactory.php │ ├── PermissionGroupFactory.php │ ├── TeamFactory.php │ └── UserFactory.php ├── migrations │ ├── 2014_10_12_000000_create_users_table.php │ ├── 2014_10_12_100000_create_password_resets_table.php │ ├── 2014_10_12_200000_add_two_factor_columns_to_users_table.php │ ├── 2019_08_19_000000_create_failed_jobs_table.php │ ├── 2019_12_14_000001_create_personal_access_tokens_table.php │ ├── 2020_05_21_100000_create_teams_table.php │ ├── 2020_05_21_200000_create_team_user_table.php │ ├── 2020_05_21_300000_create_team_invitations_table.php │ ├── 2021_07_16_121843_create_permission_tables.php │ ├── 2021_11_10_062603_create_demo_contents_table.php │ ├── 2022_01_04_065711_create_sessions_table.php │ ├── 2022_01_20_204151_add_group_columns_to_permissions_table.php │ └── 2022_01_20_204743_create_permission_groups_table.php └── seeders │ ├── DatabaseSeeder.php │ ├── PermissionGroupSeeder.php │ ├── PermissionSeeder.php │ ├── RoleSeeder.php │ └── UserSeeder.php ├── docker-compose.yml ├── mix-manifest.json ├── package-lock.json ├── package.json ├── phpunit.xml ├── public ├── .htaccess ├── css │ └── app.css ├── favicon.ico ├── img │ ├── brown-logo.svg │ ├── dark-logo.svg │ ├── demo │ │ ├── discord.svg │ │ ├── forgot_1_gradient.jpg │ │ ├── forgot_2_gray.jpg │ │ ├── forgot_3_blue.jpg │ │ ├── lock_1_gradient.jpg │ │ ├── lock_2_gray.jpg │ │ ├── lock_3_blue.jpg │ │ ├── login_1_gradient.jpg │ │ ├── login_2_gray.jpg │ │ ├── login_3_blue.jpg │ │ ├── register_1_gradient.jpg │ │ ├── register_2_gray.jpg │ │ └── register_3_blue.jpg │ ├── light-logo.svg │ ├── rose-logo.svg │ └── samples │ │ ├── bgFakurianDesign-nY14Fs8pxT8-unsplash-compressed.jpg │ │ ├── bgFakurianDesign-nY14Fs8pxT8-unsplash.jpg │ │ ├── bgGeorgieCobbs-muOHbrFGEQY-unsplash.jpg │ │ ├── dummyAvatar.svg │ │ └── imgMelBaylon-6WLcOFn4HKE-unsplash.jpg ├── index.php ├── js │ ├── app.js │ └── app.js.LICENSE.txt ├── mix-manifest.json └── robots.txt ├── resources ├── css │ ├── app.css │ ├── components │ │ ├── alert.css │ │ ├── auth.css │ │ ├── avatar.css │ │ ├── backEndTablePagination.css │ │ ├── badge.css │ │ ├── breadcrumb.css │ │ ├── button.css │ │ ├── collapsible.css │ │ ├── content-box.css │ │ ├── dropdown.css │ │ ├── grid.css │ │ ├── input.css │ │ ├── list.css │ │ ├── loading.css │ │ ├── modal.css │ │ ├── pagination.css │ │ ├── progress.css │ │ ├── radius.css │ │ ├── statistic-box.css │ │ ├── tab.css │ │ ├── table.css │ │ ├── toastr.css │ │ ├── tooltip.css │ │ └── vertical-menu.css │ ├── layout │ │ ├── footer.css │ │ ├── full-screen-layout.css │ │ ├── main-menu.css │ │ ├── main.css │ │ ├── top-bar.css │ │ └── top-menu.css │ └── misc │ │ ├── effect.css │ │ └── highlighter.css ├── js │ ├── Components │ │ ├── Alert │ │ │ └── TAlert.vue │ │ ├── Auth │ │ │ ├── TForgot.vue │ │ │ ├── TLock.vue │ │ │ ├── TLogin.vue │ │ │ └── TRegister.vue │ │ ├── Avatar │ │ │ ├── TAvatar.vue │ │ │ └── TAvatarGroup.vue │ │ ├── Badge │ │ │ └── TBadge.vue │ │ ├── Breadcrumb │ │ │ └── TBreadcrumb.vue │ │ ├── Button │ │ │ └── TButton.vue │ │ ├── Card │ │ │ ├── TContentCard.vue │ │ │ └── TStatisticWidget.vue │ │ ├── Chart │ │ │ ├── TBarChart.vue │ │ │ ├── TDoughnutChart.vue │ │ │ ├── TLineChart.vue │ │ │ ├── TPieChart.vue │ │ │ ├── TPolarChart.vue │ │ │ └── TRadarChart.vue │ │ ├── Code │ │ │ └── TCodeShowcase.vue │ │ ├── Collapsible │ │ │ ├── TCollapsible.vue │ │ │ └── TCollapsibleItem.vue │ │ ├── Dropdown │ │ │ ├── TDropdown.vue │ │ │ └── TDropdownItem.vue │ │ ├── Form │ │ │ ├── Inputs │ │ │ │ ├── TInputBetween.vue │ │ │ │ ├── TInputCheckBox.vue │ │ │ │ ├── TInputDate.vue │ │ │ │ ├── TInputFile.vue │ │ │ │ ├── TInputInlineEditableRepeatable.vue │ │ │ │ ├── TInputMultiSelect.vue │ │ │ │ ├── TInputRadioButton.vue │ │ │ │ ├── TInputRepeatable.vue │ │ │ │ ├── TInputSelect.vue │ │ │ │ ├── TInputText.vue │ │ │ │ └── TInputTextArea.vue │ │ │ ├── TError.vue │ │ │ ├── TFormContent.vue │ │ │ ├── TFormSection.vue │ │ │ └── TInputGroup.vue │ │ ├── Icon │ │ │ ├── TAdjustmentsIcon.vue │ │ │ ├── TAudioIcon.vue │ │ │ ├── TBanIcon.vue │ │ │ ├── TBellIcon.vue │ │ │ ├── TCalendarIcon.vue │ │ │ ├── TCashIcon.vue │ │ │ ├── TCheckCircleIcon.vue │ │ │ ├── TCheckCircleSolidIcon.vue │ │ │ ├── TCheckIcon.vue │ │ │ ├── TChevronDoubleDownIcon.vue │ │ │ ├── TChevronDownIcon.vue │ │ │ ├── TChevronLeftIcon.vue │ │ │ ├── TChevronRightIcon.vue │ │ │ ├── TChevronUpIcon.vue │ │ │ ├── TClockIcon.vue │ │ │ ├── TCogIcon.vue │ │ │ ├── TCollectionIcon.vue │ │ │ ├── TDocumentIcon.vue │ │ │ ├── TDotsVerticalIcon.vue │ │ │ ├── TEyeIcon.vue │ │ │ ├── TGitHubIcon.vue │ │ │ ├── THamburgerMenuTriggerIcon.vue │ │ │ ├── TInformationCircleIcon.vue │ │ │ ├── TInformationIcon.vue │ │ │ ├── TLogOutIcon.vue │ │ │ ├── TLogo.vue │ │ │ ├── TPaperClipIcon.vue │ │ │ ├── TPencilAltIcon.vue │ │ │ ├── TPlusCircleIcon.vue │ │ │ ├── TPlusIcon.vue │ │ │ ├── TRefreshIcon.vue │ │ │ ├── TSearchCircleIcon.vue │ │ │ ├── TSearchIcon.vue │ │ │ ├── TShieldCheckIcon.vue │ │ │ ├── TShieldCheckSolidIcon.vue │ │ │ ├── TShoppingBagIcon.vue │ │ │ ├── TStarIcon.vue │ │ │ ├── TStarSolidIcon.vue │ │ │ ├── TTrashIcon.vue │ │ │ ├── TUserCircleIcon.vue │ │ │ ├── TUserGroupIcon.vue │ │ │ ├── TVideoIcon.vue │ │ │ ├── TXCircleIcon.vue │ │ │ └── TXIcon.vue │ │ ├── List │ │ │ ├── TList.vue │ │ │ └── TListItem.vue │ │ ├── Loading │ │ │ ├── Animations │ │ │ │ ├── TLoadingAnimationCogs.vue │ │ │ │ ├── TLoadingAnimationThreeBars.vue │ │ │ │ └── TLoadingAnimationThreeDots.vue │ │ │ └── TLoading.vue │ │ ├── Misc │ │ │ ├── TComponentRadiusSelector.vue │ │ │ ├── TComponentStyleSelector.vue │ │ │ └── TComponentWidthSelector.vue │ │ ├── Modal │ │ │ └── TModal.vue │ │ ├── Paginate │ │ │ ├── TBackEndTablePaginate.vue │ │ │ └── TPaginate.vue │ │ ├── Progress │ │ │ └── TProgress.vue │ │ ├── Tab │ │ │ └── TTab.vue │ │ ├── Table │ │ │ ├── TBackEndTable.vue │ │ │ ├── TTable.vue │ │ │ └── TTableActionDropdown.vue │ │ ├── Toastr │ │ │ └── TToastr.vue │ │ └── Tooltip │ │ │ └── TTooltip.vue │ ├── Functions │ │ ├── darkMode.js │ │ ├── deviceInfoCollector.js │ │ ├── langChooser.js │ │ ├── menuTrigger.js │ │ └── windowSizeCalculator.js │ ├── Jetstream │ │ ├── ActionMessage.vue │ │ ├── ActionSection.vue │ │ ├── ApplicationLogo.vue │ │ ├── ApplicationMark.vue │ │ ├── AuthenticationCard.vue │ │ ├── AuthenticationCardLogo.vue │ │ ├── Banner.vue │ │ ├── Button.vue │ │ ├── Checkbox.vue │ │ ├── ConfirmationModal.vue │ │ ├── ConfirmsPassword.vue │ │ ├── DangerButton.vue │ │ ├── DialogModal.vue │ │ ├── Dropdown.vue │ │ ├── DropdownLink.vue │ │ ├── FormSection.vue │ │ ├── Input.vue │ │ ├── InputError.vue │ │ ├── Label.vue │ │ ├── Modal.vue │ │ ├── NavLink.vue │ │ ├── ResponsiveNavLink.vue │ │ ├── SecondaryButton.vue │ │ ├── SectionBorder.vue │ │ ├── SectionTitle.vue │ │ ├── ValidationErrors.vue │ │ └── Welcome.vue │ ├── Lang │ │ ├── Flags │ │ │ ├── flagBg.vue │ │ │ ├── flagDe.vue │ │ │ ├── flagEn.vue │ │ │ ├── flagFr.vue │ │ │ ├── flagRu.vue │ │ │ ├── flagTr.vue │ │ │ └── flagZh.vue │ │ ├── bg │ │ │ ├── auth_lang_bg.js │ │ │ ├── general_lang_bg.js │ │ │ ├── main_menu_lang_bg.js │ │ │ ├── notification_lang_bg.js │ │ │ └── user_menu_lang_bg.js │ │ ├── de │ │ │ ├── auth_lang_de.js │ │ │ ├── general_lang_de.js │ │ │ ├── main_menu_lang_de.js │ │ │ ├── notification_lang_de.js │ │ │ └── user_menu_lang_de.js │ │ ├── en │ │ │ ├── auth_lang_en.js │ │ │ ├── general_lang_en.js │ │ │ ├── main_menu_lang_en.js │ │ │ ├── notification_lang_en.js │ │ │ ├── pagination_lang.js │ │ │ ├── table_lang.js │ │ │ └── user_menu_lang_en.js │ │ ├── fr │ │ │ ├── auth_lang_fr.js │ │ │ ├── general_lang_fr.js │ │ │ ├── main_menu_lang_fr.js │ │ │ ├── notification_lang_fr.js │ │ │ └── user_menu_lang_fr.js │ │ ├── languages.js │ │ ├── ru │ │ │ ├── auth_lang_ru.js │ │ │ ├── general_lang_ru.js │ │ │ ├── main_menu_lang_ru.js │ │ │ ├── notification_lang_ru.js │ │ │ └── user_menu_lang_ru.js │ │ ├── tr │ │ │ ├── auth_lang_tr.js │ │ │ ├── general_lang_tr.js │ │ │ ├── main_menu_lang_tr.js │ │ │ ├── notification_lang_tr.js │ │ │ ├── pagination_lang.js │ │ │ ├── table_lang.js │ │ │ └── user_menu_lang_tr.js │ │ └── zh │ │ │ ├── auth_lang_zh.js │ │ │ ├── general_lang_zh.js │ │ │ ├── main_menu_lang_zh.js │ │ │ ├── notification_lang_zh.js │ │ │ └── user_menu_lang_zh.js │ ├── Layouts │ │ ├── AppLayout-new.vue │ │ ├── AppLayout.vue │ │ ├── FullScreenLayout.vue │ │ ├── GridSection.vue │ │ ├── InitialVerticalMenu.vue │ │ ├── LockScreen.vue │ │ ├── MainMenu.vue │ │ ├── MainMenu │ │ │ ├── Abay │ │ │ │ ├── MainMenu.vue │ │ │ │ └── UserMenu.vue │ │ │ └── Umay │ │ │ │ ├── MainMenu.vue │ │ │ │ ├── MainMenuItem.vue │ │ │ │ └── Umay.vue │ │ └── TopMenu │ │ │ ├── TopMenu.vue │ │ │ ├── TopMenuLanguageSelector.vue │ │ │ ├── TopMenuNotification.vue │ │ │ ├── TopMenuThemeSelector.vue │ │ │ └── TopMenuUserMenu.vue │ ├── Mixins │ │ ├── Styles │ │ │ ├── bgColorStyles.js │ │ │ ├── contentCardStyleMixin.js │ │ │ ├── forgotPasswordStyleMixin.js │ │ │ ├── fullScreenCardStyleMixin.js │ │ │ ├── gridStyleMixin.js │ │ │ ├── inputGroupStyleMixin.js │ │ │ ├── listStyleMixin.js │ │ │ ├── lockStyleMixin.js │ │ │ ├── loginStyleMixin.js │ │ │ ├── modalStyleMixin.js │ │ │ ├── paginateStyleMixin.js │ │ │ ├── registerStyleMixin.js │ │ │ ├── statisticWidgetStyleMixin.js │ │ │ ├── tabStyleMixin.js │ │ │ ├── toastrStyleMixin.js │ │ │ └── tooltipStyleMixin.js │ │ ├── radiusSizeMixin.js │ │ └── settingsMenuMixin.js │ ├── Pages │ │ ├── API │ │ │ ├── ApiTokenManager.vue │ │ │ ├── Index.vue │ │ │ └── Partials │ │ │ │ └── ApiTokenManager.vue │ │ ├── Auth │ │ │ ├── ConfirmPassword.vue │ │ │ ├── ForgotPassword.vue │ │ │ ├── Lock.vue │ │ │ ├── Login-new │ │ │ ├── Login.vue │ │ │ ├── Register.vue │ │ │ ├── ResetPassword.vue │ │ │ ├── TwoFactorChallenge.vue │ │ │ └── VerifyEmail.vue │ │ ├── Dashboard.vue │ │ ├── PrivacyPolicy.vue │ │ ├── Profile │ │ │ ├── DeleteUserForm.vue │ │ │ ├── LogoutOtherBrowserSessionsForm.vue │ │ │ ├── Partials │ │ │ │ ├── DeleteUserForm.vue │ │ │ │ ├── LogoutOtherBrowserSessionsForm.vue │ │ │ │ ├── TwoFactorAuthenticationForm.vue │ │ │ │ ├── UpdatePasswordForm.vue │ │ │ │ └── UpdateProfileInformationForm.vue │ │ │ ├── Show.vue │ │ │ ├── TwoFactorAuthenticationForm.vue │ │ │ ├── UpdatePasswordForm.vue │ │ │ └── UpdateProfileInformationForm.vue │ │ ├── Samples │ │ │ ├── Components │ │ │ │ ├── Alert.vue │ │ │ │ ├── Avatar.vue │ │ │ │ ├── BackEndTable.vue │ │ │ │ ├── Badge.vue │ │ │ │ ├── Breadcrumb.vue │ │ │ │ ├── Button.vue │ │ │ │ ├── Chart.vue │ │ │ │ ├── Collapsible.vue │ │ │ │ ├── ContentBox.vue │ │ │ │ ├── Dropdown.vue │ │ │ │ ├── List.vue │ │ │ │ ├── Loading.vue │ │ │ │ ├── Modal.vue │ │ │ │ ├── Paginate.vue │ │ │ │ ├── Progress.vue │ │ │ │ ├── Tab.vue │ │ │ │ ├── Table.vue │ │ │ │ ├── Toastr.vue │ │ │ │ └── Tooltip.vue │ │ │ ├── Examples │ │ │ │ ├── Auth │ │ │ │ │ ├── ForgotPassword1.vue │ │ │ │ │ ├── ForgotPassword2.vue │ │ │ │ │ ├── ForgotPassword3.vue │ │ │ │ │ ├── Lock1.vue │ │ │ │ │ ├── Lock2.vue │ │ │ │ │ ├── Lock3.vue │ │ │ │ │ ├── Login1.vue │ │ │ │ │ ├── Login2.vue │ │ │ │ │ ├── Login3.vue │ │ │ │ │ ├── Register1.vue │ │ │ │ │ ├── Register2.vue │ │ │ │ │ └── Register3.vue │ │ │ │ ├── ChatApp.vue │ │ │ │ ├── EmailApp.vue │ │ │ │ ├── ForgotPassword.vue │ │ │ │ ├── Lock.vue │ │ │ │ ├── Login.vue │ │ │ │ ├── Pricing.vue │ │ │ │ ├── Profile.vue │ │ │ │ ├── ProjectApp.vue │ │ │ │ ├── Register.vue │ │ │ │ └── TodoApp.vue │ │ │ ├── FormElements │ │ │ │ ├── DateField.vue │ │ │ │ ├── FormStructure.vue │ │ │ │ ├── InlineRepeatableField.vue │ │ │ │ ├── InputGroup.vue │ │ │ │ ├── MultiSelectInput.vue │ │ │ │ ├── RepeatableField.vue │ │ │ │ ├── SelectInput.vue │ │ │ │ ├── SimpleField.vue │ │ │ │ ├── TagInput.vue │ │ │ │ └── Validation.vue │ │ │ ├── Layouts │ │ │ │ ├── Grid.vue │ │ │ │ ├── LayoutStructure.vue │ │ │ │ └── StatisticWidget.vue │ │ │ └── Test.vue │ │ ├── Settings │ │ │ ├── Index.vue │ │ │ ├── Permission │ │ │ │ └── Index.vue │ │ │ ├── Role │ │ │ │ └── Index.vue │ │ │ ├── System.vue │ │ │ └── User.vue │ │ ├── Teams │ │ │ ├── Create.vue │ │ │ ├── CreateTeamForm.vue │ │ │ ├── DeleteTeamForm.vue │ │ │ ├── Partials │ │ │ │ ├── CreateTeamForm.vue │ │ │ │ ├── DeleteTeamForm.vue │ │ │ │ ├── TeamMemberManager.vue │ │ │ │ └── UpdateTeamNameForm.vue │ │ │ ├── Show.vue │ │ │ ├── TeamMemberManager.vue │ │ │ └── UpdateTeamNameForm.vue │ │ ├── TermsOfService.vue │ │ └── Welcome.vue │ ├── Sources │ │ ├── authScreenDesigns.js │ │ ├── icons.js │ │ └── mainMenuLinks.js │ ├── app.js │ ├── bootstrap.js │ ├── config.js │ └── language.js ├── lang │ ├── bg │ │ ├── auth.php │ │ ├── bg.json │ │ ├── pagination.php │ │ ├── passwords.php │ │ ├── validation-attributes.php │ │ ├── validation-inline.php │ │ └── validation.php │ ├── de │ │ ├── auth.php │ │ ├── de.json │ │ ├── pagination.php │ │ ├── passwords.php │ │ ├── validation-attributes.php │ │ ├── validation-inline.php │ │ └── validation.php │ ├── en │ │ ├── auth.php │ │ ├── pagination.php │ │ ├── passwords.php │ │ └── validation.php │ ├── fr │ │ ├── auth.php │ │ ├── fr.json │ │ ├── pagination.php │ │ ├── passwords.php │ │ ├── validation-attributes.php │ │ ├── validation-inline.php │ │ └── validation.php │ ├── ru │ │ ├── auth.php │ │ ├── pagination.php │ │ ├── passwords.php │ │ ├── ru.json │ │ ├── validation-attributes.php │ │ ├── validation-inline.php │ │ └── validation.php │ ├── tr │ │ ├── auth.php │ │ ├── pagination.php │ │ ├── passwords.php │ │ ├── tr.json │ │ ├── validation-attributes.php │ │ ├── validation-inline.php │ │ └── validation.php │ └── zh_CN │ │ ├── auth.php │ │ ├── pagination.php │ │ ├── passwords.php │ │ ├── validation-attributes.php │ │ ├── validation-inline.php │ │ ├── validation.php │ │ └── zh_CN.json ├── markdown │ ├── policy.md │ └── terms.md ├── sass │ └── app.scss └── views │ └── app.blade.php ├── routes ├── api.php ├── channels.php ├── console.php └── web.php ├── storage ├── app │ ├── .gitignore │ └── public │ │ └── .gitignore ├── debugbar │ └── .gitignore ├── framework │ ├── .gitignore │ ├── cache │ │ ├── .gitignore │ │ └── data │ │ │ └── .gitignore │ ├── sessions │ │ └── .gitignore │ ├── testing │ │ └── .gitignore │ └── views │ │ └── .gitignore └── logs │ └── .gitignore ├── tailwind.config.js ├── tests ├── CreatesApplication.php ├── Feature │ ├── ApiTokenPermissionsTest.php │ ├── AuthenticationTest.php │ ├── BrowserSessionsTest.php │ ├── CreateApiTokenTest.php │ ├── CreateTeamTest.php │ ├── DeleteAccountTest.php │ ├── DeleteApiTokenTest.php │ ├── DeleteTeamTest.php │ ├── EmailVerificationTest.php │ ├── ExampleTest.php │ ├── InviteTeamMemberTest.php │ ├── LeaveTeamTest.php │ ├── PasswordConfirmationTest.php │ ├── PasswordResetTest.php │ ├── ProfileInformationTest.php │ ├── RegistrationTest.php │ ├── RemoveTeamMemberTest.php │ ├── TwoFactorAuthenticationSettingsTest.php │ ├── UpdatePasswordTest.php │ ├── UpdateTeamMemberRoleTest.php │ └── UpdateTeamNameTest.php ├── TestCase.php └── Unit │ └── ExampleTest.php ├── webpack.config.js └── webpack.mix.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": ["@babel/plugin-syntax-dynamic-import"] 3 | } -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | insert_final_newline = true 7 | indent_style = space 8 | indent_size = 4 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 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | APP_NAME=Laravel 2 | APP_ENV=local 3 | APP_KEY= 4 | APP_DEBUG=true 5 | APP_URL=http://localhost 6 | 7 | LOG_CHANNEL=stack 8 | LOG_DEPRECATIONS_CHANNEL=null 9 | LOG_LEVEL=debug 10 | 11 | DB_CONNECTION=mysql 12 | DB_HOST=127.0.0.1 13 | DB_PORT=3306 14 | DB_DATABASE=test 15 | DB_USERNAME=root 16 | DB_PASSWORD= 17 | 18 | BROADCAST_DRIVER=log 19 | CACHE_DRIVER=file 20 | FILESYSTEM_DISK=local 21 | QUEUE_CONNECTION=sync 22 | SESSION_DRIVER=database 23 | SESSION_LIFETIME=120 24 | 25 | MEMCACHED_HOST=127.0.0.1 26 | 27 | REDIS_HOST=127.0.0.1 28 | REDIS_PASSWORD=null 29 | REDIS_PORT=6379 30 | 31 | MAIL_MAILER=smtp 32 | MAIL_HOST=mailhog 33 | MAIL_PORT=1025 34 | MAIL_USERNAME=null 35 | MAIL_PASSWORD=null 36 | MAIL_ENCRYPTION=null 37 | MAIL_FROM_ADDRESS=null 38 | MAIL_FROM_NAME="${APP_NAME}" 39 | 40 | AWS_ACCESS_KEY_ID= 41 | AWS_SECRET_ACCESS_KEY= 42 | AWS_DEFAULT_REGION=us-east-1 43 | AWS_BUCKET= 44 | AWS_USE_PATH_STYLE_ENDPOINT=false 45 | 46 | PUSHER_APP_ID= 47 | PUSHER_APP_KEY= 48 | PUSHER_APP_SECRET= 49 | PUSHER_APP_CLUSTER=mt1 50 | 51 | MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" 52 | MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" 53 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: [ 3 | // add more generic rulesets here, such as: 4 | 'eslint:recommended', 5 | //'plugin:vue/vue3-recommended', 6 | // 'plugin:vue/vue3-essential', // This option doesn't impose formatting rules 7 | 'plugin:vue/vue3-strongly-recommended', // This option imposes formatting rules on your code to improve readability 8 | "prettier" 9 | // Make sure "prettier" is the last element in this list. 10 | ], 11 | rules: { 12 | // override/add rules settings here, such as: 13 | // 'vue/no-unused-vars': 'error' 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 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 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /public/hot 3 | /public/storage 4 | /storage/*.key 5 | /vendor 6 | .env 7 | .env.backup 8 | .phpunit.result.cache 9 | docker-compose.override.yml 10 | Homestead.json 11 | Homestead.yaml 12 | npm-debug.log 13 | yarn-error.log 14 | /.idea 15 | /.vscode 16 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-tailwind/f5bb4199d73166dfd4cc29a739ff1437ad785bca/.prettierrc.json -------------------------------------------------------------------------------- /.styleci.yml: -------------------------------------------------------------------------------- 1 | php: 2 | preset: laravel 3 | version: 8 4 | disabled: 5 | - no_unused_imports 6 | finder: 7 | not-name: 8 | - index.php 9 | js: 10 | finder: 11 | not-name: 12 | - webpack.mix.js 13 | css: true 14 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Sinan AYDOĞAN 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/Actions/Fortify/PasswordValidationRules.php: -------------------------------------------------------------------------------- 1 | $this->passwordRules(), 24 | ])->validate(); 25 | 26 | $user->forceFill([ 27 | 'password' => Hash::make($input['password']), 28 | ])->save(); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/Actions/Fortify/UpdateUserPassword.php: -------------------------------------------------------------------------------- 1 | ['required', 'string'], 24 | 'password' => $this->passwordRules(), 25 | ])->after(function ($validator) use ($user, $input) { 26 | if (! isset($input['current_password']) || ! Hash::check($input['current_password'], $user->password)) { 27 | $validator->errors()->add('current_password', __('The provided password does not match your current password.')); 28 | } 29 | })->validateWithBag('updatePassword'); 30 | 31 | $user->forceFill([ 32 | 'password' => Hash::make($input['password']), 33 | ])->save(); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/Actions/Jetstream/CreateTeam.php: -------------------------------------------------------------------------------- 1 | authorize('create', Jetstream::newTeamModel()); 23 | 24 | Validator::make($input, [ 25 | 'name' => ['required', 'string', 'max:255'], 26 | ])->validateWithBag('createTeam'); 27 | 28 | AddingTeam::dispatch($user); 29 | 30 | $user->switchTeam($team = $user->ownedTeams()->create([ 31 | 'name' => $input['name'], 32 | 'personal_team' => false, 33 | ])); 34 | 35 | return $team; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/Actions/Jetstream/DeleteTeam.php: -------------------------------------------------------------------------------- 1 | purge(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/Actions/Jetstream/UpdateTeamName.php: -------------------------------------------------------------------------------- 1 | authorize('update', $team); 22 | 23 | Validator::make($input, [ 24 | 'name' => ['required', 'string', 'max:255'], 25 | ])->validateWithBag('updateTeamName'); 26 | 27 | $team->forceFill([ 28 | 'name' => $input['name'], 29 | ])->save(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/Console/Kernel.php: -------------------------------------------------------------------------------- 1 | command('inspire')->hourly(); 19 | } 20 | 21 | /** 22 | * Register the commands for the application. 23 | * 24 | * @return void 25 | */ 26 | protected function commands() 27 | { 28 | $this->load(__DIR__.'/Commands'); 29 | 30 | require base_path('routes/console.php'); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/Exceptions/Handler.php: -------------------------------------------------------------------------------- 1 | > 14 | */ 15 | protected $dontReport = [ 16 | // 17 | ]; 18 | 19 | /** 20 | * A list of the inputs that are never flashed for validation exceptions. 21 | * 22 | * @var array 23 | */ 24 | protected $dontFlash = [ 25 | 'current_password', 26 | 'password', 27 | 'password_confirmation', 28 | ]; 29 | 30 | /** 31 | * Register the exception handling callbacks for the application. 32 | * 33 | * @return void 34 | */ 35 | public function register() 36 | { 37 | $this->reportable(function (Throwable $e) { 38 | // 39 | }); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/Http/Controllers/Controller.php: -------------------------------------------------------------------------------- 1 | expectsJson()) { 18 | return route('login'); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /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()) { 26 | return redirect(RouteServiceProvider::HOME); 27 | } 28 | } 29 | 30 | return $next($request); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /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() 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/VerifyCsrfToken.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | // 16 | ]; 17 | } 18 | -------------------------------------------------------------------------------- /app/Http/Requests/StorePermissionGroupRequest.php: -------------------------------------------------------------------------------- 1 | $this->id, 19 | 'name' => $this->name, 20 | 'price' => $this->price, 21 | 'production_date' => $this->production_date, 22 | 'main_product_id' => $this->main_product_id, 23 | 'main_product_name' => $this->mainProduct->name, 24 | 'type' => $this->type, 25 | 'status' => $this->status, 26 | ]; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/Models/DemoContent.php: -------------------------------------------------------------------------------- 1 | 'datetime', 26 | ]; 27 | 28 | /** 29 | * Get the main demo content associated with the demo content. 30 | */ 31 | public function mainProduct(): \Illuminate\Database\Eloquent\Relations\BelongsTo 32 | { 33 | return $this->belongsTo(DemoContent::class); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/Models/Membership.php: -------------------------------------------------------------------------------- 1 | hasMany(Permission::class); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/Models/Team.php: -------------------------------------------------------------------------------- 1 | 'boolean', 22 | ]; 23 | 24 | /** 25 | * The attributes that are mass assignable. 26 | * 27 | * @var string[] 28 | */ 29 | protected $fillable = [ 30 | 'name', 31 | 'personal_team', 32 | ]; 33 | 34 | /** 35 | * The event map for the model. 36 | * 37 | * @var array 38 | */ 39 | protected $dispatchesEvents = [ 40 | 'created' => TeamCreated::class, 41 | 'updated' => TeamUpdated::class, 42 | 'deleted' => TeamDeleted::class, 43 | ]; 44 | } 45 | -------------------------------------------------------------------------------- /app/Models/TeamInvitation.php: -------------------------------------------------------------------------------- 1 | belongsTo(Jetstream::teamModel()); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/Providers/AuthServiceProvider.php: -------------------------------------------------------------------------------- 1 | TeamPolicy::class, 19 | ]; 20 | 21 | /** 22 | * Register any authentication / authorization services. 23 | * 24 | * @return void 25 | */ 26 | public function boot() 27 | { 28 | $this->registerPolicies(); 29 | 30 | // Implicitly grant "Super Admin" role all permissions 31 | // This works in the app by using gate-related functions like auth()->user->can() and @can() 32 | Gate::before(function ($user, $ability) { 33 | return $user->hasRole('Super Admin') ? true : null; 34 | }); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/Providers/BroadcastServiceProvider.php: -------------------------------------------------------------------------------- 1 | > 16 | */ 17 | protected $listen = [ 18 | Registered::class => [ 19 | SendEmailVerificationNotification::class, 20 | ], 21 | ]; 22 | 23 | /** 24 | * Register any events for your application. 25 | * 26 | * @return void 27 | */ 28 | public function boot() 29 | { 30 | // 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /bootstrap/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /config/cors.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 | ], 22 | 23 | 'postmark' => [ 24 | 'token' => env('POSTMARK_TOKEN'), 25 | ], 26 | 27 | 'ses' => [ 28 | 'key' => env('AWS_ACCESS_KEY_ID'), 29 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 30 | 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 31 | ], 32 | 33 | ]; 34 | -------------------------------------------------------------------------------- /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/DemoContentFactory.php: -------------------------------------------------------------------------------- 1 | $this->faker->randomNumber(3) . ("-" . $this->faker->colorName()), 27 | 'type' => $this->faker->randomKey(['Printer', 'Pencil', 'Clipper']), 28 | 'main_product_id' => $this->faker->numberBetween(1,50), 29 | 'price' => $this->faker->randomFloat(2,5,80), 30 | 'production_date' => $this->faker->dateTimeBetween('-5 years', 'now'), 31 | 'status' => $this->faker->boolean 32 | ]; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /database/factories/PermissionGroupFactory.php: -------------------------------------------------------------------------------- 1 | $this->faker->unique()->company(), 27 | 'user_id' => User::factory(), 28 | 'personal_team' => true, 29 | ]; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /database/migrations/2014_10_12_000000_create_users_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name'); 19 | $table->string('email')->unique(); 20 | $table->timestamp('email_verified_at')->nullable(); 21 | $table->string('password'); 22 | $table->rememberToken(); 23 | $table->foreignId('current_team_id')->nullable(); 24 | $table->string('profile_photo_path', 2048)->nullable(); 25 | $table->timestamps(); 26 | }); 27 | } 28 | 29 | /** 30 | * Reverse the migrations. 31 | * 32 | * @return void 33 | */ 34 | public function down() 35 | { 36 | Schema::dropIfExists('users'); 37 | } 38 | }; 39 | -------------------------------------------------------------------------------- /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/2014_10_12_200000_add_two_factor_columns_to_users_table.php: -------------------------------------------------------------------------------- 1 | text('two_factor_secret') 18 | ->after('password') 19 | ->nullable(); 20 | 21 | $table->text('two_factor_recovery_codes') 22 | ->after('two_factor_secret') 23 | ->nullable(); 24 | }); 25 | } 26 | 27 | /** 28 | * Reverse the migrations. 29 | * 30 | * @return void 31 | */ 32 | public function down() 33 | { 34 | Schema::table('users', function (Blueprint $table) { 35 | $table->dropColumn('two_factor_secret', 'two_factor_recovery_codes'); 36 | }); 37 | } 38 | }; 39 | -------------------------------------------------------------------------------- /database/migrations/2019_08_19_000000_create_failed_jobs_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('uuid')->unique(); 19 | $table->text('connection'); 20 | $table->text('queue'); 21 | $table->longText('payload'); 22 | $table->longText('exception'); 23 | $table->timestamp('failed_at')->useCurrent(); 24 | }); 25 | } 26 | 27 | /** 28 | * Reverse the migrations. 29 | * 30 | * @return void 31 | */ 32 | public function down() 33 | { 34 | Schema::dropIfExists('failed_jobs'); 35 | } 36 | }; 37 | -------------------------------------------------------------------------------- /database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php: -------------------------------------------------------------------------------- 1 | bigIncrements('id'); 18 | $table->morphs('tokenable'); 19 | $table->string('name'); 20 | $table->string('token', 64)->unique(); 21 | $table->text('abilities')->nullable(); 22 | $table->timestamp('last_used_at')->nullable(); 23 | $table->timestamps(); 24 | }); 25 | } 26 | 27 | /** 28 | * Reverse the migrations. 29 | * 30 | * @return void 31 | */ 32 | public function down() 33 | { 34 | Schema::dropIfExists('personal_access_tokens'); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /database/migrations/2020_05_21_100000_create_teams_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->foreignId('user_id')->index(); 19 | $table->string('name'); 20 | $table->boolean('personal_team'); 21 | $table->timestamps(); 22 | }); 23 | } 24 | 25 | /** 26 | * Reverse the migrations. 27 | * 28 | * @return void 29 | */ 30 | public function down() 31 | { 32 | Schema::dropIfExists('teams'); 33 | } 34 | }; 35 | -------------------------------------------------------------------------------- /database/migrations/2020_05_21_200000_create_team_user_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->foreignId('team_id'); 19 | $table->foreignId('user_id'); 20 | $table->string('role')->nullable(); 21 | $table->timestamps(); 22 | 23 | $table->unique(['team_id', 'user_id']); 24 | }); 25 | } 26 | 27 | /** 28 | * Reverse the migrations. 29 | * 30 | * @return void 31 | */ 32 | public function down() 33 | { 34 | Schema::dropIfExists('team_user'); 35 | } 36 | }; 37 | -------------------------------------------------------------------------------- /database/migrations/2020_05_21_300000_create_team_invitations_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->foreignId('team_id')->constrained()->cascadeOnDelete(); 19 | $table->string('email'); 20 | $table->string('role')->nullable(); 21 | $table->timestamps(); 22 | 23 | $table->unique(['team_id', 'email']); 24 | }); 25 | } 26 | 27 | /** 28 | * Reverse the migrations. 29 | * 30 | * @return void 31 | */ 32 | public function down() 33 | { 34 | Schema::dropIfExists('team_invitations'); 35 | } 36 | }; 37 | -------------------------------------------------------------------------------- /database/migrations/2021_11_10_062603_create_demo_contents_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name'); 19 | $table->string('type'); 20 | $table->double('price'); 21 | $table->foreignId('main_product_id')->nullable(); 22 | $table->date('production_date'); 23 | $table->boolean('status')->default(true); 24 | $table->timestamps(); 25 | }); 26 | } 27 | 28 | /** 29 | * Reverse the migrations. 30 | * 31 | * @return void 32 | */ 33 | public function down() 34 | { 35 | Schema::dropIfExists('demo_contents'); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /database/migrations/2022_01_04_065711_create_sessions_table.php: -------------------------------------------------------------------------------- 1 | string('id')->primary(); 18 | $table->foreignId('user_id')->nullable()->index(); 19 | $table->string('ip_address', 45)->nullable(); 20 | $table->text('user_agent')->nullable(); 21 | $table->text('payload'); 22 | $table->integer('last_activity')->index(); 23 | }); 24 | } 25 | 26 | /** 27 | * Reverse the migrations. 28 | * 29 | * @return void 30 | */ 31 | public function down() 32 | { 33 | Schema::dropIfExists('sessions'); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /database/migrations/2022_01_20_204151_add_group_columns_to_permissions_table.php: -------------------------------------------------------------------------------- 1 | foreignIdFor(\App\Models\PermissionGroup::class) 18 | ->after('guard_name') 19 | ->nullable(); 20 | 21 | $table->string('description') 22 | ->after('name') 23 | ->nullable(); 24 | }); 25 | } 26 | 27 | /** 28 | * Reverse the migrations. 29 | * 30 | * @return void 31 | */ 32 | public function down() 33 | { 34 | Schema::table('permissions', function (Blueprint $table) { 35 | // 36 | }); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /database/migrations/2022_01_20_204743_create_permission_groups_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name',100); 19 | $table->string('description',250)->nullable(); 20 | $table->timestamps(); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | * 27 | * @return void 28 | */ 29 | public function down() 30 | { 31 | Schema::dropIfExists('permission_groups'); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /database/seeders/DatabaseSeeder.php: -------------------------------------------------------------------------------- 1 | call([ 19 | PermissionSeeder::class, 20 | RoleSeeder::class, 21 | UserSeeder::class 22 | ]); 23 | \App\Models\User::factory(50)->create(); 24 | \App\Models\DemoContent::factory(100)->create(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /database/seeders/PermissionGroupSeeder.php: -------------------------------------------------------------------------------- 1 | $permission 22 | ]); 23 | } 24 | 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /database/seeders/RoleSeeder.php: -------------------------------------------------------------------------------- 1 | 'Super Admin'] 20 | ); 21 | 22 | /*Editor*/ 23 | $editor = Role::create( 24 | ['name' => 'Editor'], 25 | ); 26 | 27 | /*Simple User*/ 28 | $simpleUser = Role::create( 29 | ['name' => 'Simple User'], 30 | ); 31 | 32 | /*Assign Permission*/ 33 | $editor->givePermissionTo(['create', 'edit-all', 'delete-all', 'view-all']); 34 | $simpleUser->givePermissionTo(['create', 'edit-own', 'delete-own', 'view-own']); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /mix-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "/public/js/app.js": "/public/js/app.js", 3 | "/public/css/app.css": "/public/css/app.css" 4 | } 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/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-tailwind/f5bb4199d73166dfd4cc29a739ff1437ad785bca/public/favicon.ico -------------------------------------------------------------------------------- /public/img/brown-logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/img/dark-logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/img/demo/forgot_1_gradient.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-tailwind/f5bb4199d73166dfd4cc29a739ff1437ad785bca/public/img/demo/forgot_1_gradient.jpg -------------------------------------------------------------------------------- /public/img/demo/forgot_2_gray.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-tailwind/f5bb4199d73166dfd4cc29a739ff1437ad785bca/public/img/demo/forgot_2_gray.jpg -------------------------------------------------------------------------------- /public/img/demo/forgot_3_blue.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-tailwind/f5bb4199d73166dfd4cc29a739ff1437ad785bca/public/img/demo/forgot_3_blue.jpg -------------------------------------------------------------------------------- /public/img/demo/lock_1_gradient.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-tailwind/f5bb4199d73166dfd4cc29a739ff1437ad785bca/public/img/demo/lock_1_gradient.jpg -------------------------------------------------------------------------------- /public/img/demo/lock_2_gray.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-tailwind/f5bb4199d73166dfd4cc29a739ff1437ad785bca/public/img/demo/lock_2_gray.jpg -------------------------------------------------------------------------------- /public/img/demo/lock_3_blue.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-tailwind/f5bb4199d73166dfd4cc29a739ff1437ad785bca/public/img/demo/lock_3_blue.jpg -------------------------------------------------------------------------------- /public/img/demo/login_1_gradient.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-tailwind/f5bb4199d73166dfd4cc29a739ff1437ad785bca/public/img/demo/login_1_gradient.jpg -------------------------------------------------------------------------------- /public/img/demo/login_2_gray.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-tailwind/f5bb4199d73166dfd4cc29a739ff1437ad785bca/public/img/demo/login_2_gray.jpg -------------------------------------------------------------------------------- /public/img/demo/login_3_blue.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-tailwind/f5bb4199d73166dfd4cc29a739ff1437ad785bca/public/img/demo/login_3_blue.jpg -------------------------------------------------------------------------------- /public/img/demo/register_1_gradient.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-tailwind/f5bb4199d73166dfd4cc29a739ff1437ad785bca/public/img/demo/register_1_gradient.jpg -------------------------------------------------------------------------------- /public/img/demo/register_2_gray.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-tailwind/f5bb4199d73166dfd4cc29a739ff1437ad785bca/public/img/demo/register_2_gray.jpg -------------------------------------------------------------------------------- /public/img/demo/register_3_blue.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-tailwind/f5bb4199d73166dfd4cc29a739ff1437ad785bca/public/img/demo/register_3_blue.jpg -------------------------------------------------------------------------------- /public/img/light-logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/img/rose-logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/img/samples/bgFakurianDesign-nY14Fs8pxT8-unsplash-compressed.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-tailwind/f5bb4199d73166dfd4cc29a739ff1437ad785bca/public/img/samples/bgFakurianDesign-nY14Fs8pxT8-unsplash-compressed.jpg -------------------------------------------------------------------------------- /public/img/samples/bgFakurianDesign-nY14Fs8pxT8-unsplash.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-tailwind/f5bb4199d73166dfd4cc29a739ff1437ad785bca/public/img/samples/bgFakurianDesign-nY14Fs8pxT8-unsplash.jpg -------------------------------------------------------------------------------- /public/img/samples/bgGeorgieCobbs-muOHbrFGEQY-unsplash.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-tailwind/f5bb4199d73166dfd4cc29a739ff1437ad785bca/public/img/samples/bgGeorgieCobbs-muOHbrFGEQY-unsplash.jpg -------------------------------------------------------------------------------- /public/img/samples/dummyAvatar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/img/samples/imgMelBaylon-6WLcOFn4HKE-unsplash.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-tailwind/f5bb4199d73166dfd4cc29a739ff1437ad785bca/public/img/samples/imgMelBaylon-6WLcOFn4HKE-unsplash.jpg -------------------------------------------------------------------------------- /public/js/app.js.LICENSE.txt: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.15.3 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | 6 | /*! 7 | * Vue.js v2.6.14 8 | * (c) 2014-2021 Evan You 9 | * Released under the MIT License. 10 | */ 11 | 12 | /** 13 | * @license 14 | * Lodash 15 | * Copyright OpenJS Foundation and other contributors 16 | * Released under MIT license 17 | * Based on Underscore.js 1.8.3 18 | * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors 19 | */ 20 | -------------------------------------------------------------------------------- /public/mix-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "/js/app.js": "/js/app.js", 3 | "/css/app.css": "/css/app.css" 4 | } 5 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /resources/css/components/content-box.css: -------------------------------------------------------------------------------- 1 | /*Content Card*/ 2 | .content-card-show-button { 3 | @apply absolute top-4 right-4 text-gray-600 hover:bg-gray-500 hover:text-white w-7 h-7 flex items-center justify-center rounded-full cursor-pointer 4 | } 5 | -------------------------------------------------------------------------------- /resources/css/components/statistic-box.css: -------------------------------------------------------------------------------- 1 | /*Statistic Widget*/ 2 | .statistic-widget { 3 | @apply flex justify-between h-full w-full 4 | } 5 | 6 | .statistic-widget-data { 7 | @apply flex flex-col flex-grow 8 | } 9 | 10 | .statistic-widget-title { 11 | @apply text-lg font-semibold 12 | } 13 | 14 | .statistic-widget-value { 15 | @apply text-xl md:text-2xl xl:text-3xl font-bold py-2 16 | } 17 | 18 | .statistic-widget-diff-value { 19 | @apply flex items-center gap-1 max-w-min text-sm 20 | } 21 | 22 | .statistic-widget-icon-container { 23 | @apply flex flex-shrink-0 items-center overflow-hidden object-cover 24 | } 25 | 26 | .statistic-widget-icon { 27 | @apply flex items-center justify-center p-4 border-2 w-20 h-20 rounded-full 28 | } 29 | 30 | .statistic-widget-picture-container { 31 | @apply flex flex-shrink-0 items-center 32 | } 33 | 34 | .statistic-widget-picture { 35 | @apply flex items-center justify-center border-2 w-20 rounded-full object-cover overflow-hidden 36 | } 37 | -------------------------------------------------------------------------------- /resources/css/components/toastr.css: -------------------------------------------------------------------------------- 1 | /*Toastr*/ 2 | .toastr { 3 | @apply flex flex-row justify-between items-center shadow p-4 min-h-max 4 | } 5 | 6 | .toastr-close { 7 | @apply flex items-center justify-center w-5 h-5 rounded-full font-bold hover:bg-red-700 hover:text-white hover:bg-opacity-90 cursor-pointer 8 | } 9 | -------------------------------------------------------------------------------- /resources/css/components/vertical-menu.css: -------------------------------------------------------------------------------- 1 | /*Initial Vertical Menu*/ 2 | .ivm { 3 | @apply flex flex-col md:flex-row items-center max-h-min w-full px-2 py-2 overflow-hidden 4 | } 5 | 6 | .ivm-container { 7 | @apply flex flex-col md:flex-row w-full gap-2 8 | } 9 | 10 | .ivm-item { 11 | @apply bg-opacity-0 hover:bg-opacity-100 items-center justify-center px-3 py-2 gap-2 whitespace-nowrap h-full w-full md:max-w-min font-bold cursor-pointer transition duration-300 ease-in-out 12 | } 13 | -------------------------------------------------------------------------------- /resources/css/layout/footer.css: -------------------------------------------------------------------------------- 1 | /*Footer*/ 2 | .footer { 3 | @apply flex flex-wrap flex-shrink-0 items-center py-2 px-6 justify-center md:justify-end space-x-1 text-sm font-semibold text-right text-gray-500 w-full 4 | } 5 | -------------------------------------------------------------------------------- /resources/css/layout/full-screen-layout.css: -------------------------------------------------------------------------------- 1 | /*Full Screen Card*/ 2 | .full-screen-card { 3 | @apply relative flex h-screen w-screen 4 | } 5 | 6 | /*Full Screen Card Container*/ 7 | .full-screen-card-container { 8 | @apply absolute h-screen w-screen bg-cover z-10 9 | } 10 | 11 | /*Full Screen Card Content*/ 12 | .full-screen-card-content { 13 | @apply flex w-full items-center justify-center z-20 14 | } 15 | -------------------------------------------------------------------------------- /resources/css/layout/main.css: -------------------------------------------------------------------------------- 1 | .main-container { 2 | @apply flex justify-between bg-gray-100 h-screen dark:bg-gray-700 overflow-hidden 3 | } 4 | 5 | .content-wrapper { 6 | @apply flex flex-col flex-shrink-0 sm:flex-shrink min-h-screen flex-grow p-4 space-y-6 overflow-y-auto w-screen sm:w-full; 7 | } 8 | 9 | .content-container { 10 | @apply relative flex flex-col flex-grow justify-between space-y-6 w-full; 11 | } 12 | 13 | /*Content Container -> Content Header*/ 14 | .container-header { 15 | @apply flex flex-col lg:justify-between items-center md:flex-row; 16 | } 17 | 18 | /*Content Header -> Page Header*/ 19 | .container-header .page-header { 20 | @apply flex flex-col flex-grow; 21 | } 22 | 23 | .page-header .page-title { 24 | @apply mb-2 text-2xl lg:text-4xl font-semibold dark:text-gray-200; 25 | } 26 | 27 | .page-header .page-subtitle { 28 | @apply hidden md:block md:text-xl text-gray-600 ml-0.5 text-2xl font-semibold dark:text-gray-400; 29 | } 30 | 31 | .container-header .page-action-buttons { 32 | @apply flex flex-row items-center space-x-1; 33 | } 34 | -------------------------------------------------------------------------------- /resources/css/layout/top-menu.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-tailwind/f5bb4199d73166dfd4cc29a739ff1437ad785bca/resources/css/layout/top-menu.css -------------------------------------------------------------------------------- /resources/js/Components/Avatar/TAvatarGroup.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Chart/TBarChart.vue: -------------------------------------------------------------------------------- 1 | 23 | -------------------------------------------------------------------------------- /resources/js/Components/Chart/TDoughnutChart.vue: -------------------------------------------------------------------------------- 1 | 23 | -------------------------------------------------------------------------------- /resources/js/Components/Chart/TLineChart.vue: -------------------------------------------------------------------------------- 1 | 23 | -------------------------------------------------------------------------------- /resources/js/Components/Chart/TPieChart.vue: -------------------------------------------------------------------------------- 1 | 23 | -------------------------------------------------------------------------------- /resources/js/Components/Chart/TPolarChart.vue: -------------------------------------------------------------------------------- 1 | 23 | -------------------------------------------------------------------------------- /resources/js/Components/Chart/TRadarChart.vue: -------------------------------------------------------------------------------- 1 | 23 | -------------------------------------------------------------------------------- /resources/js/Components/Dropdown/TDropdownItem.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 44 | -------------------------------------------------------------------------------- /resources/js/Components/Form/TError.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 16 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TAdjustmentsIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TAudioIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TBanIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TBellIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TCalendarIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TCashIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TCheckCircleIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TCheckCircleSolidIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TCheckIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TChevronDoubleDownIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TChevronDownIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TChevronLeftIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TChevronRightIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TChevronUpIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TClockIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TCogIcon.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 19 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TCollectionIcon.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 15 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TDocumentIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TDotsVerticalIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TEyeIcon.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 15 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/THamburgerMenuTriggerIcon.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 24 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TInformationCircleIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TInformationIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TLogOutIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | 15 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TLogo.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 30 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TPaperClipIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TPencilAltIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TPlusCircleIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TPlusIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TRefreshIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TSearchCircleIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TSearchIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TShieldCheckIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TShieldCheckSolidIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TShoppingBagIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TStarIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TStarSolidIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TTrashIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TUserCircleIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TUserGroupIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TVideoIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TXCircleIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/Icon/TXIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /resources/js/Components/List/TList.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 55 | -------------------------------------------------------------------------------- /resources/js/Functions/deviceInfoCollector.js: -------------------------------------------------------------------------------- 1 | import {defineAsyncComponent} from "vue"; 2 | 3 | 4 | const breakpoints = useBreakpoints(breakpointsTailwind) 5 | 6 | function width() { 7 | defineAsyncComponent(() => import('@vueuse/core')) 8 | } 9 | 10 | export {breakpoints} 11 | -------------------------------------------------------------------------------- /resources/js/Functions/langChooser.js: -------------------------------------------------------------------------------- 1 | import { onBeforeMount, ref } from "vue"; 2 | import { useI18n } from "vue-i18n"; 3 | import { Inertia } from "@inertiajs/inertia"; 4 | 5 | export default function () { 6 | /*Language Selector*/ 7 | const loadingTranslations = ref(false); 8 | const { locale } = useI18n({ 9 | useScope: "global", 10 | missingWarn: false, 11 | warnHtmlMessage: false, 12 | fallbackWarn: false, 13 | }); 14 | onBeforeMount(() => { 15 | if (localStorage.lang) { 16 | locale.value = localStorage.lang; 17 | } 18 | }); 19 | const changeLang = (key) => { 20 | locale.value = key; 21 | localStorage.setItem("lang", key); 22 | Inertia.visit(route("lang", key), { 23 | onStart: () => (loadingTranslations.value = true), 24 | onSuccess: () => (loadingTranslations.value = false), 25 | preserveScroll: true, 26 | }); 27 | }; 28 | 29 | return { locale, loadingTranslations, changeLang }; 30 | } 31 | -------------------------------------------------------------------------------- /resources/js/Functions/menuTrigger.js: -------------------------------------------------------------------------------- 1 | import {breakpointsTailwind, useBreakpoints, useStorage} from '@vueuse/core' 2 | 3 | const breakpoints = useBreakpoints(breakpointsTailwind) 4 | const menuStatus = useStorage('menuStatus'); 5 | 6 | function updateMenuStatus(){ 7 | if (breakpoints.smaller('sm')) { 8 | /*Set status in mobile devices*/ 9 | if (menuStatus.value === 'hidden') { 10 | menuStatus.value = 'opened' 11 | } else { 12 | menuStatus.value = 'hidden' 13 | } 14 | } else { 15 | /*Set status in pc*/ 16 | if (menuStatus.value === 'opened') { 17 | menuStatus.value = 'closed' 18 | } else { 19 | menuStatus.value = 'opened' 20 | } 21 | } 22 | } 23 | 24 | export {updateMenuStatus, menuStatus} 25 | -------------------------------------------------------------------------------- /resources/js/Functions/windowSizeCalculator.js: -------------------------------------------------------------------------------- 1 | import { computed, onBeforeMount, onUnmounted, ref, watch } from "vue"; 2 | 3 | export default function () { 4 | /*Definitions*/ 5 | const windowWidth = ref(); 6 | const deviceType = ref(); 7 | const onResize = () => { 8 | windowWidth.value = window.innerWidth; 9 | }; 10 | 11 | /*Register Event Listener*/ 12 | onBeforeMount(() => { 13 | deviceTypeCalculate(); 14 | window.addEventListener("resize", onResize); 15 | onResize(); 16 | }); 17 | 18 | 19 | const deviceTypeCalculate = () => { 20 | if (windowWidth.value <= 640) { 21 | deviceType.value = "phone"; 22 | } else if (windowWidth.value <= 768) { 23 | deviceType.value = "tablet"; 24 | } else if (windowWidth.value <= 1024) { 25 | deviceType.value = "laptop"; 26 | } else { 27 | deviceType.value = "desktop"; 28 | } 29 | } 30 | 31 | 32 | /*Destroy Event Listener*/ 33 | onUnmounted(() => { 34 | window.removeEventListener("resize", onResize); 35 | }); 36 | 37 | watch(windowWidth, 38 | () => { 39 | deviceTypeCalculate(); 40 | }); 41 | 42 | return { deviceType }; 43 | } 44 | -------------------------------------------------------------------------------- /resources/js/Jetstream/ActionMessage.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 18 | -------------------------------------------------------------------------------- /resources/js/Jetstream/ActionSection.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 26 | -------------------------------------------------------------------------------- /resources/js/Jetstream/ApplicationMark.vue: -------------------------------------------------------------------------------- 1 | 7 | -------------------------------------------------------------------------------- /resources/js/Jetstream/AuthenticationCard.vue: -------------------------------------------------------------------------------- 1 | 12 | -------------------------------------------------------------------------------- /resources/js/Jetstream/AuthenticationCardLogo.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 20 | -------------------------------------------------------------------------------- /resources/js/Jetstream/Button.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 19 | -------------------------------------------------------------------------------- /resources/js/Jetstream/Checkbox.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 35 | -------------------------------------------------------------------------------- /resources/js/Jetstream/DangerButton.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 19 | -------------------------------------------------------------------------------- /resources/js/Jetstream/DropdownLink.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 28 | -------------------------------------------------------------------------------- /resources/js/Jetstream/Input.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 20 | -------------------------------------------------------------------------------- /resources/js/Jetstream/InputError.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 16 | -------------------------------------------------------------------------------- /resources/js/Jetstream/Label.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 15 | -------------------------------------------------------------------------------- /resources/js/Jetstream/NavLink.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 26 | -------------------------------------------------------------------------------- /resources/js/Jetstream/ResponsiveNavLink.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 32 | -------------------------------------------------------------------------------- /resources/js/Jetstream/SecondaryButton.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 19 | -------------------------------------------------------------------------------- /resources/js/Jetstream/SectionBorder.vue: -------------------------------------------------------------------------------- 1 | 8 | -------------------------------------------------------------------------------- /resources/js/Jetstream/SectionTitle.vue: -------------------------------------------------------------------------------- 1 | 18 | -------------------------------------------------------------------------------- /resources/js/Jetstream/ValidationErrors.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 26 | -------------------------------------------------------------------------------- /resources/js/Lang/Flags/flagBg.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 18 | -------------------------------------------------------------------------------- /resources/js/Lang/Flags/flagDe.vue: -------------------------------------------------------------------------------- 1 | 8 | 15 | -------------------------------------------------------------------------------- /resources/js/Lang/Flags/flagFr.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 18 | -------------------------------------------------------------------------------- /resources/js/Lang/Flags/flagRu.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 18 | -------------------------------------------------------------------------------- /resources/js/Lang/Flags/flagTr.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 28 | -------------------------------------------------------------------------------- /resources/js/Lang/bg/auth_lang_bg.js: -------------------------------------------------------------------------------- 1 | const authLangBg = { 2 | email: "Електронна поща", 3 | password: "парола", 4 | rememberMe: "Помни ме", 5 | forgotPassword: "Забравена парола?", 6 | login: "вход", 7 | logout: "Изход", 8 | register: "Регистрирай се", 9 | validationMessage: { 10 | email: { 11 | required: "Полето за имейл е задължително", 12 | email: "Имейлът трябва да е валиден имейл адрес" 13 | }, 14 | password: { 15 | required: "Полето за парола е задължително" 16 | } 17 | } 18 | }; 19 | 20 | export default authLangBg; 21 | -------------------------------------------------------------------------------- /resources/js/Lang/bg/general_lang_bg.js: -------------------------------------------------------------------------------- 1 | const generalLangBg = { 2 | brandName: "LaraQuality", 3 | /* Theme */ 4 | darkMode: "Тъмна тема", 5 | lightMode: "Светеща тема", 6 | auto: "Автоматично", 7 | /* Error */ 8 | somethingWentWrong: "Опа, нещо се обърка", 9 | /* Simple Terms */ 10 | save: 'Запазете', 11 | reset: 'Нулиране', 12 | cancel: 'Отмяна', 13 | delete: 'Изтрий', 14 | edit: 'редактиране', 15 | view: 'Преглед' 16 | }; 17 | 18 | export default generalLangBg; 19 | -------------------------------------------------------------------------------- /resources/js/Lang/bg/notification_lang_bg.js: -------------------------------------------------------------------------------- 1 | const notification_bg = { 2 | pendingWorks: 'Предстоящи работи', 3 | unfinishedTodos: 'Текущи задачи', 4 | unreadMessages: 'Непрочетени съобщения' 5 | }; 6 | 7 | export default notification_bg; 8 | -------------------------------------------------------------------------------- /resources/js/Lang/bg/user_menu_lang_bg.js: -------------------------------------------------------------------------------- 1 | const userMenuLangBg = { 2 | manageAccount: "Manage Account", 3 | manageTeam: "Manage Team", 4 | switchTeams: "Switch Team", 5 | language: "Language", 6 | darkMode: "Dark Mode", 7 | profile: "Profile", 8 | api: "API Tokens", 9 | teamSettings: "Team Settings", 10 | createNewTeam: "Create New Team", 11 | auto: "Auto", 12 | dark: "Dark", 13 | light: "Light", 14 | logout: "Logout" 15 | }; 16 | 17 | export default userMenuLangBg; 18 | -------------------------------------------------------------------------------- /resources/js/Lang/de/auth_lang_de.js: -------------------------------------------------------------------------------- 1 | const authLangDe = { 2 | email: "Email", 3 | password: "Passwort", 4 | rememberMe: "Behalte mich in Erinnerung", 5 | forgotPassword: "Passwort vergessen?", 6 | login: "Anmeldung", 7 | logout: "Abmeldung", 8 | register: "Registrierkasse", 9 | validationMessage: { 10 | email: { 11 | required: "Das E-Mail-Feld ist erforderlich", 12 | email: "Die E-Mail muss eine gültige E-Mail-Adresse sein" 13 | }, 14 | password: { 15 | required: "Das Passwortfeld ist erforderlich" 16 | } 17 | } 18 | }; 19 | 20 | export default authLangDe; 21 | -------------------------------------------------------------------------------- /resources/js/Lang/de/general_lang_de.js: -------------------------------------------------------------------------------- 1 | const generalLangDe = { 2 | brandName: "LaraQuality", 3 | /* Theme */ 4 | darkMode: "Dunkles Thema", 5 | lightMode: "Leuchtendes Thema", 6 | auto: "Automatisch", 7 | /* Error */ 8 | somethingWentWrong: "Ups! Irgendwas lief schief", 9 | /* Simple Terms */ 10 | save: 'Speichern', 11 | reset: 'Zurücksetzen', 12 | cancel: 'Abbrechen', 13 | delete: 'Löschen', 14 | edit: 'Bearbeiten', 15 | view: 'Aussicht' 16 | }; 17 | 18 | export default generalLangDe; 19 | -------------------------------------------------------------------------------- /resources/js/Lang/de/notification_lang_de.js: -------------------------------------------------------------------------------- 1 | const notification_de = { 2 | pendingWorks: 'Ausstehende Arbeiten', 3 | unfinishedTodos: 'Laufende Aufgaben', 4 | unreadMessages: 'ungelesene Nachrichten' 5 | }; 6 | 7 | export default notification_de; 8 | -------------------------------------------------------------------------------- /resources/js/Lang/de/user_menu_lang_de.js: -------------------------------------------------------------------------------- 1 | const userMenuLangDe = { 2 | manageAccount: "Manage Account", 3 | manageTeam: "Manage Team", 4 | switchTeams: "Switch Team", 5 | language: "Language", 6 | darkMode: "Dark Mode", 7 | profile: "Profile", 8 | api: "API Tokens", 9 | teamSettings: "Team Settings", 10 | createNewTeam: "Create New Team", 11 | auto: "Auto", 12 | dark: "Dark", 13 | light: "Light", 14 | logout: "Logout" 15 | }; 16 | 17 | export default userMenuLangDe; 18 | -------------------------------------------------------------------------------- /resources/js/Lang/en/auth_lang_en.js: -------------------------------------------------------------------------------- 1 | const authLangEn = { 2 | email: "Email", 3 | password: "Password", 4 | rememberMe: "Remember me", 5 | forgotPassword: "Forgot your password?", 6 | login: "Login", 7 | logout: "Logout", 8 | register: "Register", 9 | validationMessage: { 10 | email: { 11 | required: "The email filed is required", 12 | email: "The email must be a valid email address" 13 | }, 14 | password: { 15 | required: "The password filed is required" 16 | } 17 | } 18 | }; 19 | 20 | export default authLangEn; 21 | -------------------------------------------------------------------------------- /resources/js/Lang/en/general_lang_en.js: -------------------------------------------------------------------------------- 1 | const generalLangEn = { 2 | brandName: "LaraQuality", 3 | /* Theme */ 4 | darkMode: "Dark Mode", 5 | lightMode: "Light Mode", 6 | auto: "Auto", 7 | /* Error */ 8 | somethingWentWrong: "Oops, Something went wrong", 9 | /* Simple Terms */ 10 | save: 'Save', 11 | reset: 'Reset', 12 | cancel: 'Cancel', 13 | delete: 'Delete', 14 | edit: 'Edit', 15 | view: 'View' 16 | }; 17 | 18 | export default generalLangEn; 19 | -------------------------------------------------------------------------------- /resources/js/Lang/en/notification_lang_en.js: -------------------------------------------------------------------------------- 1 | const notification_en = { 2 | pendingWorks: 'Pending Works', 3 | unfinishedTodos: 'Unfinished Todos', 4 | unreadMessages: 'Unread Messages' 5 | }; 6 | 7 | export default notification_en; 8 | -------------------------------------------------------------------------------- /resources/js/Lang/en/pagination_lang.js: -------------------------------------------------------------------------------- 1 | const pagination_en = { 2 | detailText: "{totalPage} pages - {totalRecord} records", 3 | previous: "Previous", 4 | next: "Next", 5 | } 6 | export default pagination_en 7 | -------------------------------------------------------------------------------- /resources/js/Lang/en/table_lang.js: -------------------------------------------------------------------------------- 1 | const table_en = { 2 | searchPlaceHolder: "search", 3 | optionsModalTitle: "Table Options", 4 | optionsModalColumnOrder: "Column Order and Visibility", 5 | anyContentMessage: "There is any content for your search criteria", 6 | advancedSearch: "Advanced Search", 7 | itemsCountPerPage : "Items Count in a page", 8 | actionView: "View", 9 | actionEdit: "Edit", 10 | actionDelete: "Delete", 11 | missing: "Missing", 12 | contentKeyError: "Content Key is missing, please add a content key. It comes from controller.
Example: 'users'=>Users::all()", 13 | searchRouteError: "Search route is missing, please add a search route. The search route is where the search parameters posted route (same page route) like user.index.", 14 | contentError: "Content is missing, please add a content dataset. It comes from controller.
Example: 'users'=>Users::all()", 15 | headerError: "Header is missing, please add a header dataset. The table needs it for showing data columns." 16 | } 17 | export default table_en 18 | -------------------------------------------------------------------------------- /resources/js/Lang/en/user_menu_lang_en.js: -------------------------------------------------------------------------------- 1 | const userMenuLangEn = { 2 | manageAccount: "Manage Account", 3 | manageTeam: "Manage Team", 4 | switchTeams: "Switch Team", 5 | language: "Language", 6 | darkMode: "Dark Mode", 7 | profile: "Profile", 8 | api: "API Tokens", 9 | teamSettings: "Team Settings", 10 | createNewTeam: "Create New Team", 11 | auto: "Auto", 12 | dark: "Dark", 13 | light: "Light", 14 | logout: "Logout" 15 | }; 16 | 17 | export default userMenuLangEn; 18 | -------------------------------------------------------------------------------- /resources/js/Lang/fr/auth_lang_fr.js: -------------------------------------------------------------------------------- 1 | const authLangFr = { 2 | email: "Email", 3 | password: "Mot de passe", 4 | rememberMe: "Souviens-toi de moi", 5 | forgotPassword: "Mot de passe oublié?", 6 | login: "Connexion", 7 | logout: "Se déconnecter", 8 | register: "Registre", 9 | validationMessage: { 10 | email: { 11 | required: "Le champ email est obligatoire", 12 | email: "L'e-mail doit être une adresse e-mail valide" 13 | }, 14 | password: { 15 | required: "Le champ mot de passe est obligatoire" 16 | } 17 | } 18 | }; 19 | 20 | export default authLangFr; 21 | -------------------------------------------------------------------------------- /resources/js/Lang/fr/general_lang_fr.js: -------------------------------------------------------------------------------- 1 | const generalLangFr = { 2 | brandName: "LaraQuality", 3 | /* Theme */ 4 | darkMode: "Thème sombre", 5 | lightMode: "Thème de la lumière", 6 | auto: "Auto", 7 | /* Error */ 8 | somethingWentWrong: "Oups, quelque chose s'est mal passé", 9 | /* Simple Terms */ 10 | save: 'Sauvegarder', 11 | reset: 'Réinitialiser', 12 | cancel: 'Annuler', 13 | delete: 'Supprimer', 14 | edit: 'Éditer', 15 | view: 'Voir' 16 | }; 17 | 18 | export default generalLangFr; 19 | -------------------------------------------------------------------------------- /resources/js/Lang/fr/notification_lang_fr.js: -------------------------------------------------------------------------------- 1 | const notification_fr = { 2 | pendingWorks: 'Travaux en attente', 3 | unfinishedTodos: 'Tâches en cours', 4 | unreadMessages: 'Messages non lus' 5 | }; 6 | 7 | export default notification_fr; 8 | -------------------------------------------------------------------------------- /resources/js/Lang/fr/user_menu_lang_fr.js: -------------------------------------------------------------------------------- 1 | const userMenuLangFr = { 2 | manageAccount: "Manage Account", 3 | manageTeam: "Manage Team", 4 | switchTeams: "Switch Team", 5 | language: "Language", 6 | darkMode: "Dark Mode", 7 | profile: "Profile", 8 | api: "API Tokens", 9 | teamSettings: "Team Settings", 10 | createNewTeam: "Create New Team", 11 | auto: "Auto", 12 | dark: "Dark", 13 | light: "Light", 14 | logout: "Logout" 15 | }; 16 | 17 | export default userMenuLangFr; 18 | -------------------------------------------------------------------------------- /resources/js/Lang/ru/auth_lang_ru.js: -------------------------------------------------------------------------------- 1 | const authLangRu = { 2 | email: "Электронное письмо", 3 | password: "Пароль", 4 | rememberMe: "Запомните меня", 5 | forgotPassword: "Забыли Ваш пароль?", 6 | login: "Входить", 7 | logout: "Выйти", 8 | register: "Pегистр", 9 | validationMessage: { 10 | email: { 11 | required: "Поле электронной почты обязательно", 12 | email: "Электронная почта должна быть действительным адресом электронной почты" 13 | }, 14 | password: { 15 | required: "Поле пароля обязательно" 16 | } 17 | } 18 | }; 19 | 20 | export default authLangRu; 21 | -------------------------------------------------------------------------------- /resources/js/Lang/ru/general_lang_ru.js: -------------------------------------------------------------------------------- 1 | const generalLangRu = { 2 | brandName: "LaraQuality", 3 | /* Theme */ 4 | darkMode: "Темная тема", 5 | lightMode: "Светлая тема", 6 | auto: "Автоматический", 7 | /* Error */ 8 | somethingWentWrong: "Упс! Что-то пошло не так", 9 | /* Simple Terms */ 10 | save: 'Сохранять', 11 | reset: 'Перезагрузить', 12 | cancel: 'Отмена', 13 | delete: 'Удалить', 14 | edit: 'Редактировать', 15 | view: 'Вид' 16 | }; 17 | 18 | export default generalLangRu; 19 | -------------------------------------------------------------------------------- /resources/js/Lang/ru/notification_lang_ru.js: -------------------------------------------------------------------------------- 1 | const notification_ru = { 2 | pendingWorks: 'Ожидающие работы', 3 | unfinishedTodos: 'Текущие дела', 4 | unreadMessages: 'Непрочитанные сообщения' 5 | }; 6 | 7 | export default notification_ru; 8 | -------------------------------------------------------------------------------- /resources/js/Lang/ru/user_menu_lang_ru.js: -------------------------------------------------------------------------------- 1 | const userMenuLangRu = { 2 | manageAccount: "Manage Account", 3 | manageTeam: "Manage Team", 4 | switchTeams: "Switch Team", 5 | language: "Language", 6 | darkMode: "Dark Mode", 7 | profile: "Profile", 8 | api: "API Tokens", 9 | teamSettings: "Team Settings", 10 | createNewTeam: "Create New Team", 11 | auto: "Auto", 12 | dark: "Dark", 13 | light: "Light", 14 | logout: "Logout" 15 | }; 16 | 17 | export default userMenuLangRu; 18 | -------------------------------------------------------------------------------- /resources/js/Lang/tr/auth_lang_tr.js: -------------------------------------------------------------------------------- 1 | const authLangTr = { 2 | email: "Eposta", 3 | password: "Şifre", 4 | rememberMe: "Beni Hatırla", 5 | forgotPassword: "Şifreni unuttun mu?", 6 | login: "Giriş", 7 | logout: "Çıkış", 8 | register: "Kayıt", 9 | validationMessage: { 10 | email: { 11 | required: "Email adresi gereklidir", 12 | email: "Email adresi geçerli değil" 13 | }, 14 | password: { 15 | required: "Şifre gereklidir" 16 | } 17 | } 18 | }; 19 | 20 | export default authLangTr; 21 | -------------------------------------------------------------------------------- /resources/js/Lang/tr/general_lang_tr.js: -------------------------------------------------------------------------------- 1 | const generalLangTr = { 2 | brandName: "LaraQuality", 3 | /* Theme */ 4 | darkMode: "Aydınlık Tema", 5 | lightMode: "Karanlık Tema", 6 | auto: "Otomatik", 7 | /* Error */ 8 | somethingWentWrong: "Üzügünüz! Birşeyler yanlış gitti", 9 | /* Simple Terms */ 10 | save: 'Kaydet', 11 | reset: 'Sıfırla', 12 | cancel: 'İptal Et', 13 | delete: 'Sil', 14 | edit: 'Düzenle', 15 | view: 'Görüntüle' 16 | }; 17 | 18 | export default generalLangTr; 19 | -------------------------------------------------------------------------------- /resources/js/Lang/tr/notification_lang_tr.js: -------------------------------------------------------------------------------- 1 | const notification_ = { 2 | pendingWorks: 'Bekleyen İşler', 3 | unfinishedTodos: 'Devam Eden Yapılacaklar', 4 | unreadMessages: 'Okunmamış Mesajlar' 5 | }; 6 | 7 | export default notification_; 8 | -------------------------------------------------------------------------------- /resources/js/Lang/tr/pagination_lang.js: -------------------------------------------------------------------------------- 1 | const pagination_tr = { 2 | detailText: "Toplam: {totalPage} sayfa {totalRecord} kayıt", 3 | previous: "Önceki", 4 | next: "Sonraki", 5 | } 6 | 7 | export default pagination_tr 8 | -------------------------------------------------------------------------------- /resources/js/Lang/tr/table_lang.js: -------------------------------------------------------------------------------- 1 | const table_tr = { 2 | searchPlaceHolder: "Ara", 3 | optionsModalTitle: "Tablo Özellikleri", 4 | optionsModalColumnOrder: "Sütunları Sırala veya Gizle", 5 | anyContentMessage: "Aradığınız kriterde içerik bulunamadı", 6 | advancedSearch: "Detaylı Arama", 7 | itemsCountPerPage : "Sayfadaki eleman sayısı", 8 | actionView: "İncele", 9 | actionEdit: "Düzenle", 10 | actionDelete: "Sil", 11 | missing: "Eksik", 12 | contentKeyError: "Content Key eksik, lütfen content key değerini belirleyiniz. Bu değer ilgili kontrollerinizden gelir. Örnek: 'users'=>Users::all()", 13 | searchRouteError: "Search route eksik, lütfen search route değerini belirleyiniz. Arama sorgularınızın gönderileceği yoldur(route), genellikle tablonuzun bulunduğu sayfa ile aynı routedir. Örnek: user.index.", 14 | contentError: "Content veri seti eksik, lütfen bir içerik seti(content) ekleyiniz. Bu değer ilgili kontrollerinizden gelir. Örnek: 'users'=>Users::all()", 15 | headerError: "Header veri seti eksik, lütfen header veri setini ekleyiniz. Tablonuzdaki sütünlarda hangi alanları göstereceğiniz belirlediğiniz ayar öğesidir." 16 | } 17 | 18 | export default table_tr 19 | -------------------------------------------------------------------------------- /resources/js/Lang/tr/user_menu_lang_tr.js: -------------------------------------------------------------------------------- 1 | const userMenuLangTr = { 2 | manageAccount: "Hesap Yönetimi", 3 | manageTeam: "Takım Yönetimi", 4 | switchTeams: "Takım Değiştir", 5 | language: "Dil", 6 | darkMode: "Koyu Mod", 7 | profile: "Profil", 8 | api: "API Anahtarları", 9 | teamSettings: "Takım Ayarları", 10 | createNewTeam: "Yeni Takım Oluştur", 11 | auto: "Otomatik", 12 | dark: "Koyu", 13 | light: "Açık", 14 | logout: "Çıkış" 15 | }; 16 | 17 | export default userMenuLangTr; 18 | -------------------------------------------------------------------------------- /resources/js/Lang/zh/auth_lang_zh.js: -------------------------------------------------------------------------------- 1 | const authLangZh = { 2 | email: "电子邮件", 3 | password: "密码", 4 | rememberMe: "记得我", 5 | forgotPassword: "忘记密码了吗?", 6 | login: "登录", 7 | logout: "登出", 8 | register: "登记", 9 | validationMessage: { 10 | email: { 11 | required: "电子邮件字段是必需的", 12 | email: "电子邮件必须是有效的电子邮件地址" 13 | }, 14 | password: { 15 | required: "密码字段为必填项" 16 | } 17 | } 18 | }; 19 | 20 | export default authLangZh; 21 | -------------------------------------------------------------------------------- /resources/js/Lang/zh/general_lang_zh.js: -------------------------------------------------------------------------------- 1 | const generalLangZh = { 2 | brandName: "LaraQuality", 3 | /* Theme */ 4 | darkMode: "黑暗主题", 5 | lightMode: "轻主题", 6 | auto: "自动的", 7 | /* Error */ 8 | somethingWentWrong: "哎呀!出事了", 9 | /* Simple Terms */ 10 | save: '保存', 11 | reset: '重启', 12 | cancel: '取消', 13 | delete: '删除', 14 | edit: '编辑', 15 | view: '看法' 16 | }; 17 | 18 | export default generalLangZh; 19 | -------------------------------------------------------------------------------- /resources/js/Lang/zh/notification_lang_zh.js: -------------------------------------------------------------------------------- 1 | const notification_zh = { 2 | pendingWorks: '待定作品', 3 | unfinishedTodos: '正在进行的待办事项', 4 | unreadMessages: '未读消息' 5 | }; 6 | 7 | export default notification_zh; 8 | -------------------------------------------------------------------------------- /resources/js/Lang/zh/user_menu_lang_zh.js: -------------------------------------------------------------------------------- 1 | const userMenuLangZh = { 2 | manageAccount: "Manage Account", 3 | manageTeam: "Manage Team", 4 | switchTeams: "Switch Team", 5 | language: "Language", 6 | darkMode: "Dark Mode", 7 | profile: "Profile", 8 | api: "API Tokens", 9 | teamSettings: "Team Settings", 10 | createNewTeam: "Create New Team", 11 | auto: "Auto", 12 | dark: "Dark", 13 | light: "Light", 14 | logout: "Logout" 15 | }; 16 | 17 | export default userMenuLangZh; 18 | -------------------------------------------------------------------------------- /resources/js/Layouts/FullScreenLayout.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 33 | -------------------------------------------------------------------------------- /resources/js/Layouts/GridSection.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 23 | -------------------------------------------------------------------------------- /resources/js/Layouts/LockScreen.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 20 | -------------------------------------------------------------------------------- /resources/js/Layouts/MainMenu.vue: -------------------------------------------------------------------------------- 1 | 35 | 38 | -------------------------------------------------------------------------------- /resources/js/Layouts/MainMenu/Abay/UserMenu.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 10 | 11 | 14 | -------------------------------------------------------------------------------- /resources/js/Layouts/MainMenu/Umay/Umay.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 10 | 11 | 14 | -------------------------------------------------------------------------------- /resources/js/Mixins/Styles/forgotPasswordStyleMixin.js: -------------------------------------------------------------------------------- 1 | import {bgColorStyles} from "@/Mixins/Styles/bgColorStyles"; 2 | import {radiusSizeMixin} from "@/Mixins/radiusSizeMixin"; 3 | 4 | export const forgotPasswordStyleMixin = { 5 | mixins: [bgColorStyles,radiusSizeMixin], 6 | computed: { 7 | calculatedForgotPasswordStyle() { 8 | let style; 9 | style = this.bgColorStyle + ' ' 10 | style += this.textColorStyle 11 | 12 | return style 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /resources/js/Mixins/Styles/fullScreenCardStyleMixin.js: -------------------------------------------------------------------------------- 1 | import {bgColorStyles} from "@/Mixins/Styles/bgColorStyles"; 2 | 3 | export const fullScreenCardStyleMixin = { 4 | mixins: [bgColorStyles], 5 | computed: { 6 | calculatedFullscreenCardStyle() { 7 | let style = this.bgColorStyle + ' border-none'; 8 | 9 | return style 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /resources/js/Mixins/Styles/inputGroupStyleMixin.js: -------------------------------------------------------------------------------- 1 | export const inputGroupStyleMixin = { 2 | data(){ 3 | return{ 4 | subLabelColors:{ 5 | 'solid-red': 'text-red-500', 6 | 'solid-blue': 'text-blue-500', 7 | 'solid-green': 'text-green-500', 8 | 'solid-yellow': 'text-yellow-500', 9 | 'solid-indigo': 'text-indigo-500', 10 | 'solid-pink': 'text-pink-500', 11 | 'solid-purple': 'text-purple-500', 12 | 'solid-gray': 'text-gray-500', 13 | 'solid-black': 'text-black', 14 | 'solid-white': 'text-white' 15 | } 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /resources/js/Mixins/Styles/lockStyleMixin.js: -------------------------------------------------------------------------------- 1 | import {bgColorStyles} from "@/Mixins/Styles/bgColorStyles"; 2 | import {radiusSizeMixin} from "@/Mixins/radiusSizeMixin"; 3 | 4 | export const lockStyleMixin = { 5 | mixins: [bgColorStyles,radiusSizeMixin], 6 | computed: { 7 | calculatedLockStyle() { 8 | let style; 9 | style = this.bgColorStyle + ' ' 10 | style += this.textColorStyle 11 | 12 | return style 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /resources/js/Mixins/Styles/loginStyleMixin.js: -------------------------------------------------------------------------------- 1 | import {bgColorStyles} from "@/Mixins/Styles/bgColorStyles"; 2 | import {radiusSizeMixin} from "@/Mixins/radiusSizeMixin"; 3 | 4 | export const loginStyleMixin = { 5 | mixins: [bgColorStyles,radiusSizeMixin], 6 | computed: { 7 | calculatedLoginStyle() { 8 | let style; 9 | style = this.bgColorStyle + ' ' 10 | style += this.textColorStyle 11 | 12 | return style 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /resources/js/Mixins/Styles/modalStyleMixin.js: -------------------------------------------------------------------------------- 1 | import {bgColorStyles} from "@/Mixins/Styles/bgColorStyles"; 2 | import {radiusSizeMixin} from "@/Mixins/radiusSizeMixin"; 3 | export const modalStyleMixin = { 4 | mixins: [bgColorStyles,radiusSizeMixin], 5 | computed: { 6 | calculatedModalStyle() { 7 | let style; 8 | style = this.radiusStyle + ' ' + this.bgColorStyle; 9 | 10 | return style 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /resources/js/Mixins/Styles/registerStyleMixin.js: -------------------------------------------------------------------------------- 1 | import {bgColorStyles} from "@/Mixins/Styles/bgColorStyles"; 2 | import {radiusSizeMixin} from "@/Mixins/radiusSizeMixin"; 3 | 4 | export const registerStyleMixin = { 5 | mixins: [bgColorStyles,radiusSizeMixin], 6 | computed: { 7 | calculatedRegisterStyle() { 8 | let style; 9 | style = this.bgColorStyle + ' ' 10 | style += this.textColorStyle 11 | 12 | return style 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /resources/js/Mixins/Styles/tooltipStyleMixin.js: -------------------------------------------------------------------------------- 1 | export const tooltipStyleMixin = { 2 | props:{ 3 | position: { 4 | type: String, 5 | default: 'bottom' 6 | } 7 | }, 8 | data(){ 9 | return{ 10 | positionStyle: { 11 | 'left': { 12 | arrow: 'absolute w-2 h-2 border-r border-t transform -right-1 top-4 rotate-45 z-10', 13 | box: 'right-full -top-4' 14 | }, 15 | 'top': { 16 | arrow: 'absolute w-2 h-2 bg-white border-b border-r transform left-4 -bottom-1 rotate-45 z-10', 17 | box: 'left-0 bottom-6' 18 | }, 19 | 'bottom': { 20 | arrow: 'absolute w-2 h-2 border-l border-t transform left-4 -top-1 rotate-45 z-10', 21 | box: 'top-6' 22 | }, 23 | 'right': { 24 | arrow: 'absolute w-2 h-2 border-l border-b transform -left-1 top-4 rotate-45 z-10', 25 | box: 'left-full -top-4' 26 | } 27 | } 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /resources/js/Mixins/radiusSizeMixin.js: -------------------------------------------------------------------------------- 1 | export const radiusSizeMixin = { 2 | props: { 3 | radius: { 4 | type: Number, 5 | require: false, 6 | default: 3 7 | } 8 | }, 9 | data() { 10 | return { 11 | radiusSizes: [ 12 | 'rounded-sm', 13 | 'rounded', 14 | 'rounded-md', 15 | 'rounded-lg', 16 | 'rounded-xl', 17 | 'rounded-2xl', 18 | 'rounded-3xl', 19 | 'rounded-full' 20 | ] 21 | } 22 | }, 23 | computed: { 24 | radiusStyle() { 25 | let i, radiusStyle; 26 | for (i = 0; i < this.radiusSizes.length; i++) { 27 | if (i === this.radius - 1) { 28 | radiusStyle = this.radiusSizes[i]; 29 | } 30 | } 31 | return radiusStyle 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /resources/js/Pages/API/Index.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 37 | -------------------------------------------------------------------------------- /resources/js/Pages/Auth/Lock.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 18 | -------------------------------------------------------------------------------- /resources/js/Pages/Auth/Login.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 44 | -------------------------------------------------------------------------------- /resources/js/Pages/PrivacyPolicy.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 32 | -------------------------------------------------------------------------------- /resources/js/Pages/Samples/Components/Chart.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 29 | 30 | 33 | -------------------------------------------------------------------------------- /resources/js/Pages/Samples/Examples/Auth/ForgotPassword2.vue: -------------------------------------------------------------------------------- 1 | 29 | 30 | 42 | -------------------------------------------------------------------------------- /resources/js/Pages/Samples/Examples/Auth/ForgotPassword3.vue: -------------------------------------------------------------------------------- 1 | 28 | 29 | 41 | -------------------------------------------------------------------------------- /resources/js/Pages/Samples/Examples/Auth/Lock1.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 18 | -------------------------------------------------------------------------------- /resources/js/Pages/Samples/Examples/Auth/Lock2.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 20 | -------------------------------------------------------------------------------- /resources/js/Pages/Samples/Examples/Auth/Lock3.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 18 | -------------------------------------------------------------------------------- /resources/js/Pages/Samples/Examples/Auth/Login3.vue: -------------------------------------------------------------------------------- 1 | 27 | 28 | 46 | -------------------------------------------------------------------------------- /resources/js/Pages/Samples/Examples/Auth/Register1.vue: -------------------------------------------------------------------------------- 1 | x 2 | 28 | 29 | 45 | -------------------------------------------------------------------------------- /resources/js/Pages/Samples/Examples/Auth/Register2.vue: -------------------------------------------------------------------------------- 1 | 28 | 29 | 45 | -------------------------------------------------------------------------------- /resources/js/Pages/Samples/Examples/Auth/Register3.vue: -------------------------------------------------------------------------------- 1 | 27 | 28 | 44 | -------------------------------------------------------------------------------- /resources/js/Pages/Samples/Examples/ChatApp.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 19 | 20 | -------------------------------------------------------------------------------- /resources/js/Pages/Samples/Examples/EmailApp.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 19 | 20 | -------------------------------------------------------------------------------- /resources/js/Pages/Samples/Examples/Pricing.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 19 | 20 | -------------------------------------------------------------------------------- /resources/js/Pages/Samples/Examples/Profile.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 19 | 20 | -------------------------------------------------------------------------------- /resources/js/Pages/Samples/Examples/ProjectApp.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 19 | 20 | -------------------------------------------------------------------------------- /resources/js/Pages/Samples/Examples/TodoApp.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 19 | 20 | -------------------------------------------------------------------------------- /resources/js/Pages/Samples/Layouts/Grid.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 25 | 26 | 29 | -------------------------------------------------------------------------------- /resources/js/Pages/Samples/Layouts/LayoutStructure.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 22 | 23 | 26 | -------------------------------------------------------------------------------- /resources/js/Pages/Samples/Test.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 24 | 25 | 28 | -------------------------------------------------------------------------------- /resources/js/Pages/Settings/System.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 21 | 22 | -------------------------------------------------------------------------------- /resources/js/Pages/Teams/Create.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 29 | -------------------------------------------------------------------------------- /resources/js/Pages/TermsOfService.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 32 | -------------------------------------------------------------------------------- /resources/js/Sources/icons.js: -------------------------------------------------------------------------------- 1 | /*Import FontAwesomeIcon*/ 2 | import {library} from "@fortawesome/fontawesome-svg-core"; 3 | import { 4 | faTv, 5 | faPlug, 6 | faWindowRestore, 7 | faChartBar, 8 | faTable, 9 | faWindowMaximize, 10 | faLayerGroup, 11 | faGripHorizontal, 12 | faEdit, 13 | faRetweet, 14 | faClock, 15 | faCode, 16 | faQuestion, 17 | faCog, 18 | faStar, 19 | faChevronDown, 20 | faEllipsisVertical 21 | } from "@fortawesome/free-solid-svg-icons"; 22 | 23 | 24 | library.add( 25 | faTv, 26 | faPlug, 27 | faWindowRestore, 28 | faChartBar, 29 | faTable, 30 | faWindowMaximize, 31 | faLayerGroup, 32 | faGripHorizontal, 33 | faEdit, 34 | faRetweet, 35 | faClock, 36 | faCode, 37 | faQuestion, 38 | faCog, 39 | faStar, 40 | faChevronDown, 41 | faEllipsisVertical 42 | ) 43 | -------------------------------------------------------------------------------- /resources/js/bootstrap.js: -------------------------------------------------------------------------------- 1 | window._ = require('lodash'); 2 | 3 | /** 4 | * We'll load the axios HTTP library which allows us to easily issue requests 5 | * to our Laravel back-end. This library automatically handles sending the 6 | * CSRF token as a header based on the value of the "XSRF" token cookie. 7 | */ 8 | 9 | window.axios = require('axios'); 10 | 11 | window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; 12 | 13 | /** 14 | * Echo exposes an expressive API for subscribing to channels and listening 15 | * for events that are broadcast by Laravel. Echo and event broadcasting 16 | * allows your team to easily build robust real-time web applications. 17 | */ 18 | 19 | // import Echo from 'laravel-echo'; 20 | 21 | // window.Pusher = require('pusher-js'); 22 | 23 | // window.Echo = new Echo({ 24 | // broadcaster: 'pusher', 25 | // key: process.env.MIX_PUSHER_APP_KEY, 26 | // cluster: process.env.MIX_PUSHER_APP_CLUSTER, 27 | // forceTLS: true 28 | // }); 29 | -------------------------------------------------------------------------------- /resources/lang/bg/auth.php: -------------------------------------------------------------------------------- 1 | 'Неуспешно удостоверяване на потребител.', 16 | 'password' => 'Въведената парола е неправилна.', 17 | 'throttle' => 'Твърде много опити за вход. Моля, опитайте отново след :seconds секунди.', 18 | ]; 19 | -------------------------------------------------------------------------------- /resources/lang/bg/pagination.php: -------------------------------------------------------------------------------- 1 | 'Напред »', 16 | 'previous' => '« Назад', 17 | ]; 18 | -------------------------------------------------------------------------------- /resources/lang/bg/passwords.php: -------------------------------------------------------------------------------- 1 | 'Паролата е нулирана!', 16 | 'sent' => 'Изпратено е напомняне за вашата парола!', 17 | 'throttled' => 'Моля изчакайте, преди да опитате отново.', 18 | 'token' => 'Този токен за нулиране на парола е невалиден.', 19 | 'user' => 'Потребител с такъв e-mail адрес не може да бъде открит.', 20 | ]; 21 | -------------------------------------------------------------------------------- /resources/lang/de/auth.php: -------------------------------------------------------------------------------- 1 | 'Diese Kombination aus Zugangsdaten wurde nicht in unserer Datenbank gefunden.', 16 | 'password' => 'Das eingegebene Passwort ist nicht korrekt.', 17 | 'throttle' => 'Zu viele Loginversuche. Versuchen Sie es bitte in :seconds Sekunden nochmal.', 18 | ]; 19 | -------------------------------------------------------------------------------- /resources/lang/de/pagination.php: -------------------------------------------------------------------------------- 1 | 'Weiter »', 16 | 'previous' => '« Zurück', 17 | ]; 18 | -------------------------------------------------------------------------------- /resources/lang/de/passwords.php: -------------------------------------------------------------------------------- 1 | 'Das Passwort wurde zurückgesetzt!', 16 | 'sent' => 'Passworterinnerung wurde gesendet!', 17 | 'throttled' => 'Bitte warten Sie, bevor Sie es erneut versuchen.', 18 | 'token' => 'Der Passwort-Wiederherstellungs-Schlüssel ist ungültig oder abgelaufen.', 19 | 'user' => 'Es konnte leider kein Nutzer mit dieser E-Mail-Adresse gefunden werden.', 20 | ]; 21 | -------------------------------------------------------------------------------- /resources/lang/en/auth.php: -------------------------------------------------------------------------------- 1 | 'These credentials do not match our records.', 17 | 'password' => 'The provided password is incorrect.', 18 | 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', 19 | 20 | ]; 21 | -------------------------------------------------------------------------------- /resources/lang/en/pagination.php: -------------------------------------------------------------------------------- 1 | '« Previous', 17 | 'next' => 'Next »', 18 | 19 | ]; 20 | -------------------------------------------------------------------------------- /resources/lang/en/passwords.php: -------------------------------------------------------------------------------- 1 | 'Your password has been reset!', 17 | 'sent' => 'We have emailed your password reset link!', 18 | 'throttled' => 'Please wait before retrying.', 19 | 'token' => 'This password reset token is invalid.', 20 | 'user' => "We can't find a user with that email address.", 21 | 22 | ]; 23 | -------------------------------------------------------------------------------- /resources/lang/fr/auth.php: -------------------------------------------------------------------------------- 1 | 'Ces identifiants ne correspondent pas à nos enregistrements.', 16 | 'password' => 'Le mot de passe fourni est incorrect.', 17 | 'throttle' => 'Tentatives de connexion trop nombreuses. Veuillez essayer de nouveau dans :seconds secondes.', 18 | ]; 19 | -------------------------------------------------------------------------------- /resources/lang/fr/pagination.php: -------------------------------------------------------------------------------- 1 | 'Suivant »', 16 | 'previous' => '« Précédent', 17 | ]; 18 | -------------------------------------------------------------------------------- /resources/lang/fr/passwords.php: -------------------------------------------------------------------------------- 1 | 'Votre mot de passe a été réinitialisé !', 16 | 'sent' => 'Nous vous avons envoyé par email le lien de réinitialisation du mot de passe !', 17 | 'throttled' => 'Veuillez patienter avant de réessayer.', 18 | 'token' => 'Ce jeton de réinitialisation du mot de passe n\'est pas valide.', 19 | 'user' => 'Aucun utilisateur n\'a été trouvé avec cette adresse email.', 20 | ]; 21 | -------------------------------------------------------------------------------- /resources/lang/ru/auth.php: -------------------------------------------------------------------------------- 1 | 'Неверное имя пользователя или пароль.', 16 | 'password' => 'Неверный пароль.', 17 | 'throttle' => 'Слишком много попыток входа. Пожалуйста, попробуйте еще раз через :seconds секунд.', 18 | ]; 19 | -------------------------------------------------------------------------------- /resources/lang/ru/pagination.php: -------------------------------------------------------------------------------- 1 | 'Вперёд »', 16 | 'previous' => '« Назад', 17 | ]; 18 | -------------------------------------------------------------------------------- /resources/lang/ru/passwords.php: -------------------------------------------------------------------------------- 1 | 'Ваш пароль был сброшен!', 16 | 'sent' => 'Ссылка на сброс пароля была отправлена!', 17 | 'throttled' => 'Пожалуйста, подождите перед повторной попыткой.', 18 | 'token' => 'Ошибочный код сброса пароля.', 19 | 'user' => 'Не удалось найти пользователя с указанным электронным адресом.', 20 | ]; 21 | -------------------------------------------------------------------------------- /resources/lang/tr/auth.php: -------------------------------------------------------------------------------- 1 | 'Bu kimlik bilgileri kayıtlarımızla eşleşmiyor.', 16 | 'password' => 'Girilen parola geçersiz.', 17 | 'throttle' => 'Çok fazla giriş denemesi. :seconds saniye sonra lütfen tekrar deneyin.', 18 | ]; 19 | -------------------------------------------------------------------------------- /resources/lang/tr/pagination.php: -------------------------------------------------------------------------------- 1 | 'Sonrakiler »', 16 | 'previous' => '« Öncekiler', 17 | ]; 18 | -------------------------------------------------------------------------------- /resources/lang/tr/passwords.php: -------------------------------------------------------------------------------- 1 | 'Parolanız sıfırlandı!', 16 | 'sent' => 'Parola sıfırlama bağlantınız e-posta ile gönderildi!', 17 | 'throttled' => 'Tekrar denemeden önce lütfen bekleyin.', 18 | 'token' => 'Parola sıfırlama kodu geçersiz.', 19 | 'user' => 'Bu e-posta adresi ile kayıtlı bir üye bulunamadı.', 20 | ]; 21 | -------------------------------------------------------------------------------- /resources/lang/zh_CN/auth.php: -------------------------------------------------------------------------------- 1 | '用户名或密码错误。', 16 | 'password' => '密码错误。', 17 | 'throttle' => '您尝试的登录次数过多,请 :seconds 秒后再试。', 18 | ]; 19 | -------------------------------------------------------------------------------- /resources/lang/zh_CN/pagination.php: -------------------------------------------------------------------------------- 1 | '下一页 »', 16 | 'previous' => '« 上一页', 17 | ]; 18 | -------------------------------------------------------------------------------- /resources/lang/zh_CN/passwords.php: -------------------------------------------------------------------------------- 1 | '密码重置成功!', 16 | 'sent' => '密码重置邮件已发送!', 17 | 'throttled' => '请稍候再试。', 18 | 'token' => '密码重置令牌无效。', 19 | 'user' => '找不到该邮箱对应的用户。', 20 | ]; 21 | -------------------------------------------------------------------------------- /resources/markdown/policy.md: -------------------------------------------------------------------------------- 1 | # Privacy Policy 2 | 3 | Edit this file to define the privacy policy for your application. 4 | -------------------------------------------------------------------------------- /resources/markdown/terms.md: -------------------------------------------------------------------------------- 1 | # Terms of Service 2 | 3 | Edit this file to define the terms of service for your application. 4 | -------------------------------------------------------------------------------- /resources/sass/app.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-tailwind/f5bb4199d73166dfd4cc29a739ff1437ad785bca/resources/sass/app.scss -------------------------------------------------------------------------------- /resources/views/app.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | {{ config('app.name', 'Laravel') }} 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | @routes 17 | 18 | 19 | 20 | @inertia 21 | 22 | @env ('local') 23 | 24 | @endenv 25 | 26 | 27 | -------------------------------------------------------------------------------- /routes/api.php: -------------------------------------------------------------------------------- 1 | get('/user', function (Request $request) { 18 | return $request->user(); 19 | }); 20 | -------------------------------------------------------------------------------- /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/debugbar/.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(); 19 | 20 | return $app; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /tests/Feature/AuthenticationTest.php: -------------------------------------------------------------------------------- 1 | get('/login'); 17 | 18 | $response->assertStatus(200); 19 | } 20 | 21 | public function test_users_can_authenticate_using_the_login_screen() 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() 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/BrowserSessionsTest.php: -------------------------------------------------------------------------------- 1 | actingAs($user = User::factory()->create()); 16 | 17 | $response = $this->delete('/user/other-browser-sessions', [ 18 | 'password' => 'password', 19 | ]); 20 | 21 | $response->assertSessionHasNoErrors(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /tests/Feature/CreateApiTokenTest.php: -------------------------------------------------------------------------------- 1 | markTestSkipped('API support is not enabled.'); 18 | } 19 | 20 | $this->actingAs($user = User::factory()->withPersonalTeam()->create()); 21 | 22 | $response = $this->post('/user/api-tokens', [ 23 | 'name' => 'Test Token', 24 | 'permissions' => [ 25 | 'read', 26 | 'update', 27 | ], 28 | ]); 29 | 30 | $this->assertCount(1, $user->fresh()->tokens); 31 | $this->assertEquals('Test Token', $user->fresh()->tokens->first()->name); 32 | $this->assertTrue($user->fresh()->tokens->first()->can('read')); 33 | $this->assertFalse($user->fresh()->tokens->first()->can('delete')); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /tests/Feature/CreateTeamTest.php: -------------------------------------------------------------------------------- 1 | actingAs($user = User::factory()->withPersonalTeam()->create()); 16 | 17 | $response = $this->post('/teams', [ 18 | 'name' => 'Test Team', 19 | ]); 20 | 21 | $this->assertCount(2, $user->fresh()->ownedTeams); 22 | $this->assertEquals('Test Team', $user->fresh()->ownedTeams()->latest('id')->first()->name); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /tests/Feature/DeleteAccountTest.php: -------------------------------------------------------------------------------- 1 | markTestSkipped('Account deletion is not enabled.'); 18 | } 19 | 20 | $this->actingAs($user = User::factory()->create()); 21 | 22 | $response = $this->delete('/user', [ 23 | 'password' => 'password', 24 | ]); 25 | 26 | $this->assertNull($user->fresh()); 27 | } 28 | 29 | public function test_correct_password_must_be_provided_before_account_can_be_deleted() 30 | { 31 | if (! Features::hasAccountDeletionFeatures()) { 32 | return $this->markTestSkipped('Account deletion is not enabled.'); 33 | } 34 | 35 | $this->actingAs($user = User::factory()->create()); 36 | 37 | $response = $this->delete('/user', [ 38 | 'password' => 'wrong-password', 39 | ]); 40 | 41 | $this->assertNotNull($user->fresh()); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /tests/Feature/DeleteApiTokenTest.php: -------------------------------------------------------------------------------- 1 | markTestSkipped('API support is not enabled.'); 19 | } 20 | 21 | $this->actingAs($user = User::factory()->withPersonalTeam()->create()); 22 | 23 | $token = $user->tokens()->create([ 24 | 'name' => 'Test Token', 25 | 'token' => Str::random(40), 26 | 'abilities' => ['create', 'read'], 27 | ]); 28 | 29 | $response = $this->delete('/user/api-tokens/'.$token->id); 30 | 31 | $this->assertCount(0, $user->fresh()->tokens); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /tests/Feature/DeleteTeamTest.php: -------------------------------------------------------------------------------- 1 | actingAs($user = User::factory()->withPersonalTeam()->create()); 17 | 18 | $user->ownedTeams()->save($team = Team::factory()->make([ 19 | 'personal_team' => false, 20 | ])); 21 | 22 | $team->users()->attach( 23 | $otherUser = User::factory()->create(), ['role' => 'test-role'] 24 | ); 25 | 26 | $response = $this->delete('/teams/'.$team->id); 27 | 28 | $this->assertNull($team->fresh()); 29 | $this->assertCount(0, $otherUser->fresh()->teams); 30 | } 31 | 32 | public function test_personal_teams_cant_be_deleted() 33 | { 34 | $this->actingAs($user = User::factory()->withPersonalTeam()->create()); 35 | 36 | $response = $this->delete('/teams/'.$user->currentTeam->id); 37 | 38 | $this->assertNotNull($user->currentTeam->fresh()); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /tests/Feature/ExampleTest.php: -------------------------------------------------------------------------------- 1 | get('/'); 18 | 19 | $response->assertStatus(200); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /tests/Feature/LeaveTeamTest.php: -------------------------------------------------------------------------------- 1 | withPersonalTeam()->create(); 16 | 17 | $user->currentTeam->users()->attach( 18 | $otherUser = User::factory()->create(), ['role' => 'admin'] 19 | ); 20 | 21 | $this->actingAs($otherUser); 22 | 23 | $response = $this->delete('/teams/'.$user->currentTeam->id.'/members/'.$otherUser->id); 24 | 25 | $this->assertCount(0, $user->currentTeam->fresh()->users); 26 | } 27 | 28 | public function test_team_owners_cant_leave_their_own_team() 29 | { 30 | $this->actingAs($user = User::factory()->withPersonalTeam()->create()); 31 | 32 | $response = $this->delete('/teams/'.$user->currentTeam->id.'/members/'.$user->id); 33 | 34 | $response->assertSessionHasErrorsIn('removeTeamMember', ['team']); 35 | 36 | $this->assertNotNull($user->currentTeam->fresh()); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /tests/Feature/ProfileInformationTest.php: -------------------------------------------------------------------------------- 1 | actingAs($user = User::factory()->create()); 16 | 17 | $response = $this->put('/user/profile-information', [ 18 | 'name' => 'Test Name', 19 | 'email' => 'test@example.com', 20 | ]); 21 | 22 | $this->assertEquals('Test Name', $user->fresh()->name); 23 | $this->assertEquals('test@example.com', $user->fresh()->email); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /tests/Feature/RemoveTeamMemberTest.php: -------------------------------------------------------------------------------- 1 | actingAs($user = User::factory()->withPersonalTeam()->create()); 16 | 17 | $user->currentTeam->users()->attach( 18 | $otherUser = User::factory()->create(), ['role' => 'admin'] 19 | ); 20 | 21 | $response = $this->delete('/teams/'.$user->currentTeam->id.'/members/'.$otherUser->id); 22 | 23 | $this->assertCount(0, $user->currentTeam->fresh()->users); 24 | } 25 | 26 | public function test_only_team_owner_can_remove_team_members() 27 | { 28 | $user = User::factory()->withPersonalTeam()->create(); 29 | 30 | $user->currentTeam->users()->attach( 31 | $otherUser = User::factory()->create(), ['role' => 'admin'] 32 | ); 33 | 34 | $this->actingAs($otherUser); 35 | 36 | $response = $this->delete('/teams/'.$user->currentTeam->id.'/members/'.$user->id); 37 | 38 | $response->assertStatus(403); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /tests/Feature/UpdateTeamNameTest.php: -------------------------------------------------------------------------------- 1 | actingAs($user = User::factory()->withPersonalTeam()->create()); 16 | 17 | $response = $this->put('/teams/'.$user->currentTeam->id, [ 18 | 'name' => 'Test Team', 19 | ]); 20 | 21 | $this->assertCount(1, $user->fresh()->ownedTeams); 22 | $this->assertEquals('Test Team', $user->currentTeam->fresh()->name); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /tests/TestCase.php: -------------------------------------------------------------------------------- 1 | assertTrue(true); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | 3 | module.exports = { 4 | module: { 5 | rules: [ 6 | { 7 | test: /\.svg$/, 8 | use: [ 9 | 'babel-loader', 10 | 'vue-svg-loader', 11 | ], 12 | }, 13 | ], 14 | }, 15 | resolve: { 16 | alias: { 17 | '@': path.resolve('resources/js'), 18 | }, 19 | }, 20 | devServer: { 21 | host: 'localhost', 22 | port: 8080, 23 | }, 24 | }; 25 | -------------------------------------------------------------------------------- /webpack.mix.js: -------------------------------------------------------------------------------- 1 | const mix = require('laravel-mix'); 2 | 3 | /* 4 | |-------------------------------------------------------------------------- 5 | | Mix Asset Management 6 | |-------------------------------------------------------------------------- 7 | | 8 | | Mix provides a clean, fluent API for defining some Webpack build steps 9 | | for your Laravel applications. By default, we are compiling the CSS 10 | | file for the application as well as bundling up all the JS files. 11 | | 12 | */ 13 | 14 | mix.js('resources/js/app.js', 'public/js').vue({ 15 | output: { 16 | chunkFilename: 'js/[name].js?id=[chunkhash]', 17 | } 18 | }) 19 | .postCss('resources/css/app.css', 'public/css', [ 20 | require('postcss-apply'), 21 | require('postcss-import'), 22 | require('tailwindcss'), 23 | require('autoprefixer') 24 | ]) 25 | .sass('resources/sass/app.scss', 'public/css') 26 | .webpackConfig(require('./webpack.config')); 27 | 28 | if (mix.inProduction()) { 29 | mix.version(); 30 | } 31 | --------------------------------------------------------------------------------