From c6ec92802bda383ee8308621742e289798f9772b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Faleiros?= Date: Mon, 2 Feb 2026 15:31:15 -0300 Subject: [PATCH] add: full multi-tenancy control --- .dockerignore | 12 + .editorconfig | 15 + .env.example | 66 + .gitattributes | 11 + .gitignore | 35 + .tmp-growup-v4-final.tar2046928222 | 0 000-default.conf | 16 + CODE_OF_CONDUCT.md | 76 + Dockerfile | 41 + GEMINI.md | 1068 ++ LICENSE | 20 + README.md | 137 + app/Console/Kernel.php | 27 + app/Exceptions/Handler.php | 30 + app/Http/Controllers/Api/LeadController.php | 156 + app/Http/Controllers/Controller.php | 13 + .../SuperAdmin/SessionController.php | 51 + .../SuperAdmin/TenantController.php | 52 + app/Http/Kernel.php | 69 + app/Http/Middleware/Authenticate.php | 21 + app/Http/Middleware/EncryptCookies.php | 17 + .../PreventRequestsDuringMaintenance.php | 17 + .../Middleware/RedirectIfAuthenticated.php | 30 + app/Http/Middleware/SuperAdminMiddleware.php | 19 + app/Http/Middleware/TrimStrings.php | 19 + app/Http/Middleware/TrustHosts.php | 20 + app/Http/Middleware/TrustProxies.php | 13 + app/Http/Middleware/UniversalTenancy.php | 22 + app/Http/Middleware/VerifyCsrfToken.php | 18 + app/Models/Tenant.php | 21 + app/Models/User.php | 42 + app/Providers/AppServiceProvider.php | 59 + app/Providers/AuthServiceProvider.php | 26 + app/Providers/BroadcastServiceProvider.php | 19 + app/Providers/EventServiceProvider.php | 38 + app/Providers/RouteServiceProvider.php | 40 + app/Providers/TenancyServiceProvider.php | 151 + artisan | 53 + bootstrap/app.php | 55 + bootstrap/cache/.gitignore | 2 + build.sh | 193 + composer.json | 110 + composer.lock | 11770 ++++++++++++++++ config/app.php | 238 + config/auth.php | 105 + config/breadcrumbs.php | 75 + config/broadcasting.php | 64 + config/cache.php | 106 + config/concord.php | 25 + config/cors.php | 64 + config/database.php | 147 + config/filesystems.php | 72 + config/hashing.php | 52 + config/imap.php | 193 + config/krayin-vite.php | 32 + config/logging.php | 104 + config/mail-receiver.php | 17 + config/mail.php | 130 + config/queue.php | 89 + config/repository.php | 247 + config/sanctum.php | 65 + config/services.php | 33 + config/session.php | 201 + config/tenancy.php | 201 + config/tinker.php | 50 + config/view.php | 36 + configurar-docker.sh | 173 + database/.gitignore | 2 + database/factories/UserFactory.php | 47 + ..._08_19_000000_create_failed_jobs_table.php | 36 + ...2019_09_15_000010_create_tenants_table.php | 37 + ...2019_09_15_000020_create_domains_table.php | 37 + ...01_create_personal_access_tokens_table.php | 33 + ...tenant_user_impersonation_tokens_table.php | 39 + ..._09_09_094040_create_job_batches_table.php | 39 + .../2024_09_09_094042_create_jobs_table.php | 36 + ...0_add_last_updated_by_to_tenants_table.php | 22 + ..._03_12_060658_create_core_config_table.php | 33 + .../2021_03_12_074578_create_groups_table.php | 33 + .../2021_03_12_074597_create_roles_table.php | 35 + .../2021_03_12_074857_create_users_table.php | 38 + ..._03_12_074867_create_user_groups_table.php | 34 + ...4957_create_user_password_resets_table.php | 32 + ...1_04_02_080709_create_attributes_table.php | 43 + ..._080837_create_attribute_options_table.php | 34 + ...6_122751_create_attribute_values_table.php | 44 + ...4_09_051326_create_organizations_table.php | 34 + ...2021_04_09_065617_create_persons_table.php | 37 + ...021_04_09_065617_create_products_table.php | 36 + ...21_04_12_173232_create_countries_table.php | 32 + ..._12_173344_create_country_states_table.php | 36 + ...04_21_172825_create_lead_sources_table.php | 32 + ...1_04_21_172847_create_lead_types_table.php | 32 + ..._04_22_153258_create_lead_stages_table.php | 34 + ..._22_155706_create_lead_pipelines_table.php | 33 + ...5838_create_lead_pipeline_stages_table.php | 38 + .../2021_04_22_164215_create_leads_table.php | 56 + ...4_22_171805_create_lead_products_table.php | 40 + ...1_05_12_150329_create_activities_table.php | 41 + ...12_150329_create_lead_activities_table.php | 34 + ..._15_151855_create_activity_files_table.php | 37 + .../2021_05_20_141230_create_tags_table.php | 37 + ...21_05_20_141240_create_lead_tags_table.php | 34 + .../2021_05_24_075618_create_emails_table.php | 58 + ..._072700_create_email_attachments_table.php | 40 + ..._view_permission_column_in_users_table.php | 32 + .../2021_07_01_230345_create_quotes_table.php | 52 + ..._07_01_231317_create_quote_items_table.php | 49 + ..._07_02_201822_create_lead_quotes_table.php | 34 + ...453_create_activity_participants_table.php | 39 + ...21_08_26_133538_create_workflows_table.php | 38 + ...03_172713_create_email_templates_table.php | 34 + ...e_index_to_name_in_organizations_table.php | 32 + ...d_unique_index_to_name_in_groups_table.php | 32 + ...umn_expected_close_date_in_leads_table.php | 32 + ...mn_rotten_days_in_lead_pipelines_table.php | 32 + ...54222_alter_lead_pipeline_stages_table.php | 57 + .../2021_09_30_161722_alter_leads_table.php | 50 + ...closed_date_column_in_attributes_table.php | 42 + ...171510_add_image_column_in_users_table.php | 32 + ...dd_location_column_in_activities_table.php | 32 + ...21_12_14_213049_create_web_forms_table.php | 43 + ...14923_create_web_form_attributes_table.php | 41 + ...2024_01_11_154640_create_imports_table.php | 45 + ..._11_154741_create_import_batches_table.php | 32 + ...5_10_152848_create_saved_filters_table.php | 33 + ...4_06_21_160707_create_warehouses_table.php | 33 + ...60735_create_warehouse_locations_table.php | 34 + ...rehouse_attributes_in_attributes_table.php | 117 + ...54009_create_product_inventories_table.php | 39 + ...024_07_24_150821_create_webhooks_table.php | 37 + ..._092951_add_job_title_in_persons_table.php | 28 + ...es_owner_attribute_in_attributes_table.php | 40 + ...ob_title_attribute_in_attributes_table.php | 40 + ...es_owner_attribute_in_attributes_table.php | 40 + ..._08_06_145943_create_person_tags_table.php | 30 + ..._161212_create_person_activities_table.php | 30 + ...0329_create_warehouse_activities_table.php | 34 + ..._10_100340_create_warehouse_tags_table.php | 34 + ...150329_create_product_activities_table.php | 34 + ...08_10_150340_create_product_tags_table.php | 34 + ...16_add_user_id_column_in_persons_table.php | 30 + ..._user_id_column_in_organizations_table.php | 30 + ...dd_leads_stage_and_pipeline_attributes.php | 57 + ...4_08_27_091619_create_email_tags_table.php | 30 + ...065808_alter_product_inventories_table.php | 26 + ...9_112201_add_unique_id_to_person_table.php | 41 + ...9_044744_create_marketing_events_table.php | 30 + ...22500_create_marketing_campaigns_table.php | 32 + ...302_modify_foreign_keys_in_leads_table.php | 80 + ...25_01_17_151632_alter_activities_table.php | 52 + ..._text_column_type_in_core_config_table.php | 28 + ...rganization_id_column_in_persons_table.php | 32 + ...7_01_133612_alter_lead_pipelines_table.php | 30 + ...02_191710_alter_attribute_values_table.php | 39 + ..._09_133553_alter_email_templates_table.php | 30 + database/seeders/DatabaseSeeder.php | 19 + database/seeders/SuperAdminSeeder.php | 24 + docker-compose.dev.yml | 61 + docker-compose.yml | 114 + docker-entrypoint.sh | 105 + fix-locale.php | 39 + lang/en/auth.php | 20 + lang/en/pagination.php | 19 + lang/en/passwords.php | 22 + lang/en/validation.php | 152 + package.json | 13 + packages/Webkul/Activity/composer.json | 28 + .../Activity/src/Contracts/Activity.php | 5 + .../Webkul/Activity/src/Contracts/File.php | 5 + .../Activity/src/Contracts/Participant.php | 5 + ...1_05_12_150329_create_activities_table.php | 41 + ..._15_151855_create_activity_files_table.php | 37 + ...453_create_activity_participants_table.php | 39 + ...dd_location_column_in_activities_table.php | 32 + ...25_01_17_151632_alter_activities_table.php | 52 + .../Webkul/Activity/src/Models/Activity.php | 111 + .../Activity/src/Models/ActivityProxy.php | 7 + packages/Webkul/Activity/src/Models/File.php | 71 + .../Webkul/Activity/src/Models/FileProxy.php | 7 + .../Activity/src/Models/Participant.php | 52 + .../Activity/src/Models/ParticipantProxy.php | 7 + .../src/Providers/ActivityServiceProvider.php | 19 + .../src/Providers/ModuleServiceProvider.php | 14 + .../src/Repositories/ActivityRepository.php | 187 + .../src/Repositories/FileRepository.php | 18 + .../Repositories/ParticipantRepository.php | 18 + .../Activity/src/Traits/LogsActivity.php | 183 + packages/Webkul/Admin/.gitignore | 5 + packages/Webkul/Admin/composer.json | 35 + packages/Webkul/Admin/package.json | 35 + packages/Webkul/Admin/postcss.config.cjs | 3 + packages/Webkul/Admin/src/Bouncer.php | 60 + packages/Webkul/Admin/src/Config/acl.php | 527 + .../src/Config/attribute_entity_types.php | 33 + .../Admin/src/Config/attribute_lookups.php | 54 + .../Webkul/Admin/src/Config/core_config.php | 314 + packages/Webkul/Admin/src/Config/menu.php | 299 + .../DataGrids/Activity/ActivityDataGrid.php | 235 + .../Contact/OrganizationDataGrid.php | 124 + .../src/DataGrids/Contact/PersonDataGrid.php | 160 + .../Admin/src/DataGrids/Lead/LeadDataGrid.php | 326 + .../src/DataGrids/Mail/EmailDataGrid.php | 212 + .../src/DataGrids/Product/ProductDataGrid.php | 169 + .../src/DataGrids/Quote/QuoteDataGrid.php | 229 + .../DataGrids/Settings/AttributeDataGrid.php | 153 + .../Settings/DataTransfer/ImportDataGrid.php | 161 + .../Settings/EmailTemplateDataGrid.php | 87 + .../src/DataGrids/Settings/GroupDataGrid.php | 84 + .../Settings/Marketing/CampaignDatagrid.php | 110 + .../Settings/Marketing/EventDataGrid.php | 110 + .../DataGrids/Settings/PipelineDataGrid.php | 93 + .../src/DataGrids/Settings/RoleDataGrid.php | 102 + .../src/DataGrids/Settings/SourceDataGrid.php | 74 + .../src/DataGrids/Settings/TagDataGrid.php | 124 + .../src/DataGrids/Settings/TypeDataGrid.php | 74 + .../src/DataGrids/Settings/UserDataGrid.php | 146 + .../DataGrids/Settings/WarehouseDataGrid.php | 153 + .../DataGrids/Settings/WebhookDataGrid.php | 96 + .../DataGrids/Settings/WorkflowDataGrid.php | 76 + ..._view_permission_column_in_users_table.php | 32 + ...closed_date_column_in_attributes_table.php | 42 + .../Webkul/Admin/src/Exceptions/Handler.php | 117 + packages/Webkul/Admin/src/Facades/Bouncer.php | 18 + .../Webkul/Admin/src/Helpers/Dashboard.php | 142 + .../Helpers/Reporting/AbstractReporting.php | 343 + .../Admin/src/Helpers/Reporting/Activity.php | 5 + .../Admin/src/Helpers/Reporting/Lead.php | 483 + .../src/Helpers/Reporting/Organization.php | 80 + .../Admin/src/Helpers/Reporting/Person.php | 81 + .../Admin/src/Helpers/Reporting/Product.php | 94 + .../Admin/src/Helpers/Reporting/Quote.php | 44 + .../Activity/ActivityController.php | 261 + .../Configuration/ConfigurationController.php | 84 + .../Contact/OrganizationController.php | 130 + .../Contact/Persons/ActivityController.php | 88 + .../Contact/Persons/PersonController.php | 235 + .../Contact/Persons/TagController.php | 56 + .../Admin/src/Http/Controllers/Controller.php | 23 + .../Http/Controllers/DashboardController.php | 59 + .../DataGrid/SavedFilterController.php | 117 + .../Http/Controllers/DataGridController.php | 42 + .../Controllers/Lead/ActivityController.php | 88 + .../Http/Controllers/Lead/EmailController.php | 83 + .../Http/Controllers/Lead/LeadController.php | 734 + .../Http/Controllers/Lead/QuoteController.php | 66 + .../Http/Controllers/Lead/TagController.php | 61 + .../Http/Controllers/Mail/EmailController.php | 336 + .../Http/Controllers/Mail/TagController.php | 56 + .../Products/ActivityController.php | 45 + .../Products/ProductController.php | 216 + .../Controllers/Products/TagController.php | 61 + .../Controllers/Quote/QuoteController.php | 198 + .../Settings/AttributeController.php | 236 + .../DataTransfer/ImportController.php | 491 + .../Settings/EmailTemplateController.php | 133 + .../Controllers/Settings/GroupController.php | 127 + .../Settings/LocationController.php | 79 + .../Marketing/CampaignsController.php | 157 + .../Settings/Marketing/EventController.php | 169 + .../Settings/PipelineController.php | 152 + .../Controllers/Settings/RoleController.php | 168 + .../Settings/SettingController.php | 97 + .../Controllers/Settings/SourceController.php | 117 + .../Controllers/Settings/TagController.php | 161 + .../Controllers/Settings/TypeController.php | 110 + .../Controllers/Settings/UserController.php | 260 + .../Settings/Warehouse/ActivityController.php | 45 + .../Settings/Warehouse/TagController.php | 61 + .../Warehouse/WarehouseController.php | 159 + .../Settings/WebFormController.php | 159 + .../Settings/WebhookController.php | 97 + .../Settings/WorkflowController.php | 119 + .../Http/Controllers/TinyMCEController.php | 62 + .../Controllers/User/AccountController.php | 96 + .../User/ForgotPasswordController.php | 77 + .../User/ResetPasswordController.php | 97 + .../Controllers/User/SessionController.php | 117 + .../Admin/src/Http/Middleware/Bouncer.php | 86 + .../Admin/src/Http/Middleware/Locale.php | 40 + .../Admin/src/Http/Requests/AttributeForm.php | 120 + .../src/Http/Requests/ConfigurationForm.php | 43 + .../Admin/src/Http/Requests/LeadForm.php | 158 + .../src/Http/Requests/MassDestroyRequest.php | 31 + .../src/Http/Requests/MassUpdateRequest.php | 32 + .../Admin/src/Http/Requests/PipelineForm.php | 89 + .../Admin/src/Http/Requests/UserForm.php | 43 + .../Http/Resources/ActivityFileResource.php | 26 + .../Resources/ActivityParticipantResource.php | 22 + .../src/Http/Resources/ActivityResource.php | 35 + .../Resources/EmailAttachmentResource.php | 29 + .../src/Http/Resources/EmailResource.php | 43 + .../Admin/src/Http/Resources/LeadResource.php | 37 + .../Http/Resources/OrganizationResource.php | 25 + .../src/Http/Resources/PersonResource.php | 27 + .../src/Http/Resources/PipelineResource.php | 27 + .../src/Http/Resources/ProductResource.php | 27 + .../src/Http/Resources/QuoteResource.php | 33 + .../src/Http/Resources/SourceResource.php | 24 + .../src/Http/Resources/StageResource.php | 29 + .../Admin/src/Http/Resources/TagResource.php | 26 + .../Admin/src/Http/Resources/TypeResource.php | 24 + .../Admin/src/Http/Resources/UserResource.php | 26 + packages/Webkul/Admin/src/Http/helpers.php | 8 + .../Webkul/Admin/src/Listeners/Activity.php | 56 + packages/Webkul/Admin/src/Listeners/Lead.php | 30 + .../Webkul/Admin/src/Listeners/Person.php | 30 + .../Webkul/Admin/src/Notifications/Common.php | 38 + .../Admin/src/Notifications/User/Create.php | 27 + .../Notifications/User/UserResetPassword.php | 28 + .../Notifications/User/UserUpdatePassword.php | 33 + .../src/Providers/AdminServiceProvider.php | 99 + .../src/Providers/EventServiceProvider.php | 31 + .../src/Providers/ModuleServiceProvider.php | 10 + .../Admin/src/Requests/WebhookRequest.php | 47 + .../Admin/src/Resources/assets/css/app.css | 656 + .../src/Resources/assets/fonts/icomoon.woff | Bin 0 -> 37964 bytes .../Resources/assets/images/corner-clip.svg | 21 + .../assets/images/dark-corner-clip.svg | 21 + .../src/Resources/assets/images/dark-logo.svg | 39 + .../images/empty-placeholders/activities.svg | 23 + .../images/empty-placeholders/calls.svg | 21 + .../images/empty-placeholders/default.svg | 26 + .../images/empty-placeholders/description.svg | 20 + .../images/empty-placeholders/emails.svg | 19 + .../images/empty-placeholders/files.svg | 18 + .../images/empty-placeholders/lunches.svg | 19 + .../images/empty-placeholders/meetings.svg | 23 + .../images/empty-placeholders/notes.svg | 17 + .../empty-placeholders/organizations.svg | 32 + .../images/empty-placeholders/pipedrive.svg | 25 + .../images/empty-placeholders/plans.svg | 29 + .../images/empty-placeholders/products.svg | 24 + .../images/empty-placeholders/quotes.svg | 17 + .../images/empty-placeholders/users.svg | 19 + .../src/Resources/assets/images/error.svg | 29 + .../src/Resources/assets/images/favicon.ico | Bin 0 -> 125486 bytes .../src/Resources/assets/images/logo.svg | 39 + .../assets/images/mobile-dark-logo.svg | 5 + .../assets/images/mobile-light-logo.svg | 5 + .../Admin/src/Resources/assets/js/app.js | 134 + .../Admin/src/Resources/assets/js/chart.js | 20 + .../assets/js/directives/debounce.js | 17 + .../assets/js/directives/dompurify.js | 10 + .../Resources/assets/js/directives/tooltip.js | 143 + .../src/Resources/assets/js/plugins/admin.js | 148 + .../src/Resources/assets/js/plugins/axios.js | 14 + .../assets/js/plugins/createElement.js | 15 + .../Resources/assets/js/plugins/draggable.js | 10 + .../Resources/assets/js/plugins/emitter.js | 11 + .../Resources/assets/js/plugins/flatpickr.js | 56 + .../assets/js/plugins/vee-validate.js | 194 + .../Resources/assets/js/plugins/vue-cal.js | 16 + .../src/Resources/assets/locales/hi_IN.json | 32 + .../src/Resources/assets/locales/sin.json | 32 + .../Admin/src/Resources/lang/ar/app.php | 2225 +++ .../Admin/src/Resources/lang/en/app.php | 2440 ++++ .../Admin/src/Resources/lang/es/app.php | 2225 +++ .../Admin/src/Resources/lang/fa/app.php | 2225 +++ .../Admin/src/Resources/lang/pt_BR/app.php | 2308 +++ .../Admin/src/Resources/lang/tr/app.php | 2225 +++ .../Admin/src/Resources/lang/vi/app.php | 2225 +++ .../activities/datagrid/is-done.blade.php | 13 + .../Resources/views/activities/edit.blade.php | 463 + .../views/activities/index.blade.php | 733 + .../components/accordion/index.blade.php | 84 + .../activities/actions/activity.blade.php | 285 + .../actions/activity/participants.blade.php | 245 + .../activities/actions/file.blade.php | 216 + .../activities/actions/mail.blade.php | 293 + .../activities/actions/note.blade.php | 175 + .../components/activities/index.blade.php | 640 + .../components/attachments/index.blade.php | 184 + .../attributes/edit/address.blade.php | 165 + .../attributes/edit/boolean.blade.php | 20 + .../attributes/edit/checkbox.blade.php | 32 + .../components/attributes/edit/date.blade.php | 18 + .../attributes/edit/datetime.blade.php | 8 + .../attributes/edit/email.blade.php | 179 + .../components/attributes/edit/file.blade.php | 39 + .../attributes/edit/image.blade.php | 42 + .../attributes/edit/index.blade.php | 143 + .../attributes/edit/lookup.blade.php | 290 + .../attributes/edit/multiselect.blade.php | 32 + .../attributes/edit/phone.blade.php | 186 + .../attributes/edit/price.blade.php | 32 + .../attributes/edit/select.blade.php | 21 + .../components/attributes/edit/text.blade.php | 8 + .../attributes/edit/textarea.blade.php | 8 + .../components/attributes/index.blade.php | 40 + .../components/attributes/view.blade.php | 25 + .../attributes/view/address.blade.php | 11 + .../attributes/view/boolean.blade.php | 11 + .../attributes/view/checkbox.blade.php | 20 + .../components/attributes/view/date.blade.php | 21 + .../attributes/view/datetime.blade.php | 11 + .../attributes/view/email.blade.php | 11 + .../components/attributes/view/file.blade.php | 11 + .../attributes/view/image.blade.php | 11 + .../attributes/view/lookup.blade.php | 16 + .../attributes/view/multiselect.blade.php | 20 + .../attributes/view/phone.blade.php | 11 + .../attributes/view/price.blade.php | 12 + .../attributes/view/select.blade.php | 18 + .../components/attributes/view/text.blade.php | 13 + .../attributes/view/textarea.blade.php | 12 + .../views/components/avatar/index.blade.php | 69 + .../components/breadcrumbs/index.blade.php | 15 + .../views/components/button/index.blade.php | 40 + .../views/components/charts/bar.blade.php | 100 + .../components/charts/doughnut.blade.php | 68 + .../views/components/charts/line.blade.php | 97 + .../datagrid/export/index.blade.php | 170 + .../components/datagrid/export/temp.blade.php | 23 + .../views/components/datagrid/index.blade.php | 572 + .../views/components/datagrid/table.blade.php | 377 + .../components/datagrid/toolbar.blade.php | 94 + .../datagrid/toolbar/filter.blade.php | 1530 ++ .../datagrid/toolbar/mass-action.blade.php | 220 + .../datagrid/toolbar/pagination.blade.php | 157 + .../datagrid/toolbar/search.blade.php | 157 + .../views/components/drawer/index.blade.php | 201 + .../views/components/dropdown/index.blade.php | 170 + .../components/dropdown/menu/item.blade.php | 3 + .../views/components/example.blade.php | 12 + .../components/flash-group/index.blade.php | 64 + .../components/flash-group/item.blade.php | 205 + .../components/flat-picker/date.blade.php | 81 + .../components/flat-picker/datetime.blade.php | 83 + .../form/control-group/control.blade.php | 353 + .../controls/inline/address.blade.php | 370 + .../controls/inline/boolean.blade.php | 250 + .../controls/inline/date.blade.php | 245 + .../controls/inline/datetime.blade.php | 245 + .../controls/inline/email.blade.php | 320 + .../controls/inline/file.blade.php | 245 + .../controls/inline/image.blade.php | 242 + .../controls/inline/lookup.blade.php | 448 + .../controls/inline/multiselect.blade.php | 367 + .../controls/inline/phone.blade.php | 321 + .../controls/inline/select.blade.php | 270 + .../controls/inline/text.blade.php | 277 + .../control-group/controls/tags.blade.php | 183 + .../form/control-group/error.blade.php | 16 + .../form/control-group/index.blade.php | 3 + .../form/control-group/label.blade.php | 3 + .../views/components/form/index.blade.php | 40 + .../components/layouts/anonymous.blade.php | 124 + .../header/desktop/mega-search.blade.php | 567 + .../components/layouts/header/index.blade.php | 191 + .../header/mobile/mega-search.blade.php | 593 + .../layouts/header/quick-creation.blade.php | 145 + .../views/components/layouts/index.blade.php | 158 + .../layouts/sidebar/desktop/index.blade.php | 63 + .../layouts/sidebar/mobile/index.blade.php | 120 + .../views/components/layouts/tabs.blade.php | 20 + .../views/components/lookup/index.blade.php | 328 + .../views/components/media/images.blade.php | 334 + .../views/components/media/videos.blade.php | 307 + .../views/components/modal/confirm.blade.php | 140 + .../views/components/modal/index.blade.php | 225 + .../shimmer/accordion/index.blade.php | 17 + .../shimmer/activities/index.blade.php | 41 + .../components/shimmer/charts/bar.blade.php | 28 + .../shimmer/common/address.blade.php | 15 + .../index/open-leads-by-states.blade.php | 16 + .../dashboard/index/over-all.blade.php | 13 + .../index/revenue-by-sources.blade.php | 21 + .../index/revenue-by-types.blade.php | 21 + .../shimmer/dashboard/index/revenue.blade.php | 46 + .../dashboard/index/top-persons.blade.php | 25 + .../index/top-selling-products.blade.php | 25 + .../dashboard/index/total-leads.blade.php | 18 + .../shimmer/datagrid/index.blade.php | 15 + .../shimmer/datagrid/table/body.blade.php | 53 + .../shimmer/datagrid/table/head.blade.php | 29 + .../shimmer/datagrid/toolbar.blade.php | 27 + .../shimmer/datagrid/toolbar/filter.blade.php | 3 + .../datagrid/toolbar/pagination.blade.php | 17 + .../shimmer/datagrid/toolbar/search.blade.php | 5 + .../mega-search/configurations.blade.php | 12 + .../header/mega-search/leads.blade.php | 17 + .../header/mega-search/persons.blade.php | 17 + .../header/mega-search/products.blade.php | 17 + .../header/mega-search/quotes.blade.php | 12 + .../header/mega-search/settings.blade.php | 12 + .../components/shimmer/image/index.blade.php | 44 + .../shimmer/leads/datagrid.blade.php | 144 + .../shimmer/leads/index/kanban.blade.php | 60 + .../leads/index/kanban/toolbar.blade.php | 17 + .../shimmer/leads/view/mail/index.blade.php | 111 + .../shimmer/leads/view/stages.blade.php | 9 + .../shimmer/mail/datagrid/index.blade.php | 13 + .../mail/datagrid/table/body.blade.php | 31 + .../mail/datagrid/table/head.blade.php | 13 + .../person/view/activities/index.blade.php | 41 + .../shimmer/person/view/stages.blade.php | 9 + .../shimmer/person/view/tags.blade.php | 9 + .../shimmer/pipelines/kanban.blade.php | 33 + .../components/shimmer/quotes/index.blade.php | 116 + .../shimmer/settings/attributes.blade.php | 62 + .../shimmer/settings/web-forms/body.blade.php | 13 + .../shimmer/settings/web-forms/head.blade.php | 7 + .../settings/web-forms/index.blade.php | 13 + .../components/shimmer/tabs/index.blade.php | 9 + .../components/shimmer/tags/index.blade.php | 9 + .../shimmer/tinymce/index.blade.php | 3 + .../components/shimmer/tree/index.blade.php | 31 + .../views/components/spinner/index.blade.php | 27 + .../views/components/table/index.blade.php | 3 + .../components/table/tbody/index.blade.php | 3 + .../views/components/table/tbody/tr.blade.php | 3 + .../views/components/table/td.blade.php | 4 + .../views/components/table/th.blade.php | 3 + .../components/table/thead/index.blade.php | 3 + .../views/components/table/thead/tr.blade.php | 3 + .../views/components/tabs/index.blade.php | 65 + .../views/components/tabs/item.blade.php | 51 + .../views/components/tags/index.blade.php | 398 + .../views/components/tinymce/index.blade.php | 217 + .../views/components/tree/checkbox.blade.php | 55 + .../views/components/tree/radio.blade.php | 54 + .../views/components/tree/view.blade.php | 393 + .../views/configuration/edit.blade.php | 83 + .../views/configuration/field-type.blade.php | 524 + .../views/configuration/index.blade.php | 196 + .../contacts/organizations/create.blade.php | 73 + .../contacts/organizations/edit.blade.php | 75 + .../contacts/organizations/index.blade.php | 50 + .../views/contacts/persons/create.blade.php | 117 + .../views/contacts/persons/edit.blade.php | 120 + .../views/contacts/persons/index.blade.php | 339 + .../views/contacts/persons/view.blade.php | 100 + .../persons/view/attributes.blade.php | 41 + .../persons/view/organization.blade.php | 73 + .../Resources/views/dashboard/index.blade.php | 160 + .../index/open-leads-by-states.blade.php | 168 + .../views/dashboard/index/over-all.blade.php | 231 + .../index/revenue-by-sources.blade.php | 154 + .../index/revenue-by-types.blade.php | 154 + .../views/dashboard/index/revenue.blade.php | 241 + .../dashboard/index/top-persons.blade.php | 120 + .../index/top-selling-products.blade.php | 129 + .../dashboard/index/total-leads.blade.php | 128 + .../views/emails/common/index.blade.php | 3 + .../Resources/views/emails/layout.blade.php | 36 + .../views/emails/users/create.blade.php | 11 + .../emails/users/forget-password.blade.php | 28 + .../Resources/views/errors/index.blade.php | 64 + .../views/leads/common/contact.blade.php | 141 + .../views/leads/common/products.blade.php | 269 + .../Resources/views/leads/create.blade.php | 272 + .../src/Resources/views/leads/edit.blade.php | 270 + .../src/Resources/views/leads/index.blade.php | 66 + .../views/leads/index/kanban.blade.php | 772 + .../views/leads/index/kanban/filter.blade.php | 1093 ++ .../views/leads/index/kanban/search.blade.php | 98 + .../leads/index/kanban/toolbar.blade.php | 30 + .../views/leads/index/table.blade.php | 12 + .../views/leads/index/upload.blade.php | 141 + .../views/leads/index/view-switcher.blade.php | 95 + .../src/Resources/views/leads/view.blade.php | 142 + .../views/leads/view/attributes.blade.php | 49 + .../views/leads/view/person.blade.php | 103 + .../views/leads/view/products.blade.php | 379 + .../views/leads/view/quotes.blade.php | 218 + .../views/leads/view/stages.blade.php | 262 + .../src/Resources/views/mail/index.blade.php | 712 + .../src/Resources/views/mail/view.blade.php | 2019 +++ .../views/partials/breadcrumbs.blade.php | 27 + .../Resources/views/products/create.blade.php | 107 + .../Resources/views/products/edit.blade.php | 107 + .../Resources/views/products/index.blade.php | 45 + .../Resources/views/products/view.blade.php | 112 + .../views/products/view/attributes.blade.php | 44 + .../views/products/view/inventory.blade.php | 507 + .../Resources/views/quotes/create.blade.php | 807 ++ .../src/Resources/views/quotes/edit.blade.php | 800 ++ .../Resources/views/quotes/index.blade.php | 88 + .../src/Resources/views/quotes/pdf.blade.php | 408 + .../views/sessions/forgot-password.blade.php | 91 + .../Resources/views/sessions/login.blade.php | 129 + .../views/sessions/reset-password.blade.php | 136 + .../settings/attributes/create.blade.php | 658 + .../views/settings/attributes/edit.blade.php | 741 + .../views/settings/attributes/index.blade.php | 51 + .../data-transfer/imports/create.blade.php | 232 + .../data-transfer/imports/edit.blade.php | 251 + .../data-transfer/imports/import.blade.php | 539 + .../data-transfer/imports/index.blade.php | 50 + .../settings/email-templates/create.blade.php | 234 + .../settings/email-templates/edit.blade.php | 238 + .../settings/email-templates/index.blade.php | 51 + .../views/settings/groups/index.blade.php | 352 + .../Resources/views/settings/index.blade.php | 58 + .../marketing/campaigns/index.blade.php | 525 + .../settings/marketing/events/index.blade.php | 410 + .../views/settings/pipelines/create.blade.php | 427 + .../views/settings/pipelines/edit.blade.php | 377 + .../views/settings/pipelines/index.blade.php | 52 + .../views/settings/roles/create.blade.php | 214 + .../views/settings/roles/edit.blade.php | 222 + .../views/settings/roles/index.blade.php | 47 + .../views/settings/sources/index.blade.php | 317 + .../views/settings/tags/index.blade.php | 392 + .../views/settings/types/index.blade.php | 311 + .../views/settings/users/index.blade.php | 592 + .../settings/warehouses/create.blade.php | 106 + .../views/settings/warehouses/edit.blade.php | 110 + .../views/settings/warehouses/index.blade.php | 47 + .../views/settings/warehouses/view.blade.php | 117 + .../view/contact-information.blade.php | 38 + .../view/general-information.blade.php | 38 + .../warehouses/view/locations.blade.php | 208 + .../views/settings/web-forms/create.blade.php | 717 + .../views/settings/web-forms/edit.blade.php | 832 ++ .../views/settings/web-forms/index.blade.php | 120 + .../views/settings/webhook/create.blade.php | 699 + .../views/settings/webhook/edit.blade.php | 712 + .../views/settings/webhook/index.blade.php | 46 + .../views/settings/workflows/create.blade.php | 1262 ++ .../views/settings/workflows/edit.blade.php | 1280 ++ .../views/settings/workflows/index.blade.php | 50 + .../views/user/account/edit.blade.php | 201 + .../src/Routes/Admin/activities-routes.php | 24 + .../Admin/src/Routes/Admin/auth-routes.php | 47 + .../src/Routes/Admin/configuration-routes.php | 16 + .../src/Routes/Admin/contacts-routes.php | 67 + .../Admin/src/Routes/Admin/leads-routes.php | 64 + .../Admin/src/Routes/Admin/mail-routes.php | 33 + .../src/Routes/Admin/products-routes.php | 42 + .../Admin/src/Routes/Admin/quote-routes.php | 24 + .../Admin/src/Routes/Admin/rest-routes.php | 54 + .../src/Routes/Admin/settings-routes.php | 377 + .../Webkul/Admin/src/Routes/Admin/web.php | 51 + .../Webkul/Admin/src/Routes/Front/web.php | 9 + .../src/Traits/ProvideDropdownOptions.php | 279 + packages/Webkul/Admin/tailwind.config.js | 49 + packages/Webkul/Admin/tests/e2e-pw/.gitignore | 2 + .../Admin/tests/e2e-pw/data/images/1.webp | Bin 0 -> 174236 bytes .../Admin/tests/e2e-pw/data/images/10.webp | Bin 0 -> 29098 bytes .../Admin/tests/e2e-pw/data/images/11.webp | Bin 0 -> 21748 bytes .../Admin/tests/e2e-pw/data/images/12.webp | Bin 0 -> 24766 bytes .../Admin/tests/e2e-pw/data/images/2.webp | Bin 0 -> 248118 bytes .../Admin/tests/e2e-pw/data/images/3.webp | Bin 0 -> 123028 bytes .../Admin/tests/e2e-pw/data/images/4.webp | Bin 0 -> 90892 bytes .../Admin/tests/e2e-pw/data/images/5.webp | Bin 0 -> 208684 bytes .../Admin/tests/e2e-pw/data/images/6.webp | Bin 0 -> 36952 bytes .../Admin/tests/e2e-pw/data/images/7.webp | Bin 0 -> 24766 bytes .../Admin/tests/e2e-pw/data/images/8.webp | Bin 0 -> 29098 bytes .../Admin/tests/e2e-pw/data/images/9.webp | Bin 0 -> 27758 bytes .../Admin/tests/e2e-pw/playwright.config.ts | 56 + packages/Webkul/Admin/tests/e2e-pw/setup.ts | 25 + .../Admin/tests/e2e-pw/tests/auth.spec.ts | 36 + .../tests/contacts/organization.spec.ts | 113 + .../e2e-pw/tests/contacts/person.spec.ts | 40 + .../tests/e2e-pw/tests/lang/lang.spec.ts | 81 + .../Admin/tests/e2e-pw/tests/lead.spec.ts | 235 + .../tests/e2e-pw/tests/mail/draft.spec.ts | 1 + .../tests/e2e-pw/tests/mail/inbox.spec.ts | 69 + .../tests/e2e-pw/tests/mail/outbox.spec.ts | 1 + .../tests/e2e-pw/tests/mail/sent.spec.ts | 1 + .../tests/e2e-pw/tests/mail/trash.spec.ts | 1 + .../Admin/tests/e2e-pw/tests/product.spec.ts | 102 + .../Admin/tests/e2e-pw/tests/quotes.spec.ts | 103 + .../tests/settings/automation/events.spec.ts | 94 + .../e2e-pw/tests/settings/lead/types.spec.ts | 90 + .../e2e-pw/tests/settings/user/groups.spec.ts | 36 + .../e2e-pw/tests/settings/user/users.spec.ts | 227 + .../settings/warehouses/warehouse.spec.ts | 57 + .../Admin/tests/e2e-pw/utils/components.ts | 18 + .../Webkul/Admin/tests/e2e-pw/utils/faker.ts | 471 + packages/Webkul/Admin/vite.config.js | 48 + packages/Webkul/Attribute/composer.json | 27 + .../src/Config/attribute_lookups.php | 5 + .../Attribute/src/Contracts/Attribute.php | 5 + .../src/Contracts/AttributeOption.php | 5 + .../src/Contracts/AttributeValue.php | 5 + ...1_04_02_080709_create_attributes_table.php | 43 + ..._080837_create_attribute_options_table.php | 34 + ...6_122751_create_attribute_values_table.php | 44 + ...02_191710_alter_attribute_values_table.php | 39 + .../Webkul/Attribute/src/Models/Attribute.php | 35 + .../Attribute/src/Models/AttributeOption.php | 30 + .../src/Models/AttributeOptionProxy.php | 7 + .../Attribute/src/Models/AttributeProxy.php | 7 + .../Attribute/src/Models/AttributeValue.php | 85 + .../src/Models/AttributeValueProxy.php | 7 + .../Providers/AttributeServiceProvider.php | 41 + .../src/Providers/ModuleServiceProvider.php | 14 + .../AttributeOptionRepository.php | 18 + .../src/Repositories/AttributeRepository.php | 179 + .../Repositories/AttributeValueRepository.php | 267 + .../Attribute/src/Traits/CustomAttribute.php | 175 + .../Automation/src/Config/workflows.php | 74 + .../Automation/src/Contracts/Webhook.php | 5 + .../Automation/src/Contracts/Workflow.php | 5 + ...21_08_26_133538_create_workflows_table.php | 38 + ...024_07_24_150821_create_webhooks_table.php | 37 + .../Webkul/Automation/src/Helpers/Entity.php | 103 + .../src/Helpers/Entity/AbstractEntity.php | 232 + .../src/Helpers/Entity/Activity.php | 323 + .../Automation/src/Helpers/Entity/Lead.php | 210 + .../Automation/src/Helpers/Entity/Person.php | 140 + .../Automation/src/Helpers/Entity/Quote.php | 172 + .../Automation/src/Helpers/Validator.php | 183 + .../Automation/src/Listeners/Entity.php | 45 + .../Webkul/Automation/src/Models/Webhook.php | 41 + .../Automation/src/Models/WebhookProxy.php | 7 + .../Webkul/Automation/src/Models/Workflow.php | 24 + .../Automation/src/Models/WorkflowProxy.php | 7 + .../src/Providers/ModuleServiceProvider.php | 20 + .../src/Providers/WorkflowServiceProvider.php | 47 + .../src/Repositories/WebhookRepository.php | 17 + .../src/Repositories/WorkflowRepository.php | 17 + .../src/Services/WebhookService.php | 438 + packages/Webkul/Contact/composer.json | 28 + .../Contact/src/Contracts/Organization.php | 5 + .../Webkul/Contact/src/Contracts/Person.php | 5 + .../src/Database/Factories/PersonFactory.php | 30 + ...4_09_051326_create_organizations_table.php | 34 + ...2021_04_09_065617_create_persons_table.php | 37 + ...e_index_to_name_in_organizations_table.php | 32 + ..._092951_add_job_title_in_persons_table.php | 28 + ..._08_06_145943_create_person_tags_table.php | 30 + ..._161212_create_person_activities_table.php | 30 + ...16_add_user_id_column_in_persons_table.php | 30 + ..._user_id_column_in_organizations_table.php | 30 + ...9_112201_add_unique_id_to_person_table.php | 41 + ...rganization_id_column_in_persons_table.php | 32 + .../Contact/src/Models/Organization.php | 46 + .../Contact/src/Models/OrganizationProxy.php | 7 + packages/Webkul/Contact/src/Models/Person.php | 109 + .../Webkul/Contact/src/Models/PersonProxy.php | 7 + .../src/Providers/ContactServiceProvider.php | 26 + .../src/Providers/ModuleServiceProvider.php | 13 + .../Repositories/OrganizationRepository.php | 119 + .../src/Repositories/PersonRepository.php | 184 + packages/Webkul/Core/composer.json | 26 + packages/Webkul/Core/src/Acl.php | 125 + packages/Webkul/Core/src/Acl/AclItem.php | 19 + packages/Webkul/Core/src/Config/concord.php | 25 + packages/Webkul/Core/src/Config/cors.php | 62 + packages/Webkul/Core/src/Config/sanctum.php | 65 + .../Core/src/Console/Commands/Version.php | 42 + .../Webkul/Core/src/Contracts/CoreConfig.php | 5 + .../Webkul/Core/src/Contracts/Country.php | 5 + .../Core/src/Contracts/CountryState.php | 5 + .../Core/src/Contracts/Validations/Code.php | 30 + .../src/Contracts/Validations/Decimal.php | 21 + packages/Webkul/Core/src/Core.php | 243 + ..._03_12_060658_create_core_config_table.php | 33 + ...21_04_12_173232_create_countries_table.php | 32 + ..._12_173344_create_country_states_table.php | 36 + ..._text_column_type_in_core_config_table.php | 28 + .../Webkul/Core/src/Eloquent/Repository.php | 146 + .../Core/src/Eloquent/TranslatableModel.php | 23 + .../Core/src/Exceptions/ViterNotFound.php | 17 + packages/Webkul/Core/src/Facades/Acl.php | 18 + packages/Webkul/Core/src/Facades/Core.php | 18 + packages/Webkul/Core/src/Facades/Menu.php | 18 + .../Webkul/Core/src/Facades/SystemConfig.php | 18 + packages/Webkul/Core/src/Helpers/Helper.php | 27 + .../src/Http/Controllers/CoreController.php | 40 + packages/Webkul/Core/src/Http/helpers.php | 74 + packages/Webkul/Core/src/Menu.php | 188 + packages/Webkul/Core/src/Menu/MenuItem.php | 200 + .../Webkul/Core/src/Models/CoreConfig.php | 24 + .../Core/src/Models/CoreConfigProxy.php | 7 + packages/Webkul/Core/src/Models/Country.php | 11 + .../Webkul/Core/src/Models/CountryProxy.php | 7 + .../Webkul/Core/src/Models/CountryState.php | 11 + .../Core/src/Models/CountryStateProxy.php | 7 + .../Providers/BaseModuleServiceProvider.php | 32 + .../src/Providers/CoreServiceProvider.php | 90 + .../src/Providers/ModuleServiceProvider.php | 12 + .../src/Repositories/CoreConfigRepository.php | 234 + .../src/Repositories/CountryRepository.php | 21 + .../Repositories/CountryStateRepository.php | 21 + .../Webkul/Core/src/Resources/lang/ar/app.php | 8 + .../Webkul/Core/src/Resources/lang/en/app.php | 8 + .../Webkul/Core/src/Resources/lang/es/app.php | 8 + .../Webkul/Core/src/Resources/lang/fa/app.php | 8 + .../Core/src/Resources/lang/pt_BR/app.php | 8 + .../Webkul/Core/src/Resources/lang/tr/app.php | 8 + .../Webkul/Core/src/Resources/lang/vi/app.php | 8 + packages/Webkul/Core/src/SystemConfig.php | 188 + .../Webkul/Core/src/SystemConfig/Item.php | 123 + .../Core/src/SystemConfig/ItemField.php | 244 + .../Webkul/Core/src/Traits/PDFHandler.php | 65 + packages/Webkul/Core/src/Traits/Sanitizer.php | 81 + .../Core/src/ViewRenderEventManager.php | 89 + packages/Webkul/Core/src/Vite.php | 49 + packages/Webkul/DataGrid/src/Action.php | 34 + packages/Webkul/DataGrid/src/Column.php | 374 + .../DataGrid/src/ColumnTypes/Aggregate.php | 41 + .../DataGrid/src/ColumnTypes/Boolean.php | 68 + .../Webkul/DataGrid/src/ColumnTypes/Date.php | 61 + .../DataGrid/src/ColumnTypes/Datetime.php | 58 + .../DataGrid/src/ColumnTypes/Decimal.php | 26 + .../DataGrid/src/ColumnTypes/Integer.php | 26 + .../Webkul/DataGrid/src/ColumnTypes/Text.php | 41 + .../DataGrid/src/Contracts/SavedFilter.php | 5 + packages/Webkul/DataGrid/src/DataGrid.php | 582 + ...5_10_152848_create_saved_filters_table.php | 33 + .../DataGrid/src/Enums/ColumnTypeEnum.php | 67 + .../src/Enums/DateRangeOptionEnum.php | 103 + .../DataGrid/src/Enums/FilterTypeEnum.php | 21 + .../src/Exceptions/InvalidColumnException.php | 7 + .../Exceptions/InvalidColumnTypeException.php | 7 + .../Exceptions/InvalidDataGridException.php | 7 + .../DataGrid/src/Exports/DataGridExport.php | 78 + packages/Webkul/DataGrid/src/Http/helpers.php | 18 + packages/Webkul/DataGrid/src/MassAction.php | 34 + .../DataGrid/src/Models/SavedFilter.php | 40 + .../DataGrid/src/Models/SavedFilterProxy.php | 7 + .../src/Providers/DataGridServiceProvider.php | 23 + .../src/Providers/ModuleServiceProvider.php | 12 + .../Repositories/SavedFilterRepository.php | 17 + .../DataTransfer/src/Config/importers.php | 21 + .../DataTransfer/src/Contracts/Import.php | 5 + .../src/Contracts/ImportBatch.php | 5 + ...2024_01_11_154640_create_imports_table.php | 45 + ..._11_154741_create_import_batches_table.php | 32 + .../Webkul/DataTransfer/src/Helpers/Error.php | 186 + .../DataTransfer/src/Helpers/Import.php | 573 + .../Helpers/Importers/AbstractImporter.php | 551 + .../src/Helpers/Importers/Leads/Importer.php | 515 + .../src/Helpers/Importers/Leads/Storage.php | 97 + .../Helpers/Importers/Persons/Importer.php | 492 + .../src/Helpers/Importers/Persons/Storage.php | 99 + .../Helpers/Importers/Products/Importer.php | 369 + .../Helpers/Importers/Products/SKUStorage.php | 107 + .../src/Helpers/Sources/AbstractSource.php | 120 + .../DataTransfer/src/Helpers/Sources/CSV.php | 79 + .../src/Helpers/Sources/Excel.php | 70 + .../src/Jobs/Import/Completed.php | 38 + .../src/Jobs/Import/ImportBatch.php | 41 + .../src/Jobs/Import/IndexBatch.php | 41 + .../DataTransfer/src/Jobs/Import/Indexing.php | 38 + .../src/Jobs/Import/LinkBatch.php | 41 + .../DataTransfer/src/Jobs/Import/Linking.php | 38 + .../Webkul/DataTransfer/src/Models/Import.php | 63 + .../DataTransfer/src/Models/ImportBatch.php | 48 + .../src/Models/ImportBatchProxy.php | 7 + .../DataTransfer/src/Models/ImportProxy.php | 7 + .../Providers/DataTransferServiceProvider.php | 26 + .../src/Providers/ModuleServiceProvider.php | 18 + .../Repositories/ImportBatchRepository.php | 17 + .../src/Repositories/ImportRepository.php | 17 + .../DataTransfer/src/Resources/lang/ar/ar.php | 49 + .../src/Resources/lang/en/app.php | 50 + .../src/Resources/lang/es/app.php | 49 + .../src/Resources/lang/fa/app.php | 49 + .../src/Resources/lang/pt_BR/app.php | 50 + .../src/Resources/lang/tr/app.php | 49 + packages/Webkul/Email/composer.json | 28 + .../Console/Commands/ProcessInboundEmails.php | 48 + .../Webkul/Email/src/Contracts/Attachment.php | 5 + packages/Webkul/Email/src/Contracts/Email.php | 5 + .../2021_05_24_075618_create_emails_table.php | 58 + ..._072700_create_email_attachments_table.php | 40 + ...4_08_27_091619_create_email_tags_table.php | 30 + .../Email/src/Enums/SupportedFolderEnum.php | 46 + .../Webkul/Email/src/Helpers/Attachment.php | 108 + packages/Webkul/Email/src/Helpers/Charset.php | 353 + .../src/Helpers/Contracts/CharsetManager.php | 20 + .../Webkul/Email/src/Helpers/HtmlFilter.php | 1207 ++ packages/Webkul/Email/src/Helpers/Parser.php | 888 ++ .../Contracts/InboundEmailProcessor.php | 20 + .../SendgridEmailProcessor.php | 125 + .../WebklexImapEmailProcessor.php | 228 + packages/Webkul/Email/src/Mails/Email.php | 51 + .../Webkul/Email/src/Models/Attachment.php | 62 + .../Email/src/Models/AttachmentProxy.php | 7 + packages/Webkul/Email/src/Models/Email.php | 127 + .../Webkul/Email/src/Models/EmailProxy.php | 7 + .../src/Providers/EmailServiceProvider.php | 58 + .../src/Providers/ModuleServiceProvider.php | 13 + .../src/Repositories/AttachmentRepository.php | 81 + .../src/Repositories/EmailRepository.php | 95 + .../src/Contracts/EmailTemplate.php | 5 + ...03_172713_create_email_templates_table.php | 34 + ..._09_133553_alter_email_templates_table.php | 30 + .../src/Models/EmailTemplate.php | 15 + .../src/Models/EmailTemplateProxy.php | 7 + .../EmailTemplateServiceProvider.php | 18 + .../src/Providers/ModuleServiceProvider.php | 12 + .../Repositories/EmailTemplateRepository.php | 18 + packages/Webkul/Installer/.gitignore | 3 + packages/Webkul/Installer/composer.json | 26 + packages/Webkul/Installer/package.json | 24 + packages/Webkul/Installer/postcss.config.js | 6 + .../src/Console/Commands/Installer.php | 495 + .../Webkul/Installer/src/Data/countries.json | 1277 ++ .../Webkul/Installer/src/Data/states.json | 3978 ++++++ ...rehouse_attributes_in_attributes_table.php | 117 + ...es_owner_attribute_in_attributes_table.php | 40 + ...ob_title_attribute_in_attributes_table.php | 40 + ...es_owner_attribute_in_attributes_table.php | 40 + ...dd_leads_stage_and_pipeline_attributes.php | 57 + .../Seeders/Attribute/AttributeSeeder.php | 645 + .../Seeders/Attribute/DatabaseSeeder.php | 19 + .../Database/Seeders/Core/CountriesSeeder.php | 24 + .../Database/Seeders/Core/DatabaseSeeder.php | 20 + .../Database/Seeders/Core/StatesSeeder.php | 24 + .../src/Database/Seeders/DatabaseSeeder.php | 30 + .../Seeders/EmailTemplate/DatabaseSeeder.php | 19 + .../EmailTemplate/EmailTemplateSeeder.php | 85 + .../Database/Seeders/Lead/DatabaseSeeder.php | 21 + .../Database/Seeders/Lead/PipelineSeeder.php | 83 + .../Database/Seeders/Lead/SourceSeeder.php | 54 + .../src/Database/Seeders/Lead/TypeSeeder.php | 39 + .../Database/Seeders/User/DatabaseSeeder.php | 20 + .../src/Database/Seeders/User/RoleSeeder.php | 31 + .../src/Database/Seeders/User/UserSeeder.php | 34 + .../Seeders/Workflow/DatabaseSeeder.php | 19 + .../Seeders/Workflow/WorkflowSeeder.php | 51 + .../Installer/src/Events/ComposerEvents.php | 20 + .../Installer/src/Helpers/DatabaseManager.php | 107 + .../src/Helpers/EnvironmentManager.php | 94 + .../src/Helpers/ServerRequirements.php | 96 + .../src/Http/Controllers/Controller.php | 12 + .../Http/Controllers/ImageCacheController.php | 108 + .../Http/Controllers/InstallerController.php | 143 + .../src/Http/Middleware/CanInstall.php | 50 + .../Installer/src/Http/Middleware/Locale.php | 27 + .../Installer/src/Listeners/Installer.php | 53 + .../Providers/InstallerServiceProvider.php | 62 + .../src/Resources/assets/css/app.css | 182 + .../src/Resources/assets/fonts/icomoon.eot | Bin 0 -> 35796 bytes .../src/Resources/assets/fonts/icomoon.svg | 89 + .../src/Resources/assets/fonts/icomoon.ttf | Bin 0 -> 35632 bytes .../src/Resources/assets/fonts/icomoon.woff | Bin 0 -> 35708 bytes .../src/Resources/assets/images/favicon.ico | Bin 0 -> 1150 bytes .../Resources/assets/images/krayin-logo.svg | 7 + .../src/Resources/assets/images/spinner.svg | 18 + .../Installer/src/Resources/assets/js/app.js | 89 + .../src/Resources/assets/js/plugins/axios.js | 9 + .../Installer/src/Resources/lang/ar/app.php | 289 + .../Installer/src/Resources/lang/en/app.php | 289 + .../Installer/src/Resources/lang/es/app.php | 289 + .../Installer/src/Resources/lang/fa/app.php | 289 + .../src/Resources/lang/pt_BR/app.php | 218 + .../Installer/src/Resources/lang/tr/app.php | 289 + .../Installer/src/Resources/lang/vi/app.php | 289 + .../views/components/button/index.blade.php | 63 + .../form/control-group/control.blade.php | 70 + .../form/control-group/error.blade.php | 13 + .../form/control-group/index.blade.php | 3 + .../form/control-group/label.blade.php | 3 + .../views/components/form/index.blade.php | 34 + .../Resources/views/installer/index.blade.php | 1242 ++ packages/Webkul/Installer/src/Routes/web.php | 23 + .../Installer/src/Templates/on-boarding.php | 16 + packages/Webkul/Installer/tailwind.config.js | 47 + packages/Webkul/Installer/vite.config.js | 46 + packages/Webkul/Lead/composer.json | 35 + packages/Webkul/Lead/src/Contracts/Lead.php | 5 + .../Webkul/Lead/src/Contracts/Pipeline.php | 5 + .../Webkul/Lead/src/Contracts/Product.php | 5 + packages/Webkul/Lead/src/Contracts/Source.php | 5 + packages/Webkul/Lead/src/Contracts/Stage.php | 5 + packages/Webkul/Lead/src/Contracts/Type.php | 5 + ...04_21_172825_create_lead_sources_table.php | 32 + ...1_04_21_172847_create_lead_types_table.php | 32 + ..._04_22_153258_create_lead_stages_table.php | 34 + ..._22_155706_create_lead_pipelines_table.php | 33 + ...5838_create_lead_pipeline_stages_table.php | 38 + .../2021_04_22_164215_create_leads_table.php | 56 + ...4_22_171805_create_lead_products_table.php | 40 + ...12_150329_create_lead_activities_table.php | 34 + ...21_05_20_141240_create_lead_tags_table.php | 34 + ..._07_02_201822_create_lead_quotes_table.php | 34 + ...umn_expected_close_date_in_leads_table.php | 32 + ...mn_rotten_days_in_lead_pipelines_table.php | 32 + ...54222_alter_lead_pipeline_stages_table.php | 57 + .../2021_09_30_161722_alter_leads_table.php | 50 + ...nge_user_id_to_nullable_in_leads_table.php | 32 + ...ine_stage_id_constraint_in_leads_table.php | 36 + ...302_modify_foreign_keys_in_leads_table.php | 80 + ...7_01_133612_alter_lead_pipelines_table.php | 30 + packages/Webkul/Lead/src/Helpers/MagicAI.php | 127 + packages/Webkul/Lead/src/Models/Lead.php | 173 + packages/Webkul/Lead/src/Models/LeadProxy.php | 7 + packages/Webkul/Lead/src/Models/Pipeline.php | 38 + .../Webkul/Lead/src/Models/PipelineProxy.php | 7 + packages/Webkul/Lead/src/Models/Product.php | 61 + .../Webkul/Lead/src/Models/ProductProxy.php | 7 + packages/Webkul/Lead/src/Models/Source.php | 28 + .../Webkul/Lead/src/Models/SourceProxy.php | 7 + packages/Webkul/Lead/src/Models/Stage.php | 42 + .../Webkul/Lead/src/Models/StageProxy.php | 7 + packages/Webkul/Lead/src/Models/Type.php | 28 + packages/Webkul/Lead/src/Models/TypeProxy.php | 7 + .../src/Providers/LeadServiceProvider.php | 26 + .../src/Providers/ModuleServiceProvider.php | 17 + .../Lead/src/Repositories/LeadRepository.php | 254 + .../src/Repositories/PipelineRepository.php | 114 + .../src/Repositories/ProductRepository.php | 18 + .../src/Repositories/SourceRepository.php | 18 + .../Lead/src/Repositories/StageRepository.php | 18 + .../Lead/src/Repositories/TypeRepository.php | 18 + .../Lead/src/Services/MagicAIService.php | 238 + .../src/Console/Commands/CampaignCommand.php | 49 + .../Marketing/src/Contracts/Campaign.php | 5 + .../Webkul/Marketing/src/Contracts/Event.php | 5 + ...9_044744_create_marketing_events_table.php | 30 + ...22500_create_marketing_campaigns_table.php | 32 + .../Webkul/Marketing/src/Helpers/Campaign.php | 56 + .../Marketing/src/Mail/CampaignMail.php | 45 + .../Webkul/Marketing/src/Models/Campaign.php | 47 + .../Marketing/src/Models/CampaignProxy.php | 7 + .../Webkul/Marketing/src/Models/Event.php | 32 + .../Marketing/src/Models/EventProxy.php | 7 + .../Providers/MarketingServiceProvider.php | 44 + .../src/Providers/ModuleServiceProvider.php | 18 + .../src/Repositories/CampaignRepository.php | 17 + .../src/Repositories/EventRepository.php | 17 + packages/Webkul/Product/composer.json | 28 + .../Webkul/Product/src/Contracts/Product.php | 5 + .../src/Contracts/ProductInventory.php | 5 + ...021_04_09_065617_create_products_table.php | 36 + ...54009_create_product_inventories_table.php | 39 + ...150329_create_product_activities_table.php | 34 + ...08_10_150340_create_product_tags_table.php | 34 + ...065808_alter_product_inventories_table.php | 26 + .../Webkul/Product/src/Models/Product.php | 72 + .../Product/src/Models/ProductInventory.php | 61 + .../src/Models/ProductInventoryProxy.php | 7 + .../Product/src/Models/ProductProxy.php | 7 + .../src/Providers/ModuleServiceProvider.php | 13 + .../src/Providers/ProductServiceProvider.php | 26 + .../ProductInventoryRepository.php | 18 + .../src/Repositories/ProductRepository.php | 192 + packages/Webkul/Quote/src/Contracts/Quote.php | 5 + .../Webkul/Quote/src/Contracts/QuoteItem.php | 5 + .../2021_07_01_230345_create_quotes_table.php | 52 + ..._07_01_231317_create_quote_items_table.php | 49 + packages/Webkul/Quote/src/Models/Quote.php | 76 + .../Webkul/Quote/src/Models/QuoteItem.php | 39 + .../Quote/src/Models/QuoteItemProxy.php | 7 + .../Webkul/Quote/src/Models/QuoteProxy.php | 7 + .../src/Providers/ModuleServiceProvider.php | 13 + .../src/Providers/QuoteServiceProvider.php | 26 + .../src/Repositories/QuoteItemRepository.php | 68 + .../src/Repositories/QuoteRepository.php | 147 + packages/Webkul/Tag/composer.json | 28 + packages/Webkul/Tag/src/Contracts/Tag.php | 5 + .../2021_05_20_141230_create_tags_table.php | 37 + packages/Webkul/Tag/src/Models/Tag.php | 31 + packages/Webkul/Tag/src/Models/TagProxy.php | 7 + .../src/Providers/ModuleServiceProvider.php | 12 + .../Tag/src/Providers/TagServiceProvider.php | 26 + .../Tag/src/Repositories/TagRepository.php | 27 + packages/Webkul/User/.gitignore | 1 + packages/Webkul/User/composer.json | 27 + packages/Webkul/User/src/Contracts/Group.php | 5 + packages/Webkul/User/src/Contracts/Role.php | 5 + packages/Webkul/User/src/Contracts/User.php | 5 + .../User/src/Database/Migrations/.gitkeep | 0 .../2021_03_12_074578_create_groups_table.php | 33 + .../2021_03_12_074597_create_roles_table.php | 35 + .../2021_03_12_074857_create_users_table.php | 38 + ..._03_12_074867_create_user_groups_table.php | 34 + ...4957_create_user_password_resets_table.php | 32 + ...d_unique_index_to_name_in_groups_table.php | 32 + ...171510_add_image_column_in_users_table.php | 32 + packages/Webkul/User/src/Models/Group.php | 27 + .../Webkul/User/src/Models/GroupProxy.php | 7 + packages/Webkul/User/src/Models/Role.php | 33 + packages/Webkul/User/src/Models/RoleProxy.php | 7 + packages/Webkul/User/src/Models/User.php | 104 + packages/Webkul/User/src/Models/UserProxy.php | 7 + .../src/Providers/ModuleServiceProvider.php | 14 + .../src/Providers/UserServiceProvider.php | 26 + .../User/src/Repositories/GroupRepository.php | 18 + .../User/src/Repositories/RoleRepository.php | 18 + .../User/src/Repositories/UserRepository.php | 46 + .../Warehouse/src/Contracts/Location.php | 5 + .../Warehouse/src/Contracts/Warehouse.php | 5 + ...4_06_21_160707_create_warehouses_table.php | 33 + ...60735_create_warehouse_locations_table.php | 34 + ...0329_create_warehouse_activities_table.php | 34 + ..._10_100340_create_warehouse_tags_table.php | 34 + .../Webkul/Warehouse/src/Models/Location.php | 32 + .../Warehouse/src/Models/LocationProxy.php | 7 + .../Webkul/Warehouse/src/Models/Warehouse.php | 64 + .../Warehouse/src/Models/WarehouseProxy.php | 7 + .../src/Providers/ModuleServiceProvider.php | 13 + .../Providers/WarehouseServiceProvider.php | 26 + .../src/Repositories/LocationRepository.php | 26 + .../src/Repositories/WarehouseRepository.php | 101 + packages/Webkul/WebForm/.gitignore | 3 + packages/Webkul/WebForm/composer.json | 25 + packages/Webkul/WebForm/package.json | 24 + packages/Webkul/WebForm/postcss.config.js | 6 + packages/Webkul/WebForm/src/Config/acl.php | 30 + packages/Webkul/WebForm/src/Config/menu.php | 12 + .../Webkul/WebForm/src/Contracts/WebForm.php | 5 + .../src/Contracts/WebFormAttribute.php | 5 + .../WebForm/src/DataGrids/WebFormDataGrid.php | 84 + ...21_12_14_213049_create_web_forms_table.php | 43 + ...14923_create_web_form_attributes_table.php | 41 + .../src/Http/Controllers/Controller.php | 23 + .../Http/Controllers/WebFormController.php | 160 + .../WebForm/src/Http/Requests/WebForm.php | 127 + .../Webkul/WebForm/src/Models/WebForm.php | 32 + .../WebForm/src/Models/WebFormAttribute.php | 48 + .../src/Models/WebFormAttributeProxy.php | 7 + .../WebForm/src/Models/WebFormProxy.php | 7 + .../src/Providers/ModuleServiceProvider.php | 13 + .../src/Providers/WebFormServiceProvider.php | 45 + .../WebFormAttributeRepository.php | 18 + .../src/Repositories/WebFormRepository.php | 87 + .../WebForm/src/Resources/assets/css/app.css | 128 + .../src/Resources/assets/fonts/icomoon.woff | Bin 0 -> 37396 bytes .../WebForm/src/Resources/assets/js/app.js | 57 + .../src/Resources/assets/js/plugins/axios.js | 14 + .../Resources/assets/js/plugins/emitter.js | 11 + .../Resources/assets/js/plugins/flatpickr.js | 35 + .../assets/js/plugins/vee-validate.js | 285 + .../src/Resources/assets/locales/hi_IN.json | 32 + .../src/Resources/assets/locales/sin.json | 32 + .../WebForm/src/Resources/lang/ar/app.php | 20 + .../WebForm/src/Resources/lang/en/app.php | 20 + .../WebForm/src/Resources/lang/es/app.php | 20 + .../WebForm/src/Resources/lang/fa/app.php | 20 + .../WebForm/src/Resources/lang/pt_BR/app.php | 20 + .../WebForm/src/Resources/lang/tr/app.php | 20 + .../WebForm/src/Resources/lang/vi/app.php | 20 + .../views/components/button/index.blade.php | 40 + .../components/flash-group/index.blade.php | 64 + .../components/flash-group/item.blade.php | 205 + .../form/control-group/control.blade.php | 339 + .../form/control-group/error.blade.php | 16 + .../form/control-group/index.blade.php | 3 + .../form/control-group/label.blade.php | 3 + .../views/components/form/index.blade.php | 40 + .../views/components/layouts/index.blade.php | 113 + .../views/components/spinner/index.blade.php | 27 + .../settings/web-forms/controls.blade.php | 257 + .../views/settings/web-forms/embed.blade.php | 3 + .../settings/web-forms/preview.blade.php | 156 + packages/Webkul/WebForm/src/Routes/routes.php | 16 + .../Webkul/WebForm/src/Rules/PhoneNumber.php | 33 + packages/Webkul/WebForm/tailwind.config.js | 47 + packages/Webkul/WebForm/vite.config.js | 46 + phpunit.xml | 34 + pint.json | 10 + public/.htaccess | 22 + .../build/assets/activities-DpB2XKqX.svg | 23 + public/admin/build/assets/app-B6AvubOR.css | 1 + public/admin/build/assets/app-C2Wq9G4i.css | 1 + public/admin/build/assets/app-Dz7u1TwN.js | 76 + public/admin/build/assets/ar.es-CfdTYgcp.js | 5 + public/admin/build/assets/bg.es-Ce0T19Qg.js | 5 + public/admin/build/assets/bn.es-iWyup8_3.js | 5 + public/admin/build/assets/bs.es-Cz58hpHx.js | 5 + public/admin/build/assets/ca.es-CujU75Im.js | 5 + public/admin/build/assets/calls-BU_UfDax.svg | 21 + public/admin/build/assets/chart-D1u1Dgzh.js | 13 + .../build/assets/corner-clip-CRLTKrCT.svg | 21 + public/admin/build/assets/cs.es-BHhRbaip.js | 5 + public/admin/build/assets/da.es-DglD7fV2.js | 5 + .../assets/dark-corner-clip-Deux0RQO.svg | 21 + .../admin/build/assets/dark-logo-BB2BR6rR.svg | 39 + public/admin/build/assets/de.es-D_4ZyLTN.js | 5 + .../admin/build/assets/default-DBulZ5O_.svg | 26 + .../build/assets/description-BwifbkWG.svg | 20 + .../build/assets/drag-and-drop.es-JkAdgoaa.js | 5 + public/admin/build/assets/el.es-BC26X5xm.js | 5 + public/admin/build/assets/emails-D_qEBj20.svg | 19 + public/admin/build/assets/en.es-DDTuV2po.js | 5 + public/admin/build/assets/error-ClRu8L1K.svg | 29 + public/admin/build/assets/es.es-BvvfjN-O.js | 5 + public/admin/build/assets/et.es-C0rF9HtR.js | 5 + public/admin/build/assets/fa.es-CibKJjgz.js | 5 + .../admin/build/assets/favicon-BiheL4ey.ico | Bin 0 -> 125486 bytes public/admin/build/assets/fi.es-B0Iy6aas.js | 5 + public/admin/build/assets/files-Xm-jQ6Fi.svg | 18 + public/admin/build/assets/fr.es-B7WXlprl.js | 5 + public/admin/build/assets/he.es-K9Fk8xhK.js | 5 + public/admin/build/assets/hr.es-ef5bxYFj.js | 5 + public/admin/build/assets/hu.es-nZ65MV0n.js | 5 + .../admin/build/assets/icomoon-BbY1GX-d.woff | Bin 0 -> 37964 bytes public/admin/build/assets/id.es-CzHAK-XV.js | 5 + public/admin/build/assets/is.es-Dz07gBgt.js | 5 + public/admin/build/assets/it.es-CquQA5xx.js | 5 + public/admin/build/assets/ja.es-D6pL26k_.js | 5 + public/admin/build/assets/ka.es-Cb9X-eNS.js | 5 + public/admin/build/assets/ko.es-CTpJlj0A.js | 5 + public/admin/build/assets/logo-CBYU6njG.svg | 39 + public/admin/build/assets/lt.es-vqgjGyMx.js | 5 + .../admin/build/assets/lunches-BHeSbGQ3.svg | 19 + .../admin/build/assets/meetings-Cwj897qL.svg | 23 + public/admin/build/assets/mn.es-YZet1as4.js | 5 + .../assets/mobile-dark-logo-COPgCide.svg | 5 + .../assets/mobile-light-logo-CjoobCkl.svg | 5 + public/admin/build/assets/nl.es-COp8PWbT.js | 5 + public/admin/build/assets/no.es-_2m-F2FS.js | 5 + public/admin/build/assets/notes-BdIILF0F.svg | 17 + .../build/assets/organizations-aUdNng-O.svg | 32 + .../admin/build/assets/pipedrive-Dk_Mji0J.svg | 25 + public/admin/build/assets/pl.es-jjNeJM5X.js | 5 + public/admin/build/assets/plans-DIcOmGwv.svg | 29 + .../admin/build/assets/products-zDh6UFtz.svg | 24 + .../admin/build/assets/pt-br.es-D8ojES2d.js | 5 + .../admin/build/assets/pt-pt.es-D8ojES2d.js | 5 + public/admin/build/assets/quotes-0H7ZCVr6.svg | 17 + public/admin/build/assets/ro.es-B6_ATXom.js | 5 + public/admin/build/assets/ru.es-BGEpmv_x.js | 5 + public/admin/build/assets/sk.es-V3h-1af8.js | 5 + public/admin/build/assets/sl.es-mZjm0YDT.js | 5 + public/admin/build/assets/sq.es-_6B4UQXy.js | 5 + public/admin/build/assets/sr.es-BmdOpTOG.js | 5 + public/admin/build/assets/sv.es-LwrPWbzy.js | 5 + public/admin/build/assets/tr.es-CS80t-Rq.js | 5 + public/admin/build/assets/uk.es-BVYlda65.js | 5 + public/admin/build/assets/users-6trD5il1.svg | 19 + public/admin/build/assets/vi.es-B5CIRCK5.js | 5 + .../admin/build/assets/zh-cn.es-DKz-yscG.js | 5 + .../admin/build/assets/zh-hk.es-CFZP5Cvd.js | 5 + public/admin/build/manifest.json | 428 + public/build/assets/app-CAiCLEjY.js | 6 + public/build/assets/app-l0sNRNKZ.js | 1 + public/build/manifest.json | 14 + public/favicon.ico | Bin 0 -> 125486 bytes public/fonts/.gitignore | 12 + public/fonts/Hind-Bold.ttf | Bin 0 -> 279028 bytes public/fonts/Hind-Regular.ttf | Bin 0 -> 291728 bytes public/fonts/NotoSansBengali-Bold.ttf | Bin 0 -> 167968 bytes public/fonts/NotoSansBengali-Regular.ttf | Bin 0 -> 167796 bytes public/fonts/NotoSansJP-Bold.ttf | Bin 0 -> 5727828 bytes public/fonts/NotoSansJP-Regular.ttf | Bin 0 -> 5732824 bytes public/fonts/NotoSansSC-Bold.ttf | Bin 0 -> 10550116 bytes public/fonts/NotoSansSC-Regular.ttf | Bin 0 -> 10560380 bytes public/fonts/NotoSansSinhala-Bold.ttf | Bin 0 -> 242736 bytes public/fonts/NotoSansSinhala-Regular.ttf | Bin 0 -> 243084 bytes public/index.php | 55 + public/installer/build/assets/app-aec2df31.js | 49 + .../installer/build/assets/app-e0866a20.css | 1 + .../build/assets/favicon-a99d4e55.ico | Bin 0 -> 1150 bytes .../build/assets/icomoon-1bcfcf1d.eot | Bin 0 -> 35796 bytes .../build/assets/icomoon-81aea726.woff | Bin 0 -> 35708 bytes .../build/assets/icomoon-c6be70b2.ttf | Bin 0 -> 35632 bytes .../build/assets/icomoon-c96ab384.svg | 89 + .../build/assets/krayin-logo-4636add7.svg | 7 + .../build/assets/spinner-51c5cf50.svg | 18 + public/installer/build/manifest.json | 40 + public/robots.txt | 2 + public/web.config | 28 + public/webform/build/assets/app-499ae59b.css | 1 + public/webform/build/assets/app-8787c790.js | 56 + public/webform/build/assets/app-c04ede37.css | 1 + .../build/assets/icomoon-8bbcff3c.woff | Bin 0 -> 37396 bytes public/webform/build/manifest.json | 23 + resources/css/app.css | 0 resources/js/app.js | 1 + resources/js/bootstrap.js | 32 + resources/views/.gitignore | 2 + routes/api.php | 25 + routes/breadcrumbs.php | 458 + routes/channels.php | 18 + routes/console.php | 19 + routes/tenant.php | 48 + routes/web.php | 51 + storage/.gitignore | 1 + storage/app/.gitignore | 3 + storage/app/public/.gitignore | 5 + storage/app/public/data-transfer/.gitignore | 2 + .../public/data-transfer/samples/.gitignore | 4 + .../public/data-transfer/samples/leads.csv | 3 + .../public/data-transfer/samples/persons.csv | 3 + .../public/data-transfer/samples/products.csv | 3 + storage/debugbar/.gitignore | 2 + storage/framework/.gitignore | 10 + storage/framework/cache/.gitignore | 3 + storage/framework/testing/.gitignore | 2 + .../001b29cf10c8ec7f4902a2099a46a894.php | 1279 ++ .../02c67e666e64602539829664d7ffefc9.php | 21 + .../0519eb135fd1515b6d1ac67519bd7fc7.php | 102 + .../06093b7157920b07ffe0b2386674436a.php | 125 + .../0609dee9f2ed747c2dca69ce322186c1.php | 62 + .../061b45d000c95b00505223c4da8b96f9.php | 64 + .../062ebed414020ffdec12de63badae008.php | 420 + .../065de1dfcf0d9b7a25a4c3825a3b4012.php | 31 + .../0694ed6f5879592a822fb0e2cdcc2283.php | 207 + .../06b4f63e298210bfe41ecdbaa73485b5.php | 37 + .../06f673e0b7db8657a525a909d5151a48.php | 124 + .../07ed10a3c0b628a74c27154a036bfeb3.php | 101 + .../08c1b49be6a35658c525b87a12804084.php | 37 + .../0917b723175cbb45e783130f41652dd9.php | 17 + .../093673f92f5ab43661445330a02f28ae.php | 40 + .../09afd9e73fa13b8543d6bea804c76dc0.php | 21 + .../0bfefaab41196c39083a1118e6002f3b.php | 32 + .../0c70558afcdb457b4f8caf0b17b0fccb.php | 69 + .../0d354a2861d81a21c3798dbdaf36426a.php | 27 + .../0e994368ddc43a07691eac714c58cba5.php | 380 + .../0fbb59aa86f0f91adf0aa25293b36995.php | 471 + .../100f3a59fbb766493aeea1e3b76dbd08.php | 27 + .../102b247f4dd806511bfbc64c16e54acd.php | 13 + .../1062a08bbe85e41126da747e7390a122.php | 283 + .../1077ba6fa726c9b41d1edad0b4a6dfd8.php | 84 + .../1109486153d602de7beeda60afa8d625.php | 201 + .../111695946d10c9cc70119d25111a452f.php | 1677 +++ .../11285cc78978220f905eb91b0206196d.php | 79 + .../126729e645af65a1b1428c7930b00489.php | 17 + .../12e7efc69f3ed129240b4a87826bf088.php | 181 + .../12f92485d72da9c3349686cffc404206.php | 42 + .../131c0b3604e33facf25f0c3017533324.php | 100 + .../13d146e3261dfc463e256edf61eb5b48.php | 5 + .../1438427bcfe7d665c0d4e68c64bb3ca8.php | 1616 +++ .../145f549e76f755f6f7d6fb78aad72562.php | 656 + .../1484c2c3db4e9d52221c3c009ac86fee.php | 252 + .../15424a0789a2044b02be124f7b627d95.php | 440 + .../15b00e8431f123f01153aaeb431c6e4f.php | 46 + .../15c07c900513653ecdad2f377890dd63.php | 56 + .../15ccb5ea484ab9f55aebd4d45eea6fbb.php | 62 + .../161b975b0be472bae5e674eabf959809.php | 13 + .../16704626b7a88f8547bad51f51c22188.php | 172 + .../16e8057dc177e56edc798819281b078c.php | 207 + .../16ef19650167d8caf694e544ffa2a09b.php | 16 + .../170c5df6074159115a0b5ed4ffee2b4e.php | 219 + .../1809b4edb44a7848ae88c11dff4bd387.php | 332 + .../188b3aee4be9b10593969389c6117634.php | 294 + .../18bb966d166d42b49c33a9eb280dffb2.php | 463 + .../18c5f1bc083f99b64516be1508c99fa6.php | 523 + .../18f600d1f1f2fe45ea4f3ca9ceeab5db.php | 16 + .../199b704982de0e1f9c7e68da8cf2f609.php | 27 + .../19ce12676ad44d2792b6912867dc6487.php | 27 + .../19d27ec2ec307e1160193f98761eb02a.php | 853 ++ .../19fe6be0d13de61b4f7b510e8edd1d0b.php | 752 + .../1a94f3718743accc76bb1c070e4f8b94.php | 741 + .../1af00d61d237354e1364dd914047274c.php | 17 + .../1b35edf449527b204f6c874ebc008f97.php | 24 + .../1bd11486d6bb50e2e21b3206500d140c.php | 992 ++ .../1cf1afd8d641444cb25410565db93d1c.php | 13 + .../1d57a0f13b7031c53c0e8294dc10d8e9.php | 13 + .../1e60f4125d4fdf5c29ffb3df75001d2b.php | 18 + .../1ec9f8d438590dd43668eeb8329935ff.php | 241 + .../1ece863e6fea6322c5eed40d71fab2b3.php | 60 + .../1f13db5340b212653521ca7883cb79cb.php | 5 + .../1f2e64125d6fc3adff04aec9e253172d.php | 21 + .../1f3eef7fcddb344f89e2d23544f2b3ae.php | 362 + .../1fab70f1c0ce452e1288351cc75a6d99.php | 25 + .../200945cc7e10fafeca3a6a0f6d9093d9.php | 559 + .../20184e8205864b6fdd2b4e6f7d4da9ae.php | 40 + .../20c7e614f827dd7ae76eca16a6af4472.php | 5 + .../20d5f617384ae83fd2813d9de556cf14.php | 541 + .../21341f02e8727c9774890c144e91df0a.php | 212 + .../21a058e200d198f61da7b14c57c49cbf.php | 524 + .../21ab6f4b0f052f85446b6ebbcd123cc5.php | 800 ++ .../2277359d66a8c555a5c8a58232844158.php | 830 ++ .../23a0faa3cb9e87a87e5665998c1a486c.php | 73 + .../23ea605c004e5d15672b086de4db2725.php | 132 + .../243cb284b55eb167ff23d5adc995da0f.php | 60 + .../247394ff79d789e5496ed192dd749dcd.php | 245 + .../25bb81bfce00da822c7b0dd117439b2f.php | 387 + .../25e5fcbe6e65d958b1d7737c1971ee77.php | 108 + .../267ab32682295353c80bef4b06ac225e.php | 232 + .../26c679f9ee7fca0a786014206070c32b.php | 12 + .../275c7c02e2528e6029079c885e2d2418.php | 5 + .../280ecaf1425fef53e0b05e9e457c9f5a.php | 162 + .../285da80ca32354059ad51050f84cc22e.php | 131 + .../289583e70f8db895ff666251615ab26f.php | 132 + .../2930f5b83930dd3d0e08667818a6eeee.php | 21 + .../295e20e4de1728e541d80712a78ed140.php | 97 + .../2a09d292dd38b93314177b9bc1fcee01.php | 40 + .../2af6bbb5790185a0656ced8e3fa47521.php | 40 + .../2c8d7b8c6f501690b8d4d6688bc34de7.php | 1078 ++ .../2cce9fbe78a5b9751caec6ba14590144.php | 21 + .../2d9acc0f9b114a8f427c5da5f4b5c2db.php | 233 + .../2eca618673af7b1b31ad0b108c3f998d.php | 59 + .../2fc68165f2b3389c1f792ff0040e32dd.php | 15 + .../30a5be8469dd76a1dcc8e33c6c68b1db.php | 137 + .../32be47296c62abc8b4cce04357c874b6.php | 133 + .../3329fd095a1412fe72d7477c8bb75975.php | 131 + .../346163f6ab28fe7831ad80a6bc9c336b.php | 350 + .../34bee49576008f542a6d5244ac54e11b.php | 212 + .../35948624509bfd48d04bbf70805f3448.php | 70 + .../35acdf3da862ad2cd2d1ed00f41b5343.php | 13 + .../377972ae7cf184d192b7c41b90a7c302.php | 17 + .../377e804b87f1bc3a9c7af8688168e64e.php | 799 ++ .../3826d80d4551b850bda55184e8daae15.php | 15 + .../3851dd860513bc846618de7421c1011a.php | 4 + .../3894f7b0b1d5e5159999c9ed01059114.php | 1616 +++ .../389d956101ab3a13dd106a7db5cd2cd4.php | 1312 ++ .../393cff8b9c163e5c444a2397c06f9057.php | 4 + .../3962224d39fcb9ade842a952b203c859.php | 1301 ++ .../3b6b77928bd1b3ca6e981427b195045d.php | 853 ++ .../3bb225b5d6c98dab0ca463b50b5b9745.php | 776 + .../3bd822b90801ee6a3618bb3092609d64.php | 238 + .../3c8433b0243fc419af38524990def380.php | 185 + .../3d1076f198c20f6eb00428c4f3e1d0d7.php | 164 + .../3d8e4f86df8051984c4e94f974a9a8eb.php | 84 + .../3dbdad78f1a375e05191fc20683c738c.php | 5 + .../40531cb9435f113066d342b570a7e2b6.php | 42 + .../4053f4f685658d00b67739012438e776.php | 5 + .../414c13ab8b4dddc7d0e1c2f6d4b7105c.php | 16 + .../432786858790217ab2e485807b3be2ec.php | 64 + .../4335cef436cc06bf2ccf1634c7fc892f.php | 300 + .../43c50d3fc9d4cefb895fbbf6817df845.php | 2 + .../44153923754c161587d5a95cf8fae0c4.php | 1693 +++ .../4489f0d51decc3ce685fb0d6eb56e2ab.php | 251 + .../44afc7d2eefd7c11763eedffc1908b38.php | 33 + .../44dbb285cc23736ca0b01abf09c46d68.php | 31 + .../44f726d6dfb300f190aae54d549f6d51.php | 13 + .../452bc44ac883be5ad06c3f18fc98ad04.php | 20 + .../455eceb602548652aae99ec6afb7fa77.php | 69 + .../47ee8f650eff370961941f167517bb14.php | 37 + .../480ca47e14c03ee092913de02d9f6670.php | 39 + .../48761e565aa945d27efa58b20a4d0448.php | 550 + .../48dd10b26b373c4937b6c5884b0d2759.php | 127 + .../49214698a0f0496bf7568041632d38f6.php | 219 + .../494afe70054c2b4df34779d7a9e52f81.php | 101 + .../49e76b622514b45a450088d68ee790cd.php | 30 + .../4b835e679a8197dfa4004967b9d57769.php | 861 ++ .../4b90df0cca0c53116124cea3be711eed.php | 417 + .../4bf0f83ab2f3a3e91b9d7e8c42dc7e72.php | 132 + .../4c406234ba5dba25d1430e9622454ad4.php | 223 + .../4d6cad4f255bc6ca30ab900359df06b4.php | 197 + .../4daa0b61a18dfe293174290555b4033b.php | 105 + .../4ee3ab6db1fa8b9c29091a68e99cacf9.php | 117 + .../4efa6d5ebffb0d20c27159fb7a21317a.php | 38 + .../4f7a5cef13809f48f2b761588da541a5.php | 245 + .../50bd42fd594e381bc254d1116d617f08.php | 709 + .../50ed7fd9f65d2a0981caf5267fbb1a2f.php | 100 + .../519c1b7909e3ba8de0a02909068db720.php | 69 + .../51c8fa9deccf2a1c72ab32288f7faa5c.php | 463 + .../51c9dcd4d754aacd65c0a98c9f5617df.php | 144 + .../52467a5874f2585e3a0e85c21cd0a979.php | 212 + .../529827ffcc1e168e7fa532a34b41deb1.php | 532 + .../53d3e50e8e6ed7673f830cf9772df9b4.php | 82 + .../540959f0cf53bae7ec1816d777363538.php | 20 + .../542cbc478691bbe940b41de3361fd851.php | 12 + .../545413bde057b13c11465ce9d1e3447c.php | 64 + .../560102a6012bd1670b8708e7a7c41f39.php | 1886 +++ .../56c77105d71f2690475c6a871f8938d6.php | 33 + .../576d6b774f1541f64f07f88e5e32d558.php | 683 + .../5796e0c9b0e92368a0b53a0335f8bbe2.php | 86 + .../5851a2c03cce2452b73cc594ed6456dd.php | 31 + .../58d8d4f4e02fcf924f0c5afdebd628d5.php | 1911 +++ .../5931db70af1cddda7346ccc0f7cc9a7f.php | 30 + .../5953494c629bb665f26aa6b07777aa87.php | 21 + .../5a4cf762ce54bc823dbc2a8be5808bca.php | 18 + .../5b1d7562a1e69a71ca4d5fd7543b436c.php | 21 + .../5b5bd30afeabd8a4a991c7754401bbb9.php | 387 + .../5c2001e939204ec0b7ec56c9a9f31d3d.php | 5 + .../5c4dbb25213fcc1592166fa8594fe465.php | 21 + .../5c69291b8becda40307a38b846104d1e.php | 5 + .../5cc12c0ae8298cca78ee87beeb85fd1a.php | 657 + .../5cd7fc7afc1451da8e7f5d36c56c5a84.php | 37 + .../5d2dafabab6d773fcd75ee6e0d9cdff2.php | 429 + .../5d80da38c76349f24e95b9aea7bec760.php | 309 + .../5e843da415e20346a427dc270b5d0294.php | 142 + .../5f29a9e0bea8869d6d23a7fdafef86e1.php | 324 + .../5fee729c5c99ff4c2d07fe314dfc6111.php | 14 + .../605b124922e9cee59c768f18ecb2a1f8.php | 12 + .../60afd578ec2561a00b3ba5488bfda498.php | 387 + .../6196735aba6c22cc64b61dfd6a574bf8.php | 79 + .../622acc512af7c1ed3719802780a93697.php | 84 + .../643c43a91b2568b91ae66692762e507e.php | 100 + .../645b117505eaf328b063b457f0a7e171.php | 241 + .../662fc54fc0def05c1b259622e811803c.php | 71 + .../66efbdfac607c4462bb2298a98d6faac.php | 783 + .../6855d2e33205b91888dcc7a02816a39b.php | 241 + .../689347dc050fe533aed0a037aa9c5cdd.php | 5 + .../692fa9c7f895fcb4e21a1f1731a60406.php | 22 + .../696327619b02356f19b3adf2c3bf704f.php | 32 + .../6be40a9fac33782099171d0d80e025cf.php | 272 + .../6ce34c8fbee2f19577a6005fe418d650.php | 17 + .../6d2001f86aa58fedf8ebfbcfb16c5b76.php | 1922 +++ .../6de5c8c28cb29acce8a2bd9af36344a8.php | 227 + .../6e12219585f1d10655b79c1a5e0b6718.php | 60 + .../6fb6d9feeb93e6fdb9c5e671249d0b02.php | 46 + .../705ba4a03b5ebcb6854888da30ba37f8.php | 141 + .../718638775cf4f89c56d3240e2a076acb.php | 1279 ++ .../722922ee7af664e6e83dc93040da9fbc.php | 59 + .../727e484febeccf10f8c1e01e91fb2f18.php | 9 + .../7338f0eab0650fe45e0cbc7b97dfdf31.php | 133 + .../73d0f687bf3f179b75a519792a6a0190.php | 131 + .../73f6108386de9d6b9dd8e8f4d6aafcdf.php | 85 + .../74349877583591de964288672b6047a7.php | 12 + .../74d0fe6129f6d2d2751bf1d6c1c5e6be.php | 14 + .../7545453b31afffb888d933c90f187db5.php | 40 + .../763aa3438a725492f52411b7c5af8cac.php | 201 + .../76580b75925f708c1a37f6afa9029bb9.php | 338 + .../78de902192b1714ac039398d9f4426d8.php | 96 + .../79e8e90194be1d8195f6f37c97738d0e.php | 5 + .../7a1d92179836214dd1888bc3bb83cc42.php | 57 + .../7a87d246bb7b408660a5fb294f811956.php | 13 + .../7afe19b7ca789b437f936aa7a33665d6.php | 362 + .../7c39c87d70316fd50ddef81471da8c68.php | 42 + .../7d32429f498c45b7a16b838740c1f803.php | 21 + .../7dd35949e06fe81b098af5553fa6a342.php | 126 + .../7df9fc296534d20b4c1d0a6636050ffb.php | 1247 ++ .../80328a3d8d637cac7f3cd1dcaf8ba595.php | 71 + .../8045eecedb3d7e156af551095e06d541.php | 4 + .../81832cbe8b1dc51181dd4444cc2b75ac.php | 20 + .../81aa4767a1c1fd106645581a82b3d039.php | 7 + .../82d6f8989f545ac1df2a6907421f2bda.php | 84 + .../8384b9be9a053dd08ab203ee1264ea99.php | 70 + .../83c4e4975e1dc8e11aaba8b00b2637e1.php | 86 + .../84ca5927186a61d96c9aa979ed9d32c3.php | 227 + .../854e22ee1ae052a7b502f2086fdd520c.php | 21 + .../857502e84b2e3d811ca62093f06a83ef.php | 49 + .../869b8c53bbaa41f201693cd8ac233e18.php | 2 + .../86e7ad99a2f60c181ff6221e8a463026.php | 30 + .../8702e7e94dc56cac392789fa6382a77b.php | 13 + .../88072a664aaf8108f0f58cda06c46095.php | 22 + .../884cada878fc61b9e4a4d0ca41058011.php | 426 + .../88b14aed5dac5bd92d7147188398c84b.php | 287 + .../88bea98a1376d5d8feaf9cc6532eb4ba.php | 125 + .../8a17e69ebe882e749209f94a38820f3c.php | 776 + .../8a59a466a35144d796c5b814196af89b.php | 245 + .../8bae8d55f9e611db52d14d4cea7aed55.php | 4 + .../8bf5d3a224233878842202702d6fc971.php | 500 + .../8c4fb3572583daf48a49a4c3c10aa8f0.php | 592 + .../8cd6f22911eceb78967b172efb7a3e4d.php | 21 + .../8db0fee22081357b08aac61d2811038f.php | 222 + .../8e57faf3fdad6d72cd5dae96efb6e32d.php | 29 + .../8f116a3d8eb219317dd63973388de625.php | 38 + .../9055d5aa6817e1c2a482961ccb336070.php | 658 + .../909db4de01ae69ca6d8fdb47d48c3ae9.php | 41 + .../90a5248af06033b8f4dd64a644274070.php | 293 + .../90b04458d177c3dada7a3e01eb2c135a.php | 171 + .../90deeaf9f2dcac7abfde3cc13e37ffd7.php | 20 + .../91bc81542d0d8bc6a883e11ba4f0a393.php | 5 + .../925d1237a9e4ca489126a9072aa264d2.php | 188 + .../92acfd4627deaa2d813e04f81ba29728.php | 212 + .../92b3aade7795023f63125b7bb1702d03.php | 639 + .../92b933031062dd5cad4972c31428fb46.php | 181 + .../92e13459cd974753921232bbfbf0aeb9.php | 38 + .../9317ecbb458a25699dddb338429ce29a.php | 85 + .../934aab714a4eb851ea4eb219c788782b.php | 108 + .../93aa69ca334eb6628bd9f09efab714ad.php | 522 + .../9558f9114f97694e92ae6472c02ebf05.php | 1740 +++ .../95b5c81635c64aea784454aff2257ef7.php | 658 + .../973ec33cebe14c9893ad5d32ad8c68c9.php | 25 + .../974fb0b69dbc0076e14acbf808232f09.php | 155 + .../98072615de1b43056c7a8ff124ef81d0.php | 50 + .../99aa974efcee7262d96012bc812fca61.php | 18 + .../9ad7840c207a7afc87ee0e1cb234dcfa.php | 25 + .../9b0031b4889c60054d46ba508003d13e.php | 116 + .../9bc5b97a529c41a831f2a790c6b68649.php | 4 + .../9d29dd05b14ef75e0e09c9fb664383d9.php | 21 + .../9ef6f52bd7cece2edcd3a9f011ce1337.php | 17 + .../9ef7d91b1c5f09419a9136420111b3a6.php | 283 + .../9ffcff2286213d3a8fe04af513c7cd88.php | 66 + .../a00783c81487f8730c1391b08502d86c.php | 45 + .../a0b01cc8d8aa93c4b0106214b50105d3.php | 556 + .../a0b4fa9fb4c26e44c4aa216c07a722a9.php | 190 + .../a15b5670fe81fa7c104d47953f0a0948.php | 47 + .../a1b6707d7b57bbc79ebb3cfb0642233c.php | 243 + .../a1f8639f84aec9a6fcc765cd7fdb91d8.php | 21 + .../a20a7427658b5c91a3f551c4fb22b570.php | 598 + .../a3034fb28815c6737c7f1fe6dc837ca7.php | 546 + .../a37261f10bbbc05300815fb27a6ce63f.php | 512 + .../a4ffc4ebcff2eba17458b2d181875a11.php | 4 + .../a52f436cfd938cdb4acb6d87ffec90d8.php | 20 + .../a55cad60de14a3e8924ed2c7fafe03d4.php | 130 + .../a615b108a840c54bfeb4d02b8c45acf2.php | 30 + .../a6fb7309da265defe85e1a1064366648.php | 21 + .../a827f213957676a16001cd91dc112549.php | 2467 ++++ .../aa751045bcf62af601caa003cf69f1e5.php | 1693 +++ .../aa9b8ba744313423689d8fe2f1840af9.php | 809 ++ .../aba3e368dde555f8dcd51c7aceba4e6b.php | 190 + .../abd5fd79a831966c71bb278a11a52c2b.php | 29 + .../ad12a543aad8643f064247eb30d7680e.php | 153 + .../ad152e82c2a5ac11df6a67de491a6e0a.php | 1827 +++ .../ae624372bcce32c8f2b0998c0e654eb2.php | 96 + .../ae6d84192f2b8fbb06da1688efe959ba.php | 55 + .../aea6af283674c4fcb9af8ae7ded8a121.php | 245 + .../afd0c6897040e2cc8cb829831a78c878.php | 223 + .../b0c16e8a003253e493829e3c14194dd2.php | 657 + .../b0d25a274c1687d483793e43b44ae95d.php | 4 + .../b1a2cf391c7dc6d3786a1276d45fd47c.php | 222 + .../b372d51f5500295bc9228d9d664663fb.php | 21 + .../b49985407b07abfefd64aaab2382947e.php | 17 + .../b49e8f9599a267bde604c4e4eb02960c.php | 1078 ++ .../b55b5d08250e5310d019e7e3aacd86b4.php | 185 + .../b649a86c76252c380b129e4cc338f7be.php | 324 + .../b665faddbd4156979a33bd7256a63804.php | 99 + .../b7000ff43eefa965176fcf1bb48f25c9.php | 127 + .../b73c32b3e3eb705eb379b5f68dac5cfb.php | 3028 ++++ .../b76090b5a4cb58a27d81ee28ceee41ba.php | 686 + .../b8eaf7547e9a9ea023ea2b6a9aba1195.php | 333 + .../b94d068fd1cfcdbd8dea9170647897f8.php | 31 + .../b9a9babe76c8328b3cfd9a0f6be97ac9.php | 238 + .../b9dba1f802a8f3ef9925ab0f86ada175.php | 188 + .../ba39863401b82f9aae2299c32bce8534.php | 21 + .../bba119bc75cf4ca9d930c7d1aa6518a1.php | 1021 ++ .../bbdae7896a1f7165054fd9355cae7301.php | 41 + .../bd5df4af7aa6519e61a16b0135794c6d.php | 28 + .../bddfc759890f2c4c9b12ae35f48b5c55.php | 560 + .../be37ec7b1345fcb3c2f3c4f68700e4f6.php | 13 + .../be65033c29029eb224ea0eceb6f05545.php | 500 + .../bfb95f08f5507d145605961ebeaa83f9.php | 31 + .../c0c04d49115719602aeabe1311e2e11e.php | 141 + .../c0eeafa5404ccb3b6a234ee46c87e511.php | 4 + .../c100bd2e7fff457a7b18e261caf1ef81.php | 272 + .../c12f125c21d124ddb00e61b72c3d6467.php | 3 + .../c216a456d8abda98e9a1e002200cd508.php | 771 + .../c4188c8d16ca50973c0514392a83278d.php | 70 + .../c466ea3b4d80f80373c9b95dbad50b8c.php | 550 + .../c4d70cd171bf2fc590ee7c7141de88d2.php | 592 + .../c5467567decfdcefe29aac61f3d5589e.php | 171 + .../c5bcc7f5f43cdf04c3e1958145d44ff7.php | 711 + .../c62c8976e81c463eb2916ca0044ca1cb.php | 21 + .../c6e4ea11ca7454f87ab86a2864a7cc06.php | 47 + .../c84fe614c3ee24c1ddf401fb2bea6af0.php | 25 + .../c88b70a8a9feab42ed2b012b4e9ee5c1.php | 296 + .../c93246842dd998089762986ccb96fd3d.php | 254 + .../c96786be548c061098a89722818ccdd9.php | 137 + .../c9dd5fab3c50756806a823d0086ed3ab.php | 48 + .../cacd1ce355b094ed718c8e57c6c09cce.php | 131 + .../cc0143e300080a647abe2f5a7cc57b40.php | 172 + .../cc637471677bcb38ce3f1da95b8515a3.php | 6 + .../cd06a68343b54991724d7af0fd4fbf94.php | 160 + .../cdf6fb19a5c0ad1ef5db7342b765bba8.php | 124 + .../ce51d0382acd3068014849bcbd3390c7.php | 303 + .../cef5a8b8fe9e2295a6f0cd070e4ab426.php | 303 + .../cf663c2c06309f3a59c67ba60cc1815a.php | 1886 +++ .../d028a4887c85c25f7b1d6f3b0d730412.php | 93 + .../d03914f7418dbbe11a34e35b629d81da.php | 65 + .../d088af29b2c8f0235601107a5f871950.php | 237 + .../d152e93aa18084fce458b6000ce4c6d0.php | 37 + .../d1f08c39f1f5d58707d54efd7804b954.php | 164 + .../d2c46ca36ad74e62d092fa104c6403d2.php | 29 + .../d33307fb31bb2672758386635ebd2409.php | 21 + .../d4062cf192494d743f721004ae6def7a.php | 1251 ++ .../d4b0a3e17c2124cfec42f81937afea08.php | 243 + .../d5041d7ba88a56444ac758c9cce83a35.php | 197 + .../d66b74b49d95530ad03f4294dd4ab050.php | 245 + .../d6c7c91ccd6193f9cd451e4deeedba4d.php | 226 + .../d6fbed627e4c89b29c413eb23eeadcdb.php | 709 + .../d76543fc136a2fb26036cf2dc1a322f3.php | 21 + .../d7daa0669623d0843faae680d79d5170.php | 300 + .../d8243be939fa006d973e91115191161b.php | 37 + .../d84bcbb3d7b8d427bb210340b35bbd2f.php | 1282 ++ .../dc0412c0780ee8f64f910e45f574ee0f.php | 639 + .../dcfc209cfcd29250c5cd4457912cc6c0.php | 240 + .../dd110fa48c7ea808250a8c92771c47cb.php | 386 + .../dd176efcf4d159000b9a55553f87ccb1.php | 106 + .../dd310000961f2d208873a737c27d849a.php | 35 + .../dd4f775cdf3e345524a2ade89dee5cd6.php | 84 + .../dd90c61f625f87e8ccaf54e392e6603a.php | 153 + .../ddc7cd9af3029afaf2b177122446790d.php | 67 + .../ddde46e2c3e07f623e890cd4be59e607.php | 17 + .../dde597c3b13585264f473de3430b8792.php | 90 + .../decb4b9850e964b06d91abea7ed638e3.php | 541 + .../e0276c8bee964928573ce227b79ec846.php | 66 + .../e0688c0fbc190f2d2b5546e07a44af84.php | 524 + .../e0c0309d658af32f720f58d954a75621.php | 338 + .../e10715403ad8ebf33c12c87a3c8d124c.php | 5 + .../e12515669a36502caee1fcb5890b704c.php | 101 + .../e17ea57b30de72877d20a53f3c29aeaf.php | 207 + .../e1a71a194e9c94ace82a6690e1ce6f27.php | 5 + .../e21f4ff533736ebf8374e63f2f425fbf.php | 5 + .../e2ad14a097b32f80f7bfc5e55946b567.php | 683 + .../e41ac4cb9266fc960043673a707c4bc4.php | 6 + .../e44c3f8c8fc495a1ec2f928ecd6f077b.php | 522 + .../e5ab0b39aa46cbd3d851dae297b36740.php | 210 + .../e5fb6ecb638634ab6fe102fca42ca237.php | 212 + .../e646a2dc3039e01a727e45c31f6b5969.php | 1312 ++ .../e655b5dc7a417cc04c20dd7746949c81.php | 25 + .../e69116b6c1b73e7d6d7e525efdf78de0.php | 102 + .../e8684d137bef4b6d7a4a6952ea74c011.php | 210 + .../e8ce166cee254d2d793d7f11fa6d8524.php | 240 + .../e9a64ccf83e40b6b16a288dc330a6877.php | 63 + .../ed507c4a065f40e23e7c18c118e304cc.php | 5 + .../edb8e49c7ccaa4a5bd586b67f28eb732.php | 46 + .../edeb0bd066809f3fa4eb174c19fe02a4.php | 427 + .../ee76b80f4b4c257890fa6eb02c461b47.php | 4 + .../eea27cf20a93f6533c1f9f77ddbc40bc.php | 126 + .../efa161867573b91595bb8fdc55cb83ff.php | 131 + .../f037afa2cd3deb169723c7576dd246cc.php | 904 ++ .../f0479fe0a9819bb77bf23ff2870d14a2.php | 24 + .../f056c191d683862e733efe7cbf77a1bb.php | 240 + .../f08f9a4bdbea6736050597a3e3943772.php | 59 + .../f14cd80c650555595b28d3c36344c1c2.php | 31 + .../f1631a8fe6a313e38d60d7a7f4fbff66.php | 17 + .../f16a27acdab6bea42a9a04dc2f8c8311.php | 130 + .../f2d44e75f98e6576692a8ccc837b1e6f.php | 3 + .../f2fe26289caa447896210dce80973ed6.php | 254 + .../f43374d46900c297198a91efd93280bb.php | 131 + .../f441b0949af07185b51f5f12270d8ff0.php | 2047 +++ .../f4b3949f3dd837ea9b805b03044ea7c1.php | 90 + .../f520e9e1ec939cb1f5cade832c4d3dc8.php | 251 + .../f561d5461c8e88c79bbe9c1621e3ec4c.php | 212 + .../f6b76ad05f9eca674f592a3144628674.php | 39 + .../f76c362f43ac9716be49beee6dc42bcd.php | 47 + .../f79dde1f2e8081a7a504b6f8c11336b2.php | 5 + .../f88f0d9a8e2f1cc80cecccd60df508eb.php | 30 + .../fa24ec43edd90de89ad19da955a1ecc4.php | 245 + .../fa2cf417103f02e1394dd139791598d8.php | 224 + .../fa555339de4cdf446f116325eadd4dc6.php | 5 + .../fae2acf3af7f796b07d789eb150178f8.php | 18 + .../fb10a49c8fba3a1c0b12ed4f3e8cbba2.php | 16 + .../fc252ae46c09f7fd2b704dab985a93a7.php | 195 + .../fca414b36e4c13c171c46bfef449ceb3.php | 126 + .../fca436142e86e0113dba7bd2c8bbc281.php | 17 + .../fd0024623da8afa781adf503b6c5876e.php | 126 + .../fd6bc016b04e3ac46f0ac3e7d1cd9e82.php | 232 + .../fe5faeb9d28c73897b30c50e779419a2.php | 116 + .../fe66cc2a12be3423c9157b9f1427314e.php | 34 + .../fe7372eb19574941f5c3dac69cde3dc3.php | 904 ++ .../ffd442e3c0a04c0587373e639425db60.php | 487 + storage/logs/laravel.log | 1055 ++ vite.config.js | 11 + 1711 files changed, 258106 insertions(+) create mode 100644 .dockerignore create mode 100644 .editorconfig create mode 100644 .env.example create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .tmp-growup-v4-final.tar2046928222 create mode 100644 000-default.conf create mode 100644 CODE_OF_CONDUCT.md create mode 100644 Dockerfile create mode 100644 GEMINI.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 app/Console/Kernel.php create mode 100644 app/Exceptions/Handler.php create mode 100644 app/Http/Controllers/Api/LeadController.php create mode 100644 app/Http/Controllers/Controller.php create mode 100644 app/Http/Controllers/SuperAdmin/SessionController.php create mode 100644 app/Http/Controllers/SuperAdmin/TenantController.php create mode 100644 app/Http/Kernel.php create mode 100644 app/Http/Middleware/Authenticate.php create mode 100644 app/Http/Middleware/EncryptCookies.php create mode 100644 app/Http/Middleware/PreventRequestsDuringMaintenance.php create mode 100644 app/Http/Middleware/RedirectIfAuthenticated.php create mode 100644 app/Http/Middleware/SuperAdminMiddleware.php create mode 100644 app/Http/Middleware/TrimStrings.php create mode 100644 app/Http/Middleware/TrustHosts.php create mode 100644 app/Http/Middleware/TrustProxies.php create mode 100644 app/Http/Middleware/UniversalTenancy.php create mode 100644 app/Http/Middleware/VerifyCsrfToken.php create mode 100644 app/Models/Tenant.php create mode 100644 app/Models/User.php create mode 100644 app/Providers/AppServiceProvider.php create mode 100644 app/Providers/AuthServiceProvider.php create mode 100644 app/Providers/BroadcastServiceProvider.php create mode 100644 app/Providers/EventServiceProvider.php create mode 100644 app/Providers/RouteServiceProvider.php create mode 100644 app/Providers/TenancyServiceProvider.php create mode 100755 artisan create mode 100755 bootstrap/app.php create mode 100755 bootstrap/cache/.gitignore create mode 100755 build.sh create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 config/app.php create mode 100644 config/auth.php create mode 100644 config/breadcrumbs.php create mode 100644 config/broadcasting.php create mode 100644 config/cache.php create mode 100644 config/concord.php create mode 100644 config/cors.php create mode 100644 config/database.php create mode 100644 config/filesystems.php create mode 100644 config/hashing.php create mode 100644 config/imap.php create mode 100755 config/krayin-vite.php create mode 100644 config/logging.php create mode 100644 config/mail-receiver.php create mode 100644 config/mail.php create mode 100644 config/queue.php create mode 100644 config/repository.php create mode 100644 config/sanctum.php create mode 100644 config/services.php create mode 100644 config/session.php create mode 100644 config/tenancy.php create mode 100644 config/tinker.php create mode 100644 config/view.php create mode 100755 configurar-docker.sh create mode 100644 database/.gitignore create mode 100644 database/factories/UserFactory.php create mode 100644 database/migrations/2019_08_19_000000_create_failed_jobs_table.php create mode 100644 database/migrations/2019_09_15_000010_create_tenants_table.php create mode 100644 database/migrations/2019_09_15_000020_create_domains_table.php create mode 100644 database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php create mode 100644 database/migrations/2020_05_15_000010_create_tenant_user_impersonation_tokens_table.php create mode 100644 database/migrations/2024_09_09_094040_create_job_batches_table.php create mode 100644 database/migrations/2024_09_09_094042_create_jobs_table.php create mode 100644 database/migrations/2026_02_02_000000_add_last_updated_by_to_tenants_table.php create mode 100755 database/migrations/tenant/2021_03_12_060658_create_core_config_table.php create mode 100755 database/migrations/tenant/2021_03_12_074578_create_groups_table.php create mode 100755 database/migrations/tenant/2021_03_12_074597_create_roles_table.php create mode 100644 database/migrations/tenant/2021_03_12_074857_create_users_table.php create mode 100644 database/migrations/tenant/2021_03_12_074867_create_user_groups_table.php create mode 100755 database/migrations/tenant/2021_03_12_074957_create_user_password_resets_table.php create mode 100644 database/migrations/tenant/2021_04_02_080709_create_attributes_table.php create mode 100644 database/migrations/tenant/2021_04_02_080837_create_attribute_options_table.php create mode 100644 database/migrations/tenant/2021_04_06_122751_create_attribute_values_table.php create mode 100644 database/migrations/tenant/2021_04_09_051326_create_organizations_table.php create mode 100644 database/migrations/tenant/2021_04_09_065617_create_persons_table.php create mode 100644 database/migrations/tenant/2021_04_09_065617_create_products_table.php create mode 100644 database/migrations/tenant/2021_04_12_173232_create_countries_table.php create mode 100644 database/migrations/tenant/2021_04_12_173344_create_country_states_table.php create mode 100644 database/migrations/tenant/2021_04_21_172825_create_lead_sources_table.php create mode 100644 database/migrations/tenant/2021_04_21_172847_create_lead_types_table.php create mode 100644 database/migrations/tenant/2021_04_22_153258_create_lead_stages_table.php create mode 100644 database/migrations/tenant/2021_04_22_155706_create_lead_pipelines_table.php create mode 100644 database/migrations/tenant/2021_04_22_155838_create_lead_pipeline_stages_table.php create mode 100644 database/migrations/tenant/2021_04_22_164215_create_leads_table.php create mode 100644 database/migrations/tenant/2021_04_22_171805_create_lead_products_table.php create mode 100644 database/migrations/tenant/2021_05_12_150329_create_activities_table.php create mode 100644 database/migrations/tenant/2021_05_12_150329_create_lead_activities_table.php create mode 100644 database/migrations/tenant/2021_05_15_151855_create_activity_files_table.php create mode 100644 database/migrations/tenant/2021_05_20_141230_create_tags_table.php create mode 100644 database/migrations/tenant/2021_05_20_141240_create_lead_tags_table.php create mode 100644 database/migrations/tenant/2021_05_24_075618_create_emails_table.php create mode 100644 database/migrations/tenant/2021_05_25_072700_create_email_attachments_table.php create mode 100644 database/migrations/tenant/2021_06_07_162808_add_lead_view_permission_column_in_users_table.php create mode 100644 database/migrations/tenant/2021_07_01_230345_create_quotes_table.php create mode 100644 database/migrations/tenant/2021_07_01_231317_create_quote_items_table.php create mode 100644 database/migrations/tenant/2021_07_02_201822_create_lead_quotes_table.php create mode 100644 database/migrations/tenant/2021_07_28_142453_create_activity_participants_table.php create mode 100644 database/migrations/tenant/2021_08_26_133538_create_workflows_table.php create mode 100644 database/migrations/tenant/2021_09_03_172713_create_email_templates_table.php create mode 100644 database/migrations/tenant/2021_09_22_194103_add_unique_index_to_name_in_organizations_table.php create mode 100644 database/migrations/tenant/2021_09_22_194622_add_unique_index_to_name_in_groups_table.php create mode 100644 database/migrations/tenant/2021_09_23_221138_add_column_expected_close_date_in_leads_table.php create mode 100644 database/migrations/tenant/2021_09_30_135857_add_column_rotten_days_in_lead_pipelines_table.php create mode 100644 database/migrations/tenant/2021_09_30_154222_alter_lead_pipeline_stages_table.php create mode 100644 database/migrations/tenant/2021_09_30_161722_alter_leads_table.php create mode 100644 database/migrations/tenant/2021_10_02_170105_insert_expected_closed_date_column_in_attributes_table.php create mode 100644 database/migrations/tenant/2021_11_12_171510_add_image_column_in_users_table.php create mode 100644 database/migrations/tenant/2021_11_17_190943_add_location_column_in_activities_table.php create mode 100644 database/migrations/tenant/2021_12_14_213049_create_web_forms_table.php create mode 100644 database/migrations/tenant/2021_12_14_214923_create_web_form_attributes_table.php create mode 100644 database/migrations/tenant/2024_01_11_154640_create_imports_table.php create mode 100644 database/migrations/tenant/2024_01_11_154741_create_import_batches_table.php create mode 100644 database/migrations/tenant/2024_05_10_152848_create_saved_filters_table.php create mode 100644 database/migrations/tenant/2024_06_21_160707_create_warehouses_table.php create mode 100644 database/migrations/tenant/2024_06_21_160735_create_warehouse_locations_table.php create mode 100644 database/migrations/tenant/2024_06_24_174241_insert_warehouse_attributes_in_attributes_table.php create mode 100644 database/migrations/tenant/2024_06_28_154009_create_product_inventories_table.php create mode 100644 database/migrations/tenant/2024_07_24_150821_create_webhooks_table.php create mode 100644 database/migrations/tenant/2024_07_31_092951_add_job_title_in_persons_table.php create mode 100644 database/migrations/tenant/2024_07_31_093603_add_organization_sales_owner_attribute_in_attributes_table.php create mode 100644 database/migrations/tenant/2024_07_31_093605_add_person_job_title_attribute_in_attributes_table.php create mode 100644 database/migrations/tenant/2024_07_31_093605_add_person_sales_owner_attribute_in_attributes_table.php create mode 100644 database/migrations/tenant/2024_08_06_145943_create_person_tags_table.php create mode 100644 database/migrations/tenant/2024_08_06_161212_create_person_activities_table.php create mode 100644 database/migrations/tenant/2024_08_10_100329_create_warehouse_activities_table.php create mode 100644 database/migrations/tenant/2024_08_10_100340_create_warehouse_tags_table.php create mode 100644 database/migrations/tenant/2024_08_10_150329_create_product_activities_table.php create mode 100644 database/migrations/tenant/2024_08_10_150340_create_product_tags_table.php create mode 100644 database/migrations/tenant/2024_08_14_102116_add_user_id_column_in_persons_table.php create mode 100644 database/migrations/tenant/2024_08_14_102136_add_user_id_column_in_organizations_table.php create mode 100644 database/migrations/tenant/2024_08_21_153011_add_leads_stage_and_pipeline_attributes.php create mode 100644 database/migrations/tenant/2024_08_27_091619_create_email_tags_table.php create mode 100644 database/migrations/tenant/2024_09_06_065808_alter_product_inventories_table.php create mode 100644 database/migrations/tenant/2024_09_09_112201_add_unique_id_to_person_table.php create mode 100644 database/migrations/tenant/2024_10_29_044744_create_marketing_events_table.php create mode 100644 database/migrations/tenant/2024_11_04_122500_create_marketing_campaigns_table.php create mode 100644 database/migrations/tenant/2024_11_29_120302_modify_foreign_keys_in_leads_table.php create mode 100644 database/migrations/tenant/2025_01_17_151632_alter_activities_table.php create mode 100644 database/migrations/tenant/2025_01_29_133500_update_text_column_type_in_core_config_table.php create mode 100644 database/migrations/tenant/2025_03_19_132236_update_organization_id_column_in_persons_table.php create mode 100644 database/migrations/tenant/2025_07_01_133612_alter_lead_pipelines_table.php create mode 100644 database/migrations/tenant/2025_07_02_191710_alter_attribute_values_table.php create mode 100644 database/migrations/tenant/2025_07_09_133553_alter_email_templates_table.php create mode 100644 database/seeders/DatabaseSeeder.php create mode 100644 database/seeders/SuperAdminSeeder.php create mode 100644 docker-compose.dev.yml create mode 100644 docker-compose.yml create mode 100644 docker-entrypoint.sh create mode 100644 fix-locale.php create mode 100644 lang/en/auth.php create mode 100644 lang/en/pagination.php create mode 100644 lang/en/passwords.php create mode 100644 lang/en/validation.php create mode 100644 package.json create mode 100755 packages/Webkul/Activity/composer.json create mode 100644 packages/Webkul/Activity/src/Contracts/Activity.php create mode 100644 packages/Webkul/Activity/src/Contracts/File.php create mode 100644 packages/Webkul/Activity/src/Contracts/Participant.php create mode 100644 packages/Webkul/Activity/src/Database/Migrations/2021_05_12_150329_create_activities_table.php create mode 100644 packages/Webkul/Activity/src/Database/Migrations/2021_05_15_151855_create_activity_files_table.php create mode 100644 packages/Webkul/Activity/src/Database/Migrations/2021_07_28_142453_create_activity_participants_table.php create mode 100644 packages/Webkul/Activity/src/Database/Migrations/2021_11_17_190943_add_location_column_in_activities_table.php create mode 100644 packages/Webkul/Activity/src/Database/Migrations/2025_01_17_151632_alter_activities_table.php create mode 100644 packages/Webkul/Activity/src/Models/Activity.php create mode 100644 packages/Webkul/Activity/src/Models/ActivityProxy.php create mode 100644 packages/Webkul/Activity/src/Models/File.php create mode 100644 packages/Webkul/Activity/src/Models/FileProxy.php create mode 100644 packages/Webkul/Activity/src/Models/Participant.php create mode 100644 packages/Webkul/Activity/src/Models/ParticipantProxy.php create mode 100644 packages/Webkul/Activity/src/Providers/ActivityServiceProvider.php create mode 100644 packages/Webkul/Activity/src/Providers/ModuleServiceProvider.php create mode 100755 packages/Webkul/Activity/src/Repositories/ActivityRepository.php create mode 100755 packages/Webkul/Activity/src/Repositories/FileRepository.php create mode 100755 packages/Webkul/Activity/src/Repositories/ParticipantRepository.php create mode 100644 packages/Webkul/Activity/src/Traits/LogsActivity.php create mode 100755 packages/Webkul/Admin/.gitignore create mode 100755 packages/Webkul/Admin/composer.json create mode 100644 packages/Webkul/Admin/package.json create mode 100644 packages/Webkul/Admin/postcss.config.cjs create mode 100755 packages/Webkul/Admin/src/Bouncer.php create mode 100644 packages/Webkul/Admin/src/Config/acl.php create mode 100644 packages/Webkul/Admin/src/Config/attribute_entity_types.php create mode 100644 packages/Webkul/Admin/src/Config/attribute_lookups.php create mode 100644 packages/Webkul/Admin/src/Config/core_config.php create mode 100644 packages/Webkul/Admin/src/Config/menu.php create mode 100644 packages/Webkul/Admin/src/DataGrids/Activity/ActivityDataGrid.php create mode 100644 packages/Webkul/Admin/src/DataGrids/Contact/OrganizationDataGrid.php create mode 100644 packages/Webkul/Admin/src/DataGrids/Contact/PersonDataGrid.php create mode 100644 packages/Webkul/Admin/src/DataGrids/Lead/LeadDataGrid.php create mode 100644 packages/Webkul/Admin/src/DataGrids/Mail/EmailDataGrid.php create mode 100644 packages/Webkul/Admin/src/DataGrids/Product/ProductDataGrid.php create mode 100644 packages/Webkul/Admin/src/DataGrids/Quote/QuoteDataGrid.php create mode 100644 packages/Webkul/Admin/src/DataGrids/Settings/AttributeDataGrid.php create mode 100644 packages/Webkul/Admin/src/DataGrids/Settings/DataTransfer/ImportDataGrid.php create mode 100644 packages/Webkul/Admin/src/DataGrids/Settings/EmailTemplateDataGrid.php create mode 100644 packages/Webkul/Admin/src/DataGrids/Settings/GroupDataGrid.php create mode 100644 packages/Webkul/Admin/src/DataGrids/Settings/Marketing/CampaignDatagrid.php create mode 100644 packages/Webkul/Admin/src/DataGrids/Settings/Marketing/EventDataGrid.php create mode 100644 packages/Webkul/Admin/src/DataGrids/Settings/PipelineDataGrid.php create mode 100644 packages/Webkul/Admin/src/DataGrids/Settings/RoleDataGrid.php create mode 100644 packages/Webkul/Admin/src/DataGrids/Settings/SourceDataGrid.php create mode 100644 packages/Webkul/Admin/src/DataGrids/Settings/TagDataGrid.php create mode 100644 packages/Webkul/Admin/src/DataGrids/Settings/TypeDataGrid.php create mode 100644 packages/Webkul/Admin/src/DataGrids/Settings/UserDataGrid.php create mode 100644 packages/Webkul/Admin/src/DataGrids/Settings/WarehouseDataGrid.php create mode 100644 packages/Webkul/Admin/src/DataGrids/Settings/WebhookDataGrid.php create mode 100644 packages/Webkul/Admin/src/DataGrids/Settings/WorkflowDataGrid.php create mode 100644 packages/Webkul/Admin/src/Database/Migrations/2021_06_07_162808_add_lead_view_permission_column_in_users_table.php create mode 100644 packages/Webkul/Admin/src/Database/Migrations/2021_10_02_170105_insert_expected_closed_date_column_in_attributes_table.php create mode 100755 packages/Webkul/Admin/src/Exceptions/Handler.php create mode 100755 packages/Webkul/Admin/src/Facades/Bouncer.php create mode 100644 packages/Webkul/Admin/src/Helpers/Dashboard.php create mode 100644 packages/Webkul/Admin/src/Helpers/Reporting/AbstractReporting.php create mode 100644 packages/Webkul/Admin/src/Helpers/Reporting/Activity.php create mode 100644 packages/Webkul/Admin/src/Helpers/Reporting/Lead.php create mode 100644 packages/Webkul/Admin/src/Helpers/Reporting/Organization.php create mode 100644 packages/Webkul/Admin/src/Helpers/Reporting/Person.php create mode 100644 packages/Webkul/Admin/src/Helpers/Reporting/Product.php create mode 100644 packages/Webkul/Admin/src/Helpers/Reporting/Quote.php create mode 100755 packages/Webkul/Admin/src/Http/Controllers/Activity/ActivityController.php create mode 100644 packages/Webkul/Admin/src/Http/Controllers/Configuration/ConfigurationController.php create mode 100644 packages/Webkul/Admin/src/Http/Controllers/Contact/OrganizationController.php create mode 100644 packages/Webkul/Admin/src/Http/Controllers/Contact/Persons/ActivityController.php create mode 100644 packages/Webkul/Admin/src/Http/Controllers/Contact/Persons/PersonController.php create mode 100644 packages/Webkul/Admin/src/Http/Controllers/Contact/Persons/TagController.php create mode 100755 packages/Webkul/Admin/src/Http/Controllers/Controller.php create mode 100755 packages/Webkul/Admin/src/Http/Controllers/DashboardController.php create mode 100644 packages/Webkul/Admin/src/Http/Controllers/DataGrid/SavedFilterController.php create mode 100644 packages/Webkul/Admin/src/Http/Controllers/DataGridController.php create mode 100644 packages/Webkul/Admin/src/Http/Controllers/Lead/ActivityController.php create mode 100644 packages/Webkul/Admin/src/Http/Controllers/Lead/EmailController.php create mode 100755 packages/Webkul/Admin/src/Http/Controllers/Lead/LeadController.php create mode 100644 packages/Webkul/Admin/src/Http/Controllers/Lead/QuoteController.php create mode 100644 packages/Webkul/Admin/src/Http/Controllers/Lead/TagController.php create mode 100644 packages/Webkul/Admin/src/Http/Controllers/Mail/EmailController.php create mode 100644 packages/Webkul/Admin/src/Http/Controllers/Mail/TagController.php create mode 100644 packages/Webkul/Admin/src/Http/Controllers/Products/ActivityController.php create mode 100644 packages/Webkul/Admin/src/Http/Controllers/Products/ProductController.php create mode 100644 packages/Webkul/Admin/src/Http/Controllers/Products/TagController.php create mode 100644 packages/Webkul/Admin/src/Http/Controllers/Quote/QuoteController.php create mode 100644 packages/Webkul/Admin/src/Http/Controllers/Settings/AttributeController.php create mode 100755 packages/Webkul/Admin/src/Http/Controllers/Settings/DataTransfer/ImportController.php create mode 100755 packages/Webkul/Admin/src/Http/Controllers/Settings/EmailTemplateController.php create mode 100755 packages/Webkul/Admin/src/Http/Controllers/Settings/GroupController.php create mode 100644 packages/Webkul/Admin/src/Http/Controllers/Settings/LocationController.php create mode 100644 packages/Webkul/Admin/src/Http/Controllers/Settings/Marketing/CampaignsController.php create mode 100644 packages/Webkul/Admin/src/Http/Controllers/Settings/Marketing/EventController.php create mode 100644 packages/Webkul/Admin/src/Http/Controllers/Settings/PipelineController.php create mode 100755 packages/Webkul/Admin/src/Http/Controllers/Settings/RoleController.php create mode 100644 packages/Webkul/Admin/src/Http/Controllers/Settings/SettingController.php create mode 100755 packages/Webkul/Admin/src/Http/Controllers/Settings/SourceController.php create mode 100755 packages/Webkul/Admin/src/Http/Controllers/Settings/TagController.php create mode 100755 packages/Webkul/Admin/src/Http/Controllers/Settings/TypeController.php create mode 100755 packages/Webkul/Admin/src/Http/Controllers/Settings/UserController.php create mode 100644 packages/Webkul/Admin/src/Http/Controllers/Settings/Warehouse/ActivityController.php create mode 100644 packages/Webkul/Admin/src/Http/Controllers/Settings/Warehouse/TagController.php create mode 100644 packages/Webkul/Admin/src/Http/Controllers/Settings/Warehouse/WarehouseController.php create mode 100644 packages/Webkul/Admin/src/Http/Controllers/Settings/WebFormController.php create mode 100644 packages/Webkul/Admin/src/Http/Controllers/Settings/WebhookController.php create mode 100755 packages/Webkul/Admin/src/Http/Controllers/Settings/WorkflowController.php create mode 100644 packages/Webkul/Admin/src/Http/Controllers/TinyMCEController.php create mode 100755 packages/Webkul/Admin/src/Http/Controllers/User/AccountController.php create mode 100755 packages/Webkul/Admin/src/Http/Controllers/User/ForgotPasswordController.php create mode 100755 packages/Webkul/Admin/src/Http/Controllers/User/ResetPasswordController.php create mode 100755 packages/Webkul/Admin/src/Http/Controllers/User/SessionController.php create mode 100755 packages/Webkul/Admin/src/Http/Middleware/Bouncer.php create mode 100644 packages/Webkul/Admin/src/Http/Middleware/Locale.php create mode 100644 packages/Webkul/Admin/src/Http/Requests/AttributeForm.php create mode 100644 packages/Webkul/Admin/src/Http/Requests/ConfigurationForm.php create mode 100644 packages/Webkul/Admin/src/Http/Requests/LeadForm.php create mode 100644 packages/Webkul/Admin/src/Http/Requests/MassDestroyRequest.php create mode 100644 packages/Webkul/Admin/src/Http/Requests/MassUpdateRequest.php create mode 100755 packages/Webkul/Admin/src/Http/Requests/PipelineForm.php create mode 100755 packages/Webkul/Admin/src/Http/Requests/UserForm.php create mode 100644 packages/Webkul/Admin/src/Http/Resources/ActivityFileResource.php create mode 100644 packages/Webkul/Admin/src/Http/Resources/ActivityParticipantResource.php create mode 100644 packages/Webkul/Admin/src/Http/Resources/ActivityResource.php create mode 100644 packages/Webkul/Admin/src/Http/Resources/EmailAttachmentResource.php create mode 100644 packages/Webkul/Admin/src/Http/Resources/EmailResource.php create mode 100644 packages/Webkul/Admin/src/Http/Resources/LeadResource.php create mode 100644 packages/Webkul/Admin/src/Http/Resources/OrganizationResource.php create mode 100644 packages/Webkul/Admin/src/Http/Resources/PersonResource.php create mode 100644 packages/Webkul/Admin/src/Http/Resources/PipelineResource.php create mode 100644 packages/Webkul/Admin/src/Http/Resources/ProductResource.php create mode 100644 packages/Webkul/Admin/src/Http/Resources/QuoteResource.php create mode 100644 packages/Webkul/Admin/src/Http/Resources/SourceResource.php create mode 100644 packages/Webkul/Admin/src/Http/Resources/StageResource.php create mode 100644 packages/Webkul/Admin/src/Http/Resources/TagResource.php create mode 100644 packages/Webkul/Admin/src/Http/Resources/TypeResource.php create mode 100644 packages/Webkul/Admin/src/Http/Resources/UserResource.php create mode 100755 packages/Webkul/Admin/src/Http/helpers.php create mode 100644 packages/Webkul/Admin/src/Listeners/Activity.php create mode 100644 packages/Webkul/Admin/src/Listeners/Lead.php create mode 100644 packages/Webkul/Admin/src/Listeners/Person.php create mode 100644 packages/Webkul/Admin/src/Notifications/Common.php create mode 100644 packages/Webkul/Admin/src/Notifications/User/Create.php create mode 100755 packages/Webkul/Admin/src/Notifications/User/UserResetPassword.php create mode 100644 packages/Webkul/Admin/src/Notifications/User/UserUpdatePassword.php create mode 100644 packages/Webkul/Admin/src/Providers/AdminServiceProvider.php create mode 100644 packages/Webkul/Admin/src/Providers/EventServiceProvider.php create mode 100644 packages/Webkul/Admin/src/Providers/ModuleServiceProvider.php create mode 100644 packages/Webkul/Admin/src/Requests/WebhookRequest.php create mode 100644 packages/Webkul/Admin/src/Resources/assets/css/app.css create mode 100644 packages/Webkul/Admin/src/Resources/assets/fonts/icomoon.woff create mode 100644 packages/Webkul/Admin/src/Resources/assets/images/corner-clip.svg create mode 100644 packages/Webkul/Admin/src/Resources/assets/images/dark-corner-clip.svg create mode 100644 packages/Webkul/Admin/src/Resources/assets/images/dark-logo.svg create mode 100644 packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/activities.svg create mode 100644 packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/calls.svg create mode 100644 packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/default.svg create mode 100644 packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/description.svg create mode 100644 packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/emails.svg create mode 100644 packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/files.svg create mode 100644 packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/lunches.svg create mode 100644 packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/meetings.svg create mode 100644 packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/notes.svg create mode 100644 packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/organizations.svg create mode 100644 packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/pipedrive.svg create mode 100644 packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/plans.svg create mode 100644 packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/products.svg create mode 100644 packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/quotes.svg create mode 100644 packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/users.svg create mode 100644 packages/Webkul/Admin/src/Resources/assets/images/error.svg create mode 100644 packages/Webkul/Admin/src/Resources/assets/images/favicon.ico create mode 100644 packages/Webkul/Admin/src/Resources/assets/images/logo.svg create mode 100644 packages/Webkul/Admin/src/Resources/assets/images/mobile-dark-logo.svg create mode 100644 packages/Webkul/Admin/src/Resources/assets/images/mobile-light-logo.svg create mode 100644 packages/Webkul/Admin/src/Resources/assets/js/app.js create mode 100644 packages/Webkul/Admin/src/Resources/assets/js/chart.js create mode 100644 packages/Webkul/Admin/src/Resources/assets/js/directives/debounce.js create mode 100644 packages/Webkul/Admin/src/Resources/assets/js/directives/dompurify.js create mode 100644 packages/Webkul/Admin/src/Resources/assets/js/directives/tooltip.js create mode 100644 packages/Webkul/Admin/src/Resources/assets/js/plugins/admin.js create mode 100644 packages/Webkul/Admin/src/Resources/assets/js/plugins/axios.js create mode 100644 packages/Webkul/Admin/src/Resources/assets/js/plugins/createElement.js create mode 100644 packages/Webkul/Admin/src/Resources/assets/js/plugins/draggable.js create mode 100644 packages/Webkul/Admin/src/Resources/assets/js/plugins/emitter.js create mode 100644 packages/Webkul/Admin/src/Resources/assets/js/plugins/flatpickr.js create mode 100644 packages/Webkul/Admin/src/Resources/assets/js/plugins/vee-validate.js create mode 100644 packages/Webkul/Admin/src/Resources/assets/js/plugins/vue-cal.js create mode 100644 packages/Webkul/Admin/src/Resources/assets/locales/hi_IN.json create mode 100644 packages/Webkul/Admin/src/Resources/assets/locales/sin.json create mode 100644 packages/Webkul/Admin/src/Resources/lang/ar/app.php create mode 100644 packages/Webkul/Admin/src/Resources/lang/en/app.php create mode 100644 packages/Webkul/Admin/src/Resources/lang/es/app.php create mode 100644 packages/Webkul/Admin/src/Resources/lang/fa/app.php create mode 100644 packages/Webkul/Admin/src/Resources/lang/pt_BR/app.php create mode 100644 packages/Webkul/Admin/src/Resources/lang/tr/app.php create mode 100644 packages/Webkul/Admin/src/Resources/lang/vi/app.php create mode 100644 packages/Webkul/Admin/src/Resources/views/activities/datagrid/is-done.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/activities/edit.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/activities/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/accordion/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/activities/actions/activity.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/activities/actions/activity/participants.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/activities/actions/file.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/activities/actions/mail.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/activities/actions/note.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/activities/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/attachments/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/attributes/edit/address.blade.php create mode 100755 packages/Webkul/Admin/src/Resources/views/components/attributes/edit/boolean.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/attributes/edit/checkbox.blade.php create mode 100755 packages/Webkul/Admin/src/Resources/views/components/attributes/edit/date.blade.php create mode 100755 packages/Webkul/Admin/src/Resources/views/components/attributes/edit/datetime.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/attributes/edit/email.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/attributes/edit/file.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/attributes/edit/image.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/attributes/edit/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/attributes/edit/lookup.blade.php create mode 100755 packages/Webkul/Admin/src/Resources/views/components/attributes/edit/multiselect.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/attributes/edit/phone.blade.php create mode 100755 packages/Webkul/Admin/src/Resources/views/components/attributes/edit/price.blade.php create mode 100755 packages/Webkul/Admin/src/Resources/views/components/attributes/edit/select.blade.php create mode 100755 packages/Webkul/Admin/src/Resources/views/components/attributes/edit/text.blade.php create mode 100755 packages/Webkul/Admin/src/Resources/views/components/attributes/edit/textarea.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/attributes/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/attributes/view.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/attributes/view/address.blade.php create mode 100755 packages/Webkul/Admin/src/Resources/views/components/attributes/view/boolean.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/attributes/view/checkbox.blade.php create mode 100755 packages/Webkul/Admin/src/Resources/views/components/attributes/view/date.blade.php create mode 100755 packages/Webkul/Admin/src/Resources/views/components/attributes/view/datetime.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/attributes/view/email.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/attributes/view/file.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/attributes/view/image.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/attributes/view/lookup.blade.php create mode 100755 packages/Webkul/Admin/src/Resources/views/components/attributes/view/multiselect.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/attributes/view/phone.blade.php create mode 100755 packages/Webkul/Admin/src/Resources/views/components/attributes/view/price.blade.php create mode 100755 packages/Webkul/Admin/src/Resources/views/components/attributes/view/select.blade.php create mode 100755 packages/Webkul/Admin/src/Resources/views/components/attributes/view/text.blade.php create mode 100755 packages/Webkul/Admin/src/Resources/views/components/attributes/view/textarea.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/avatar/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/breadcrumbs/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/button/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/charts/bar.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/charts/doughnut.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/charts/line.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/datagrid/export/index.blade.php create mode 100755 packages/Webkul/Admin/src/Resources/views/components/datagrid/export/temp.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/datagrid/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/datagrid/table.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar/filter.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar/mass-action.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar/pagination.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar/search.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/drawer/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/dropdown/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/dropdown/menu/item.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/example.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/flash-group/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/flash-group/item.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/flat-picker/date.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/flat-picker/datetime.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/form/control-group/control.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/address.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/boolean.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/date.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/datetime.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/email.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/file.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/image.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/lookup.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/multiselect.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/phone.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/select.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/text.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/tags.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/form/control-group/error.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/form/control-group/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/form/control-group/label.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/form/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/layouts/anonymous.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/layouts/header/desktop/mega-search.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/layouts/header/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/layouts/header/mobile/mega-search.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/layouts/header/quick-creation.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/layouts/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/layouts/sidebar/desktop/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/layouts/sidebar/mobile/index.blade.php create mode 100755 packages/Webkul/Admin/src/Resources/views/components/layouts/tabs.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/lookup/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/media/images.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/media/videos.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/modal/confirm.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/modal/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/accordion/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/activities/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/charts/bar.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/common/address.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/open-leads-by-states.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/over-all.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/revenue-by-sources.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/revenue-by-types.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/revenue.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/top-persons.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/top-selling-products.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/total-leads.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/table/body.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/table/head.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/toolbar.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/toolbar/filter.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/toolbar/pagination.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/toolbar/search.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/configurations.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/leads.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/persons.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/products.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/quotes.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/settings.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/image/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/datagrid.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/index/kanban.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/index/kanban/toolbar.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/view/mail/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/view/stages.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/mail/datagrid/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/mail/datagrid/table/body.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/mail/datagrid/table/head.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/person/view/activities/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/person/view/stages.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/person/view/tags.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/pipelines/kanban.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/quotes/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/settings/attributes.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/settings/web-forms/body.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/settings/web-forms/head.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/settings/web-forms/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/tabs/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/tags/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/tinymce/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/shimmer/tree/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/spinner/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/table/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/table/tbody/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/table/tbody/tr.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/table/td.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/table/th.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/table/thead/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/table/thead/tr.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/tabs/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/tabs/item.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/tags/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/tinymce/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/tree/checkbox.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/tree/radio.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/components/tree/view.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/configuration/edit.blade.php create mode 100755 packages/Webkul/Admin/src/Resources/views/configuration/field-type.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/configuration/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/contacts/organizations/create.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/contacts/organizations/edit.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/contacts/organizations/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/contacts/persons/create.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/contacts/persons/edit.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/contacts/persons/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/contacts/persons/view.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/contacts/persons/view/attributes.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/contacts/persons/view/organization.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/dashboard/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/dashboard/index/open-leads-by-states.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/dashboard/index/over-all.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/dashboard/index/revenue-by-sources.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/dashboard/index/revenue-by-types.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/dashboard/index/revenue.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/dashboard/index/top-persons.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/dashboard/index/top-selling-products.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/dashboard/index/total-leads.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/emails/common/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/emails/layout.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/emails/users/create.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/emails/users/forget-password.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/errors/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/leads/common/contact.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/leads/common/products.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/leads/create.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/leads/edit.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/leads/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/leads/index/kanban.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/leads/index/kanban/filter.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/leads/index/kanban/search.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/leads/index/kanban/toolbar.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/leads/index/table.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/leads/index/upload.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/leads/index/view-switcher.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/leads/view.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/leads/view/attributes.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/leads/view/person.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/leads/view/products.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/leads/view/quotes.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/leads/view/stages.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/mail/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/mail/view.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/partials/breadcrumbs.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/products/create.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/products/edit.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/products/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/products/view.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/products/view/attributes.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/products/view/inventory.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/quotes/create.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/quotes/edit.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/quotes/index.blade.php create mode 100755 packages/Webkul/Admin/src/Resources/views/quotes/pdf.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/sessions/forgot-password.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/sessions/login.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/sessions/reset-password.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/attributes/create.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/attributes/edit.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/attributes/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/data-transfer/imports/create.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/data-transfer/imports/edit.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/data-transfer/imports/import.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/data-transfer/imports/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/email-templates/create.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/email-templates/edit.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/email-templates/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/groups/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/marketing/campaigns/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/marketing/events/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/pipelines/create.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/pipelines/edit.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/pipelines/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/roles/create.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/roles/edit.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/roles/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/sources/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/tags/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/types/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/users/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/warehouses/create.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/warehouses/edit.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/warehouses/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/warehouses/view.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/warehouses/view/contact-information.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/warehouses/view/general-information.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/warehouses/view/locations.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/web-forms/create.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/web-forms/edit.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/web-forms/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/webhook/create.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/webhook/edit.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/webhook/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/workflows/create.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/workflows/edit.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/settings/workflows/index.blade.php create mode 100644 packages/Webkul/Admin/src/Resources/views/user/account/edit.blade.php create mode 100644 packages/Webkul/Admin/src/Routes/Admin/activities-routes.php create mode 100644 packages/Webkul/Admin/src/Routes/Admin/auth-routes.php create mode 100644 packages/Webkul/Admin/src/Routes/Admin/configuration-routes.php create mode 100644 packages/Webkul/Admin/src/Routes/Admin/contacts-routes.php create mode 100644 packages/Webkul/Admin/src/Routes/Admin/leads-routes.php create mode 100644 packages/Webkul/Admin/src/Routes/Admin/mail-routes.php create mode 100644 packages/Webkul/Admin/src/Routes/Admin/products-routes.php create mode 100644 packages/Webkul/Admin/src/Routes/Admin/quote-routes.php create mode 100644 packages/Webkul/Admin/src/Routes/Admin/rest-routes.php create mode 100644 packages/Webkul/Admin/src/Routes/Admin/settings-routes.php create mode 100644 packages/Webkul/Admin/src/Routes/Admin/web.php create mode 100644 packages/Webkul/Admin/src/Routes/Front/web.php create mode 100644 packages/Webkul/Admin/src/Traits/ProvideDropdownOptions.php create mode 100644 packages/Webkul/Admin/tailwind.config.js create mode 100644 packages/Webkul/Admin/tests/e2e-pw/.gitignore create mode 100644 packages/Webkul/Admin/tests/e2e-pw/data/images/1.webp create mode 100644 packages/Webkul/Admin/tests/e2e-pw/data/images/10.webp create mode 100644 packages/Webkul/Admin/tests/e2e-pw/data/images/11.webp create mode 100644 packages/Webkul/Admin/tests/e2e-pw/data/images/12.webp create mode 100644 packages/Webkul/Admin/tests/e2e-pw/data/images/2.webp create mode 100644 packages/Webkul/Admin/tests/e2e-pw/data/images/3.webp create mode 100644 packages/Webkul/Admin/tests/e2e-pw/data/images/4.webp create mode 100644 packages/Webkul/Admin/tests/e2e-pw/data/images/5.webp create mode 100644 packages/Webkul/Admin/tests/e2e-pw/data/images/6.webp create mode 100644 packages/Webkul/Admin/tests/e2e-pw/data/images/7.webp create mode 100644 packages/Webkul/Admin/tests/e2e-pw/data/images/8.webp create mode 100644 packages/Webkul/Admin/tests/e2e-pw/data/images/9.webp create mode 100644 packages/Webkul/Admin/tests/e2e-pw/playwright.config.ts create mode 100644 packages/Webkul/Admin/tests/e2e-pw/setup.ts create mode 100644 packages/Webkul/Admin/tests/e2e-pw/tests/auth.spec.ts create mode 100644 packages/Webkul/Admin/tests/e2e-pw/tests/contacts/organization.spec.ts create mode 100644 packages/Webkul/Admin/tests/e2e-pw/tests/contacts/person.spec.ts create mode 100644 packages/Webkul/Admin/tests/e2e-pw/tests/lang/lang.spec.ts create mode 100644 packages/Webkul/Admin/tests/e2e-pw/tests/lead.spec.ts create mode 100644 packages/Webkul/Admin/tests/e2e-pw/tests/mail/draft.spec.ts create mode 100644 packages/Webkul/Admin/tests/e2e-pw/tests/mail/inbox.spec.ts create mode 100644 packages/Webkul/Admin/tests/e2e-pw/tests/mail/outbox.spec.ts create mode 100644 packages/Webkul/Admin/tests/e2e-pw/tests/mail/sent.spec.ts create mode 100644 packages/Webkul/Admin/tests/e2e-pw/tests/mail/trash.spec.ts create mode 100644 packages/Webkul/Admin/tests/e2e-pw/tests/product.spec.ts create mode 100644 packages/Webkul/Admin/tests/e2e-pw/tests/quotes.spec.ts create mode 100644 packages/Webkul/Admin/tests/e2e-pw/tests/settings/automation/events.spec.ts create mode 100644 packages/Webkul/Admin/tests/e2e-pw/tests/settings/lead/types.spec.ts create mode 100644 packages/Webkul/Admin/tests/e2e-pw/tests/settings/user/groups.spec.ts create mode 100644 packages/Webkul/Admin/tests/e2e-pw/tests/settings/user/users.spec.ts create mode 100644 packages/Webkul/Admin/tests/e2e-pw/tests/settings/warehouses/warehouse.spec.ts create mode 100644 packages/Webkul/Admin/tests/e2e-pw/utils/components.ts create mode 100644 packages/Webkul/Admin/tests/e2e-pw/utils/faker.ts create mode 100644 packages/Webkul/Admin/vite.config.js create mode 100755 packages/Webkul/Attribute/composer.json create mode 100644 packages/Webkul/Attribute/src/Config/attribute_lookups.php create mode 100644 packages/Webkul/Attribute/src/Contracts/Attribute.php create mode 100644 packages/Webkul/Attribute/src/Contracts/AttributeOption.php create mode 100644 packages/Webkul/Attribute/src/Contracts/AttributeValue.php create mode 100644 packages/Webkul/Attribute/src/Database/Migrations/2021_04_02_080709_create_attributes_table.php create mode 100644 packages/Webkul/Attribute/src/Database/Migrations/2021_04_02_080837_create_attribute_options_table.php create mode 100644 packages/Webkul/Attribute/src/Database/Migrations/2021_04_06_122751_create_attribute_values_table.php create mode 100644 packages/Webkul/Attribute/src/Database/Migrations/2025_07_02_191710_alter_attribute_values_table.php create mode 100644 packages/Webkul/Attribute/src/Models/Attribute.php create mode 100644 packages/Webkul/Attribute/src/Models/AttributeOption.php create mode 100644 packages/Webkul/Attribute/src/Models/AttributeOptionProxy.php create mode 100644 packages/Webkul/Attribute/src/Models/AttributeProxy.php create mode 100755 packages/Webkul/Attribute/src/Models/AttributeValue.php create mode 100644 packages/Webkul/Attribute/src/Models/AttributeValueProxy.php create mode 100644 packages/Webkul/Attribute/src/Providers/AttributeServiceProvider.php create mode 100644 packages/Webkul/Attribute/src/Providers/ModuleServiceProvider.php create mode 100755 packages/Webkul/Attribute/src/Repositories/AttributeOptionRepository.php create mode 100755 packages/Webkul/Attribute/src/Repositories/AttributeRepository.php create mode 100755 packages/Webkul/Attribute/src/Repositories/AttributeValueRepository.php create mode 100644 packages/Webkul/Attribute/src/Traits/CustomAttribute.php create mode 100644 packages/Webkul/Automation/src/Config/workflows.php create mode 100644 packages/Webkul/Automation/src/Contracts/Webhook.php create mode 100644 packages/Webkul/Automation/src/Contracts/Workflow.php create mode 100644 packages/Webkul/Automation/src/Database/Migrations/2021_08_26_133538_create_workflows_table.php create mode 100644 packages/Webkul/Automation/src/Database/Migrations/2024_07_24_150821_create_webhooks_table.php create mode 100644 packages/Webkul/Automation/src/Helpers/Entity.php create mode 100644 packages/Webkul/Automation/src/Helpers/Entity/AbstractEntity.php create mode 100644 packages/Webkul/Automation/src/Helpers/Entity/Activity.php create mode 100644 packages/Webkul/Automation/src/Helpers/Entity/Lead.php create mode 100644 packages/Webkul/Automation/src/Helpers/Entity/Person.php create mode 100644 packages/Webkul/Automation/src/Helpers/Entity/Quote.php create mode 100644 packages/Webkul/Automation/src/Helpers/Validator.php create mode 100644 packages/Webkul/Automation/src/Listeners/Entity.php create mode 100644 packages/Webkul/Automation/src/Models/Webhook.php create mode 100644 packages/Webkul/Automation/src/Models/WebhookProxy.php create mode 100644 packages/Webkul/Automation/src/Models/Workflow.php create mode 100644 packages/Webkul/Automation/src/Models/WorkflowProxy.php create mode 100644 packages/Webkul/Automation/src/Providers/ModuleServiceProvider.php create mode 100644 packages/Webkul/Automation/src/Providers/WorkflowServiceProvider.php create mode 100644 packages/Webkul/Automation/src/Repositories/WebhookRepository.php create mode 100644 packages/Webkul/Automation/src/Repositories/WorkflowRepository.php create mode 100644 packages/Webkul/Automation/src/Services/WebhookService.php create mode 100755 packages/Webkul/Contact/composer.json create mode 100644 packages/Webkul/Contact/src/Contracts/Organization.php create mode 100644 packages/Webkul/Contact/src/Contracts/Person.php create mode 100644 packages/Webkul/Contact/src/Database/Factories/PersonFactory.php create mode 100644 packages/Webkul/Contact/src/Database/Migrations/2021_04_09_051326_create_organizations_table.php create mode 100644 packages/Webkul/Contact/src/Database/Migrations/2021_04_09_065617_create_persons_table.php create mode 100644 packages/Webkul/Contact/src/Database/Migrations/2021_09_22_194103_add_unique_index_to_name_in_organizations_table.php create mode 100644 packages/Webkul/Contact/src/Database/Migrations/2024_07_31_092951_add_job_title_in_persons_table.php create mode 100644 packages/Webkul/Contact/src/Database/Migrations/2024_08_06_145943_create_person_tags_table.php create mode 100644 packages/Webkul/Contact/src/Database/Migrations/2024_08_06_161212_create_person_activities_table.php create mode 100644 packages/Webkul/Contact/src/Database/Migrations/2024_08_14_102116_add_user_id_column_in_persons_table.php create mode 100644 packages/Webkul/Contact/src/Database/Migrations/2024_08_14_102136_add_user_id_column_in_organizations_table.php create mode 100644 packages/Webkul/Contact/src/Database/Migrations/2024_09_09_112201_add_unique_id_to_person_table.php create mode 100644 packages/Webkul/Contact/src/Database/Migrations/2025_03_19_132236_update_organization_id_column_in_persons_table.php create mode 100644 packages/Webkul/Contact/src/Models/Organization.php create mode 100644 packages/Webkul/Contact/src/Models/OrganizationProxy.php create mode 100644 packages/Webkul/Contact/src/Models/Person.php create mode 100644 packages/Webkul/Contact/src/Models/PersonProxy.php create mode 100644 packages/Webkul/Contact/src/Providers/ContactServiceProvider.php create mode 100644 packages/Webkul/Contact/src/Providers/ModuleServiceProvider.php create mode 100644 packages/Webkul/Contact/src/Repositories/OrganizationRepository.php create mode 100644 packages/Webkul/Contact/src/Repositories/PersonRepository.php create mode 100755 packages/Webkul/Core/composer.json create mode 100644 packages/Webkul/Core/src/Acl.php create mode 100644 packages/Webkul/Core/src/Acl/AclItem.php create mode 100644 packages/Webkul/Core/src/Config/concord.php create mode 100644 packages/Webkul/Core/src/Config/cors.php create mode 100644 packages/Webkul/Core/src/Config/sanctum.php create mode 100644 packages/Webkul/Core/src/Console/Commands/Version.php create mode 100644 packages/Webkul/Core/src/Contracts/CoreConfig.php create mode 100644 packages/Webkul/Core/src/Contracts/Country.php create mode 100644 packages/Webkul/Core/src/Contracts/CountryState.php create mode 100755 packages/Webkul/Core/src/Contracts/Validations/Code.php create mode 100755 packages/Webkul/Core/src/Contracts/Validations/Decimal.php create mode 100644 packages/Webkul/Core/src/Core.php create mode 100755 packages/Webkul/Core/src/Database/Migrations/2021_03_12_060658_create_core_config_table.php create mode 100644 packages/Webkul/Core/src/Database/Migrations/2021_04_12_173232_create_countries_table.php create mode 100644 packages/Webkul/Core/src/Database/Migrations/2021_04_12_173344_create_country_states_table.php create mode 100644 packages/Webkul/Core/src/Database/Migrations/2025_01_29_133500_update_text_column_type_in_core_config_table.php create mode 100755 packages/Webkul/Core/src/Eloquent/Repository.php create mode 100755 packages/Webkul/Core/src/Eloquent/TranslatableModel.php create mode 100755 packages/Webkul/Core/src/Exceptions/ViterNotFound.php create mode 100644 packages/Webkul/Core/src/Facades/Acl.php create mode 100755 packages/Webkul/Core/src/Facades/Core.php create mode 100644 packages/Webkul/Core/src/Facades/Menu.php create mode 100644 packages/Webkul/Core/src/Facades/SystemConfig.php create mode 100644 packages/Webkul/Core/src/Helpers/Helper.php create mode 100644 packages/Webkul/Core/src/Http/Controllers/CoreController.php create mode 100755 packages/Webkul/Core/src/Http/helpers.php create mode 100644 packages/Webkul/Core/src/Menu.php create mode 100644 packages/Webkul/Core/src/Menu/MenuItem.php create mode 100755 packages/Webkul/Core/src/Models/CoreConfig.php create mode 100644 packages/Webkul/Core/src/Models/CoreConfigProxy.php create mode 100755 packages/Webkul/Core/src/Models/Country.php create mode 100644 packages/Webkul/Core/src/Models/CountryProxy.php create mode 100755 packages/Webkul/Core/src/Models/CountryState.php create mode 100644 packages/Webkul/Core/src/Models/CountryStateProxy.php create mode 100644 packages/Webkul/Core/src/Providers/BaseModuleServiceProvider.php create mode 100644 packages/Webkul/Core/src/Providers/CoreServiceProvider.php create mode 100644 packages/Webkul/Core/src/Providers/ModuleServiceProvider.php create mode 100755 packages/Webkul/Core/src/Repositories/CoreConfigRepository.php create mode 100755 packages/Webkul/Core/src/Repositories/CountryRepository.php create mode 100755 packages/Webkul/Core/src/Repositories/CountryStateRepository.php create mode 100644 packages/Webkul/Core/src/Resources/lang/ar/app.php create mode 100644 packages/Webkul/Core/src/Resources/lang/en/app.php create mode 100644 packages/Webkul/Core/src/Resources/lang/es/app.php create mode 100644 packages/Webkul/Core/src/Resources/lang/fa/app.php create mode 100644 packages/Webkul/Core/src/Resources/lang/pt_BR/app.php create mode 100644 packages/Webkul/Core/src/Resources/lang/tr/app.php create mode 100644 packages/Webkul/Core/src/Resources/lang/vi/app.php create mode 100644 packages/Webkul/Core/src/SystemConfig.php create mode 100644 packages/Webkul/Core/src/SystemConfig/Item.php create mode 100644 packages/Webkul/Core/src/SystemConfig/ItemField.php create mode 100644 packages/Webkul/Core/src/Traits/PDFHandler.php create mode 100644 packages/Webkul/Core/src/Traits/Sanitizer.php create mode 100755 packages/Webkul/Core/src/ViewRenderEventManager.php create mode 100644 packages/Webkul/Core/src/Vite.php create mode 100644 packages/Webkul/DataGrid/src/Action.php create mode 100644 packages/Webkul/DataGrid/src/Column.php create mode 100644 packages/Webkul/DataGrid/src/ColumnTypes/Aggregate.php create mode 100644 packages/Webkul/DataGrid/src/ColumnTypes/Boolean.php create mode 100644 packages/Webkul/DataGrid/src/ColumnTypes/Date.php create mode 100644 packages/Webkul/DataGrid/src/ColumnTypes/Datetime.php create mode 100644 packages/Webkul/DataGrid/src/ColumnTypes/Decimal.php create mode 100644 packages/Webkul/DataGrid/src/ColumnTypes/Integer.php create mode 100644 packages/Webkul/DataGrid/src/ColumnTypes/Text.php create mode 100644 packages/Webkul/DataGrid/src/Contracts/SavedFilter.php create mode 100644 packages/Webkul/DataGrid/src/DataGrid.php create mode 100644 packages/Webkul/DataGrid/src/Database/Migrations/2024_05_10_152848_create_saved_filters_table.php create mode 100644 packages/Webkul/DataGrid/src/Enums/ColumnTypeEnum.php create mode 100644 packages/Webkul/DataGrid/src/Enums/DateRangeOptionEnum.php create mode 100644 packages/Webkul/DataGrid/src/Enums/FilterTypeEnum.php create mode 100644 packages/Webkul/DataGrid/src/Exceptions/InvalidColumnException.php create mode 100644 packages/Webkul/DataGrid/src/Exceptions/InvalidColumnTypeException.php create mode 100644 packages/Webkul/DataGrid/src/Exceptions/InvalidDataGridException.php create mode 100644 packages/Webkul/DataGrid/src/Exports/DataGridExport.php create mode 100644 packages/Webkul/DataGrid/src/Http/helpers.php create mode 100644 packages/Webkul/DataGrid/src/MassAction.php create mode 100755 packages/Webkul/DataGrid/src/Models/SavedFilter.php create mode 100644 packages/Webkul/DataGrid/src/Models/SavedFilterProxy.php create mode 100644 packages/Webkul/DataGrid/src/Providers/DataGridServiceProvider.php create mode 100644 packages/Webkul/DataGrid/src/Providers/ModuleServiceProvider.php create mode 100644 packages/Webkul/DataGrid/src/Repositories/SavedFilterRepository.php create mode 100644 packages/Webkul/DataTransfer/src/Config/importers.php create mode 100644 packages/Webkul/DataTransfer/src/Contracts/Import.php create mode 100644 packages/Webkul/DataTransfer/src/Contracts/ImportBatch.php create mode 100644 packages/Webkul/DataTransfer/src/Database/Migrations/2024_01_11_154640_create_imports_table.php create mode 100644 packages/Webkul/DataTransfer/src/Database/Migrations/2024_01_11_154741_create_import_batches_table.php create mode 100644 packages/Webkul/DataTransfer/src/Helpers/Error.php create mode 100644 packages/Webkul/DataTransfer/src/Helpers/Import.php create mode 100644 packages/Webkul/DataTransfer/src/Helpers/Importers/AbstractImporter.php create mode 100644 packages/Webkul/DataTransfer/src/Helpers/Importers/Leads/Importer.php create mode 100644 packages/Webkul/DataTransfer/src/Helpers/Importers/Leads/Storage.php create mode 100644 packages/Webkul/DataTransfer/src/Helpers/Importers/Persons/Importer.php create mode 100644 packages/Webkul/DataTransfer/src/Helpers/Importers/Persons/Storage.php create mode 100644 packages/Webkul/DataTransfer/src/Helpers/Importers/Products/Importer.php create mode 100644 packages/Webkul/DataTransfer/src/Helpers/Importers/Products/SKUStorage.php create mode 100644 packages/Webkul/DataTransfer/src/Helpers/Sources/AbstractSource.php create mode 100644 packages/Webkul/DataTransfer/src/Helpers/Sources/CSV.php create mode 100644 packages/Webkul/DataTransfer/src/Helpers/Sources/Excel.php create mode 100644 packages/Webkul/DataTransfer/src/Jobs/Import/Completed.php create mode 100644 packages/Webkul/DataTransfer/src/Jobs/Import/ImportBatch.php create mode 100644 packages/Webkul/DataTransfer/src/Jobs/Import/IndexBatch.php create mode 100644 packages/Webkul/DataTransfer/src/Jobs/Import/Indexing.php create mode 100644 packages/Webkul/DataTransfer/src/Jobs/Import/LinkBatch.php create mode 100644 packages/Webkul/DataTransfer/src/Jobs/Import/Linking.php create mode 100755 packages/Webkul/DataTransfer/src/Models/Import.php create mode 100755 packages/Webkul/DataTransfer/src/Models/ImportBatch.php create mode 100644 packages/Webkul/DataTransfer/src/Models/ImportBatchProxy.php create mode 100644 packages/Webkul/DataTransfer/src/Models/ImportProxy.php create mode 100644 packages/Webkul/DataTransfer/src/Providers/DataTransferServiceProvider.php create mode 100644 packages/Webkul/DataTransfer/src/Providers/ModuleServiceProvider.php create mode 100755 packages/Webkul/DataTransfer/src/Repositories/ImportBatchRepository.php create mode 100755 packages/Webkul/DataTransfer/src/Repositories/ImportRepository.php create mode 100644 packages/Webkul/DataTransfer/src/Resources/lang/ar/ar.php create mode 100644 packages/Webkul/DataTransfer/src/Resources/lang/en/app.php create mode 100644 packages/Webkul/DataTransfer/src/Resources/lang/es/app.php create mode 100644 packages/Webkul/DataTransfer/src/Resources/lang/fa/app.php create mode 100644 packages/Webkul/DataTransfer/src/Resources/lang/pt_BR/app.php create mode 100644 packages/Webkul/DataTransfer/src/Resources/lang/tr/app.php create mode 100755 packages/Webkul/Email/composer.json create mode 100644 packages/Webkul/Email/src/Console/Commands/ProcessInboundEmails.php create mode 100644 packages/Webkul/Email/src/Contracts/Attachment.php create mode 100644 packages/Webkul/Email/src/Contracts/Email.php create mode 100644 packages/Webkul/Email/src/Database/Migrations/2021_05_24_075618_create_emails_table.php create mode 100644 packages/Webkul/Email/src/Database/Migrations/2021_05_25_072700_create_email_attachments_table.php create mode 100644 packages/Webkul/Email/src/Database/Migrations/2024_08_27_091619_create_email_tags_table.php create mode 100644 packages/Webkul/Email/src/Enums/SupportedFolderEnum.php create mode 100644 packages/Webkul/Email/src/Helpers/Attachment.php create mode 100644 packages/Webkul/Email/src/Helpers/Charset.php create mode 100644 packages/Webkul/Email/src/Helpers/Contracts/CharsetManager.php create mode 100644 packages/Webkul/Email/src/Helpers/HtmlFilter.php create mode 100644 packages/Webkul/Email/src/Helpers/Parser.php create mode 100644 packages/Webkul/Email/src/InboundEmailProcessor/Contracts/InboundEmailProcessor.php create mode 100644 packages/Webkul/Email/src/InboundEmailProcessor/SendgridEmailProcessor.php create mode 100644 packages/Webkul/Email/src/InboundEmailProcessor/WebklexImapEmailProcessor.php create mode 100644 packages/Webkul/Email/src/Mails/Email.php create mode 100644 packages/Webkul/Email/src/Models/Attachment.php create mode 100644 packages/Webkul/Email/src/Models/AttachmentProxy.php create mode 100644 packages/Webkul/Email/src/Models/Email.php create mode 100644 packages/Webkul/Email/src/Models/EmailProxy.php create mode 100644 packages/Webkul/Email/src/Providers/EmailServiceProvider.php create mode 100644 packages/Webkul/Email/src/Providers/ModuleServiceProvider.php create mode 100644 packages/Webkul/Email/src/Repositories/AttachmentRepository.php create mode 100644 packages/Webkul/Email/src/Repositories/EmailRepository.php create mode 100644 packages/Webkul/EmailTemplate/src/Contracts/EmailTemplate.php create mode 100644 packages/Webkul/EmailTemplate/src/Database/Migrations/2021_09_03_172713_create_email_templates_table.php create mode 100644 packages/Webkul/EmailTemplate/src/Database/Migrations/2025_07_09_133553_alter_email_templates_table.php create mode 100644 packages/Webkul/EmailTemplate/src/Models/EmailTemplate.php create mode 100644 packages/Webkul/EmailTemplate/src/Models/EmailTemplateProxy.php create mode 100644 packages/Webkul/EmailTemplate/src/Providers/EmailTemplateServiceProvider.php create mode 100644 packages/Webkul/EmailTemplate/src/Providers/ModuleServiceProvider.php create mode 100644 packages/Webkul/EmailTemplate/src/Repositories/EmailTemplateRepository.php create mode 100644 packages/Webkul/Installer/.gitignore create mode 100644 packages/Webkul/Installer/composer.json create mode 100644 packages/Webkul/Installer/package.json create mode 100644 packages/Webkul/Installer/postcss.config.js create mode 100644 packages/Webkul/Installer/src/Console/Commands/Installer.php create mode 100644 packages/Webkul/Installer/src/Data/countries.json create mode 100644 packages/Webkul/Installer/src/Data/states.json create mode 100644 packages/Webkul/Installer/src/Database/Migrations/2024_06_24_174241_insert_warehouse_attributes_in_attributes_table.php create mode 100644 packages/Webkul/Installer/src/Database/Migrations/2024_07_31_093603_add_organization_sales_owner_attribute_in_attributes_table.php create mode 100644 packages/Webkul/Installer/src/Database/Migrations/2024_07_31_093605_add_person_job_title_attribute_in_attributes_table.php create mode 100644 packages/Webkul/Installer/src/Database/Migrations/2024_07_31_093605_add_person_sales_owner_attribute_in_attributes_table.php create mode 100644 packages/Webkul/Installer/src/Database/Migrations/2024_08_21_153011_add_leads_stage_and_pipeline_attributes.php create mode 100644 packages/Webkul/Installer/src/Database/Seeders/Attribute/AttributeSeeder.php create mode 100644 packages/Webkul/Installer/src/Database/Seeders/Attribute/DatabaseSeeder.php create mode 100644 packages/Webkul/Installer/src/Database/Seeders/Core/CountriesSeeder.php create mode 100644 packages/Webkul/Installer/src/Database/Seeders/Core/DatabaseSeeder.php create mode 100644 packages/Webkul/Installer/src/Database/Seeders/Core/StatesSeeder.php create mode 100644 packages/Webkul/Installer/src/Database/Seeders/DatabaseSeeder.php create mode 100644 packages/Webkul/Installer/src/Database/Seeders/EmailTemplate/DatabaseSeeder.php create mode 100644 packages/Webkul/Installer/src/Database/Seeders/EmailTemplate/EmailTemplateSeeder.php create mode 100644 packages/Webkul/Installer/src/Database/Seeders/Lead/DatabaseSeeder.php create mode 100644 packages/Webkul/Installer/src/Database/Seeders/Lead/PipelineSeeder.php create mode 100644 packages/Webkul/Installer/src/Database/Seeders/Lead/SourceSeeder.php create mode 100644 packages/Webkul/Installer/src/Database/Seeders/Lead/TypeSeeder.php create mode 100644 packages/Webkul/Installer/src/Database/Seeders/User/DatabaseSeeder.php create mode 100644 packages/Webkul/Installer/src/Database/Seeders/User/RoleSeeder.php create mode 100644 packages/Webkul/Installer/src/Database/Seeders/User/UserSeeder.php create mode 100644 packages/Webkul/Installer/src/Database/Seeders/Workflow/DatabaseSeeder.php create mode 100644 packages/Webkul/Installer/src/Database/Seeders/Workflow/WorkflowSeeder.php create mode 100644 packages/Webkul/Installer/src/Events/ComposerEvents.php create mode 100644 packages/Webkul/Installer/src/Helpers/DatabaseManager.php create mode 100644 packages/Webkul/Installer/src/Helpers/EnvironmentManager.php create mode 100644 packages/Webkul/Installer/src/Helpers/ServerRequirements.php create mode 100644 packages/Webkul/Installer/src/Http/Controllers/Controller.php create mode 100644 packages/Webkul/Installer/src/Http/Controllers/ImageCacheController.php create mode 100644 packages/Webkul/Installer/src/Http/Controllers/InstallerController.php create mode 100644 packages/Webkul/Installer/src/Http/Middleware/CanInstall.php create mode 100644 packages/Webkul/Installer/src/Http/Middleware/Locale.php create mode 100644 packages/Webkul/Installer/src/Listeners/Installer.php create mode 100644 packages/Webkul/Installer/src/Providers/InstallerServiceProvider.php create mode 100644 packages/Webkul/Installer/src/Resources/assets/css/app.css create mode 100644 packages/Webkul/Installer/src/Resources/assets/fonts/icomoon.eot create mode 100644 packages/Webkul/Installer/src/Resources/assets/fonts/icomoon.svg create mode 100644 packages/Webkul/Installer/src/Resources/assets/fonts/icomoon.ttf create mode 100644 packages/Webkul/Installer/src/Resources/assets/fonts/icomoon.woff create mode 100644 packages/Webkul/Installer/src/Resources/assets/images/favicon.ico create mode 100644 packages/Webkul/Installer/src/Resources/assets/images/krayin-logo.svg create mode 100644 packages/Webkul/Installer/src/Resources/assets/images/spinner.svg create mode 100644 packages/Webkul/Installer/src/Resources/assets/js/app.js create mode 100644 packages/Webkul/Installer/src/Resources/assets/js/plugins/axios.js create mode 100644 packages/Webkul/Installer/src/Resources/lang/ar/app.php create mode 100644 packages/Webkul/Installer/src/Resources/lang/en/app.php create mode 100644 packages/Webkul/Installer/src/Resources/lang/es/app.php create mode 100644 packages/Webkul/Installer/src/Resources/lang/fa/app.php create mode 100644 packages/Webkul/Installer/src/Resources/lang/pt_BR/app.php create mode 100644 packages/Webkul/Installer/src/Resources/lang/tr/app.php create mode 100644 packages/Webkul/Installer/src/Resources/lang/vi/app.php create mode 100644 packages/Webkul/Installer/src/Resources/views/components/button/index.blade.php create mode 100644 packages/Webkul/Installer/src/Resources/views/components/form/control-group/control.blade.php create mode 100644 packages/Webkul/Installer/src/Resources/views/components/form/control-group/error.blade.php create mode 100644 packages/Webkul/Installer/src/Resources/views/components/form/control-group/index.blade.php create mode 100644 packages/Webkul/Installer/src/Resources/views/components/form/control-group/label.blade.php create mode 100644 packages/Webkul/Installer/src/Resources/views/components/form/index.blade.php create mode 100644 packages/Webkul/Installer/src/Resources/views/installer/index.blade.php create mode 100644 packages/Webkul/Installer/src/Routes/web.php create mode 100644 packages/Webkul/Installer/src/Templates/on-boarding.php create mode 100644 packages/Webkul/Installer/tailwind.config.js create mode 100644 packages/Webkul/Installer/vite.config.js create mode 100755 packages/Webkul/Lead/composer.json create mode 100644 packages/Webkul/Lead/src/Contracts/Lead.php create mode 100644 packages/Webkul/Lead/src/Contracts/Pipeline.php create mode 100644 packages/Webkul/Lead/src/Contracts/Product.php create mode 100644 packages/Webkul/Lead/src/Contracts/Source.php create mode 100644 packages/Webkul/Lead/src/Contracts/Stage.php create mode 100644 packages/Webkul/Lead/src/Contracts/Type.php create mode 100644 packages/Webkul/Lead/src/Database/Migrations/2021_04_21_172825_create_lead_sources_table.php create mode 100644 packages/Webkul/Lead/src/Database/Migrations/2021_04_21_172847_create_lead_types_table.php create mode 100644 packages/Webkul/Lead/src/Database/Migrations/2021_04_22_153258_create_lead_stages_table.php create mode 100644 packages/Webkul/Lead/src/Database/Migrations/2021_04_22_155706_create_lead_pipelines_table.php create mode 100644 packages/Webkul/Lead/src/Database/Migrations/2021_04_22_155838_create_lead_pipeline_stages_table.php create mode 100644 packages/Webkul/Lead/src/Database/Migrations/2021_04_22_164215_create_leads_table.php create mode 100644 packages/Webkul/Lead/src/Database/Migrations/2021_04_22_171805_create_lead_products_table.php create mode 100644 packages/Webkul/Lead/src/Database/Migrations/2021_05_12_150329_create_lead_activities_table.php create mode 100644 packages/Webkul/Lead/src/Database/Migrations/2021_05_20_141240_create_lead_tags_table.php create mode 100644 packages/Webkul/Lead/src/Database/Migrations/2021_07_02_201822_create_lead_quotes_table.php create mode 100644 packages/Webkul/Lead/src/Database/Migrations/2021_09_23_221138_add_column_expected_close_date_in_leads_table.php create mode 100644 packages/Webkul/Lead/src/Database/Migrations/2021_09_30_135857_add_column_rotten_days_in_lead_pipelines_table.php create mode 100644 packages/Webkul/Lead/src/Database/Migrations/2021_09_30_154222_alter_lead_pipeline_stages_table.php create mode 100644 packages/Webkul/Lead/src/Database/Migrations/2021_09_30_161722_alter_leads_table.php create mode 100644 packages/Webkul/Lead/src/Database/Migrations/2021_09_30_183825_change_user_id_to_nullable_in_leads_table.php create mode 100644 packages/Webkul/Lead/src/Database/Migrations/2021_11_11_180804_change_lead_pipeline_stage_id_constraint_in_leads_table.php create mode 100644 packages/Webkul/Lead/src/Database/Migrations/2024_11_29_120302_modify_foreign_keys_in_leads_table.php create mode 100644 packages/Webkul/Lead/src/Database/Migrations/2025_07_01_133612_alter_lead_pipelines_table.php create mode 100644 packages/Webkul/Lead/src/Helpers/MagicAI.php create mode 100644 packages/Webkul/Lead/src/Models/Lead.php create mode 100644 packages/Webkul/Lead/src/Models/LeadProxy.php create mode 100644 packages/Webkul/Lead/src/Models/Pipeline.php create mode 100644 packages/Webkul/Lead/src/Models/PipelineProxy.php create mode 100644 packages/Webkul/Lead/src/Models/Product.php create mode 100644 packages/Webkul/Lead/src/Models/ProductProxy.php create mode 100644 packages/Webkul/Lead/src/Models/Source.php create mode 100644 packages/Webkul/Lead/src/Models/SourceProxy.php create mode 100644 packages/Webkul/Lead/src/Models/Stage.php create mode 100644 packages/Webkul/Lead/src/Models/StageProxy.php create mode 100644 packages/Webkul/Lead/src/Models/Type.php create mode 100644 packages/Webkul/Lead/src/Models/TypeProxy.php create mode 100644 packages/Webkul/Lead/src/Providers/LeadServiceProvider.php create mode 100644 packages/Webkul/Lead/src/Providers/ModuleServiceProvider.php create mode 100755 packages/Webkul/Lead/src/Repositories/LeadRepository.php create mode 100755 packages/Webkul/Lead/src/Repositories/PipelineRepository.php create mode 100755 packages/Webkul/Lead/src/Repositories/ProductRepository.php create mode 100755 packages/Webkul/Lead/src/Repositories/SourceRepository.php create mode 100644 packages/Webkul/Lead/src/Repositories/StageRepository.php create mode 100755 packages/Webkul/Lead/src/Repositories/TypeRepository.php create mode 100644 packages/Webkul/Lead/src/Services/MagicAIService.php create mode 100644 packages/Webkul/Marketing/src/Console/Commands/CampaignCommand.php create mode 100644 packages/Webkul/Marketing/src/Contracts/Campaign.php create mode 100644 packages/Webkul/Marketing/src/Contracts/Event.php create mode 100644 packages/Webkul/Marketing/src/Database/Migrations/2024_10_29_044744_create_marketing_events_table.php create mode 100644 packages/Webkul/Marketing/src/Database/Migrations/2024_11_04_122500_create_marketing_campaigns_table.php create mode 100644 packages/Webkul/Marketing/src/Helpers/Campaign.php create mode 100644 packages/Webkul/Marketing/src/Mail/CampaignMail.php create mode 100644 packages/Webkul/Marketing/src/Models/Campaign.php create mode 100644 packages/Webkul/Marketing/src/Models/CampaignProxy.php create mode 100644 packages/Webkul/Marketing/src/Models/Event.php create mode 100644 packages/Webkul/Marketing/src/Models/EventProxy.php create mode 100644 packages/Webkul/Marketing/src/Providers/MarketingServiceProvider.php create mode 100644 packages/Webkul/Marketing/src/Providers/ModuleServiceProvider.php create mode 100644 packages/Webkul/Marketing/src/Repositories/CampaignRepository.php create mode 100644 packages/Webkul/Marketing/src/Repositories/EventRepository.php create mode 100755 packages/Webkul/Product/composer.json create mode 100644 packages/Webkul/Product/src/Contracts/Product.php create mode 100644 packages/Webkul/Product/src/Contracts/ProductInventory.php create mode 100644 packages/Webkul/Product/src/Database/Migrations/2021_04_09_065617_create_products_table.php create mode 100644 packages/Webkul/Product/src/Database/Migrations/2024_06_28_154009_create_product_inventories_table.php create mode 100644 packages/Webkul/Product/src/Database/Migrations/2024_08_10_150329_create_product_activities_table.php create mode 100644 packages/Webkul/Product/src/Database/Migrations/2024_08_10_150340_create_product_tags_table.php create mode 100644 packages/Webkul/Product/src/Database/Migrations/2024_09_06_065808_alter_product_inventories_table.php create mode 100644 packages/Webkul/Product/src/Models/Product.php create mode 100755 packages/Webkul/Product/src/Models/ProductInventory.php create mode 100644 packages/Webkul/Product/src/Models/ProductInventoryProxy.php create mode 100644 packages/Webkul/Product/src/Models/ProductProxy.php create mode 100644 packages/Webkul/Product/src/Providers/ModuleServiceProvider.php create mode 100644 packages/Webkul/Product/src/Providers/ProductServiceProvider.php create mode 100644 packages/Webkul/Product/src/Repositories/ProductInventoryRepository.php create mode 100644 packages/Webkul/Product/src/Repositories/ProductRepository.php create mode 100644 packages/Webkul/Quote/src/Contracts/Quote.php create mode 100644 packages/Webkul/Quote/src/Contracts/QuoteItem.php create mode 100644 packages/Webkul/Quote/src/Database/Migrations/2021_07_01_230345_create_quotes_table.php create mode 100644 packages/Webkul/Quote/src/Database/Migrations/2021_07_01_231317_create_quote_items_table.php create mode 100644 packages/Webkul/Quote/src/Models/Quote.php create mode 100644 packages/Webkul/Quote/src/Models/QuoteItem.php create mode 100644 packages/Webkul/Quote/src/Models/QuoteItemProxy.php create mode 100644 packages/Webkul/Quote/src/Models/QuoteProxy.php create mode 100644 packages/Webkul/Quote/src/Providers/ModuleServiceProvider.php create mode 100644 packages/Webkul/Quote/src/Providers/QuoteServiceProvider.php create mode 100644 packages/Webkul/Quote/src/Repositories/QuoteItemRepository.php create mode 100644 packages/Webkul/Quote/src/Repositories/QuoteRepository.php create mode 100755 packages/Webkul/Tag/composer.json create mode 100644 packages/Webkul/Tag/src/Contracts/Tag.php create mode 100644 packages/Webkul/Tag/src/Database/Migrations/2021_05_20_141230_create_tags_table.php create mode 100644 packages/Webkul/Tag/src/Models/Tag.php create mode 100644 packages/Webkul/Tag/src/Models/TagProxy.php create mode 100644 packages/Webkul/Tag/src/Providers/ModuleServiceProvider.php create mode 100644 packages/Webkul/Tag/src/Providers/TagServiceProvider.php create mode 100644 packages/Webkul/Tag/src/Repositories/TagRepository.php create mode 100755 packages/Webkul/User/.gitignore create mode 100755 packages/Webkul/User/composer.json create mode 100644 packages/Webkul/User/src/Contracts/Group.php create mode 100644 packages/Webkul/User/src/Contracts/Role.php create mode 100644 packages/Webkul/User/src/Contracts/User.php create mode 100755 packages/Webkul/User/src/Database/Migrations/.gitkeep create mode 100755 packages/Webkul/User/src/Database/Migrations/2021_03_12_074578_create_groups_table.php create mode 100755 packages/Webkul/User/src/Database/Migrations/2021_03_12_074597_create_roles_table.php create mode 100644 packages/Webkul/User/src/Database/Migrations/2021_03_12_074857_create_users_table.php create mode 100644 packages/Webkul/User/src/Database/Migrations/2021_03_12_074867_create_user_groups_table.php create mode 100755 packages/Webkul/User/src/Database/Migrations/2021_03_12_074957_create_user_password_resets_table.php create mode 100644 packages/Webkul/User/src/Database/Migrations/2021_09_22_194622_add_unique_index_to_name_in_groups_table.php create mode 100644 packages/Webkul/User/src/Database/Migrations/2021_11_12_171510_add_image_column_in_users_table.php create mode 100755 packages/Webkul/User/src/Models/Group.php create mode 100644 packages/Webkul/User/src/Models/GroupProxy.php create mode 100755 packages/Webkul/User/src/Models/Role.php create mode 100644 packages/Webkul/User/src/Models/RoleProxy.php create mode 100755 packages/Webkul/User/src/Models/User.php create mode 100644 packages/Webkul/User/src/Models/UserProxy.php create mode 100644 packages/Webkul/User/src/Providers/ModuleServiceProvider.php create mode 100755 packages/Webkul/User/src/Providers/UserServiceProvider.php create mode 100755 packages/Webkul/User/src/Repositories/GroupRepository.php create mode 100755 packages/Webkul/User/src/Repositories/RoleRepository.php create mode 100755 packages/Webkul/User/src/Repositories/UserRepository.php create mode 100644 packages/Webkul/Warehouse/src/Contracts/Location.php create mode 100644 packages/Webkul/Warehouse/src/Contracts/Warehouse.php create mode 100644 packages/Webkul/Warehouse/src/Database/Migrations/2024_06_21_160707_create_warehouses_table.php create mode 100644 packages/Webkul/Warehouse/src/Database/Migrations/2024_06_21_160735_create_warehouse_locations_table.php create mode 100644 packages/Webkul/Warehouse/src/Database/Migrations/2024_08_10_100329_create_warehouse_activities_table.php create mode 100644 packages/Webkul/Warehouse/src/Database/Migrations/2024_08_10_100340_create_warehouse_tags_table.php create mode 100755 packages/Webkul/Warehouse/src/Models/Location.php create mode 100644 packages/Webkul/Warehouse/src/Models/LocationProxy.php create mode 100755 packages/Webkul/Warehouse/src/Models/Warehouse.php create mode 100644 packages/Webkul/Warehouse/src/Models/WarehouseProxy.php create mode 100644 packages/Webkul/Warehouse/src/Providers/ModuleServiceProvider.php create mode 100644 packages/Webkul/Warehouse/src/Providers/WarehouseServiceProvider.php create mode 100755 packages/Webkul/Warehouse/src/Repositories/LocationRepository.php create mode 100755 packages/Webkul/Warehouse/src/Repositories/WarehouseRepository.php create mode 100755 packages/Webkul/WebForm/.gitignore create mode 100755 packages/Webkul/WebForm/composer.json create mode 100644 packages/Webkul/WebForm/package.json create mode 100644 packages/Webkul/WebForm/postcss.config.js create mode 100644 packages/Webkul/WebForm/src/Config/acl.php create mode 100644 packages/Webkul/WebForm/src/Config/menu.php create mode 100644 packages/Webkul/WebForm/src/Contracts/WebForm.php create mode 100644 packages/Webkul/WebForm/src/Contracts/WebFormAttribute.php create mode 100644 packages/Webkul/WebForm/src/DataGrids/WebFormDataGrid.php create mode 100644 packages/Webkul/WebForm/src/Database/Migrations/2021_12_14_213049_create_web_forms_table.php create mode 100644 packages/Webkul/WebForm/src/Database/Migrations/2021_12_14_214923_create_web_form_attributes_table.php create mode 100755 packages/Webkul/WebForm/src/Http/Controllers/Controller.php create mode 100644 packages/Webkul/WebForm/src/Http/Controllers/WebFormController.php create mode 100644 packages/Webkul/WebForm/src/Http/Requests/WebForm.php create mode 100644 packages/Webkul/WebForm/src/Models/WebForm.php create mode 100644 packages/Webkul/WebForm/src/Models/WebFormAttribute.php create mode 100644 packages/Webkul/WebForm/src/Models/WebFormAttributeProxy.php create mode 100644 packages/Webkul/WebForm/src/Models/WebFormProxy.php create mode 100644 packages/Webkul/WebForm/src/Providers/ModuleServiceProvider.php create mode 100644 packages/Webkul/WebForm/src/Providers/WebFormServiceProvider.php create mode 100644 packages/Webkul/WebForm/src/Repositories/WebFormAttributeRepository.php create mode 100644 packages/Webkul/WebForm/src/Repositories/WebFormRepository.php create mode 100644 packages/Webkul/WebForm/src/Resources/assets/css/app.css create mode 100644 packages/Webkul/WebForm/src/Resources/assets/fonts/icomoon.woff create mode 100644 packages/Webkul/WebForm/src/Resources/assets/js/app.js create mode 100644 packages/Webkul/WebForm/src/Resources/assets/js/plugins/axios.js create mode 100644 packages/Webkul/WebForm/src/Resources/assets/js/plugins/emitter.js create mode 100644 packages/Webkul/WebForm/src/Resources/assets/js/plugins/flatpickr.js create mode 100644 packages/Webkul/WebForm/src/Resources/assets/js/plugins/vee-validate.js create mode 100644 packages/Webkul/WebForm/src/Resources/assets/locales/hi_IN.json create mode 100644 packages/Webkul/WebForm/src/Resources/assets/locales/sin.json create mode 100644 packages/Webkul/WebForm/src/Resources/lang/ar/app.php create mode 100644 packages/Webkul/WebForm/src/Resources/lang/en/app.php create mode 100644 packages/Webkul/WebForm/src/Resources/lang/es/app.php create mode 100644 packages/Webkul/WebForm/src/Resources/lang/fa/app.php create mode 100644 packages/Webkul/WebForm/src/Resources/lang/pt_BR/app.php create mode 100644 packages/Webkul/WebForm/src/Resources/lang/tr/app.php create mode 100644 packages/Webkul/WebForm/src/Resources/lang/vi/app.php create mode 100644 packages/Webkul/WebForm/src/Resources/views/components/button/index.blade.php create mode 100644 packages/Webkul/WebForm/src/Resources/views/components/flash-group/index.blade.php create mode 100644 packages/Webkul/WebForm/src/Resources/views/components/flash-group/item.blade.php create mode 100644 packages/Webkul/WebForm/src/Resources/views/components/form/control-group/control.blade.php create mode 100644 packages/Webkul/WebForm/src/Resources/views/components/form/control-group/error.blade.php create mode 100644 packages/Webkul/WebForm/src/Resources/views/components/form/control-group/index.blade.php create mode 100644 packages/Webkul/WebForm/src/Resources/views/components/form/control-group/label.blade.php create mode 100644 packages/Webkul/WebForm/src/Resources/views/components/form/index.blade.php create mode 100644 packages/Webkul/WebForm/src/Resources/views/components/layouts/index.blade.php create mode 100644 packages/Webkul/WebForm/src/Resources/views/components/spinner/index.blade.php create mode 100644 packages/Webkul/WebForm/src/Resources/views/settings/web-forms/controls.blade.php create mode 100644 packages/Webkul/WebForm/src/Resources/views/settings/web-forms/embed.blade.php create mode 100644 packages/Webkul/WebForm/src/Resources/views/settings/web-forms/preview.blade.php create mode 100644 packages/Webkul/WebForm/src/Routes/routes.php create mode 100644 packages/Webkul/WebForm/src/Rules/PhoneNumber.php create mode 100644 packages/Webkul/WebForm/tailwind.config.js create mode 100644 packages/Webkul/WebForm/vite.config.js create mode 100644 phpunit.xml create mode 100644 pint.json create mode 100644 public/.htaccess create mode 100644 public/admin/build/assets/activities-DpB2XKqX.svg create mode 100644 public/admin/build/assets/app-B6AvubOR.css create mode 100644 public/admin/build/assets/app-C2Wq9G4i.css create mode 100644 public/admin/build/assets/app-Dz7u1TwN.js create mode 100644 public/admin/build/assets/ar.es-CfdTYgcp.js create mode 100644 public/admin/build/assets/bg.es-Ce0T19Qg.js create mode 100644 public/admin/build/assets/bn.es-iWyup8_3.js create mode 100644 public/admin/build/assets/bs.es-Cz58hpHx.js create mode 100644 public/admin/build/assets/ca.es-CujU75Im.js create mode 100644 public/admin/build/assets/calls-BU_UfDax.svg create mode 100644 public/admin/build/assets/chart-D1u1Dgzh.js create mode 100644 public/admin/build/assets/corner-clip-CRLTKrCT.svg create mode 100644 public/admin/build/assets/cs.es-BHhRbaip.js create mode 100644 public/admin/build/assets/da.es-DglD7fV2.js create mode 100644 public/admin/build/assets/dark-corner-clip-Deux0RQO.svg create mode 100644 public/admin/build/assets/dark-logo-BB2BR6rR.svg create mode 100644 public/admin/build/assets/de.es-D_4ZyLTN.js create mode 100644 public/admin/build/assets/default-DBulZ5O_.svg create mode 100644 public/admin/build/assets/description-BwifbkWG.svg create mode 100644 public/admin/build/assets/drag-and-drop.es-JkAdgoaa.js create mode 100644 public/admin/build/assets/el.es-BC26X5xm.js create mode 100644 public/admin/build/assets/emails-D_qEBj20.svg create mode 100644 public/admin/build/assets/en.es-DDTuV2po.js create mode 100644 public/admin/build/assets/error-ClRu8L1K.svg create mode 100644 public/admin/build/assets/es.es-BvvfjN-O.js create mode 100644 public/admin/build/assets/et.es-C0rF9HtR.js create mode 100644 public/admin/build/assets/fa.es-CibKJjgz.js create mode 100644 public/admin/build/assets/favicon-BiheL4ey.ico create mode 100644 public/admin/build/assets/fi.es-B0Iy6aas.js create mode 100644 public/admin/build/assets/files-Xm-jQ6Fi.svg create mode 100644 public/admin/build/assets/fr.es-B7WXlprl.js create mode 100644 public/admin/build/assets/he.es-K9Fk8xhK.js create mode 100644 public/admin/build/assets/hr.es-ef5bxYFj.js create mode 100644 public/admin/build/assets/hu.es-nZ65MV0n.js create mode 100644 public/admin/build/assets/icomoon-BbY1GX-d.woff create mode 100644 public/admin/build/assets/id.es-CzHAK-XV.js create mode 100644 public/admin/build/assets/is.es-Dz07gBgt.js create mode 100644 public/admin/build/assets/it.es-CquQA5xx.js create mode 100644 public/admin/build/assets/ja.es-D6pL26k_.js create mode 100644 public/admin/build/assets/ka.es-Cb9X-eNS.js create mode 100644 public/admin/build/assets/ko.es-CTpJlj0A.js create mode 100644 public/admin/build/assets/logo-CBYU6njG.svg create mode 100644 public/admin/build/assets/lt.es-vqgjGyMx.js create mode 100644 public/admin/build/assets/lunches-BHeSbGQ3.svg create mode 100644 public/admin/build/assets/meetings-Cwj897qL.svg create mode 100644 public/admin/build/assets/mn.es-YZet1as4.js create mode 100644 public/admin/build/assets/mobile-dark-logo-COPgCide.svg create mode 100644 public/admin/build/assets/mobile-light-logo-CjoobCkl.svg create mode 100644 public/admin/build/assets/nl.es-COp8PWbT.js create mode 100644 public/admin/build/assets/no.es-_2m-F2FS.js create mode 100644 public/admin/build/assets/notes-BdIILF0F.svg create mode 100644 public/admin/build/assets/organizations-aUdNng-O.svg create mode 100644 public/admin/build/assets/pipedrive-Dk_Mji0J.svg create mode 100644 public/admin/build/assets/pl.es-jjNeJM5X.js create mode 100644 public/admin/build/assets/plans-DIcOmGwv.svg create mode 100644 public/admin/build/assets/products-zDh6UFtz.svg create mode 100644 public/admin/build/assets/pt-br.es-D8ojES2d.js create mode 100644 public/admin/build/assets/pt-pt.es-D8ojES2d.js create mode 100644 public/admin/build/assets/quotes-0H7ZCVr6.svg create mode 100644 public/admin/build/assets/ro.es-B6_ATXom.js create mode 100644 public/admin/build/assets/ru.es-BGEpmv_x.js create mode 100644 public/admin/build/assets/sk.es-V3h-1af8.js create mode 100644 public/admin/build/assets/sl.es-mZjm0YDT.js create mode 100644 public/admin/build/assets/sq.es-_6B4UQXy.js create mode 100644 public/admin/build/assets/sr.es-BmdOpTOG.js create mode 100644 public/admin/build/assets/sv.es-LwrPWbzy.js create mode 100644 public/admin/build/assets/tr.es-CS80t-Rq.js create mode 100644 public/admin/build/assets/uk.es-BVYlda65.js create mode 100644 public/admin/build/assets/users-6trD5il1.svg create mode 100644 public/admin/build/assets/vi.es-B5CIRCK5.js create mode 100644 public/admin/build/assets/zh-cn.es-DKz-yscG.js create mode 100644 public/admin/build/assets/zh-hk.es-CFZP5Cvd.js create mode 100644 public/admin/build/manifest.json create mode 100644 public/build/assets/app-CAiCLEjY.js create mode 100644 public/build/assets/app-l0sNRNKZ.js create mode 100644 public/build/manifest.json create mode 100644 public/favicon.ico create mode 100755 public/fonts/.gitignore create mode 100644 public/fonts/Hind-Bold.ttf create mode 100644 public/fonts/Hind-Regular.ttf create mode 100644 public/fonts/NotoSansBengali-Bold.ttf create mode 100644 public/fonts/NotoSansBengali-Regular.ttf create mode 100644 public/fonts/NotoSansJP-Bold.ttf create mode 100644 public/fonts/NotoSansJP-Regular.ttf create mode 100644 public/fonts/NotoSansSC-Bold.ttf create mode 100644 public/fonts/NotoSansSC-Regular.ttf create mode 100644 public/fonts/NotoSansSinhala-Bold.ttf create mode 100644 public/fonts/NotoSansSinhala-Regular.ttf create mode 100644 public/index.php create mode 100644 public/installer/build/assets/app-aec2df31.js create mode 100644 public/installer/build/assets/app-e0866a20.css create mode 100644 public/installer/build/assets/favicon-a99d4e55.ico create mode 100644 public/installer/build/assets/icomoon-1bcfcf1d.eot create mode 100644 public/installer/build/assets/icomoon-81aea726.woff create mode 100644 public/installer/build/assets/icomoon-c6be70b2.ttf create mode 100644 public/installer/build/assets/icomoon-c96ab384.svg create mode 100644 public/installer/build/assets/krayin-logo-4636add7.svg create mode 100644 public/installer/build/assets/spinner-51c5cf50.svg create mode 100644 public/installer/build/manifest.json create mode 100644 public/robots.txt create mode 100644 public/web.config create mode 100644 public/webform/build/assets/app-499ae59b.css create mode 100644 public/webform/build/assets/app-8787c790.js create mode 100644 public/webform/build/assets/app-c04ede37.css create mode 100644 public/webform/build/assets/icomoon-8bbcff3c.woff create mode 100644 public/webform/build/manifest.json create mode 100644 resources/css/app.css create mode 100644 resources/js/app.js create mode 100644 resources/js/bootstrap.js create mode 100644 resources/views/.gitignore create mode 100644 routes/api.php create mode 100644 routes/breadcrumbs.php create mode 100644 routes/channels.php create mode 100644 routes/console.php create mode 100644 routes/tenant.php create mode 100644 routes/web.php create mode 100755 storage/.gitignore create mode 100755 storage/app/.gitignore create mode 100755 storage/app/public/.gitignore create mode 100755 storage/app/public/data-transfer/.gitignore create mode 100755 storage/app/public/data-transfer/samples/.gitignore create mode 100755 storage/app/public/data-transfer/samples/leads.csv create mode 100755 storage/app/public/data-transfer/samples/persons.csv create mode 100755 storage/app/public/data-transfer/samples/products.csv create mode 100755 storage/debugbar/.gitignore create mode 100755 storage/framework/.gitignore create mode 100755 storage/framework/cache/.gitignore create mode 100755 storage/framework/testing/.gitignore create mode 100755 storage/framework/views/001b29cf10c8ec7f4902a2099a46a894.php create mode 100755 storage/framework/views/02c67e666e64602539829664d7ffefc9.php create mode 100755 storage/framework/views/0519eb135fd1515b6d1ac67519bd7fc7.php create mode 100755 storage/framework/views/06093b7157920b07ffe0b2386674436a.php create mode 100755 storage/framework/views/0609dee9f2ed747c2dca69ce322186c1.php create mode 100755 storage/framework/views/061b45d000c95b00505223c4da8b96f9.php create mode 100755 storage/framework/views/062ebed414020ffdec12de63badae008.php create mode 100755 storage/framework/views/065de1dfcf0d9b7a25a4c3825a3b4012.php create mode 100755 storage/framework/views/0694ed6f5879592a822fb0e2cdcc2283.php create mode 100755 storage/framework/views/06b4f63e298210bfe41ecdbaa73485b5.php create mode 100755 storage/framework/views/06f673e0b7db8657a525a909d5151a48.php create mode 100755 storage/framework/views/07ed10a3c0b628a74c27154a036bfeb3.php create mode 100755 storage/framework/views/08c1b49be6a35658c525b87a12804084.php create mode 100755 storage/framework/views/0917b723175cbb45e783130f41652dd9.php create mode 100755 storage/framework/views/093673f92f5ab43661445330a02f28ae.php create mode 100755 storage/framework/views/09afd9e73fa13b8543d6bea804c76dc0.php create mode 100755 storage/framework/views/0bfefaab41196c39083a1118e6002f3b.php create mode 100755 storage/framework/views/0c70558afcdb457b4f8caf0b17b0fccb.php create mode 100755 storage/framework/views/0d354a2861d81a21c3798dbdaf36426a.php create mode 100755 storage/framework/views/0e994368ddc43a07691eac714c58cba5.php create mode 100755 storage/framework/views/0fbb59aa86f0f91adf0aa25293b36995.php create mode 100755 storage/framework/views/100f3a59fbb766493aeea1e3b76dbd08.php create mode 100755 storage/framework/views/102b247f4dd806511bfbc64c16e54acd.php create mode 100755 storage/framework/views/1062a08bbe85e41126da747e7390a122.php create mode 100755 storage/framework/views/1077ba6fa726c9b41d1edad0b4a6dfd8.php create mode 100755 storage/framework/views/1109486153d602de7beeda60afa8d625.php create mode 100755 storage/framework/views/111695946d10c9cc70119d25111a452f.php create mode 100755 storage/framework/views/11285cc78978220f905eb91b0206196d.php create mode 100755 storage/framework/views/126729e645af65a1b1428c7930b00489.php create mode 100755 storage/framework/views/12e7efc69f3ed129240b4a87826bf088.php create mode 100755 storage/framework/views/12f92485d72da9c3349686cffc404206.php create mode 100755 storage/framework/views/131c0b3604e33facf25f0c3017533324.php create mode 100755 storage/framework/views/13d146e3261dfc463e256edf61eb5b48.php create mode 100755 storage/framework/views/1438427bcfe7d665c0d4e68c64bb3ca8.php create mode 100755 storage/framework/views/145f549e76f755f6f7d6fb78aad72562.php create mode 100755 storage/framework/views/1484c2c3db4e9d52221c3c009ac86fee.php create mode 100755 storage/framework/views/15424a0789a2044b02be124f7b627d95.php create mode 100755 storage/framework/views/15b00e8431f123f01153aaeb431c6e4f.php create mode 100755 storage/framework/views/15c07c900513653ecdad2f377890dd63.php create mode 100755 storage/framework/views/15ccb5ea484ab9f55aebd4d45eea6fbb.php create mode 100755 storage/framework/views/161b975b0be472bae5e674eabf959809.php create mode 100755 storage/framework/views/16704626b7a88f8547bad51f51c22188.php create mode 100755 storage/framework/views/16e8057dc177e56edc798819281b078c.php create mode 100755 storage/framework/views/16ef19650167d8caf694e544ffa2a09b.php create mode 100755 storage/framework/views/170c5df6074159115a0b5ed4ffee2b4e.php create mode 100755 storage/framework/views/1809b4edb44a7848ae88c11dff4bd387.php create mode 100755 storage/framework/views/188b3aee4be9b10593969389c6117634.php create mode 100755 storage/framework/views/18bb966d166d42b49c33a9eb280dffb2.php create mode 100755 storage/framework/views/18c5f1bc083f99b64516be1508c99fa6.php create mode 100755 storage/framework/views/18f600d1f1f2fe45ea4f3ca9ceeab5db.php create mode 100755 storage/framework/views/199b704982de0e1f9c7e68da8cf2f609.php create mode 100755 storage/framework/views/19ce12676ad44d2792b6912867dc6487.php create mode 100755 storage/framework/views/19d27ec2ec307e1160193f98761eb02a.php create mode 100755 storage/framework/views/19fe6be0d13de61b4f7b510e8edd1d0b.php create mode 100755 storage/framework/views/1a94f3718743accc76bb1c070e4f8b94.php create mode 100755 storage/framework/views/1af00d61d237354e1364dd914047274c.php create mode 100755 storage/framework/views/1b35edf449527b204f6c874ebc008f97.php create mode 100755 storage/framework/views/1bd11486d6bb50e2e21b3206500d140c.php create mode 100755 storage/framework/views/1cf1afd8d641444cb25410565db93d1c.php create mode 100755 storage/framework/views/1d57a0f13b7031c53c0e8294dc10d8e9.php create mode 100755 storage/framework/views/1e60f4125d4fdf5c29ffb3df75001d2b.php create mode 100755 storage/framework/views/1ec9f8d438590dd43668eeb8329935ff.php create mode 100755 storage/framework/views/1ece863e6fea6322c5eed40d71fab2b3.php create mode 100755 storage/framework/views/1f13db5340b212653521ca7883cb79cb.php create mode 100755 storage/framework/views/1f2e64125d6fc3adff04aec9e253172d.php create mode 100755 storage/framework/views/1f3eef7fcddb344f89e2d23544f2b3ae.php create mode 100755 storage/framework/views/1fab70f1c0ce452e1288351cc75a6d99.php create mode 100755 storage/framework/views/200945cc7e10fafeca3a6a0f6d9093d9.php create mode 100755 storage/framework/views/20184e8205864b6fdd2b4e6f7d4da9ae.php create mode 100755 storage/framework/views/20c7e614f827dd7ae76eca16a6af4472.php create mode 100755 storage/framework/views/20d5f617384ae83fd2813d9de556cf14.php create mode 100755 storage/framework/views/21341f02e8727c9774890c144e91df0a.php create mode 100755 storage/framework/views/21a058e200d198f61da7b14c57c49cbf.php create mode 100755 storage/framework/views/21ab6f4b0f052f85446b6ebbcd123cc5.php create mode 100755 storage/framework/views/2277359d66a8c555a5c8a58232844158.php create mode 100755 storage/framework/views/23a0faa3cb9e87a87e5665998c1a486c.php create mode 100755 storage/framework/views/23ea605c004e5d15672b086de4db2725.php create mode 100755 storage/framework/views/243cb284b55eb167ff23d5adc995da0f.php create mode 100755 storage/framework/views/247394ff79d789e5496ed192dd749dcd.php create mode 100755 storage/framework/views/25bb81bfce00da822c7b0dd117439b2f.php create mode 100755 storage/framework/views/25e5fcbe6e65d958b1d7737c1971ee77.php create mode 100755 storage/framework/views/267ab32682295353c80bef4b06ac225e.php create mode 100755 storage/framework/views/26c679f9ee7fca0a786014206070c32b.php create mode 100755 storage/framework/views/275c7c02e2528e6029079c885e2d2418.php create mode 100755 storage/framework/views/280ecaf1425fef53e0b05e9e457c9f5a.php create mode 100755 storage/framework/views/285da80ca32354059ad51050f84cc22e.php create mode 100755 storage/framework/views/289583e70f8db895ff666251615ab26f.php create mode 100755 storage/framework/views/2930f5b83930dd3d0e08667818a6eeee.php create mode 100755 storage/framework/views/295e20e4de1728e541d80712a78ed140.php create mode 100755 storage/framework/views/2a09d292dd38b93314177b9bc1fcee01.php create mode 100755 storage/framework/views/2af6bbb5790185a0656ced8e3fa47521.php create mode 100755 storage/framework/views/2c8d7b8c6f501690b8d4d6688bc34de7.php create mode 100755 storage/framework/views/2cce9fbe78a5b9751caec6ba14590144.php create mode 100755 storage/framework/views/2d9acc0f9b114a8f427c5da5f4b5c2db.php create mode 100755 storage/framework/views/2eca618673af7b1b31ad0b108c3f998d.php create mode 100755 storage/framework/views/2fc68165f2b3389c1f792ff0040e32dd.php create mode 100755 storage/framework/views/30a5be8469dd76a1dcc8e33c6c68b1db.php create mode 100755 storage/framework/views/32be47296c62abc8b4cce04357c874b6.php create mode 100755 storage/framework/views/3329fd095a1412fe72d7477c8bb75975.php create mode 100755 storage/framework/views/346163f6ab28fe7831ad80a6bc9c336b.php create mode 100755 storage/framework/views/34bee49576008f542a6d5244ac54e11b.php create mode 100755 storage/framework/views/35948624509bfd48d04bbf70805f3448.php create mode 100755 storage/framework/views/35acdf3da862ad2cd2d1ed00f41b5343.php create mode 100755 storage/framework/views/377972ae7cf184d192b7c41b90a7c302.php create mode 100755 storage/framework/views/377e804b87f1bc3a9c7af8688168e64e.php create mode 100755 storage/framework/views/3826d80d4551b850bda55184e8daae15.php create mode 100755 storage/framework/views/3851dd860513bc846618de7421c1011a.php create mode 100755 storage/framework/views/3894f7b0b1d5e5159999c9ed01059114.php create mode 100755 storage/framework/views/389d956101ab3a13dd106a7db5cd2cd4.php create mode 100755 storage/framework/views/393cff8b9c163e5c444a2397c06f9057.php create mode 100755 storage/framework/views/3962224d39fcb9ade842a952b203c859.php create mode 100755 storage/framework/views/3b6b77928bd1b3ca6e981427b195045d.php create mode 100755 storage/framework/views/3bb225b5d6c98dab0ca463b50b5b9745.php create mode 100755 storage/framework/views/3bd822b90801ee6a3618bb3092609d64.php create mode 100755 storage/framework/views/3c8433b0243fc419af38524990def380.php create mode 100755 storage/framework/views/3d1076f198c20f6eb00428c4f3e1d0d7.php create mode 100755 storage/framework/views/3d8e4f86df8051984c4e94f974a9a8eb.php create mode 100755 storage/framework/views/3dbdad78f1a375e05191fc20683c738c.php create mode 100755 storage/framework/views/40531cb9435f113066d342b570a7e2b6.php create mode 100755 storage/framework/views/4053f4f685658d00b67739012438e776.php create mode 100755 storage/framework/views/414c13ab8b4dddc7d0e1c2f6d4b7105c.php create mode 100755 storage/framework/views/432786858790217ab2e485807b3be2ec.php create mode 100755 storage/framework/views/4335cef436cc06bf2ccf1634c7fc892f.php create mode 100755 storage/framework/views/43c50d3fc9d4cefb895fbbf6817df845.php create mode 100755 storage/framework/views/44153923754c161587d5a95cf8fae0c4.php create mode 100755 storage/framework/views/4489f0d51decc3ce685fb0d6eb56e2ab.php create mode 100755 storage/framework/views/44afc7d2eefd7c11763eedffc1908b38.php create mode 100755 storage/framework/views/44dbb285cc23736ca0b01abf09c46d68.php create mode 100755 storage/framework/views/44f726d6dfb300f190aae54d549f6d51.php create mode 100755 storage/framework/views/452bc44ac883be5ad06c3f18fc98ad04.php create mode 100755 storage/framework/views/455eceb602548652aae99ec6afb7fa77.php create mode 100755 storage/framework/views/47ee8f650eff370961941f167517bb14.php create mode 100755 storage/framework/views/480ca47e14c03ee092913de02d9f6670.php create mode 100755 storage/framework/views/48761e565aa945d27efa58b20a4d0448.php create mode 100755 storage/framework/views/48dd10b26b373c4937b6c5884b0d2759.php create mode 100755 storage/framework/views/49214698a0f0496bf7568041632d38f6.php create mode 100755 storage/framework/views/494afe70054c2b4df34779d7a9e52f81.php create mode 100755 storage/framework/views/49e76b622514b45a450088d68ee790cd.php create mode 100755 storage/framework/views/4b835e679a8197dfa4004967b9d57769.php create mode 100755 storage/framework/views/4b90df0cca0c53116124cea3be711eed.php create mode 100755 storage/framework/views/4bf0f83ab2f3a3e91b9d7e8c42dc7e72.php create mode 100755 storage/framework/views/4c406234ba5dba25d1430e9622454ad4.php create mode 100755 storage/framework/views/4d6cad4f255bc6ca30ab900359df06b4.php create mode 100755 storage/framework/views/4daa0b61a18dfe293174290555b4033b.php create mode 100755 storage/framework/views/4ee3ab6db1fa8b9c29091a68e99cacf9.php create mode 100755 storage/framework/views/4efa6d5ebffb0d20c27159fb7a21317a.php create mode 100755 storage/framework/views/4f7a5cef13809f48f2b761588da541a5.php create mode 100755 storage/framework/views/50bd42fd594e381bc254d1116d617f08.php create mode 100755 storage/framework/views/50ed7fd9f65d2a0981caf5267fbb1a2f.php create mode 100755 storage/framework/views/519c1b7909e3ba8de0a02909068db720.php create mode 100755 storage/framework/views/51c8fa9deccf2a1c72ab32288f7faa5c.php create mode 100755 storage/framework/views/51c9dcd4d754aacd65c0a98c9f5617df.php create mode 100755 storage/framework/views/52467a5874f2585e3a0e85c21cd0a979.php create mode 100755 storage/framework/views/529827ffcc1e168e7fa532a34b41deb1.php create mode 100755 storage/framework/views/53d3e50e8e6ed7673f830cf9772df9b4.php create mode 100755 storage/framework/views/540959f0cf53bae7ec1816d777363538.php create mode 100755 storage/framework/views/542cbc478691bbe940b41de3361fd851.php create mode 100755 storage/framework/views/545413bde057b13c11465ce9d1e3447c.php create mode 100755 storage/framework/views/560102a6012bd1670b8708e7a7c41f39.php create mode 100755 storage/framework/views/56c77105d71f2690475c6a871f8938d6.php create mode 100755 storage/framework/views/576d6b774f1541f64f07f88e5e32d558.php create mode 100755 storage/framework/views/5796e0c9b0e92368a0b53a0335f8bbe2.php create mode 100755 storage/framework/views/5851a2c03cce2452b73cc594ed6456dd.php create mode 100755 storage/framework/views/58d8d4f4e02fcf924f0c5afdebd628d5.php create mode 100755 storage/framework/views/5931db70af1cddda7346ccc0f7cc9a7f.php create mode 100755 storage/framework/views/5953494c629bb665f26aa6b07777aa87.php create mode 100755 storage/framework/views/5a4cf762ce54bc823dbc2a8be5808bca.php create mode 100755 storage/framework/views/5b1d7562a1e69a71ca4d5fd7543b436c.php create mode 100755 storage/framework/views/5b5bd30afeabd8a4a991c7754401bbb9.php create mode 100644 storage/framework/views/5c2001e939204ec0b7ec56c9a9f31d3d.php create mode 100755 storage/framework/views/5c4dbb25213fcc1592166fa8594fe465.php create mode 100755 storage/framework/views/5c69291b8becda40307a38b846104d1e.php create mode 100755 storage/framework/views/5cc12c0ae8298cca78ee87beeb85fd1a.php create mode 100755 storage/framework/views/5cd7fc7afc1451da8e7f5d36c56c5a84.php create mode 100755 storage/framework/views/5d2dafabab6d773fcd75ee6e0d9cdff2.php create mode 100755 storage/framework/views/5d80da38c76349f24e95b9aea7bec760.php create mode 100755 storage/framework/views/5e843da415e20346a427dc270b5d0294.php create mode 100755 storage/framework/views/5f29a9e0bea8869d6d23a7fdafef86e1.php create mode 100755 storage/framework/views/5fee729c5c99ff4c2d07fe314dfc6111.php create mode 100755 storage/framework/views/605b124922e9cee59c768f18ecb2a1f8.php create mode 100755 storage/framework/views/60afd578ec2561a00b3ba5488bfda498.php create mode 100755 storage/framework/views/6196735aba6c22cc64b61dfd6a574bf8.php create mode 100755 storage/framework/views/622acc512af7c1ed3719802780a93697.php create mode 100755 storage/framework/views/643c43a91b2568b91ae66692762e507e.php create mode 100755 storage/framework/views/645b117505eaf328b063b457f0a7e171.php create mode 100755 storage/framework/views/662fc54fc0def05c1b259622e811803c.php create mode 100755 storage/framework/views/66efbdfac607c4462bb2298a98d6faac.php create mode 100755 storage/framework/views/6855d2e33205b91888dcc7a02816a39b.php create mode 100755 storage/framework/views/689347dc050fe533aed0a037aa9c5cdd.php create mode 100755 storage/framework/views/692fa9c7f895fcb4e21a1f1731a60406.php create mode 100755 storage/framework/views/696327619b02356f19b3adf2c3bf704f.php create mode 100755 storage/framework/views/6be40a9fac33782099171d0d80e025cf.php create mode 100755 storage/framework/views/6ce34c8fbee2f19577a6005fe418d650.php create mode 100755 storage/framework/views/6d2001f86aa58fedf8ebfbcfb16c5b76.php create mode 100755 storage/framework/views/6de5c8c28cb29acce8a2bd9af36344a8.php create mode 100755 storage/framework/views/6e12219585f1d10655b79c1a5e0b6718.php create mode 100755 storage/framework/views/6fb6d9feeb93e6fdb9c5e671249d0b02.php create mode 100755 storage/framework/views/705ba4a03b5ebcb6854888da30ba37f8.php create mode 100755 storage/framework/views/718638775cf4f89c56d3240e2a076acb.php create mode 100755 storage/framework/views/722922ee7af664e6e83dc93040da9fbc.php create mode 100755 storage/framework/views/727e484febeccf10f8c1e01e91fb2f18.php create mode 100755 storage/framework/views/7338f0eab0650fe45e0cbc7b97dfdf31.php create mode 100755 storage/framework/views/73d0f687bf3f179b75a519792a6a0190.php create mode 100755 storage/framework/views/73f6108386de9d6b9dd8e8f4d6aafcdf.php create mode 100755 storage/framework/views/74349877583591de964288672b6047a7.php create mode 100755 storage/framework/views/74d0fe6129f6d2d2751bf1d6c1c5e6be.php create mode 100755 storage/framework/views/7545453b31afffb888d933c90f187db5.php create mode 100755 storage/framework/views/763aa3438a725492f52411b7c5af8cac.php create mode 100755 storage/framework/views/76580b75925f708c1a37f6afa9029bb9.php create mode 100755 storage/framework/views/78de902192b1714ac039398d9f4426d8.php create mode 100755 storage/framework/views/79e8e90194be1d8195f6f37c97738d0e.php create mode 100755 storage/framework/views/7a1d92179836214dd1888bc3bb83cc42.php create mode 100755 storage/framework/views/7a87d246bb7b408660a5fb294f811956.php create mode 100755 storage/framework/views/7afe19b7ca789b437f936aa7a33665d6.php create mode 100755 storage/framework/views/7c39c87d70316fd50ddef81471da8c68.php create mode 100755 storage/framework/views/7d32429f498c45b7a16b838740c1f803.php create mode 100755 storage/framework/views/7dd35949e06fe81b098af5553fa6a342.php create mode 100755 storage/framework/views/7df9fc296534d20b4c1d0a6636050ffb.php create mode 100755 storage/framework/views/80328a3d8d637cac7f3cd1dcaf8ba595.php create mode 100755 storage/framework/views/8045eecedb3d7e156af551095e06d541.php create mode 100755 storage/framework/views/81832cbe8b1dc51181dd4444cc2b75ac.php create mode 100755 storage/framework/views/81aa4767a1c1fd106645581a82b3d039.php create mode 100755 storage/framework/views/82d6f8989f545ac1df2a6907421f2bda.php create mode 100755 storage/framework/views/8384b9be9a053dd08ab203ee1264ea99.php create mode 100755 storage/framework/views/83c4e4975e1dc8e11aaba8b00b2637e1.php create mode 100755 storage/framework/views/84ca5927186a61d96c9aa979ed9d32c3.php create mode 100755 storage/framework/views/854e22ee1ae052a7b502f2086fdd520c.php create mode 100755 storage/framework/views/857502e84b2e3d811ca62093f06a83ef.php create mode 100755 storage/framework/views/869b8c53bbaa41f201693cd8ac233e18.php create mode 100755 storage/framework/views/86e7ad99a2f60c181ff6221e8a463026.php create mode 100755 storage/framework/views/8702e7e94dc56cac392789fa6382a77b.php create mode 100755 storage/framework/views/88072a664aaf8108f0f58cda06c46095.php create mode 100755 storage/framework/views/884cada878fc61b9e4a4d0ca41058011.php create mode 100755 storage/framework/views/88b14aed5dac5bd92d7147188398c84b.php create mode 100755 storage/framework/views/88bea98a1376d5d8feaf9cc6532eb4ba.php create mode 100755 storage/framework/views/8a17e69ebe882e749209f94a38820f3c.php create mode 100755 storage/framework/views/8a59a466a35144d796c5b814196af89b.php create mode 100755 storage/framework/views/8bae8d55f9e611db52d14d4cea7aed55.php create mode 100755 storage/framework/views/8bf5d3a224233878842202702d6fc971.php create mode 100755 storage/framework/views/8c4fb3572583daf48a49a4c3c10aa8f0.php create mode 100755 storage/framework/views/8cd6f22911eceb78967b172efb7a3e4d.php create mode 100755 storage/framework/views/8db0fee22081357b08aac61d2811038f.php create mode 100755 storage/framework/views/8e57faf3fdad6d72cd5dae96efb6e32d.php create mode 100755 storage/framework/views/8f116a3d8eb219317dd63973388de625.php create mode 100755 storage/framework/views/9055d5aa6817e1c2a482961ccb336070.php create mode 100755 storage/framework/views/909db4de01ae69ca6d8fdb47d48c3ae9.php create mode 100755 storage/framework/views/90a5248af06033b8f4dd64a644274070.php create mode 100755 storage/framework/views/90b04458d177c3dada7a3e01eb2c135a.php create mode 100755 storage/framework/views/90deeaf9f2dcac7abfde3cc13e37ffd7.php create mode 100755 storage/framework/views/91bc81542d0d8bc6a883e11ba4f0a393.php create mode 100755 storage/framework/views/925d1237a9e4ca489126a9072aa264d2.php create mode 100755 storage/framework/views/92acfd4627deaa2d813e04f81ba29728.php create mode 100755 storage/framework/views/92b3aade7795023f63125b7bb1702d03.php create mode 100755 storage/framework/views/92b933031062dd5cad4972c31428fb46.php create mode 100755 storage/framework/views/92e13459cd974753921232bbfbf0aeb9.php create mode 100755 storage/framework/views/9317ecbb458a25699dddb338429ce29a.php create mode 100755 storage/framework/views/934aab714a4eb851ea4eb219c788782b.php create mode 100755 storage/framework/views/93aa69ca334eb6628bd9f09efab714ad.php create mode 100755 storage/framework/views/9558f9114f97694e92ae6472c02ebf05.php create mode 100755 storage/framework/views/95b5c81635c64aea784454aff2257ef7.php create mode 100755 storage/framework/views/973ec33cebe14c9893ad5d32ad8c68c9.php create mode 100755 storage/framework/views/974fb0b69dbc0076e14acbf808232f09.php create mode 100755 storage/framework/views/98072615de1b43056c7a8ff124ef81d0.php create mode 100755 storage/framework/views/99aa974efcee7262d96012bc812fca61.php create mode 100755 storage/framework/views/9ad7840c207a7afc87ee0e1cb234dcfa.php create mode 100755 storage/framework/views/9b0031b4889c60054d46ba508003d13e.php create mode 100755 storage/framework/views/9bc5b97a529c41a831f2a790c6b68649.php create mode 100755 storage/framework/views/9d29dd05b14ef75e0e09c9fb664383d9.php create mode 100755 storage/framework/views/9ef6f52bd7cece2edcd3a9f011ce1337.php create mode 100755 storage/framework/views/9ef7d91b1c5f09419a9136420111b3a6.php create mode 100755 storage/framework/views/9ffcff2286213d3a8fe04af513c7cd88.php create mode 100755 storage/framework/views/a00783c81487f8730c1391b08502d86c.php create mode 100755 storage/framework/views/a0b01cc8d8aa93c4b0106214b50105d3.php create mode 100755 storage/framework/views/a0b4fa9fb4c26e44c4aa216c07a722a9.php create mode 100755 storage/framework/views/a15b5670fe81fa7c104d47953f0a0948.php create mode 100755 storage/framework/views/a1b6707d7b57bbc79ebb3cfb0642233c.php create mode 100755 storage/framework/views/a1f8639f84aec9a6fcc765cd7fdb91d8.php create mode 100755 storage/framework/views/a20a7427658b5c91a3f551c4fb22b570.php create mode 100755 storage/framework/views/a3034fb28815c6737c7f1fe6dc837ca7.php create mode 100755 storage/framework/views/a37261f10bbbc05300815fb27a6ce63f.php create mode 100755 storage/framework/views/a4ffc4ebcff2eba17458b2d181875a11.php create mode 100755 storage/framework/views/a52f436cfd938cdb4acb6d87ffec90d8.php create mode 100755 storage/framework/views/a55cad60de14a3e8924ed2c7fafe03d4.php create mode 100755 storage/framework/views/a615b108a840c54bfeb4d02b8c45acf2.php create mode 100755 storage/framework/views/a6fb7309da265defe85e1a1064366648.php create mode 100755 storage/framework/views/a827f213957676a16001cd91dc112549.php create mode 100755 storage/framework/views/aa751045bcf62af601caa003cf69f1e5.php create mode 100755 storage/framework/views/aa9b8ba744313423689d8fe2f1840af9.php create mode 100755 storage/framework/views/aba3e368dde555f8dcd51c7aceba4e6b.php create mode 100755 storage/framework/views/abd5fd79a831966c71bb278a11a52c2b.php create mode 100755 storage/framework/views/ad12a543aad8643f064247eb30d7680e.php create mode 100755 storage/framework/views/ad152e82c2a5ac11df6a67de491a6e0a.php create mode 100755 storage/framework/views/ae624372bcce32c8f2b0998c0e654eb2.php create mode 100644 storage/framework/views/ae6d84192f2b8fbb06da1688efe959ba.php create mode 100755 storage/framework/views/aea6af283674c4fcb9af8ae7ded8a121.php create mode 100755 storage/framework/views/afd0c6897040e2cc8cb829831a78c878.php create mode 100755 storage/framework/views/b0c16e8a003253e493829e3c14194dd2.php create mode 100755 storage/framework/views/b0d25a274c1687d483793e43b44ae95d.php create mode 100755 storage/framework/views/b1a2cf391c7dc6d3786a1276d45fd47c.php create mode 100755 storage/framework/views/b372d51f5500295bc9228d9d664663fb.php create mode 100755 storage/framework/views/b49985407b07abfefd64aaab2382947e.php create mode 100755 storage/framework/views/b49e8f9599a267bde604c4e4eb02960c.php create mode 100755 storage/framework/views/b55b5d08250e5310d019e7e3aacd86b4.php create mode 100755 storage/framework/views/b649a86c76252c380b129e4cc338f7be.php create mode 100755 storage/framework/views/b665faddbd4156979a33bd7256a63804.php create mode 100755 storage/framework/views/b7000ff43eefa965176fcf1bb48f25c9.php create mode 100755 storage/framework/views/b73c32b3e3eb705eb379b5f68dac5cfb.php create mode 100755 storage/framework/views/b76090b5a4cb58a27d81ee28ceee41ba.php create mode 100755 storage/framework/views/b8eaf7547e9a9ea023ea2b6a9aba1195.php create mode 100755 storage/framework/views/b94d068fd1cfcdbd8dea9170647897f8.php create mode 100755 storage/framework/views/b9a9babe76c8328b3cfd9a0f6be97ac9.php create mode 100755 storage/framework/views/b9dba1f802a8f3ef9925ab0f86ada175.php create mode 100755 storage/framework/views/ba39863401b82f9aae2299c32bce8534.php create mode 100755 storage/framework/views/bba119bc75cf4ca9d930c7d1aa6518a1.php create mode 100755 storage/framework/views/bbdae7896a1f7165054fd9355cae7301.php create mode 100755 storage/framework/views/bd5df4af7aa6519e61a16b0135794c6d.php create mode 100755 storage/framework/views/bddfc759890f2c4c9b12ae35f48b5c55.php create mode 100755 storage/framework/views/be37ec7b1345fcb3c2f3c4f68700e4f6.php create mode 100755 storage/framework/views/be65033c29029eb224ea0eceb6f05545.php create mode 100755 storage/framework/views/bfb95f08f5507d145605961ebeaa83f9.php create mode 100755 storage/framework/views/c0c04d49115719602aeabe1311e2e11e.php create mode 100755 storage/framework/views/c0eeafa5404ccb3b6a234ee46c87e511.php create mode 100755 storage/framework/views/c100bd2e7fff457a7b18e261caf1ef81.php create mode 100755 storage/framework/views/c12f125c21d124ddb00e61b72c3d6467.php create mode 100755 storage/framework/views/c216a456d8abda98e9a1e002200cd508.php create mode 100755 storage/framework/views/c4188c8d16ca50973c0514392a83278d.php create mode 100755 storage/framework/views/c466ea3b4d80f80373c9b95dbad50b8c.php create mode 100755 storage/framework/views/c4d70cd171bf2fc590ee7c7141de88d2.php create mode 100755 storage/framework/views/c5467567decfdcefe29aac61f3d5589e.php create mode 100755 storage/framework/views/c5bcc7f5f43cdf04c3e1958145d44ff7.php create mode 100755 storage/framework/views/c62c8976e81c463eb2916ca0044ca1cb.php create mode 100755 storage/framework/views/c6e4ea11ca7454f87ab86a2864a7cc06.php create mode 100755 storage/framework/views/c84fe614c3ee24c1ddf401fb2bea6af0.php create mode 100755 storage/framework/views/c88b70a8a9feab42ed2b012b4e9ee5c1.php create mode 100755 storage/framework/views/c93246842dd998089762986ccb96fd3d.php create mode 100755 storage/framework/views/c96786be548c061098a89722818ccdd9.php create mode 100755 storage/framework/views/c9dd5fab3c50756806a823d0086ed3ab.php create mode 100755 storage/framework/views/cacd1ce355b094ed718c8e57c6c09cce.php create mode 100755 storage/framework/views/cc0143e300080a647abe2f5a7cc57b40.php create mode 100755 storage/framework/views/cc637471677bcb38ce3f1da95b8515a3.php create mode 100755 storage/framework/views/cd06a68343b54991724d7af0fd4fbf94.php create mode 100755 storage/framework/views/cdf6fb19a5c0ad1ef5db7342b765bba8.php create mode 100755 storage/framework/views/ce51d0382acd3068014849bcbd3390c7.php create mode 100755 storage/framework/views/cef5a8b8fe9e2295a6f0cd070e4ab426.php create mode 100755 storage/framework/views/cf663c2c06309f3a59c67ba60cc1815a.php create mode 100755 storage/framework/views/d028a4887c85c25f7b1d6f3b0d730412.php create mode 100755 storage/framework/views/d03914f7418dbbe11a34e35b629d81da.php create mode 100755 storage/framework/views/d088af29b2c8f0235601107a5f871950.php create mode 100755 storage/framework/views/d152e93aa18084fce458b6000ce4c6d0.php create mode 100755 storage/framework/views/d1f08c39f1f5d58707d54efd7804b954.php create mode 100755 storage/framework/views/d2c46ca36ad74e62d092fa104c6403d2.php create mode 100755 storage/framework/views/d33307fb31bb2672758386635ebd2409.php create mode 100755 storage/framework/views/d4062cf192494d743f721004ae6def7a.php create mode 100755 storage/framework/views/d4b0a3e17c2124cfec42f81937afea08.php create mode 100755 storage/framework/views/d5041d7ba88a56444ac758c9cce83a35.php create mode 100755 storage/framework/views/d66b74b49d95530ad03f4294dd4ab050.php create mode 100755 storage/framework/views/d6c7c91ccd6193f9cd451e4deeedba4d.php create mode 100755 storage/framework/views/d6fbed627e4c89b29c413eb23eeadcdb.php create mode 100755 storage/framework/views/d76543fc136a2fb26036cf2dc1a322f3.php create mode 100755 storage/framework/views/d7daa0669623d0843faae680d79d5170.php create mode 100755 storage/framework/views/d8243be939fa006d973e91115191161b.php create mode 100755 storage/framework/views/d84bcbb3d7b8d427bb210340b35bbd2f.php create mode 100755 storage/framework/views/dc0412c0780ee8f64f910e45f574ee0f.php create mode 100755 storage/framework/views/dcfc209cfcd29250c5cd4457912cc6c0.php create mode 100755 storage/framework/views/dd110fa48c7ea808250a8c92771c47cb.php create mode 100755 storage/framework/views/dd176efcf4d159000b9a55553f87ccb1.php create mode 100755 storage/framework/views/dd310000961f2d208873a737c27d849a.php create mode 100755 storage/framework/views/dd4f775cdf3e345524a2ade89dee5cd6.php create mode 100755 storage/framework/views/dd90c61f625f87e8ccaf54e392e6603a.php create mode 100755 storage/framework/views/ddc7cd9af3029afaf2b177122446790d.php create mode 100755 storage/framework/views/ddde46e2c3e07f623e890cd4be59e607.php create mode 100755 storage/framework/views/dde597c3b13585264f473de3430b8792.php create mode 100755 storage/framework/views/decb4b9850e964b06d91abea7ed638e3.php create mode 100755 storage/framework/views/e0276c8bee964928573ce227b79ec846.php create mode 100755 storage/framework/views/e0688c0fbc190f2d2b5546e07a44af84.php create mode 100755 storage/framework/views/e0c0309d658af32f720f58d954a75621.php create mode 100755 storage/framework/views/e10715403ad8ebf33c12c87a3c8d124c.php create mode 100755 storage/framework/views/e12515669a36502caee1fcb5890b704c.php create mode 100755 storage/framework/views/e17ea57b30de72877d20a53f3c29aeaf.php create mode 100755 storage/framework/views/e1a71a194e9c94ace82a6690e1ce6f27.php create mode 100755 storage/framework/views/e21f4ff533736ebf8374e63f2f425fbf.php create mode 100755 storage/framework/views/e2ad14a097b32f80f7bfc5e55946b567.php create mode 100755 storage/framework/views/e41ac4cb9266fc960043673a707c4bc4.php create mode 100755 storage/framework/views/e44c3f8c8fc495a1ec2f928ecd6f077b.php create mode 100755 storage/framework/views/e5ab0b39aa46cbd3d851dae297b36740.php create mode 100755 storage/framework/views/e5fb6ecb638634ab6fe102fca42ca237.php create mode 100755 storage/framework/views/e646a2dc3039e01a727e45c31f6b5969.php create mode 100755 storage/framework/views/e655b5dc7a417cc04c20dd7746949c81.php create mode 100755 storage/framework/views/e69116b6c1b73e7d6d7e525efdf78de0.php create mode 100755 storage/framework/views/e8684d137bef4b6d7a4a6952ea74c011.php create mode 100644 storage/framework/views/e8ce166cee254d2d793d7f11fa6d8524.php create mode 100755 storage/framework/views/e9a64ccf83e40b6b16a288dc330a6877.php create mode 100755 storage/framework/views/ed507c4a065f40e23e7c18c118e304cc.php create mode 100755 storage/framework/views/edb8e49c7ccaa4a5bd586b67f28eb732.php create mode 100755 storage/framework/views/edeb0bd066809f3fa4eb174c19fe02a4.php create mode 100755 storage/framework/views/ee76b80f4b4c257890fa6eb02c461b47.php create mode 100755 storage/framework/views/eea27cf20a93f6533c1f9f77ddbc40bc.php create mode 100755 storage/framework/views/efa161867573b91595bb8fdc55cb83ff.php create mode 100755 storage/framework/views/f037afa2cd3deb169723c7576dd246cc.php create mode 100755 storage/framework/views/f0479fe0a9819bb77bf23ff2870d14a2.php create mode 100755 storage/framework/views/f056c191d683862e733efe7cbf77a1bb.php create mode 100755 storage/framework/views/f08f9a4bdbea6736050597a3e3943772.php create mode 100755 storage/framework/views/f14cd80c650555595b28d3c36344c1c2.php create mode 100755 storage/framework/views/f1631a8fe6a313e38d60d7a7f4fbff66.php create mode 100755 storage/framework/views/f16a27acdab6bea42a9a04dc2f8c8311.php create mode 100755 storage/framework/views/f2d44e75f98e6576692a8ccc837b1e6f.php create mode 100755 storage/framework/views/f2fe26289caa447896210dce80973ed6.php create mode 100755 storage/framework/views/f43374d46900c297198a91efd93280bb.php create mode 100755 storage/framework/views/f441b0949af07185b51f5f12270d8ff0.php create mode 100755 storage/framework/views/f4b3949f3dd837ea9b805b03044ea7c1.php create mode 100755 storage/framework/views/f520e9e1ec939cb1f5cade832c4d3dc8.php create mode 100755 storage/framework/views/f561d5461c8e88c79bbe9c1621e3ec4c.php create mode 100755 storage/framework/views/f6b76ad05f9eca674f592a3144628674.php create mode 100755 storage/framework/views/f76c362f43ac9716be49beee6dc42bcd.php create mode 100755 storage/framework/views/f79dde1f2e8081a7a504b6f8c11336b2.php create mode 100755 storage/framework/views/f88f0d9a8e2f1cc80cecccd60df508eb.php create mode 100755 storage/framework/views/fa24ec43edd90de89ad19da955a1ecc4.php create mode 100755 storage/framework/views/fa2cf417103f02e1394dd139791598d8.php create mode 100755 storage/framework/views/fa555339de4cdf446f116325eadd4dc6.php create mode 100755 storage/framework/views/fae2acf3af7f796b07d789eb150178f8.php create mode 100755 storage/framework/views/fb10a49c8fba3a1c0b12ed4f3e8cbba2.php create mode 100755 storage/framework/views/fc252ae46c09f7fd2b704dab985a93a7.php create mode 100755 storage/framework/views/fca414b36e4c13c171c46bfef449ceb3.php create mode 100755 storage/framework/views/fca436142e86e0113dba7bd2c8bbc281.php create mode 100755 storage/framework/views/fd0024623da8afa781adf503b6c5876e.php create mode 100755 storage/framework/views/fd6bc016b04e3ac46f0ac3e7d1cd9e82.php create mode 100755 storage/framework/views/fe5faeb9d28c73897b30c50e779419a2.php create mode 100755 storage/framework/views/fe66cc2a12be3423c9157b9f1427314e.php create mode 100755 storage/framework/views/fe7372eb19574941f5c3dac69cde3dc3.php create mode 100755 storage/framework/views/ffd442e3c0a04c0587373e639425db60.php create mode 100755 storage/logs/laravel.log create mode 100644 vite.config.js diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..59c2881 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,12 @@ +.git +.env +node_modules +vendor +storage/framework/cache/data +storage/framework/sessions +storage/framework/views +storage/logs +bootstrap/cache/*.php +public/storage +tests +docker diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..6537ca4 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..24a72ce --- /dev/null +++ b/.env.example @@ -0,0 +1,66 @@ +APP_NAME='Krayin CRM' +APP_ENV=local +APP_KEY= +APP_DEBUG=true +APP_URL=http://localhost +APP_TIMEZONE=Asia/Kolkata +APP_LOCALE=en +APP_CURRENCY=USD + +VITE_HOST= +VITE_PORT= + +LOG_CHANNEL=stack +LOG_LEVEL=debug + +DB_CONNECTION=mysql +DB_HOST=127.0.0.1 +DB_PORT=3306 +DB_DATABASE=laravel-crm +DB_USERNAME=root +DB_PASSWORD= +DB_PREFIX= + +BROADCAST_DRIVER=log +CACHE_DRIVER=file +QUEUE_CONNECTION=sync +SESSION_DRIVER=file +SESSION_LIFETIME=120 + +MEMCACHED_HOST=127.0.0.1 + +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_PORT=6379 + +MAIL_MAILER=smtp +MAIL_HOST=mailhog +MAIL_PORT=1025 +MAIL_USERNAME=null +MAIL_PASSWORD=null +MAIL_ENCRYPTION=null +MAIL_FROM_ADDRESS=laravel@krayincrm.com +MAIL_FROM_NAME="${APP_NAME}" +MAIL_DOMAIN=webkul.com + +MAIL_RECEIVER_DRIVER=sendgrid + +IMAP_HOST=imap.example.com +IMAP_PORT=993 +IMAP_ENCRYPTION=ssl +IMAP_VALIDATE_CERT=true +IMAP_USERNAME=your_username +IMAP_PASSWORD=your_password + +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_DEFAULT_REGION=us-east-1 +AWS_BUCKET= + +PUSHER_APP_ID= +PUSHER_APP_KEY= +PUSHER_APP_SECRET= +PUSHER_APP_CLUSTER=mt1 + +MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" +MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..fcb21d3 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,11 @@ +* text=auto eol=lf + +*.blade.php diff=html +*.css diff=css +*.html diff=html +*.md diff=markdown +*.php diff=php + +/.github export-ignore +CHANGELOG.md export-ignore +.styleci.yml export-ignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6cc6208 --- /dev/null +++ b/.gitignore @@ -0,0 +1,35 @@ +.env +.env.testing +.idea +.php_cs.cache +.phpunit.result.cache +.vscode +.vagrant +*.hot +/stubs +/data +/docker-compose-collection +Homestead.json +Homestead.yaml +/ignorables/* +/node_modules +npm-debug.log +package-lock.json +/playwright-report +/public/css +/public/js +/public/hot +/public/storage +/public/vendor +/lang/vendor +/storage/*.key +/storage/dcc-data/ +/vendor +yarn.lock +yarn-error.log + +# Playwright +node_modules/ +/test-results/ +/blob-report/ +/playwright/.cache/ diff --git a/.tmp-growup-v4-final.tar2046928222 b/.tmp-growup-v4-final.tar2046928222 new file mode 100644 index 0000000..e69de29 diff --git a/000-default.conf b/000-default.conf new file mode 100644 index 0000000..37ecc74 --- /dev/null +++ b/000-default.conf @@ -0,0 +1,16 @@ + + ServerAdmin webmaster@localhost + + # AQUI ESTÁ A MÁGICA: Apontar para a pasta public + DocumentRoot /var/www/html/public + + + Options Indexes FollowSymLinks + # Isso permite que o Laravel gerencie as rotas (remove o index.php da url) + AllowOverride All + Require all granted + + + ErrorLog ${APACHE_LOG_DIR}/error.log + CustomLog ${APACHE_LOG_DIR}/access.log combined + diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..882f374 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at support@krayincrm.com. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..1673fda --- /dev/null +++ b/Dockerfile @@ -0,0 +1,41 @@ +FROM php:8.2-apache + +# 1. Dependências (Inclui netcat-openbsd e redis) +RUN apt-get update && apt-get install -y \ + git curl unzip libpng-dev libonig-dev libxml2-dev libzip-dev libicu-dev zip vim nano autoconf pkg-config netcat-openbsd \ + && pecl install redis \ + && docker-php-ext-enable redis \ + && docker-php-ext-configure intl \ + && docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip calendar intl \ + && a2enmod rewrite \ + && apt-get clean && rm -rf /var/lib/apt/lists/* + +COPY --from=composer:latest /usr/bin/composer /usr/bin/composer +WORKDIR /var/www/html +COPY . . + +# 2. Copia as correções manuais +# COPY AppServiceProvider.php app/Providers/AppServiceProvider.php +# COPY TrustProxies.php app/Http/Middleware/TrustProxies.php +COPY 000-default.conf /etc/apache2/sites-available/000-default.conf + +# 3. Pastas e Permissões +RUN mkdir -p storage/framework/sessions \ + && mkdir -p storage/framework/views \ + && mkdir -p storage/framework/cache \ + && mkdir -p bootstrap/cache \ + && chown -R www-data:www-data /var/www/html/storage \ + && chown -R www-data:www-data /var/www/html/bootstrap/cache \ + && chmod -R 775 /var/www/html/storage + +# 4. Instalação do PHP +RUN composer install --no-dev --no-interaction --prefer-dist --optimize-autoloader + +# 5. Script de Entrada +COPY docker-entrypoint.sh /usr/local/bin/ +# Garante quebras de linha Linux +RUN sed -i 's/\r$//' /usr/local/bin/docker-entrypoint.sh +RUN chmod +x /usr/local/bin/docker-entrypoint.sh + +EXPOSE 80 +ENTRYPOINT ["docker-entrypoint.sh"] diff --git a/GEMINI.md b/GEMINI.md new file mode 100644 index 0000000..21e1b5f --- /dev/null +++ b/GEMINI.md @@ -0,0 +1,1068 @@ +# Growup Pro - Krayin CRM Whitelabel Multi-tenant + +## Project Overview + +**Growup Pro** is a whitelabel implementation of [Krayin Laravel CRM](https://github.com/krayin/laravel-crm) with multi-tenancy support. The platform allows multiple companies/organizations to use the same CRM instance with complete data isolation through subdomain-based tenancy. + +**CURRENT STATUS: DEBUGGING PHASE** +- **Multi-tenancy implementation**: Installed but encountering issues. +- **Issue 1**: `localhost` not recognized as central domain (TenantCouldNotBeIdentifiedOnDomainException). +- **Issue 2**: Tenant instances (`tenant1.localhost`) load but missing CSS (Asset 404). +- **Goal**: Fix central domain detection and static asset serving for tenants. + +### Key Differentiators from Krayin +- **Rebranding**: Complete visual overhaul with Growup Pro branding +- **Multi-tenancy**: Isolated environments per client organization +- **Localization**: Full Portuguese (pt-BR) translation +- **White-label ready**: Easy customization per tenant + +## Tech Stack + +- **Framework**: Laravel (check composer.json for exact version) +- **Base CRM**: Krayin Laravel CRM +- **Database**: MySQL/PostgreSQL +- **Multi-tenancy Package**: [Tenancy for Laravel](https://tenancyforlaravel.com/docs/v3/introduction) (v3) +- **Frontend**: Blade templates with Alpine.js (Krayin default) +- **PHP Version**: 8.1+ +- **Containerization**: Docker with Docker Compose +- **Orchestration**: Docker Swarm +- **Management**: Portainer +- **CI/CD**: Gitea Actions (GitHub Actions compatible) +- **Error Tracking**: Sentry for Laravel +- **Code Quality**: PHPStan (static analysis) + Laravel Pint (code formatter) +- **CDN**: Cloudflare (caching and DDoS protection) - **PRODUCTION ONLY** + +## Project Structure + +``` +. +├── .gitea/ +│ └── workflows/ # Gitea Actions CI/CD pipelines +│ ├── deploy.yml # Production deployment +│ ├── deploy-staging.yml # Staging environment deployment +│ └── tests.yml # Automated testing pipeline +├── .husky/ # Git hooks (pre-commit, pre-push) +├── Makefile # Common development commands +├── app/ +│ ├── Models/ # Eloquent models (tenant-scoped) +│ ├── Http/ +│ │ ├── Controllers/ # Application controllers +│ │ └── Middleware/ # Custom middleware (tenant identification) +│ └── Providers/ # Service providers +├── config/ +│ └── tenancy.php # Tenancy for Laravel configuration +├── database/ +│ ├── migrations/ # Database migrations +│ │ ├── tenant/ # Tenant-specific migrations +│ │ └── landlord/ # Central database migrations +│ └── seeders/ # Seeders for tenants and central data +│ ├── DemoTenantSeeder.php # Creates demo tenants for testing +│ └── ProductionSeeder.php # Production data seeding +├── docker/ +│ ├── Dockerfile # Application container definition +│ ├── docker-compose.yml # Local development orchestration +│ └── docker-compose.prod.yml # Production stack definition +├── packages/ # Krayin core packages +│ └── Webkul/ +│ └── ... +├── public/ +│ └── assets/ # Growup Pro assets (logos, images) +├── resources/ +│ ├── lang/ +│ │ └── pt_BR/ # Portuguese translations +│ └── views/ # Blade templates (Growup Pro customized) +└── routes/ + ├── web.php # Central app routes + ├── tenant.php # Tenant-specific routes + ├── admin.php # Admin dashboard routes (tenant management) + └── api.php # API routes +``` + +## Multi-tenancy Configuration + +### Package: Tenancy for Laravel +We use **Tenancy for Laravel v3** for robust multi-tenant architecture with automatic database switching and tenant identification. + +### Tenant Identification Strategy +- **Method**: Subdomain-based identification +- **Domain**: `growuppro.com.br` +- **Pattern**: `{tenant}.growuppro.com.br` +- **Examples**: + - `empresa1.growuppro.com.br` → Tenant: empresa1 + - `empresa2.growuppro.com.br` → Tenant: empresa2 + - `demo.growuppro.com.br` → Tenant: demo + +### Data Isolation +- **Approach**: Separate database per tenant (recommended by Tenancy for Laravel) +- Database naming: `tenant_{tenant_id}` (e.g., `tenant_empresa1`) +- Central database: `growuppro_central` (stores tenant metadata, domains, users) +- Automatic tenant context switching via middleware +- Models automatically scoped to current tenant + +### Tenant Features +Each tenant has isolated: +- **Data**: Leads, contacts, deals, products, activities +- **Users**: Separate user base with roles/permissions +- **Settings**: Email configuration, notifications, workflows +- **Customization**: Optional CSS overrides, email templates + +## Branding & Localization + +### Growup Pro Visual Identity +- **Application Name**: Growup Pro (replacing all Krayin mentions) +- **Logo**: Custom Growup Pro logo in all interfaces +- **Color Scheme**: [Define primary/secondary colors when ready] +- **Typography**: [Define font family when ready] +- **UI/UX**: Modern, clean interface aligned with Growup Pro brand + +### Translation (pt-BR) +- All user-facing text translated to Portuguese (Brazil) +- Language files in `resources/lang/pt_BR/` +- Default locale: `pt_BR` (set in `config/app.php`) +- Maintain translation keys for easy updates +- Include tenant-customizable text snippets + +### Customization Locations +1. **Logo**: `public/assets/images/logo.png` (central) and tenant-specific storage +2. **Translations**: `resources/lang/pt_BR/` +3. **Views**: `resources/views/` (customized Krayin templates) +4. **Styles**: `public/assets/css/custom.css` (Growup Pro overrides) +5. **Config**: `config/growuppro.php` (application-specific settings) + +## Docker & Deployment Architecture + +### Container Strategy +The application runs in Docker containers orchestrated by Docker Swarm and managed through Portainer. + +### Docker Compose Structure +- **Development**: `docker-compose.yml` (local development with hot-reload) +- **Production**: `docker-compose.prod.yml` (optimized for Swarm deployment) + +### Services +Typical stack includes: +- **app**: PHP-FPM application container (Growup Pro) +- **nginx-proxy-manager**: Nginx Proxy Manager for reverse proxy, SSL, and domain management (managed via Portainer) +- **database**: MySQL/PostgreSQL (central + tenants) +- **redis**: Session and cache storage +- **queue**: Laravel queue worker for background jobs +- **scheduler**: Laravel scheduler (cron jobs) + +### Image Management +- **Registry**: GitHub Container Registry (GHCR) +- **Image naming**: `ghcr.io/cauefaleiros/growup-pro:latest` +- **Tagging strategy**: Git commit SHA and semantic versioning +- **Tags**: `latest` (production), `dev` (development), `v{version}` (releases) + +## CI/CD Pipeline with Gitea Actions + +### About Gitea Actions +Gitea Actions (available since Gitea 1.19) is a built-in CI/CD solution similar and mostly compatible with GitHub Actions. It uses the same YAML workflow format and is compatible with most GitHub Actions marketplace plugins. + +**Key Components:** +- **Gitea Server**: Hosts repositories and triggers workflows +- **act_runner**: Standalone runner program (written in Go) that executes jobs, based on a fork of nektos/act +- **Workflows**: YAML files stored in `.gitea/workflows/` directory (compatible with GitHub Actions syntax) + +**Compatibility:** +- Same YAML syntax as GitHub Actions +- Can use most actions from GitHub marketplace (e.g., `actions/checkout@v4`, `actions/setup-node@v4`) +- Workflows are portable between GitHub and Gitea with minimal changes + +### Deployment Flow +``` +Developer pushes code to GitHub + ↓ +GitHub Actions workflow triggered + ↓ +1. Run tests (PHPUnit, Pest) +2. Build Docker image +3. Tag image with commit SHA + ↓ +Push image to GitHub Container Registry (GHCR) + ↓ +Call Portainer API (webhook or direct API) + ↓ +Portainer updates Docker Stack definition + ↓ +Docker Swarm pulls new image + ↓ +Swarm performs rolling update (zero-downtime) + ↓ +Health checks verify deployment + ↓ +Old containers removed +``` + +### GitHub Actions Workflow +Location: `.github/workflows/deploy.yml` + +Key steps: +1. **Checkout code** +2. **Setup PHP & dependencies** (Composer install) +3. **Run code quality checks** (PHPStan, Pint) +4. **Run tests** (PHPUnit/Pest - ensure code quality) +5. **Build Docker image** with build args +6. **Login to GHCR** using GitHub token +7. **Push image** with appropriate tags +8. **Trigger Portainer** via API to update stack +9. **Verify deployment** (health check endpoint) +10. **Notify team** (Slack/Discord webhook on success/failure) + +### Environment Variables +Managed through: +- **GitHub Secrets**: Sensitive data (API keys, tokens, Sentry DSN) +- **Portainer**: Stack environment variables +- **Docker Swarm Secrets**: Database credentials, API keys + +### Portainer Integration +- **Portainer URL**: `https://148.230.76.122:9443` +- **API Endpoint**: `https://148.230.76.122:9443/api` +- **Authentication**: API token (stored in GitHub Secrets) +- **Stack Management**: Update existing stack with new image tag +- **Webhooks**: Optional webhook for automated redeploy +- **Nginx Proxy Manager**: Managed through Portainer for SSL certificates and domain routing + +## Coding Conventions + +### Models +All tenant-scoped models automatically inherit tenant context through Tenancy for Laravel: + +```php +id(); + $table->string('title'); + $table->decimal('value', 10, 2); + // No tenant_id needed - separate databases per tenant + $table->timestamps(); +}); + +// database/migrations/2024_xx_xx_create_tenants_table.php (central) +Schema::create('tenants', function (Blueprint $table) { + $table->string('id')->primary(); + $table->string('company_name'); + $table->string('subdomain')->unique(); + $table->timestamps(); +}); +``` + +### Routes +```php +// routes/tenant.php - Runs in tenant context +Route::middleware(['tenant'])->group(function () { + Route::get('/dashboard', [DashboardController::class, 'index']); + Route::resource('leads', LeadController::class); +}); + +// routes/web.php - Central app (tenant selection, etc.) +Route::get('/', [HomeController::class, 'index']); +Route::post('/register-tenant', [TenantController::class, 'register']); +``` + +## Important Files to Know + +### Configuration +- `config/app.php` - Application configuration (locale: pt_BR) +- `config/tenancy.php` - Tenancy for Laravel settings +- `config/growuppro.php` - Custom Growup Pro configuration +- `app/Http/Kernel.php` - Middleware registration + +### Krayin Core +- `packages/Webkul/` - Krayin core packages (**never modify directly**) +- Extend functionality through Laravel's standard practices (service providers, custom packages) + +### Docker & Deployment +- `docker/Dockerfile` - Application container definition +- `docker-compose.yml` - Local development environment +- `docker-compose.prod.yml` - Production stack for Swarm +- `.github/workflows/deploy.yml` - CI/CD pipeline + +### Branding +- `public/assets/images/logo.png` - Growup Pro logo +- `resources/lang/pt_BR/` - Portuguese translations +- `resources/views/layouts/app.blade.php` - Main layout (branded) + +## CRITICAL: Krayin Authentication Issues (MUST RESOLVE BEFORE MULTI-TENANCY) + +**IMPORTANT:** Multi-tenancy implementation is ON HOLD until we stabilize Krayin's base authentication system. We have experienced critical login issues that must be resolved first. + +### Known Authentication Problems + +#### Problem 1: Error 419 - CSRF Token Mismatch +**Symptoms:** +- User enters credentials +- Form submission returns 419 error +- Login fails even with correct credentials + +**Possible Causes:** +- Session driver misconfiguration (`file` vs `redis` vs `database`) +- Session cookie not being set properly +- Domain/subdomain mismatch in session configuration +- `APP_URL` mismatch with actual access URL +- CSRF token expiration (session timeout too short) +- Reverse proxy stripping session cookies + +**Debug Steps:** +```bash +# Check current session driver +grep SESSION_DRIVER .env + +# Clear all caches +php artisan cache:clear +php artisan config:clear +php artisan route:clear +php artisan view:clear + +# Check session files (if using file driver) +ls -la storage/framework/sessions/ + +# Test session configuration +php artisan tinker +>>> session()->put('test', 'value'); +>>> session()->get('test'); # Should return 'value' +``` + +**Potential Fixes:** +1. **Ensure APP_URL matches access URL exactly:** + ```env + # If accessing via localhost:8000 + APP_URL=http://localhost:8000 + + # If accessing via IP + APP_URL=http://192.168.1.100:8000 + ``` + +2. **Check session configuration** (`config/session.php`): + ```php + 'domain' => env('SESSION_DOMAIN', null), // Should match your domain + 'secure' => env('SESSION_SECURE_COOKIE', false), // false for HTTP, true for HTTPS + 'same_site' => 'lax', // Not 'strict' - can cause issues + ``` + +3. **Verify CSRF middleware** is present in `app/Http/Kernel.php`: + ```php + protected $middlewareGroups = [ + 'web' => [ + \App\Http\Middleware\EncryptCookies::class, + \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, + \Illuminate\Session\Middleware\StartSession::class, + \Illuminate\View\Middleware\ShareErrorsFromSession::class, + \App\Http\Middleware\VerifyCsrfToken::class, // THIS IS CRITICAL + // ... + ], + ]; + ``` + +4. **Check CSRF exceptions** (if login route needs to be excluded): + ```php + // app/Http/Middleware/VerifyCsrfToken.php + protected $except = [ + // Add routes here ONLY as last resort + ]; + ``` + +#### Problem 2: Tenant Database Connection Issues +**Symptoms:** +- Login attempt fails silently +- Database connection errors in logs +- Can't authenticate against tenant-specific users table + +**Possible Causes:** +- Tenant database doesn't exist yet +- Database migrations not run on tenant database +- Wrong database being queried (central vs tenant) +- Tenant context not initialized before authentication attempt + +**Debug Steps:** +```bash +# List all databases +php artisan tinker +>>> DB::select('SHOW DATABASES'); + +# Check which database Laravel is connected to +>>> DB::connection()->getDatabaseName(); + +# Verify users table exists in tenant DB +>>> Schema::connection('tenant')->hasTable('users'); +``` + +**Critical Notes for Multi-tenancy:** +- Authentication MUST work in single-tenant (non-multi-tenant) mode FIRST +- Only after stable authentication should we add tenant context switching +- Tenant middleware should NOT interfere with session/CSRF handling + +#### Problem 3: Infinite Login Redirect Loop (CRITICAL - UNRESOLVED) +**Symptoms:** +- User enters valid credentials +- Form submits successfully (no 419 error) +- Page redirects back to login page +- User is never authenticated +- Dashboard never loads +- No error messages displayed + +**This is the MOST CRITICAL issue and must be debugged thoroughly.** + +**Possible Causes:** +1. **Session not persisting after authentication:** + - Session written but immediately destroyed + - Session driver issue (file permissions, Redis connection) + - Session ID regeneration failing + +2. **Authentication middleware misconfigured:** + - `Auth` middleware blocking authenticated users + - Wrong guard being checked + - Middleware order issues in Kernel.php + +3. **Redirect logic broken:** + - `redirectTo` property in LoginController pointing to login route + - Intended destination not being preserved + - Route name/path mismatch + +4. **Auth guard misconfigured:** + - Wrong guard specified in `config/auth.php` + - Provider not finding users correctly + - User model relationship issues + +5. **Cookie domain/path mismatch:** + - Session cookie being set but not read back + - Domain attribute too restrictive + - Path attribute incorrect + +**Detailed Debug Steps:** + +```bash +# 1. Enable query logging to see what's happening +# Add to AppServiceProvider boot(): +DB::listen(function ($query) { + Log::info('Query: ' . $query->sql . ' - Bindings: ' . json_encode($query->bindings)); +}); + +# 2. Add extensive logging to login process +# In LoginController or wherever authentication happens: +Log::info('Login attempt for: ' . request()->email); +Log::info('Session ID before auth: ' . session()->getId()); + +# After Auth::attempt(): +Log::info('Auth attempt result: ' . (Auth::check() ? 'success' : 'failed')); +Log::info('Session ID after auth: ' . session()->getId()); +Log::info('Authenticated user: ' . (Auth::user() ? Auth::user()->id : 'none')); + +# 3. Check session files directly +# If using file driver: +tail -f storage/logs/laravel.log & +# Make login attempt +# Check if session file is created and contains auth data: +cat storage/framework/sessions/* + +# 4. Test authentication in Tinker +php artisan tinker +>>> $user = User::first(); +>>> Auth::login($user); +>>> Auth::check(); # Should return true +>>> session()->all(); # Check session data +>>> session()->save(); # Manually save session +``` + +**Configuration Files to Check:** + +1. **config/auth.php** + ```php + 'defaults' => [ + 'guard' => 'web', // Verify this matches your usage + 'passwords' => 'users', + ], + + 'guards' => [ + 'web' => [ + 'driver' => 'session', + 'provider' => 'users', + ], + ], + + 'providers' => [ + 'users' => [ + 'driver' => 'eloquent', + 'model' => App\Models\User::class, // Verify model path + ], + ], + ``` + +2. **config/session.php** + ```php + 'driver' => env('SESSION_DRIVER', 'file'), + 'lifetime' => env('SESSION_LIFETIME', 120), + 'expire_on_close' => false, + 'encrypt' => false, + 'files' => storage_path('framework/sessions'), + 'connection' => env('SESSION_CONNECTION', null), + 'table' => 'sessions', + 'store' => env('SESSION_STORE', null), + 'lottery' => [2, 100], + 'cookie' => env('SESSION_COOKIE', Str::slug(env('APP_NAME', 'laravel'), '_').'_session'), + 'path' => '/', + 'domain' => env('SESSION_DOMAIN', null), // Should be NULL for localhost + 'secure' => env('SESSION_SECURE_COOKIE', false), // FALSE for HTTP + 'http_only' => true, + 'same_site' => 'lax', // NOT 'strict' + ``` + +3. **Verify LoginController redirect logic:** + ```php + // Typical Laravel LoginController + protected $redirectTo = '/dashboard'; // NOT '/login'! + + // Or method: + protected function redirectTo() { + return '/dashboard'; // Verify this route exists and is accessible + } + + // Check authenticated() method isn't causing issues: + protected function authenticated(Request $request, $user) { + // Should NOT return redirect to login + Log::info('User authenticated: ' . $user->id); + } + ``` + +4. **Check middleware in routes:** + ```php + // routes/web.php + Route::middleware(['auth'])->group(function () { + Route::get('/dashboard', [DashboardController::class, 'index']); + }); + + // Verify 'auth' middleware is defined in Kernel.php + // and uses the correct guard + ``` + +**Testing Methodology:** + +1. **Isolate the problem:** + ```bash + # Create a minimal test route + Route::get('/test-auth', function () { + Auth::login(User::first()); + return [ + 'authenticated' => Auth::check(), + 'user_id' => Auth::id(), + 'session_id' => session()->getId(), + 'session_data' => session()->all(), + ]; + }); + ``` + +2. **Test session persistence separately:** + ```bash + Route::get('/test-session-write', function () { + session(['test_key' => 'test_value_' . time()]); + return 'Session written: ' . session('test_key'); + }); + + Route::get('/test-session-read', function () { + return 'Session read: ' . session('test_key', 'NOT FOUND'); + }); + ``` + +3. **Test authentication without redirect:** + ```bash + Route::post('/test-login', function (Request $request) { + $credentials = $request->only('email', 'password'); + + if (Auth::attempt($credentials)) { + return [ + 'status' => 'success', + 'user' => Auth::user()->only(['id', 'email']), + 'session_id' => session()->getId(), + ]; + } + + return ['status' => 'failed']; + }); + ``` + +**Critical Checklist Before Multi-tenancy:** + +- [ ] Session driver works correctly (can write and read session data) +- [ ] CSRF protection works (no 419 errors) +- [ ] Auth::attempt() returns true for valid credentials +- [ ] Auth::check() returns true immediately after Auth::attempt() +- [ ] Session persists across requests (test with simple session()->put/get) +- [ ] User can access protected routes after authentication +- [ ] No infinite redirect loops +- [ ] Login process completes in browser devtools Network tab (check for redirect chains) +- [ ] Session cookie is set and sent back with subsequent requests (check devtools Application/Storage) + +**DO NOT proceed with multi-tenancy until ALL checklist items pass.** + +### Debugging Tools + +```bash +# Enable debug mode +APP_DEBUG=true + +# Tail logs in real-time +tail -f storage/logs/laravel.log + +# Check Redis connection (if using Redis sessions) +redis-cli ping + +# Check MySQL connection +php artisan tinker +>>> DB::connection()->getPdo(); + +# Dump session driver configuration +php artisan tinker +>>> config('session.driver'); +>>> config('session.files'); +>>> config('session.connection'); + +# Test file permissions +ls -la storage/framework/sessions/ +# Should be writable by web server user +``` + +### Next Steps After Resolving Authentication + +1. Document the exact fix that resolved the issue +2. Create test cases to prevent regression +3. Only then begin multi-tenancy implementation +4. Add monitoring/logging to detect authentication issues early + +--- + +## Development Workflow + +### Development Environments +The project uses multiple environments for safe deployment: + +1. **Local Development** (`localhost`) + - Docker Compose for local stack + - Hot reload enabled + - Debug mode on + +2. **Staging Environment** (`staging.growuppro.com.br`) + - Production-like environment + - Deployed from `staging` branch + - Used for testing before production + - Same infrastructure as production + +3. **Production Environment** (`growuppro.com.br`) + - Live environment + - Deployed from `main` branch + - Zero-downtime deployments + +### Local Development +1. Clone repository +2. Copy `.env.example` to `.env` and configure +3. Run `docker-compose up -d` +4. Access: `http://localhost` or configured local domain +5. Create test tenants: `php artisan tenants:create` + +### Making Changes +1. **Never modify Krayin core** - extend via Laravel patterns +2. **Test with multiple tenants** - always verify isolation +3. **Follow PSR-12** coding standards (enforced by Pint) +4. **Run quality checks** before committing: + ```bash + make lint # Run PHPStan + Pint + make test # Run test suite + ``` +5. **Write tests** for new features (PHPUnit/Pest) +6. **Update translations** when adding UI text +7. **Document breaking changes** in pull requests +8. **Use pre-commit hooks** to catch issues early + +### Testing Strategy +- **Unit Tests**: Core business logic, services +- **Feature Tests**: Tenant isolation, API endpoints +- **Browser Tests**: Multi-tenant user flows (Dusk) +- **Database Tests**: Migration rollback/forward +- Test with at least 2-3 active tenants +- **CI/CD Integration**: All tests run automatically on push +- **Coverage Goal**: Minimum 70% code coverage + +### Deployment Process +1. **Create feature branch** from `main` +2. **Develop and test locally** +3. **Push to `staging` branch** for staging deployment +4. **Test on staging environment** (`staging.growuppro.com.br`) +5. **Create Pull Request** to `main` (after PR approval) +6. **Merge to `main`** - GitHub Actions runs automatically +7. **Monitor deployment** in Portainer +8. **Verify health checks** pass +9. **Test critical flows** on production +10. **Sentry** monitors for runtime errors + +## Common Tasks + +### Quick Development Commands (Makefile) +```bash +make dev # Start local development environment +make prod # Start production-like local environment +make test # Run test suite +make lint # Run PHPStan + Pint checks +make fix # Auto-fix code style issues +make deploy-staging # Deploy to staging +make deploy-prod # Deploy to production +make logs # Show application logs +make shell # Enter application container shell +make db-fresh # Fresh database with seeders +make tenant-create # Create a new demo tenant +``` + +### Creating a tenant-scoped feature +1. Create migration in `database/migrations/tenant/` +2. Run migrations: `php artisan tenants:migrate` +3. Create model (no special traits needed) +4. Add routes in `routes/tenant.php` +5. Build controller with tenant-aware logic + +### Adding a new translation +1. Edit `resources/lang/pt_BR/{file}.php` +2. Add translation key and Portuguese text +3. Use in Blade: `{{ __('messages.welcome') }}` +4. Test across different tenant contexts + +### Customizing tenant branding +1. Store settings in Tenant model (JSON or relations) +2. Load in middleware or service provider +3. Pass to views via view composer +4. Cache for performance: `tenant()->cache('branding')` + +### Updating Docker image +1. Modify `docker/Dockerfile` as needed +2. Test locally: `make build` or `docker-compose build app` +3. Push changes to GitHub +4. CI/CD handles the rest automatically + +### Creating demo tenants for testing +```bash +# Using artisan command +php artisan tenants:seed + +# Or via Makefile +make tenant-create + +# Specify tenant details +php artisan tenants:create \ + --domain=demo.growuppro.com.br \ + --name="Empresa Demo" \ + --email=admin@demo.com +``` + +### Managing code quality +```bash +# Run static analysis +./vendor/bin/phpstan analyse + +# Check code style +./vendor/bin/pint --test + +# Auto-fix code style +./vendor/bin/pint + +# Or use Makefile shortcuts +make lint # Check only +make fix # Auto-fix +``` + +### Setting up pre-commit hooks +```bash +# Install Husky (or similar) +npm install --save-dev husky + +# Initialize hooks +npx husky init + +# Add pre-commit hook +echo "make lint && make test" > .husky/pre-commit +chmod +x .husky/pre-commit +``` + +## Environment Variables + +### Required Variables +```env +# Application +APP_NAME="Growup Pro" +APP_ENV=production +APP_KEY=base64:... +APP_URL=https://growuppro.com.br +APP_LOCALE=pt_BR +APP_DEBUG=false + +# Database (Central) +DB_CONNECTION=mysql +DB_HOST=database +DB_PORT=3306 +DB_DATABASE=growuppro_central +DB_USERNAME=growuppro +DB_PASSWORD=secure_password + +# Tenancy +TENANCY_DATABASE_PREFIX=tenant_ +CENTRAL_DOMAINS=growuppro.com.br + +# Redis +REDIS_HOST=redis +REDIS_PASSWORD=null +REDIS_PORT=6379 + +# Cache & Queue +CACHE_DRIVER=redis +QUEUE_CONNECTION=redis +SESSION_DRIVER=redis + +# Sentry (Error Tracking) +SENTRY_LARAVEL_DSN=https://xxx@sentry.io/xxx +SENTRY_TRACES_SAMPLE_RATE=0.2 +SENTRY_PROFILES_SAMPLE_RATE=0.2 + +# Gitea Container Registry (or GitHub Container Registry as fallback) +REGISTRY_URL=gitea.yourdomain.com +REGISTRY_USERNAME=cauefaleiros +REGISTRY_PASSWORD=... # Or use token + +# GitHub Container Registry (GHCR) - if using as fallback +GHCR_TOKEN=ghp_... +GHCR_USERNAME=cauefaleiros +GHCR_IMAGE=ghcr.io/cauefaleiros/growup-pro + +# Portainer +PORTAINER_URL=https://148.230.76.122:9443 +PORTAINER_API_TOKEN=ptr_... +PORTAINER_STACK_ID=... + +# Cloudflare (Optional - for API integration) +CLOUDFLARE_API_TOKEN=... +CLOUDFLARE_ZONE_ID=... +``` + +## Admin Dashboard for Tenant Management + +The platform includes a comprehensive admin dashboard for managing tenants and monitoring platform health. + +### Dashboard Features + +**Tenant Management:** +- View all active tenants with key metrics +- Create/edit/delete tenant accounts +- Suspend or activate tenant access +- View tenant resource usage (storage, bandwidth, users) +- Manage tenant subscriptions and billing + +**Analytics & Monitoring:** +- Total active tenants count +- Growth metrics (new tenants per month) +- Resource utilization per tenant +- Most active tenants (by usage) +- Revenue tracking (if applicable) +- System health overview + +**Tenant Details View:** +- Company information and contact details +- Subdomain and custom domain settings +- User count and activity logs +- Storage usage and database size +- Last login and activity timestamps +- Custom branding settings (logo, colors) + +**Bulk Operations:** +- Bulk tenant creation via CSV import +- Batch notifications to multiple tenants +- Mass configuration updates +- Export tenant data for reporting + +**System Settings:** +- Default tenant configurations +- Resource limits and quotas +- Email templates for tenant communications +- Feature flags management +- Maintenance mode per tenant + +### Access Control +- Admin dashboard accessible only to super admins +- Route: `/admin` (protected by `SuperAdmin` middleware) +- Audit logs for all admin actions +- Two-factor authentication required + +### Implementation Notes +- Built with Filament Admin Panel (recommended) or custom Blade views +- Real-time updates using Livewire +- Caching for performance (tenant list, metrics) +- API endpoints for programmatic access +- Webhooks for tenant lifecycle events (created, suspended, deleted) + +## Notes for Gemini AI Assistant + +### Context Awareness +- This is **Growup Pro**, not Krayin - always use correct branding +- All text should be in **Portuguese (pt-BR)** when user-facing +- Consider **tenant context** in all suggestions +- Respect **Docker/Swarm constraints** in infrastructure suggestions + +### Code Suggestions +- Prefer extending over modifying Krayin core +- Ensure **tenant isolation** in all data operations +- Follow **Tenancy for Laravel best practices** +- Include proper **error handling** (tenant not found, DB connection issues) +- Suggest **Docker-compatible** solutions (env vars, volumes, etc.) +- Always consider **Sentry error tracking** when suggesting error handling +- Recommend **testable code** (dependency injection, mockable services) +- Suggest **code quality improvements** when reviewing code (PHPStan compliance) + +### Infrastructure Suggestions +- Consider **Docker Swarm** constraints (secrets, configs, networks) +- Suggest **zero-downtime** deployment strategies +- Include **health checks** in Docker configurations +- Recommend **scalable** solutions (horizontal scaling, load balancing) + +### Translation Reminders +- Always provide Portuguese translations for new strings +- Check existing translation files before adding new keys +- Maintain consistent terminology across the application + +## Quality Assurance & Best Practices + +### Code Quality Tools +The project enforces code quality through automated tools: + +**PHPStan (Static Analysis):** +- Level 5 minimum (configurable in `phpstan.neon`) +- Catches type errors, undefined variables, incorrect method calls +- Runs on every commit (pre-commit hook) +- Must pass before deployment + +**Laravel Pint (Code Formatter):** +- PSR-12 coding standard enforcement +- Automatic code formatting +- Consistent code style across the team +- Can auto-fix issues: `./vendor/bin/pint` + +**Pre-commit Hooks:** +- Automatically run before every commit +- Prevents committing code that doesn't pass quality checks +- Fast feedback loop for developers +- Configured via Husky or similar + +### Error Tracking with Sentry + +**Setup:** +```bash +composer require sentry/sentry-laravel +php artisan sentry:publish --dsn +``` + +**Features:** +- Real-time error notifications +- Complete stack traces with context +- User tracking (which tenant experienced the error) +- Performance monitoring +- Release tracking (know which deployment introduced bugs) + +**Configuration:** +```php +// config/sentry.php +'dsn' => env('SENTRY_LARAVEL_DSN'), +'environment' => env('APP_ENV'), +'traces_sample_rate' => 0.2, // 20% of requests +'profiles_sample_rate' => 0.2, +``` + +**Tenant Context:** +Always include tenant information in Sentry reports: +```php +\Sentry\configureScope(function (\Sentry\State\Scope $scope): void { + $scope->setTag('tenant_id', tenant('id')); + $scope->setContext('tenant', [ + 'name' => tenant('name'), + 'domain' => tenant('domain'), + ]); +}); +``` + +### Testing Standards +- **Coverage minimum**: 70% code coverage +- **Test pyramid**: More unit tests, fewer integration/feature tests +- **Tenant isolation tests**: Critical - must verify data doesn't leak +- **Performance tests**: Ensure queries are optimized (N+1 detection) +- **CI enforcement**: All tests must pass before merge + +## Resources & Documentation + +### Project Specific +- [Krayin CRM Docs](https://devdocs.krayincrm.com/) +- [Krayin GitHub](https://github.com/krayin/laravel-crm) +- [Tenancy for Laravel Docs](https://tenancyforlaravel.com/docs/v3/introduction) + +### Infrastructure +- [Docker Documentation](https://docs.docker.com/) +- [Docker Compose Reference](https://docs.docker.com/compose/compose-file/) +- [Docker Swarm Guide](https://docs.docker.com/engine/swarm/) +- [Portainer Documentation](https://docs.portainer.io/) +- [Portainer API Reference](https://docs.portainer.io/api/docs) + +### CI/CD +- [Gitea Actions Documentation](https://docs.gitea.com/usage/actions/overview) +- [Gitea Actions Quickstart](https://docs.gitea.com/usage/actions/quickstart) +- [act_runner Documentation](https://gitea.com/gitea/act_runner) +- [GitHub Actions (for compatibility reference)](https://docs.github.com/en/actions) +- [GitHub Container Registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry) +- [Docker Build Actions](https://github.com/docker/build-push-action) + +### Laravel & PHP +- [Laravel Documentation](https://laravel.com/docs) +- [Laravel Multi-tenancy Patterns](https://laravel-news.com/multi-tenancy) +- [PSR-12 Coding Standard](https://www.php-fig.org/psr/psr-12/) + +--- + +**Project**: Growup Pro +**Base**: Krayin Laravel CRM (Whitelabel) +**Current Phase**: Initial setup - multi-tenancy integration and Docker infrastructure +**Domain**: growuppro.com.br +**Language**: Portuguese (pt-BR) +**Deployment**: Docker Swarm + Portainer + GitHub Actions CI/CD diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..aa358e8 --- /dev/null +++ b/LICENSE @@ -0,0 +1,20 @@ +MIT License + +Copyright 2010-2025, Webkul Software + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..9751f9b --- /dev/null +++ b/README.md @@ -0,0 +1,137 @@ +

+Total Downloads +

+ +

+Total Downloads +Latest Stable Version +License +

+ + +![enter image description here](https://raw.githubusercontent.com/krayin/temp-media/master/dashboard.png) + +## Topics + +1. [Introduction](#introduction) +2. [Documentation](#documentation) +3. [Requirements](#requirements) +4. [Installation & Configuration](#installation-and-configuration) +4. [Docker Installation](https://devdocs.krayincrm.com/2.0/introduction/docker.html) +5. [License](#license) +6. [Security Vulnerabilities](#security-vulnerabilities) + +### Introduction + +[Krayin CRM](https://krayincrm.com) is a hand tailored CRM framework built on some of the hottest opensource technologies +such as [Laravel](https://laravel.com) (a [PHP](https://secure.php.net/) framework) and [Vue.js](https://vuejs.org) +a progressive Javascript framework. + +**Free & Opensource Laravel CRM solution for SMEs and Enterprises for complete customer lifecycle management.** + +**Read our documentation: [Krayin CRM Docs](https://devdocs.krayincrm.com/)** + +**We also have a forum for any type of concerns, feature requests, or discussions. Please visit: [Krayin CRM Forums](https://forums.krayincrm.com/)** + +# Visit our live [Demo](https://demo.krayincrm.com) + + + Chinese + + +It packs in lots of features that will allow your E-Commerce business to scale in no time: + +- Descriptive and Simple Admin Panel. +- Admin Dashboard. +- Custom Attributes. +- Built on Modular Approach. +- Email parsing via Sendgrid. +- Check out [these features and more](https://krayincrm.com/features/). + +**For Developers**: +Take advantage of two of the hottest frameworks used in this project -- Laravel and Vue.js -- both of which have been used in Krayin CRM. + +### Documentation + +#### Krayin Documentation [https://devdocs.krayincrm.com](https://devdocs.krayincrm.com) + +### Requirements + +- **SERVER**: Apache 2 or NGINX. +- **RAM**: 3 GB or higher. +- **PHP**: 8.1 or higher +- **For MySQL users**: 5.7.23 or higher. +- **For MariaDB users**: 10.2.7 or Higher. +- **Node**: 8.11.3 LTS or higher. +- **Composer**: 2.5 or higher + +### Installation and Configuration + +##### Execute these commands below, in order + +``` +composer create-project +``` + +- Find **.env** file in root directory and change the **APP_URL** param to your **domain**. + +- Also, Configure the **Mail** and **Database** parameters inside **.env** file. + +``` +php artisan krayin-crm:install +``` + +**To execute Krayin**: + +##### On server: + +Warning: Before going into production mode we recommend you uninstall developer dependencies. +In order to do that, run the command below: + +> composer install --no-dev + +``` +Open the specified entry point in your hosts file in your browser or make an entry in hosts file if not done. +``` + +##### On local: + +``` +php artisan route:clear +php artisan serve +``` + + +**How to log in as admin:** + +> _http(s)://example.com/admin/login_ + +``` +email:admin@example.com +password:admin123 +``` +### Krayin CRM Multi Tenant SaaS + +[Krayin CRM Multi Tenant SaaS](https://krayincrm.com/extensions/krayin-crm-multi-tenant-saas-extension/) Krayin Multitenant SaaS is a Laravel-based CRM solution that allows multiple businesses (tenants) to use a single application instance while keeping their data isolated and secure. + +![enter image description here](https://raw.githubusercontent.com/krayin/temp-media/master/krayin-saas.png) + +### WhatsApp CRM Integration + +[Krayin CRM WhatsApp](https://krayincrm.com/extensions/krayin-crm-whatsapp-extension/) Extension enables the store administrator to generate leads via their WhatsApp number. + +![enter image description here](https://raw.githubusercontent.com/krayin/temp-media/master/krayin-crm-whatsapp-integration.png) + +### VoIP CRM Integration + +[Krayin CRM VoIP](https://krayincrm.com/extensions/krayin-crm-voip/) extension allows the user to make Trunk calls over a broadband Internet connection and the user can also perform Inbound routes. + +![enter image description here](https://raw.githubusercontent.com/krayin/temp-media/master/krayin-voip.png) + +### License + +Krayin CRM is a fully open-source CRM framework which will always be free under the [MIT License](https://github.com/krayin/laravel-crm/blob/2.1/LICENSE). + +### Security Vulnerabilities + +Please don't disclose security vulnerabilities publicly. If you find any security vulnerability in Krayin CRM then please email us: sales@krayincrm.com. diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php new file mode 100644 index 0000000..8d5e390 --- /dev/null +++ b/app/Console/Kernel.php @@ -0,0 +1,27 @@ +command('inbound-emails:process')->everyFiveMinutes(); + } + + /** + * Register the commands for the application. + */ + protected function commands(): void + { + $this->load(__DIR__.'/Commands'); + + require base_path('routes/console.php'); + } +} diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php new file mode 100644 index 0000000..ba3d384 --- /dev/null +++ b/app/Exceptions/Handler.php @@ -0,0 +1,30 @@ + + */ + protected $dontFlash = [ + 'current_password', + 'password', + 'password_confirmation', + ]; + + /** + * Register the exception handling callbacks for the application. + */ + public function register(): void + { + $this->reportable(function (Throwable $e) { + // + }); + } +} diff --git a/app/Http/Controllers/Api/LeadController.php b/app/Http/Controllers/Api/LeadController.php new file mode 100644 index 0000000..1f6e7c7 --- /dev/null +++ b/app/Http/Controllers/Api/LeadController.php @@ -0,0 +1,156 @@ +validate([ + 'title' => 'required|string|max:255', + 'person_name' => 'required|string|max:255', + 'person_email' => 'nullable|email', + 'person_phone' => 'nullable|string', + 'lead_value' => 'nullable|numeric', + 'description' => 'nullable|string', + 'lead_pipeline_stage_id' => 'nullable|integer|exists:lead_pipeline_stages,id', // Nova validação + ]); + + // Inicia transação + DB::beginTransaction(); + + // 1. Busca ou cria a pessoa + $personId = null; + + if (!empty($validated['person_email'])) { + // Busca pessoa existente pelo email + $existingPerson = DB::table('persons') + ->where('emails', 'like', '%' . $validated['person_email'] . '%') + ->first(); + + if ($existingPerson) { + $personId = $existingPerson->id; + } + } + + // Se não encontrou pessoa, cria uma nova + if (!$personId) { + $personEmails = !empty($validated['person_email']) + ? json_encode([['value' => $validated['person_email'], 'label' => 'work']]) + : json_encode([]); + + $personPhones = !empty($validated['person_phone']) + ? json_encode([['value' => $validated['person_phone'], 'label' => 'work']]) + : json_encode([]); + + $personId = DB::table('persons')->insertGetId([ + 'name' => $validated['person_name'], + 'emails' => $personEmails, + 'contact_numbers' => $personPhones, + 'created_at' => now(), + 'updated_at' => now(), + ]); + } + + // 2. Cria o lead + $leadId = DB::table('leads')->insertGetId([ + 'title' => $validated['title'], + 'description' => $validated['description'] ?? '', + 'lead_value' => $validated['lead_value'] ?? 0, + 'status' => 1, + 'person_id' => $personId, + 'user_id' => 1, + 'lead_pipeline_id' => 1, + 'lead_pipeline_stage_id' => $validated['lead_pipeline_stage_id'] ?? 1, // Usa o valor enviado ou padrão (2) + 'lead_source_id' => 1, + 'lead_type_id' => 1, + 'expected_close_date' => null, + 'created_at' => now(), + 'updated_at' => now(), + ]); + + // Commit da transação + DB::commit(); + + // Busca o lead criado com a pessoa + $lead = DB::table('leads') + ->join('persons', 'leads.person_id', '=', 'persons.id') + ->where('leads.id', $leadId) + ->select('leads.*', 'persons.name as person_name', 'persons.emails as person_emails') + ->first(); + + return response()->json([ + 'success' => true, + 'message' => 'Lead criado com sucesso', + 'data' => [ + 'lead_id' => $lead->id, + 'title' => $lead->title, + 'person_id' => $personId, + 'person_name' => $lead->person_name, + 'lead_value' => $lead->lead_value, + 'lead_pipeline_stage_id' => $lead->lead_pipeline_stage_id, + ] + ], 201); + + } catch (\Illuminate\Validation\ValidationException $e) { + DB::rollBack(); + return response()->json([ + 'success' => false, + 'message' => 'Erro de validação', + 'errors' => $e->errors() + ], 422); + + } catch (\Exception $e) { + DB::rollBack(); + + \Log::error('Erro ao criar lead via API', [ + 'message' => $e->getMessage(), + 'line' => $e->getLine(), + 'file' => $e->getFile(), + ]); + + return response()->json([ + 'success' => false, + 'message' => 'Erro ao criar lead', + 'error' => $e->getMessage(), + ], 500); + } + } + + public function index() + { + try { + $leads = DB::table('leads') + ->join('persons', 'leads.person_id', '=', 'persons.id') + ->select( + 'leads.id', + 'leads.title', + 'leads.lead_value', + 'leads.created_at', + 'persons.name as person_name', + 'persons.emails as person_emails' + ) + ->orderBy('leads.created_at', 'desc') + ->limit(50) + ->get(); + + return response()->json([ + 'success' => true, + 'count' => $leads->count(), + 'data' => $leads + ], 200); + + } catch (\Exception $e) { + return response()->json([ + 'success' => false, + 'message' => 'Erro ao listar leads: ' . $e->getMessage() + ], 500); + } + } +} diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php new file mode 100644 index 0000000..a0a2a8a --- /dev/null +++ b/app/Http/Controllers/Controller.php @@ -0,0 +1,13 @@ +email === 'admin@example.com') { + return redirect()->route('super-admin.tenants.index'); + } + return view('super-admin.session.login'); + } + + public function store(Request $request) + { + $credentials = $request->validate([ + 'email' => ['required', 'email'], + 'password' => ['required'], + ]); + + if (Auth::attempt($credentials)) { + $request->session()->regenerate(); + + if (Auth::user()->email !== 'admin@example.com') { + Auth::logout(); + return back()->withErrors([ + 'email' => 'Unauthorized access.', + ]); + } + + return redirect()->route('super-admin.tenants.index'); + } + + return back()->withErrors([ + 'email' => 'The provided credentials do not match our records.', + ]); + } + + public function destroy(Request $request) + { + Auth::logout(); + $request->session()->invalidate(); + $request->session()->regenerateToken(); + return redirect()->route('super-admin.session.create'); + } +} diff --git a/app/Http/Controllers/SuperAdmin/TenantController.php b/app/Http/Controllers/SuperAdmin/TenantController.php new file mode 100644 index 0000000..431d7b2 --- /dev/null +++ b/app/Http/Controllers/SuperAdmin/TenantController.php @@ -0,0 +1,52 @@ +validate([ + 'id' => 'required|string|unique:mysql.tenants', + 'domain' => 'required|string|unique:mysql.domains,domain', + ]); + + $tenant = Tenant::create([ + 'id' => $validated['id'], + 'last_updated_by' => Auth::user()->name ?? 'Super Admin', + ]); + + $tenant->domains()->create([ + 'domain' => $validated['domain'], + ]); + + return redirect()->route('super-admin.tenants.index') + ->with('success', 'Tenant created successfully.'); + } + + public function destroy($id) + { + $tenant = Tenant::findOrFail($id); + $tenant->delete(); + + return redirect()->route('super-admin.tenants.index') + ->with('success', 'Tenant deleted successfully.'); + } +} diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php new file mode 100644 index 0000000..fe8013b --- /dev/null +++ b/app/Http/Kernel.php @@ -0,0 +1,69 @@ + [ + \App\Http\Middleware\UniversalTenancy::class, + \App\Http\Middleware\EncryptCookies::class, + \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, + \Illuminate\Session\Middleware\StartSession::class, + // \Illuminate\Session\Middleware\AuthenticateSession::class, + \Illuminate\View\Middleware\ShareErrorsFromSession::class, + \App\Http\Middleware\VerifyCsrfToken::class, + \Illuminate\Routing\Middleware\SubstituteBindings::class, + ], + + 'api' => [ + \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, + 'throttle:api', + \Illuminate\Routing\Middleware\SubstituteBindings::class, + ], + ]; + + /** + * The application's route middleware. + * + * These middleware may be assigned to groups or used individually. + * + * @var array + */ + protected $routeMiddleware = [ + 'auth' => \App\Http\Middleware\Authenticate::class, + 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, + 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, + 'can' => \Illuminate\Auth\Middleware\Authorize::class, + 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, + 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, + 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, + 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, + 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, + 'super_admin' => \App\Http\Middleware\SuperAdminMiddleware::class, + ]; +} \ No newline at end of file diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php new file mode 100644 index 0000000..704089a --- /dev/null +++ b/app/Http/Middleware/Authenticate.php @@ -0,0 +1,21 @@ +expectsJson()) { + return route('login'); + } + } +} diff --git a/app/Http/Middleware/EncryptCookies.php b/app/Http/Middleware/EncryptCookies.php new file mode 100644 index 0000000..607561a --- /dev/null +++ b/app/Http/Middleware/EncryptCookies.php @@ -0,0 +1,17 @@ +check()) { + return redirect(RouteServiceProvider::HOME); + } + } + + return $next($request); + } +} diff --git a/app/Http/Middleware/SuperAdminMiddleware.php b/app/Http/Middleware/SuperAdminMiddleware.php new file mode 100644 index 0000000..b152766 --- /dev/null +++ b/app/Http/Middleware/SuperAdminMiddleware.php @@ -0,0 +1,19 @@ +email === 'admin@example.com') { + return $next($request); + } + + return redirect()->route('super-admin.session.create'); + } +} diff --git a/app/Http/Middleware/TrimStrings.php b/app/Http/Middleware/TrimStrings.php new file mode 100644 index 0000000..a8a252d --- /dev/null +++ b/app/Http/Middleware/TrimStrings.php @@ -0,0 +1,19 @@ +allSubdomainsOfApplicationUrl(), + ]; + } +} diff --git a/app/Http/Middleware/TrustProxies.php b/app/Http/Middleware/TrustProxies.php new file mode 100644 index 0000000..6bc81d9 --- /dev/null +++ b/app/Http/Middleware/TrustProxies.php @@ -0,0 +1,13 @@ +getHost(), config('tenancy.central_domains'))) { + // It's a central domain, skip tenancy initialization + return $next($request); + } + + // It's a tenant domain, proceed with standard initialization + return parent::handle($request, $next); + } +} diff --git a/app/Http/Middleware/VerifyCsrfToken.php b/app/Http/Middleware/VerifyCsrfToken.php new file mode 100644 index 0000000..788d6bd --- /dev/null +++ b/app/Http/Middleware/VerifyCsrfToken.php @@ -0,0 +1,18 @@ + 'datetime', + ]; +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php new file mode 100644 index 0000000..637878d --- /dev/null +++ b/app/Providers/AppServiceProvider.php @@ -0,0 +1,59 @@ +overrideCoreConfigDefaults(); + } + + protected function overrideCoreConfigDefaults() + { + $config = config('core_config'); + + if (!$config) { + return; + } + + // Filter out the 'general.settings' item + $config = array_values(array_filter($config, function ($item) { + return !isset($item['key']) || $item['key'] !== 'general.settings'; + })); + + foreach ($config as &$item) { + if (isset($item['key']) && $item['key'] === 'general.general.locale_settings') { + if (isset($item['fields'])) { + foreach ($item['fields'] as &$field) { + if (isset($field['name']) && $field['name'] === 'locale') { + $field['default'] = 'pt_BR'; + } + } + } + } + } + + config(['core_config' => $config]); + } +} diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php new file mode 100644 index 0000000..54756cd --- /dev/null +++ b/app/Providers/AuthServiceProvider.php @@ -0,0 +1,26 @@ + + */ + protected $policies = [ + // + ]; + + /** + * Register any authentication / authorization services. + */ + public function boot(): void + { + // + } +} diff --git a/app/Providers/BroadcastServiceProvider.php b/app/Providers/BroadcastServiceProvider.php new file mode 100644 index 0000000..2be04f5 --- /dev/null +++ b/app/Providers/BroadcastServiceProvider.php @@ -0,0 +1,19 @@ +> + */ + protected $listen = [ + Registered::class => [ + SendEmailVerificationNotification::class, + ], + ]; + + /** + * Register any events for your application. + */ + public function boot(): void + { + // + } + + /** + * Determine if events and listeners should be automatically discovered. + */ + public function shouldDiscoverEvents(): bool + { + return false; + } +} diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php new file mode 100644 index 0000000..1cf5f15 --- /dev/null +++ b/app/Providers/RouteServiceProvider.php @@ -0,0 +1,40 @@ +by($request->user()?->id ?: $request->ip()); + }); + + $this->routes(function () { + Route::middleware('api') + ->prefix('api') + ->group(base_path('routes/api.php')); + + Route::middleware('web') + ->group(base_path('routes/web.php')); + }); + } +} diff --git a/app/Providers/TenancyServiceProvider.php b/app/Providers/TenancyServiceProvider.php new file mode 100644 index 0000000..2cb93fc --- /dev/null +++ b/app/Providers/TenancyServiceProvider.php @@ -0,0 +1,151 @@ + [], + Events\TenantCreated::class => [ + JobPipeline::make([ + Jobs\CreateDatabase::class, + Jobs\MigrateDatabase::class, + Jobs\SeedDatabase::class, + + // Your own jobs to prepare the tenant. + // Provision API keys, create S3 buckets, anything you want! + + ])->send(function (Events\TenantCreated $event) { + return $event->tenant; + })->shouldBeQueued(false), // `false` by default, but you probably want to make this `true` for production. + ], + Events\SavingTenant::class => [], + Events\TenantSaved::class => [], + Events\UpdatingTenant::class => [], + Events\TenantUpdated::class => [], + Events\DeletingTenant::class => [], + Events\TenantDeleted::class => [ + JobPipeline::make([ + Jobs\DeleteDatabase::class, + ])->send(function (Events\TenantDeleted $event) { + return $event->tenant; + })->shouldBeQueued(false), // `false` by default, but you probably want to make this `true` for production. + ], + + // Domain events + Events\CreatingDomain::class => [], + Events\DomainCreated::class => [], + Events\SavingDomain::class => [], + Events\DomainSaved::class => [], + Events\UpdatingDomain::class => [], + Events\DomainUpdated::class => [], + Events\DeletingDomain::class => [], + Events\DomainDeleted::class => [], + + // Database events + Events\DatabaseCreated::class => [], + Events\DatabaseMigrated::class => [], + Events\DatabaseSeeded::class => [], + Events\DatabaseRolledBack::class => [], + Events\DatabaseDeleted::class => [], + + // Tenancy events + Events\InitializingTenancy::class => [], + Events\TenancyInitialized::class => [ + Listeners\BootstrapTenancy::class, + function (Events\TenancyInitialized $event) { + app()->setLocale('pt_BR'); + }, + ], + + Events\EndingTenancy::class => [], + Events\TenancyEnded::class => [ + Listeners\RevertToCentralContext::class, + ], + + Events\BootstrappingTenancy::class => [], + Events\TenancyBootstrapped::class => [], + Events\RevertingToCentralContext::class => [], + Events\RevertedToCentralContext::class => [], + + // Resource syncing + Events\SyncedResourceSaved::class => [ + Listeners\UpdateSyncedResource::class, + ], + + // Fired only when a synced resource is changed in a different DB than the origin DB (to avoid infinite loops) + Events\SyncedResourceChangedInForeignDatabase::class => [], + ]; + } + + public function register() + { + // + } + + public function boot() + { + $this->bootEvents(); + $this->mapRoutes(); + + $this->makeTenancyMiddlewareHighestPriority(); + } + + protected function bootEvents() + { + foreach ($this->events() as $event => $listeners) { + foreach ($listeners as $listener) { + if ($listener instanceof JobPipeline) { + $listener = $listener->toListener(); + } + + Event::listen($event, $listener); + } + } + } + + protected function mapRoutes() + { + $this->app->booted(function () { + if (file_exists(base_path('routes/tenant.php'))) { + Route::namespace(static::$controllerNamespace) + ->group(base_path('routes/tenant.php')); + } + }); + } + + protected function makeTenancyMiddlewareHighestPriority() + { + $tenancyMiddleware = [ + // Even higher priority than the initialization middleware + Middleware\PreventAccessFromCentralDomains::class, + + Middleware\InitializeTenancyByDomain::class, + Middleware\InitializeTenancyBySubdomain::class, + Middleware\InitializeTenancyByDomainOrSubdomain::class, + Middleware\InitializeTenancyByPath::class, + Middleware\InitializeTenancyByRequestData::class, + ]; + + foreach (array_reverse($tenancyMiddleware) as $middleware) { + $this->app[\Illuminate\Contracts\Http\Kernel::class]->prependToMiddlewarePriority($middleware); + } + } +} diff --git a/artisan b/artisan new file mode 100755 index 0000000..5c23e2e --- /dev/null +++ b/artisan @@ -0,0 +1,53 @@ +#!/usr/bin/env php +make(Illuminate\Contracts\Console\Kernel::class); + +$status = $kernel->handle( + $input = new Symfony\Component\Console\Input\ArgvInput, + new Symfony\Component\Console\Output\ConsoleOutput +); + +/* +|-------------------------------------------------------------------------- +| Shutdown The Application +|-------------------------------------------------------------------------- +| +| Once Artisan has finished running, we will fire off the shutdown events +| so that any final work may be done by the application before we shut +| down the process. This is the last thing to happen to the request. +| +*/ + +$kernel->terminate($input, $status); + +exit($status); diff --git a/bootstrap/app.php b/bootstrap/app.php new file mode 100755 index 0000000..037e17d --- /dev/null +++ b/bootstrap/app.php @@ -0,0 +1,55 @@ +singleton( + Illuminate\Contracts\Http\Kernel::class, + App\Http\Kernel::class +); + +$app->singleton( + Illuminate\Contracts\Console\Kernel::class, + App\Console\Kernel::class +); + +$app->singleton( + Illuminate\Contracts\Debug\ExceptionHandler::class, + App\Exceptions\Handler::class +); + +/* +|-------------------------------------------------------------------------- +| Return The Application +|-------------------------------------------------------------------------- +| +| This script returns the application instance. The instance is given to +| the calling script so we can separate the building of the instances +| from the actual running of the application and sending responses. +| +*/ + +return $app; diff --git a/bootstrap/cache/.gitignore b/bootstrap/cache/.gitignore new file mode 100755 index 0000000..d6b7ef3 --- /dev/null +++ b/bootstrap/cache/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..1e6ca36 --- /dev/null +++ b/build.sh @@ -0,0 +1,193 @@ +#!/bin/bash +set -e + +echo "🚀 Criando imagem Docker do Krayin..." + +# Criar pasta docker se não existir +mkdir -p docker + +# ======================================== +# NGINX CONFIG +# ======================================== +cat > docker/nginx.conf << 'NGINX_EOF' +server { + listen 80; + server_name _; + root /var/www/html/public; + + add_header X-Frame-Options "SAMEORIGIN"; + add_header X-Content-Type-Options "nosniff"; + + index index.php; + charset utf-8; + + location / { + try_files $uri $uri/ /index.php?$query_string; + } + + location = /favicon.ico { access_log off; log_not_found off; } + location = /robots.txt { access_log off; log_not_found off; } + + error_page 404 /index.php; + + location ~ \.php$ { + fastcgi_pass 127.0.0.1:9000; + fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; + include fastcgi_params; + } + + location ~ /\.(?!well-known).* { + deny all; + } +} +NGINX_EOF + +# ======================================== +# SUPERVISOR CONFIG +# ======================================== +cat > docker/supervisord.conf << 'SUPER_EOF' +[supervisord] +nodaemon=true +user=root + +[program:php-fpm] +command=/usr/local/sbin/php-fpm +autostart=true +autorestart=true +priority=5 +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 + +[program:nginx] +command=/usr/sbin/nginx -g "daemon off;" +autostart=true +autorestart=true +priority=10 +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +SUPER_EOF + +# ======================================== +# DOCKERIGNORE +# ======================================== +cat > .dockerignore << 'IGNORE_EOF' +.git +.gitignore +node_modules +storage/logs/* +storage/framework/cache/* +storage/framework/sessions/* +storage/framework/views/* +bootstrap/cache/* +.DS_Store +Thumbs.db +*.tar +*.tar.gz +IGNORE_EOF + +# ======================================== +# DOCKERFILE +# ======================================== +cat > Dockerfile << 'DOCKER_EOF' +FROM php:8.2-fpm + +# Instalar dependências +RUN apt-get update && apt-get install -y \ + git curl libpng-dev libonig-dev libxml2-dev \ + zip unzip libzip-dev nginx supervisor \ + && docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip calendar \ + && apt-get clean && rm -rf /var/lib/apt/lists/* + +# Instalar Composer +COPY --from=composer:latest /usr/bin/composer /usr/bin/composer + +WORKDIR /var/www/html + +# Copiar composer.json e composer.lock primeiro (cache layer) +COPY composer.json composer.lock ./ + +# Instalar dependências (isso vai rodar composer update se necessário) +RUN composer install --no-dev --no-scripts --no-interaction || \ + composer update --no-dev --no-scripts --no-interaction + +# Copiar todo o código +COPY . . + +# Rodar scripts do composer +RUN composer dump-autoload --optimize --no-dev + +# Ajustar permissões +RUN chown -R www-data:www-data /var/www/html \ + && chmod -R 755 /var/www/html/storage \ + && chmod -R 755 /var/www/html/bootstrap/cache + +# Copiar configurações +COPY docker/nginx.conf /etc/nginx/sites-available/default +COPY docker/supervisord.conf /etc/supervisor/conf.d/supervisord.conf + +# Script de inicialização +RUN echo '#!/bin/bash' > /start.sh && \ + echo 'php artisan config:cache' >> /start.sh && \ + echo 'php artisan route:cache' >> /start.sh && \ + echo 'php artisan view:cache' >> /start.sh && \ + echo 'exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf' >> /start.sh && \ + chmod +x /start.sh + +EXPOSE 80 + +CMD ["/start.sh"] +DOCKER_EOF + +echo "" +echo "✅ Arquivos de configuração criados!" +echo "" + +# ======================================== +# BUILD +# ======================================== +echo "🔨 Construindo imagem Docker..." +if docker build -t growup:latest .; then + echo "" + echo "✅ Imagem construída com sucesso!" + echo "" + + # ======================================== + # SAVE + # ======================================== + echo "💾 Salvando imagem em arquivo..." + if docker save growup:latest -o growup-latest.tar; then + echo "" + echo "================================================" + echo "✅ SUCESSO TOTAL!" + echo "================================================" + echo "" + echo "📦 Arquivo criado: growup-latest.tar" + echo "📊 Tamanho: $(du -h growup-latest.tar | cut -f1)" + echo "" + echo "🚀 PRÓXIMOS PASSOS:" + echo "" + echo "1️⃣ Transferir para o servidor:" + echo " scp growup-latest.tar usuario@servidor:/caminho/" + echo "" + echo "2️⃣ No servidor, carregar a imagem:" + echo " docker load -i growup-latest.tar" + echo "" + echo "3️⃣ No docker-compose.yml, use:" + echo " image: growup:latest" + echo "" + echo "================================================" + else + echo "❌ Erro ao salvar a imagem" + exit 1 + fi +else + echo "" + echo "❌ Erro ao construir a imagem" + echo "" + echo "💡 DICA: Verifique se você está na pasta raiz do projeto Krayin" + exit 1 +fi diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..18bdb1a --- /dev/null +++ b/composer.json @@ -0,0 +1,110 @@ +{ + "name": "krayin/laravel-crm", + "type": "project", + "description": "Krayin CRM", + "keywords": [ + "framework", + "laravel" + ], + "license": "MIT", + "require": { + "php": "^8.2", + "barryvdh/laravel-dompdf": "^2.0.0", + "diglactic/laravel-breadcrumbs": "^8.0", + "doctrine/dbal": "^3.0", + "enshrined/svg-sanitize": "^0.21.0", + "guzzlehttp/guzzle": "^7.0.1", + "khaled.alshamaa/ar-php": "^6.3", + "konekt/concord": "^1.10", + "laravel/framework": "^10.0", + "laravel/sanctum": "^3.2", + "laravel/tinker": "^2.5", + "laravel/ui": "^4.5", + "maatwebsite/excel": "^3.1", + "mpdf/mpdf": "^8.2", + "prettus/l5-repository": "^2.7.9", + "smalot/pdfparser": "^2.11", + "stancl/tenancy": "^3.8", + "webklex/laravel-imap": "^5.3" + }, + "require-dev": { + "barryvdh/laravel-debugbar": "^3.6", + "fakerphp/faker": "^1.9.1", + "krayin/krayin-package-generator": "dev-master", + "laravel/pint": "^1.16", + "laravel/sail": "^1.0.1", + "mockery/mockery": "^1.4.2", + "nunomaduro/collision": "^7.0", + "pestphp/pest": "^2.6", + "pestphp/pest-plugin-laravel": "^2.1", + "phpunit/phpunit": "^10.0", + "spatie/laravel-ignition": "^2.0" + }, + "config": { + "optimize-autoloader": true, + "preferred-install": "dist", + "sort-packages": true, + "allow-plugins": { + "pestphp/pest-plugin": true + } + }, + "extra": { + "laravel": { + "dont-discover": [] + } + }, + "autoload": { + "psr-4": { + "App\\": "app/", + "Database\\Factories\\": "database/factories/", + "Database\\Seeders\\": "database/seeders/", + "Webkul\\Activity\\": "packages/Webkul/Activity/src", + "Webkul\\Admin\\": "packages/Webkul/Admin/src", + "Webkul\\Attribute\\": "packages/Webkul/Attribute/src", + "Webkul\\Contact\\": "packages/Webkul/Contact/src", + "Webkul\\Core\\": "packages/Webkul/Core/src", + "Webkul\\DataGrid\\": "packages/Webkul/DataGrid/src", + "Webkul\\DataTransfer\\": "packages/Webkul/DataTransfer/src", + "Webkul\\Email\\": "packages/Webkul/Email/src", + "Webkul\\EmailTemplate\\": "packages/Webkul/EmailTemplate/src", + "Webkul\\Marketing\\": "packages/Webkul/Marketing/src", + "Webkul\\Installer\\": "packages/Webkul/Installer/src", + "Webkul\\Lead\\": "packages/Webkul/Lead/src", + "Webkul\\Product\\": "packages/Webkul/Product/src", + "Webkul\\Quote\\": "packages/Webkul/Quote/src", + "Webkul\\Tag\\": "packages/Webkul/Tag/src", + "Webkul\\User\\": "packages/Webkul/User/src", + "Webkul\\Warehouse\\": "packages/Webkul/Warehouse/src", + "Webkul\\WebForm\\": "packages/Webkul/WebForm/src", + "Webkul\\Automation\\": "packages/Webkul/Automation/src" + } + }, + "autoload-dev": { + "psr-4": { + "Tests\\": "tests/" + } + }, + "repositories": [ + { + "type": "path", + "url": "packages/*/*", + "options": { + "symlink": true + } + } + ], + "minimum-stability": "stable", + "prefer-stable": true, + "scripts": { + "post-autoload-dump": [ + "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", + "@php artisan package:discover --ansi" + ], + "post-root-package-install": [ + "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" + ], + "post-create-project-cmd": [ + "@php artisan key:generate --ansi" + ] + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..ff3f83e --- /dev/null +++ b/composer.lock @@ -0,0 +1,11770 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "623afca672b2112feb8f9c4a5dc491ce", + "packages": [ + { + "name": "barryvdh/laravel-dompdf", + "version": "v2.2.0", + "source": { + "type": "git", + "url": "https://github.com/barryvdh/laravel-dompdf.git", + "reference": "c96f90c97666cebec154ca1ffb67afed372114d8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/barryvdh/laravel-dompdf/zipball/c96f90c97666cebec154ca1ffb67afed372114d8", + "reference": "c96f90c97666cebec154ca1ffb67afed372114d8", + "shasum": "" + }, + "require": { + "dompdf/dompdf": "^2.0.7", + "illuminate/support": "^6|^7|^8|^9|^10|^11", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "larastan/larastan": "^1.0|^2.7.0", + "orchestra/testbench": "^4|^5|^6|^7|^8|^9", + "phpro/grumphp": "^1 || ^2.5", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "PDF": "Barryvdh\\DomPDF\\Facade\\Pdf", + "Pdf": "Barryvdh\\DomPDF\\Facade\\Pdf" + }, + "providers": [ + "Barryvdh\\DomPDF\\ServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "psr-4": { + "Barryvdh\\DomPDF\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "A DOMPDF Wrapper for Laravel", + "keywords": [ + "dompdf", + "laravel", + "pdf" + ], + "support": { + "issues": "https://github.com/barryvdh/laravel-dompdf/issues", + "source": "https://github.com/barryvdh/laravel-dompdf/tree/v2.2.0" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2024-04-25T13:16:04+00:00" + }, + { + "name": "brick/math", + "version": "0.12.3", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/866551da34e9a618e64a819ee1e01c20d8a588ba", + "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^10.1", + "vimeo/psalm": "6.8.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Brick\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Arbitrary-precision arithmetic library", + "keywords": [ + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "bignumber", + "brick", + "decimal", + "integer", + "math", + "mathematics", + "rational" + ], + "support": { + "issues": "https://github.com/brick/math/issues", + "source": "https://github.com/brick/math/tree/0.12.3" + }, + "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + } + ], + "time": "2025-02-28T13:11:00+00:00" + }, + { + "name": "carbonphp/carbon-doctrine-types", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", + "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/99f76ffa36cce3b70a4a6abce41dba15ca2e84cb", + "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "doctrine/dbal": "<3.7.0 || >=4.0.0" + }, + "require-dev": { + "doctrine/dbal": "^3.7.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Types to use Carbon in Doctrine", + "keywords": [ + "carbon", + "date", + "datetime", + "doctrine", + "time" + ], + "support": { + "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/2.1.0" + }, + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2023-12-11T17:09:12+00:00" + }, + { + "name": "composer/pcre", + "version": "3.3.2", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<1.11.10" + }, + "require-dev": { + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", + "phpunit/phpunit": "^8 || ^9" + }, + "type": "library", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.3.2" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-11-12T16:29:46+00:00" + }, + { + "name": "composer/semver", + "version": "3.4.3", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.3" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-09-19T14:15:21+00:00" + }, + { + "name": "dflydev/dot-access-data", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3" + }, + "time": "2024-07-08T12:26:09+00:00" + }, + { + "name": "diglactic/laravel-breadcrumbs", + "version": "v8.1.1", + "source": { + "type": "git", + "url": "https://github.com/diglactic/laravel-breadcrumbs.git", + "reference": "f72a78eb3e26aea507d7888a65f15e5790864e21" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/diglactic/laravel-breadcrumbs/zipball/f72a78eb3e26aea507d7888a65f15e5790864e21", + "reference": "f72a78eb3e26aea507d7888a65f15e5790864e21", + "shasum": "" + }, + "require": { + "facade/ignition-contracts": "^1.0", + "laravel/framework": "^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "davejamesmiller/laravel-breadcrumbs": "*" + }, + "require-dev": { + "orchestra/testbench": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0", + "php-coveralls/php-coveralls": "^2.4", + "phpunit/phpunit": "^8.5 || ^9.5", + "spatie/phpunit-snapshot-assertions": "^2.2 || ^4.2" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Breadcrumbs": "Diglactic\\Breadcrumbs\\Breadcrumbs" + }, + "providers": [ + "Diglactic\\Breadcrumbs\\ServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Diglactic\\Breadcrumbs\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sheng Slogar", + "email": "sheng@diglactic.com", + "role": "Maintainer" + }, + { + "name": "Dave James Miller", + "email": "dave@davejamesmiller.com", + "role": "Original Creator" + } + ], + "description": "A simple Laravel-style way to create breadcrumbs.", + "homepage": "https://github.com/diglactic/laravel-breadcrumbs", + "keywords": [ + "laravel" + ], + "support": { + "issues": "https://github.com/diglactic/laravel-breadcrumbs/issues", + "source": "https://github.com/diglactic/laravel-breadcrumbs/tree/v8.1.1" + }, + "time": "2023-04-17T23:24:15+00:00" + }, + { + "name": "doctrine/cache", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb", + "shasum": "" + }, + "require": { + "php": "~7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/coding-standard": "^9", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "symfony/cache": "^4.4 || ^5.4 || ^6", + "symfony/var-exporter": "^4.4 || ^5.4 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", + "homepage": "https://www.doctrine-project.org/projects/cache.html", + "keywords": [ + "abstraction", + "apcu", + "cache", + "caching", + "couchdb", + "memcached", + "php", + "redis", + "xcache" + ], + "support": { + "issues": "https://github.com/doctrine/cache/issues", + "source": "https://github.com/doctrine/cache/tree/2.2.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", + "type": "tidelift" + } + ], + "time": "2022-05-20T20:07:39+00:00" + }, + { + "name": "doctrine/dbal", + "version": "3.9.4", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "ec16c82f20be1a7224e65ac67144a29199f87959" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/ec16c82f20be1a7224e65ac67144a29199f87959", + "reference": "ec16c82f20be1a7224e65ac67144a29199f87959", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2", + "doctrine/cache": "^1.11|^2.0", + "doctrine/deprecations": "^0.5.3|^1", + "doctrine/event-manager": "^1|^2", + "php": "^7.4 || ^8.0", + "psr/cache": "^1|^2|^3", + "psr/log": "^1|^2|^3" + }, + "require-dev": { + "doctrine/coding-standard": "12.0.0", + "fig/log-test": "^1", + "jetbrains/phpstorm-stubs": "2023.1", + "phpstan/phpstan": "2.1.1", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "9.6.22", + "slevomat/coding-standard": "8.13.1", + "squizlabs/php_codesniffer": "3.10.2", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/console": "^4.4|^5.4|^6.0|^7.0" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "bin": [ + "bin/doctrine-dbal" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\DBAL\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", + "homepage": "https://www.doctrine-project.org/projects/dbal.html", + "keywords": [ + "abstraction", + "database", + "db2", + "dbal", + "mariadb", + "mssql", + "mysql", + "oci8", + "oracle", + "pdo", + "pgsql", + "postgresql", + "queryobject", + "sasql", + "sql", + "sqlite", + "sqlserver", + "sqlsrv" + ], + "support": { + "issues": "https://github.com/doctrine/dbal/issues", + "source": "https://github.com/doctrine/dbal/tree/3.9.4" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", + "type": "tidelift" + } + ], + "time": "2025-01-16T08:28:55+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "1.1.4", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/31610dbb31faa98e6b5447b62340826f54fbc4e9", + "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^12", + "phpstan/phpstan": "1.4.10 || 2.0.3", + "phpstan/phpstan-phpunit": "^1.0 || ^2", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psr/log": "^1 || ^2 || ^3" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.4" + }, + "time": "2024-12-07T21:18:45+00:00" + }, + { + "name": "doctrine/event-manager", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/event-manager.git", + "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/b680156fa328f1dfd874fd48c7026c41570b9c6e", + "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "conflict": { + "doctrine/common": "<2.9" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.8.8", + "phpunit/phpunit": "^10.5", + "vimeo/psalm": "^5.24" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", + "homepage": "https://www.doctrine-project.org/projects/event-manager.html", + "keywords": [ + "event", + "event dispatcher", + "event manager", + "event system", + "events" + ], + "support": { + "issues": "https://github.com/doctrine/event-manager/issues", + "source": "https://github.com/doctrine/event-manager/tree/2.0.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", + "type": "tidelift" + } + ], + "time": "2024-05-22T20:47:39+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.0.10", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^11.0", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25 || ^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.10" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2024-02-18T20:23:39+00:00" + }, + { + "name": "doctrine/lexer", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2024-02-05T11:56:58+00:00" + }, + { + "name": "dompdf/dompdf", + "version": "v2.0.8", + "source": { + "type": "git", + "url": "https://github.com/dompdf/dompdf.git", + "reference": "c20247574601700e1f7c8dab39310fca1964dc52" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dompdf/dompdf/zipball/c20247574601700e1f7c8dab39310fca1964dc52", + "reference": "c20247574601700e1f7c8dab39310fca1964dc52", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "masterminds/html5": "^2.0", + "phenx/php-font-lib": ">=0.5.4 <1.0.0", + "phenx/php-svg-lib": ">=0.5.2 <1.0.0", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "ext-json": "*", + "ext-zip": "*", + "mockery/mockery": "^1.3", + "phpunit/phpunit": "^7.5 || ^8 || ^9", + "squizlabs/php_codesniffer": "^3.5" + }, + "suggest": { + "ext-gd": "Needed to process images", + "ext-gmagick": "Improves image processing performance", + "ext-imagick": "Improves image processing performance", + "ext-zlib": "Needed for pdf stream compression" + }, + "type": "library", + "autoload": { + "psr-4": { + "Dompdf\\": "src/" + }, + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1" + ], + "authors": [ + { + "name": "The Dompdf Community", + "homepage": "https://github.com/dompdf/dompdf/blob/master/AUTHORS.md" + } + ], + "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter", + "homepage": "https://github.com/dompdf/dompdf", + "support": { + "issues": "https://github.com/dompdf/dompdf/issues", + "source": "https://github.com/dompdf/dompdf/tree/v2.0.8" + }, + "time": "2024-04-29T13:06:17+00:00" + }, + { + "name": "dragonmantank/cron-expression", + "version": "v3.4.0", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "8c784d071debd117328803d86b2097615b457500" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/8c784d071debd117328803d86b2097615b457500", + "reference": "8c784d071debd117328803d86b2097615b457500", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0", + "webmozart/assert": "^1.0" + }, + "replace": { + "mtdowling/cron-expression": "^1.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.0", + "phpunit/phpunit": "^7.0|^8.0|^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "support": { + "issues": "https://github.com/dragonmantank/cron-expression/issues", + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.4.0" + }, + "funding": [ + { + "url": "https://github.com/dragonmantank", + "type": "github" + } + ], + "time": "2024-10-09T13:47:03+00:00" + }, + { + "name": "egulias/email-validator", + "version": "4.0.3", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "b115554301161fa21467629f1e1391c1936de517" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/b115554301161fa21467629f1e1391c1936de517", + "reference": "b115554301161fa21467629f1e1391c1936de517", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" + }, + "require-dev": { + "phpunit/phpunit": "^10.2", + "vimeo/psalm": "^5.12" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/4.0.3" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2024-12-27T00:36:43+00:00" + }, + { + "name": "enshrined/svg-sanitize", + "version": "0.21.0", + "source": { + "type": "git", + "url": "https://github.com/darylldoyle/svg-sanitizer.git", + "reference": "5e477468fac5c5ce933dce53af3e8e4e58dcccc9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/darylldoyle/svg-sanitizer/zipball/5e477468fac5c5ce933dce53af3e8e4e58dcccc9", + "reference": "5e477468fac5c5ce933dce53af3e8e4e58dcccc9", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.5 || ^8.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "enshrined\\svgSanitize\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Daryll Doyle", + "email": "daryll@enshrined.co.uk" + } + ], + "description": "An SVG sanitizer for PHP", + "support": { + "issues": "https://github.com/darylldoyle/svg-sanitizer/issues", + "source": "https://github.com/darylldoyle/svg-sanitizer/tree/0.21.0" + }, + "time": "2025-01-13T09:32:25+00:00" + }, + { + "name": "ezyang/htmlpurifier", + "version": "v4.18.0", + "source": { + "type": "git", + "url": "https://github.com/ezyang/htmlpurifier.git", + "reference": "cb56001e54359df7ae76dc522d08845dc741621b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/cb56001e54359df7ae76dc522d08845dc741621b", + "reference": "cb56001e54359df7ae76dc522d08845dc741621b", + "shasum": "" + }, + "require": { + "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + }, + "require-dev": { + "cerdic/css-tidy": "^1.7 || ^2.0", + "simpletest/simpletest": "dev-master" + }, + "suggest": { + "cerdic/css-tidy": "If you want to use the filter 'Filter.ExtractStyleBlocks'.", + "ext-bcmath": "Used for unit conversion and imagecrash protection", + "ext-iconv": "Converts text to and from non-UTF-8 encodings", + "ext-tidy": "Used for pretty-printing HTML" + }, + "type": "library", + "autoload": { + "files": [ + "library/HTMLPurifier.composer.php" + ], + "psr-0": { + "HTMLPurifier": "library/" + }, + "exclude-from-classmap": [ + "/library/HTMLPurifier/Language/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Edward Z. Yang", + "email": "admin@htmlpurifier.org", + "homepage": "http://ezyang.com" + } + ], + "description": "Standards compliant HTML filter written in PHP", + "homepage": "http://htmlpurifier.org/", + "keywords": [ + "html" + ], + "support": { + "issues": "https://github.com/ezyang/htmlpurifier/issues", + "source": "https://github.com/ezyang/htmlpurifier/tree/v4.18.0" + }, + "time": "2024-11-01T03:51:45+00:00" + }, + { + "name": "facade/ignition-contracts", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/facade/ignition-contracts.git", + "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/facade/ignition-contracts/zipball/3c921a1cdba35b68a7f0ccffc6dffc1995b18267", + "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^v2.15.8", + "phpunit/phpunit": "^9.3.11", + "vimeo/psalm": "^3.17.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Facade\\IgnitionContracts\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://flareapp.io", + "role": "Developer" + } + ], + "description": "Solution contracts for Ignition", + "homepage": "https://github.com/facade/ignition-contracts", + "keywords": [ + "contracts", + "flare", + "ignition" + ], + "support": { + "issues": "https://github.com/facade/ignition-contracts/issues", + "source": "https://github.com/facade/ignition-contracts/tree/1.0.2" + }, + "time": "2020-10-16T08:27:54+00:00" + }, + { + "name": "fruitcake/php-cors", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/fruitcake/php-cors.git", + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/3d158f36e7875e2f040f37bc0573956240a5a38b", + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "symfony/http-foundation": "^4.4|^5.4|^6|^7" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "Fruitcake\\Cors\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fruitcake", + "homepage": "https://fruitcake.nl" + }, + { + "name": "Barryvdh", + "email": "barryvdh@gmail.com" + } + ], + "description": "Cross-origin resource sharing library for the Symfony HttpFoundation", + "homepage": "https://github.com/fruitcake/php-cors", + "keywords": [ + "cors", + "laravel", + "symfony" + ], + "support": { + "issues": "https://github.com/fruitcake/php-cors/issues", + "source": "https://github.com/fruitcake/php-cors/tree/v1.3.0" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2023-10-12T05:21:21+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.1.3", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/3ba905c11371512af9d9bdd27d99b782216b6945", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:45:45+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.9.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0.3", + "guzzlehttp/psr7": "^2.7.0", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "guzzle/client-integration-tests": "3.0.2", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.9.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2024-07-24T11:22:20+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455", + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2024-10-17T10:06:22+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.7.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.7.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2024-07-18T11:15:46+00:00" + }, + { + "name": "guzzlehttp/uri-template", + "version": "v1.0.4", + "source": { + "type": "git", + "url": "https://github.com/guzzle/uri-template.git", + "reference": "30e286560c137526eccd4ce21b2de477ab0676d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/30e286560c137526eccd4ce21b2de477ab0676d2", + "reference": "30e286560c137526eccd4ce21b2de477ab0676d2", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.36 || ^9.6.15", + "uri-template/tests": "1.0.0" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\UriTemplate\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + } + ], + "description": "A polyfill class for uri_template of PHP", + "keywords": [ + "guzzlehttp", + "uri-template" + ], + "support": { + "issues": "https://github.com/guzzle/uri-template/issues", + "source": "https://github.com/guzzle/uri-template/tree/v1.0.4" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/uri-template", + "type": "tidelift" + } + ], + "time": "2025-02-03T10:55:03+00:00" + }, + { + "name": "khaled.alshamaa/ar-php", + "version": "v6.3.4", + "source": { + "type": "git", + "url": "https://github.com/khaled-alshamaa/ar-php.git", + "reference": "36550a0d805dc50fcede0132cd8b83c80fe1fd6c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/khaled-alshamaa/ar-php/zipball/36550a0d805dc50fcede0132cd8b83c80fe1fd6c", + "reference": "36550a0d805dc50fcede0132cd8b83c80fe1fd6c", + "shasum": "" + }, + "require": { + "ext-calendar": "*", + "ext-mbstring": "*", + "php": ">=5.6.0" + }, + "require-dev": { + "phpunit/phpunit": "9.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "ArPHP\\I18N\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0" + ], + "authors": [ + { + "name": "Khaled Al-Sham'aa", + "email": "khaled@ar-php.org", + "homepage": "http://www.ar-php.org", + "role": "Developer" + } + ], + "description": "Set of functionalities enable Arabic website developers to serve professional search, present and process Arabic content in PHP", + "homepage": "https://github.com/khaled-alshamaa/ar-php", + "keywords": [ + "arabic", + "arabic-calendar", + "arabic-glyphs", + "arabic-numbers", + "arabic-segments-identifier", + "arabic-sentiment", + "arabic-sql-query" + ], + "support": { + "issues": "https://github.com/khaled-alshamaa/ar-php/issues", + "source": "https://github.com/khaled-alshamaa/ar-php/tree/v6.3.4" + }, + "funding": [ + { + "url": "https://github.com/khaled-alshamaa", + "type": "github" + } + ], + "time": "2023-04-04T22:05:31+00:00" + }, + { + "name": "konekt/concord", + "version": "1.16.0", + "source": { + "type": "git", + "url": "https://github.com/artkonekt/concord.git", + "reference": "56d337f6ffc8534175c98b82071556a2d74f659c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/artkonekt/concord/zipball/56d337f6ffc8534175c98b82071556a2d74f659c", + "reference": "56d337f6ffc8534175c98b82071556a2d74f659c", + "shasum": "" + }, + "require": { + "illuminate/console": "^10.0|^11.0|^12.0", + "illuminate/support": "^10.0|^11.0|^12.0", + "konekt/enum": "^2.1|^3.0|^4.0", + "konekt/enum-eloquent": "^1.7", + "php": "^8.1" + }, + "require-dev": { + "orchestra/testbench": "^8.0|^9.0|^10.0", + "phpunit/phpunit": "9 - 11" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Helper": "Konekt\\Concord\\Facades\\Helper", + "Concord": "Konekt\\Concord\\Facades\\Concord" + }, + "providers": [ + "Konekt\\Concord\\ConcordServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/Support/functions.php" + ], + "psr-4": { + "Konekt\\Concord\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Attila Fulop", + "homepage": "https://github.com/fulopattila122" + } + ], + "description": "Concord is a Laravel Extension for building modular Laravel Applications", + "support": { + "issues": "https://github.com/artkonekt/concord", + "source": "https://github.com/artkonekt/concord/tree/1.16.0" + }, + "time": "2025-03-03T11:39:09+00:00" + }, + { + "name": "konekt/enum", + "version": "4.2.0", + "source": { + "type": "git", + "url": "https://github.com/artkonekt/enum.git", + "reference": "e3c723fc65e6c7bc901f022477a9e37f0f278bdb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/artkonekt/enum/zipball/e3c723fc65e6c7bc901f022477a9e37f0f278bdb", + "reference": "e3c723fc65e6c7bc901f022477a9e37f0f278bdb", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "autoload": { + "psr-4": { + "Konekt\\Enum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Attila Fulop", + "homepage": "https://github.com/fulopattila122" + } + ], + "description": "SPL inspired PHP enum class implementation", + "keywords": [ + "artkonekt", + "enum", + "konekt" + ], + "support": { + "issues": "https://github.com/artkonekt/enum/issues", + "source": "https://github.com/artkonekt/enum" + }, + "time": "2024-02-29T15:32:06+00:00" + }, + { + "name": "konekt/enum-eloquent", + "version": "1.10.0", + "source": { + "type": "git", + "url": "https://github.com/artkonekt/enum-eloquent.git", + "reference": "ebfbc29706c407eb98fdabd90c38501315d99ec7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/artkonekt/enum-eloquent/zipball/ebfbc29706c407eb98fdabd90c38501315d99ec7", + "reference": "ebfbc29706c407eb98fdabd90c38501315d99ec7", + "shasum": "" + }, + "require": { + "illuminate/database": "^8.75|9.*|10.*|11.*|12.*", + "konekt/enum": "^2.0.2 || ^3.0 | ^4.0", + "php": "^8.0" + }, + "require-dev": { + "illuminate/events": "^8.75|9.*|10.*|11.*|12.*", + "phpunit/phpunit": "9 - 11" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Konekt\\Enum\\Eloquent\\EnumServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Konekt\\Enum\\Eloquent\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Attila Fulop", + "homepage": "https://github.com/fulopattila122" + }, + { + "name": "Semyon Chetvertnyh", + "homepage": "https://github.com/semyonchetvertnyh" + }, + { + "name": "Mark Boessenkool", + "homepage": "https://github.com/TheM1984" + } + ], + "description": "Enum attribute casting for Eloquent models", + "keywords": [ + "artkonekt", + "eloquent", + "enum", + "konekt", + "laravel" + ], + "support": { + "issues": "https://github.com/artkonekt/enum-eloquent/issues", + "source": "https://github.com/artkonekt/enum-eloquent" + }, + "time": "2025-03-03T11:34:47+00:00" + }, + { + "name": "laravel/framework", + "version": "v10.48.29", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "8f7f9247cb8aad1a769d6b9815a6623d89b46b47" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/8f7f9247cb8aad1a769d6b9815a6623d89b46b47", + "reference": "8f7f9247cb8aad1a769d6b9815a6623d89b46b47", + "shasum": "" + }, + "require": { + "brick/math": "^0.9.3|^0.10.2|^0.11|^0.12", + "composer-runtime-api": "^2.2", + "doctrine/inflector": "^2.0.5", + "dragonmantank/cron-expression": "^3.3.2", + "egulias/email-validator": "^3.2.1|^4.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "ext-session": "*", + "ext-tokenizer": "*", + "fruitcake/php-cors": "^1.2", + "guzzlehttp/uri-template": "^1.0", + "laravel/prompts": "^0.1.9", + "laravel/serializable-closure": "^1.3", + "league/commonmark": "^2.2.1", + "league/flysystem": "^3.8.0", + "monolog/monolog": "^3.0", + "nesbot/carbon": "^2.67", + "nunomaduro/termwind": "^1.13", + "php": "^8.1", + "psr/container": "^1.1.1|^2.0.1", + "psr/log": "^1.0|^2.0|^3.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "ramsey/uuid": "^4.7", + "symfony/console": "^6.2", + "symfony/error-handler": "^6.2", + "symfony/finder": "^6.2", + "symfony/http-foundation": "^6.4", + "symfony/http-kernel": "^6.2", + "symfony/mailer": "^6.2", + "symfony/mime": "^6.2", + "symfony/process": "^6.2", + "symfony/routing": "^6.2", + "symfony/uid": "^6.2", + "symfony/var-dumper": "^6.2", + "tijsverkoyen/css-to-inline-styles": "^2.2.5", + "vlucas/phpdotenv": "^5.4.1", + "voku/portable-ascii": "^2.0" + }, + "conflict": { + "carbonphp/carbon-doctrine-types": ">=3.0", + "doctrine/dbal": ">=4.0", + "mockery/mockery": "1.6.8", + "phpunit/phpunit": ">=11.0.0", + "tightenco/collect": "<5.5.33" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/collections": "self.version", + "illuminate/conditionable": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/log": "self.version", + "illuminate/macroable": "self.version", + "illuminate/mail": "self.version", + "illuminate/notifications": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/process": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/testing": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version" + }, + "require-dev": { + "ably/ably-php": "^1.0", + "aws/aws-sdk-php": "^3.235.5", + "doctrine/dbal": "^3.5.1", + "ext-gmp": "*", + "fakerphp/faker": "^1.21", + "guzzlehttp/guzzle": "^7.5", + "league/flysystem-aws-s3-v3": "^3.0", + "league/flysystem-ftp": "^3.0", + "league/flysystem-path-prefixing": "^3.3", + "league/flysystem-read-only": "^3.3", + "league/flysystem-sftp-v3": "^3.0", + "mockery/mockery": "^1.5.1", + "nyholm/psr7": "^1.2", + "orchestra/testbench-core": "^8.23.4", + "pda/pheanstalk": "^4.0", + "phpstan/phpstan": "~1.11.11", + "phpunit/phpunit": "^10.0.7", + "predis/predis": "^2.0.2", + "symfony/cache": "^6.2", + "symfony/http-client": "^6.2.4", + "symfony/psr-http-message-bridge": "^2.0" + }, + "suggest": { + "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.235.5).", + "brianium/paratest": "Required to run tests in parallel (^6.0).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (^3.5.1).", + "ext-apcu": "Required to use the APC cache driver.", + "ext-fileinfo": "Required to use the Filesystem class.", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", + "ext-memcached": "Required to use the memcache cache driver.", + "ext-pcntl": "Required to use all features of the queue worker and console signal trapping.", + "ext-pdo": "Required to use all database features.", + "ext-posix": "Required to use all features of the queue worker.", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).", + "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", + "filp/whoops": "Required for friendly error pages in development (^2.14.3).", + "guzzlehttp/guzzle": "Required to use the HTTP Client and the ping methods on schedules (^7.5).", + "laravel/tinker": "Required to use the tinker console command (^2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.0).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.0).", + "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.3).", + "league/flysystem-read-only": "Required to use read-only disks (^3.3)", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.0).", + "mockery/mockery": "Required to use mocking (^1.5.1).", + "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).", + "phpunit/phpunit": "Required to use assertions and run tests (^9.5.8|^10.0.7).", + "predis/predis": "Required to use the predis connector (^2.0.2).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^6.2).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^6.2).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^6.2).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^6.2).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^6.2).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "10.x-dev" + } + }, + "autoload": { + "files": [ + "src/Illuminate/Collections/helpers.php", + "src/Illuminate/Events/functions.php", + "src/Illuminate/Filesystem/functions.php", + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/", + "Illuminate\\Support\\": [ + "src/Illuminate/Macroable/", + "src/Illuminate/Collections/", + "src/Illuminate/Conditionable/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "https://laravel.com", + "keywords": [ + "framework", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-03-12T14:42:01+00:00" + }, + { + "name": "laravel/prompts", + "version": "v0.1.25", + "source": { + "type": "git", + "url": "https://github.com/laravel/prompts.git", + "reference": "7b4029a84c37cb2725fc7f011586e2997040bc95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/prompts/zipball/7b4029a84c37cb2725fc7f011586e2997040bc95", + "reference": "7b4029a84c37cb2725fc7f011586e2997040bc95", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "illuminate/collections": "^10.0|^11.0", + "php": "^8.1", + "symfony/console": "^6.2|^7.0" + }, + "conflict": { + "illuminate/console": ">=10.17.0 <10.25.0", + "laravel/framework": ">=10.17.0 <10.25.0" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "pestphp/pest": "^2.3", + "phpstan/phpstan": "^1.11", + "phpstan/phpstan-mockery": "^1.1" + }, + "suggest": { + "ext-pcntl": "Required for the spinner to be animated." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.1.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Laravel\\Prompts\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Add beautiful and user-friendly forms to your command-line applications.", + "support": { + "issues": "https://github.com/laravel/prompts/issues", + "source": "https://github.com/laravel/prompts/tree/v0.1.25" + }, + "time": "2024-08-12T22:06:33+00:00" + }, + { + "name": "laravel/sanctum", + "version": "v3.3.3", + "source": { + "type": "git", + "url": "https://github.com/laravel/sanctum.git", + "reference": "8c104366459739f3ada0e994bcd3e6fd681ce3d5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sanctum/zipball/8c104366459739f3ada0e994bcd3e6fd681ce3d5", + "reference": "8c104366459739f3ada0e994bcd3e6fd681ce3d5", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/console": "^9.21|^10.0", + "illuminate/contracts": "^9.21|^10.0", + "illuminate/database": "^9.21|^10.0", + "illuminate/support": "^9.21|^10.0", + "php": "^8.0.2" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "orchestra/testbench": "^7.28.2|^8.8.3", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.6" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Sanctum\\SanctumServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sanctum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel Sanctum provides a featherweight authentication system for SPAs and simple APIs.", + "keywords": [ + "auth", + "laravel", + "sanctum" + ], + "support": { + "issues": "https://github.com/laravel/sanctum/issues", + "source": "https://github.com/laravel/sanctum" + }, + "time": "2023-12-19T18:44:48+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v1.3.7", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "4f48ade902b94323ca3be7646db16209ec76be3d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/4f48ade902b94323ca3be7646db16209ec76be3d", + "reference": "4f48ade902b94323ca3be7646db16209ec76be3d", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "illuminate/support": "^8.0|^9.0|^10.0|^11.0", + "nesbot/carbon": "^2.61|^3.0", + "pestphp/pest": "^1.21.3", + "phpstan/phpstan": "^1.8.2", + "symfony/var-dumper": "^5.4.11|^6.2.0|^7.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\SerializableClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" + } + ], + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "keywords": [ + "closure", + "laravel", + "serializable" + ], + "support": { + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" + }, + "time": "2024-11-14T18:34:49+00:00" + }, + { + "name": "laravel/tinker", + "version": "v2.10.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/tinker.git", + "reference": "22177cc71807d38f2810c6204d8f7183d88a57d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/tinker/zipball/22177cc71807d38f2810c6204d8f7183d88a57d3", + "reference": "22177cc71807d38f2810c6204d8f7183d88a57d3", + "shasum": "" + }, + "require": { + "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "php": "^7.2.5|^8.0", + "psy/psysh": "^0.11.1|^0.12.0", + "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0" + }, + "require-dev": { + "mockery/mockery": "~1.3.3|^1.4.2", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.5.8|^9.3.3|^10.0" + }, + "suggest": { + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0)." + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Tinker\\TinkerServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Tinker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Powerful REPL for the Laravel framework.", + "keywords": [ + "REPL", + "Tinker", + "laravel", + "psysh" + ], + "support": { + "issues": "https://github.com/laravel/tinker/issues", + "source": "https://github.com/laravel/tinker/tree/v2.10.1" + }, + "time": "2025-01-27T14:24:01+00:00" + }, + { + "name": "laravel/ui", + "version": "v4.6.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/ui.git", + "reference": "7d6ffa38d79f19c9b3e70a751a9af845e8f41d88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/ui/zipball/7d6ffa38d79f19c9b3e70a751a9af845e8f41d88", + "reference": "7d6ffa38d79f19c9b3e70a751a9af845e8f41d88", + "shasum": "" + }, + "require": { + "illuminate/console": "^9.21|^10.0|^11.0|^12.0", + "illuminate/filesystem": "^9.21|^10.0|^11.0|^12.0", + "illuminate/support": "^9.21|^10.0|^11.0|^12.0", + "illuminate/validation": "^9.21|^10.0|^11.0|^12.0", + "php": "^8.0", + "symfony/console": "^6.0|^7.0" + }, + "require-dev": { + "orchestra/testbench": "^7.35|^8.15|^9.0|^10.0", + "phpunit/phpunit": "^9.3|^10.4|^11.5" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Ui\\UiServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\Ui\\": "src/", + "Illuminate\\Foundation\\Auth\\": "auth-backend/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel UI utilities and presets.", + "keywords": [ + "laravel", + "ui" + ], + "support": { + "source": "https://github.com/laravel/ui/tree/v4.6.1" + }, + "time": "2025-01-28T15:15:29+00:00" + }, + { + "name": "league/commonmark", + "version": "2.7.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "10732241927d3971d28e7ea7b5712721fa2296ca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/10732241927d3971d28e7ea7b5712721fa2296ca", + "reference": "10732241927d3971d28e7ea7b5712721fa2296ca", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.31.1", + "commonmark/commonmark.js": "0.31.1", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0 | ^7.0", + "symfony/process": "^5.4 | ^6.0 | ^7.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0 || ^6.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", + "keywords": [ + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" + ], + "support": { + "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/commonmark", + "type": "tidelift" + } + ], + "time": "2025-07-20T12:47:49+00:00" + }, + { + "name": "league/config", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/config.git", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], + "support": { + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2022-12-11T20:36:23+00:00" + }, + { + "name": "league/flysystem", + "version": "3.29.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/edc1bb7c86fab0776c3287dbd19b5fa278347319", + "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319", + "shasum": "" + }, + "require": { + "league/flysystem-local": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "conflict": { + "async-aws/core": "<1.19.0", + "async-aws/s3": "<1.14.0", + "aws/aws-sdk-php": "3.209.31 || 3.210.0", + "guzzlehttp/guzzle": "<7.0", + "guzzlehttp/ringphp": "<1.1.1", + "phpseclib/phpseclib": "3.0.15", + "symfony/http-client": "<5.2" + }, + "require-dev": { + "async-aws/s3": "^1.5 || ^2.0", + "async-aws/simple-s3": "^1.1 || ^2.0", + "aws/aws-sdk-php": "^3.295.10", + "composer/semver": "^3.0", + "ext-fileinfo": "*", + "ext-ftp": "*", + "ext-mongodb": "^1.3", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.5", + "google/cloud-storage": "^1.23", + "guzzlehttp/psr7": "^2.6", + "microsoft/azure-storage-blob": "^1.1", + "mongodb/mongodb": "^1.2", + "phpseclib/phpseclib": "^3.0.36", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5.11|^10.0", + "sabre/dav": "^4.6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "File storage abstraction for PHP", + "keywords": [ + "WebDAV", + "aws", + "cloud", + "file", + "files", + "filesystem", + "filesystems", + "ftp", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/3.29.1" + }, + "time": "2024-10-08T08:58:34+00:00" + }, + { + "name": "league/flysystem-local", + "version": "3.29.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-local.git", + "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/e0e8d52ce4b2ed154148453d321e97c8e931bd27", + "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/flysystem": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\Local\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Local filesystem adapter for Flysystem.", + "keywords": [ + "Flysystem", + "file", + "files", + "filesystem", + "local" + ], + "support": { + "source": "https://github.com/thephpleague/flysystem-local/tree/3.29.0" + }, + "time": "2024-08-09T21:24:39+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.16.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2024-09-21T08:32:55+00:00" + }, + { + "name": "maatwebsite/excel", + "version": "3.1.64", + "source": { + "type": "git", + "url": "https://github.com/SpartnerNL/Laravel-Excel.git", + "reference": "e25d44a2d91da9179cd2d7fec952313548597a79" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/SpartnerNL/Laravel-Excel/zipball/e25d44a2d91da9179cd2d7fec952313548597a79", + "reference": "e25d44a2d91da9179cd2d7fec952313548597a79", + "shasum": "" + }, + "require": { + "composer/semver": "^3.3", + "ext-json": "*", + "illuminate/support": "5.8.*||^6.0||^7.0||^8.0||^9.0||^10.0||^11.0||^12.0", + "php": "^7.0||^8.0", + "phpoffice/phpspreadsheet": "^1.29.9", + "psr/simple-cache": "^1.0||^2.0||^3.0" + }, + "require-dev": { + "laravel/scout": "^7.0||^8.0||^9.0||^10.0", + "orchestra/testbench": "^6.0||^7.0||^8.0||^9.0||^10.0", + "predis/predis": "^1.1" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Excel": "Maatwebsite\\Excel\\Facades\\Excel" + }, + "providers": [ + "Maatwebsite\\Excel\\ExcelServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Maatwebsite\\Excel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Patrick Brouwers", + "email": "patrick@spartner.nl" + } + ], + "description": "Supercharged Excel exports and imports in Laravel", + "keywords": [ + "PHPExcel", + "batch", + "csv", + "excel", + "export", + "import", + "laravel", + "php", + "phpspreadsheet" + ], + "support": { + "issues": "https://github.com/SpartnerNL/Laravel-Excel/issues", + "source": "https://github.com/SpartnerNL/Laravel-Excel/tree/3.1.64" + }, + "funding": [ + { + "url": "https://laravel-excel.com/commercial-support", + "type": "custom" + }, + { + "url": "https://github.com/patrickbrouwers", + "type": "github" + } + ], + "time": "2025-02-24T11:12:50+00:00" + }, + { + "name": "maennchen/zipstream-php", + "version": "3.1.2", + "source": { + "type": "git", + "url": "https://github.com/maennchen/ZipStream-PHP.git", + "reference": "aeadcf5c412332eb426c0f9b4485f6accba2a99f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/aeadcf5c412332eb426c0f9b4485f6accba2a99f", + "reference": "aeadcf5c412332eb426c0f9b4485f6accba2a99f", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "ext-zlib": "*", + "php-64bit": "^8.2" + }, + "require-dev": { + "brianium/paratest": "^7.7", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.16", + "guzzlehttp/guzzle": "^7.5", + "mikey179/vfsstream": "^1.6", + "php-coveralls/php-coveralls": "^2.5", + "phpunit/phpunit": "^11.0", + "vimeo/psalm": "^6.0" + }, + "suggest": { + "guzzlehttp/psr7": "^2.4", + "psr/http-message": "^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZipStream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paul Duncan", + "email": "pabs@pablotron.org" + }, + { + "name": "Jonatan Männchen", + "email": "jonatan@maennchen.ch" + }, + { + "name": "Jesse Donat", + "email": "donatj@gmail.com" + }, + { + "name": "András Kolesár", + "email": "kolesar@kolesar.hu" + } + ], + "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.", + "keywords": [ + "stream", + "zip" + ], + "support": { + "issues": "https://github.com/maennchen/ZipStream-PHP/issues", + "source": "https://github.com/maennchen/ZipStream-PHP/tree/3.1.2" + }, + "funding": [ + { + "url": "https://github.com/maennchen", + "type": "github" + } + ], + "time": "2025-01-27T12:07:53+00:00" + }, + { + "name": "markbaker/complex", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPComplex.git", + "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/95c56caa1cf5c766ad6d65b6344b807c1e8405b9", + "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-master", + "phpcompatibility/php-compatibility": "^9.3", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "squizlabs/php_codesniffer": "^3.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "Complex\\": "classes/src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@lange.demon.co.uk" + } + ], + "description": "PHP Class for working with complex numbers", + "homepage": "https://github.com/MarkBaker/PHPComplex", + "keywords": [ + "complex", + "mathematics" + ], + "support": { + "issues": "https://github.com/MarkBaker/PHPComplex/issues", + "source": "https://github.com/MarkBaker/PHPComplex/tree/3.0.2" + }, + "time": "2022-12-06T16:21:08+00:00" + }, + { + "name": "markbaker/matrix", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPMatrix.git", + "reference": "728434227fe21be27ff6d86621a1b13107a2562c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/728434227fe21be27ff6d86621a1b13107a2562c", + "reference": "728434227fe21be27ff6d86621a1b13107a2562c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-master", + "phpcompatibility/php-compatibility": "^9.3", + "phpdocumentor/phpdocumentor": "2.*", + "phploc/phploc": "^4.0", + "phpmd/phpmd": "2.*", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "sebastian/phpcpd": "^4.0", + "squizlabs/php_codesniffer": "^3.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "Matrix\\": "classes/src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@demon-angel.eu" + } + ], + "description": "PHP Class for working with matrices", + "homepage": "https://github.com/MarkBaker/PHPMatrix", + "keywords": [ + "mathematics", + "matrix", + "vector" + ], + "support": { + "issues": "https://github.com/MarkBaker/PHPMatrix/issues", + "source": "https://github.com/MarkBaker/PHPMatrix/tree/3.0.1" + }, + "time": "2022-12-02T22:17:43+00:00" + }, + { + "name": "masterminds/html5", + "version": "2.9.0", + "source": { + "type": "git", + "url": "https://github.com/Masterminds/html5-php.git", + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Masterminds\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matt Butcher", + "email": "technosophos@gmail.com" + }, + { + "name": "Matt Farina", + "email": "matt@mattfarina.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + } + ], + "description": "An HTML5 parser and serializer.", + "homepage": "http://masterminds.github.io/html5-php", + "keywords": [ + "HTML5", + "dom", + "html", + "parser", + "querypath", + "serializer", + "xml" + ], + "support": { + "issues": "https://github.com/Masterminds/html5-php/issues", + "source": "https://github.com/Masterminds/html5-php/tree/2.9.0" + }, + "time": "2024-03-31T07:05:07+00:00" + }, + { + "name": "monolog/monolog", + "version": "3.8.1", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "aef6ee73a77a66e404dd6540934a9ef1b3c855b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/aef6ee73a77a66e404dd6540934a9ef1b3c855b4", + "reference": "aef6ee73a77a66e404dd6540934a9ef1b3c855b4", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "php-console/php-console": "^3.1.8", + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.17 || ^11.0.7", + "predis/predis": "^1.1 || ^2", + "rollbar/rollbar": "^4.0", + "ruflin/elastica": "^7 || ^8", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/3.8.1" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2024-12-05T17:15:07+00:00" + }, + { + "name": "mpdf/mpdf", + "version": "v8.2.5", + "source": { + "type": "git", + "url": "https://github.com/mpdf/mpdf.git", + "reference": "e175b05e3e00977b85feb96a8cccb174ac63621f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mpdf/mpdf/zipball/e175b05e3e00977b85feb96a8cccb174ac63621f", + "reference": "e175b05e3e00977b85feb96a8cccb174ac63621f", + "shasum": "" + }, + "require": { + "ext-gd": "*", + "ext-mbstring": "*", + "mpdf/psr-http-message-shim": "^1.0 || ^2.0", + "mpdf/psr-log-aware-trait": "^2.0 || ^3.0", + "myclabs/deep-copy": "^1.7", + "paragonie/random_compat": "^1.4|^2.0|^9.99.99", + "php": "^5.6 || ^7.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", + "psr/http-message": "^1.0 || ^2.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "setasign/fpdi": "^2.1" + }, + "require-dev": { + "mockery/mockery": "^1.3.0", + "mpdf/qrcode": "^1.1.0", + "squizlabs/php_codesniffer": "^3.5.0", + "tracy/tracy": "~2.5", + "yoast/phpunit-polyfills": "^1.0" + }, + "suggest": { + "ext-bcmath": "Needed for generation of some types of barcodes", + "ext-xml": "Needed mainly for SVG manipulation", + "ext-zlib": "Needed for compression of embedded resources, such as fonts" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Mpdf\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-only" + ], + "authors": [ + { + "name": "Matěj Humpál", + "role": "Developer, maintainer" + }, + { + "name": "Ian Back", + "role": "Developer (retired)" + } + ], + "description": "PHP library generating PDF files from UTF-8 encoded HTML", + "homepage": "https://mpdf.github.io", + "keywords": [ + "pdf", + "php", + "utf-8" + ], + "support": { + "docs": "https://mpdf.github.io", + "issues": "https://github.com/mpdf/mpdf/issues", + "source": "https://github.com/mpdf/mpdf" + }, + "funding": [ + { + "url": "https://www.paypal.me/mpdf", + "type": "custom" + } + ], + "time": "2024-11-18T15:30:42+00:00" + }, + { + "name": "mpdf/psr-http-message-shim", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/mpdf/psr-http-message-shim.git", + "reference": "f25a0153d645e234f9db42e5433b16d9b113920f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mpdf/psr-http-message-shim/zipball/f25a0153d645e234f9db42e5433b16d9b113920f", + "reference": "f25a0153d645e234f9db42e5433b16d9b113920f", + "shasum": "" + }, + "require": { + "psr/http-message": "^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Mpdf\\PsrHttpMessageShim\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Dorison", + "email": "mark@chromatichq.com" + }, + { + "name": "Kristofer Widholm", + "email": "kristofer@chromatichq.com" + }, + { + "name": "Nigel Cunningham", + "email": "nigel.cunningham@technocrat.com.au" + } + ], + "description": "Shim to allow support of different psr/message versions.", + "support": { + "issues": "https://github.com/mpdf/psr-http-message-shim/issues", + "source": "https://github.com/mpdf/psr-http-message-shim/tree/v2.0.1" + }, + "time": "2023-10-02T14:34:03+00:00" + }, + { + "name": "mpdf/psr-log-aware-trait", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/mpdf/psr-log-aware-trait.git", + "reference": "a633da6065e946cc491e1c962850344bb0bf3e78" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mpdf/psr-log-aware-trait/zipball/a633da6065e946cc491e1c962850344bb0bf3e78", + "reference": "a633da6065e946cc491e1c962850344bb0bf3e78", + "shasum": "" + }, + "require": { + "psr/log": "^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Mpdf\\PsrLogAwareTrait\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Dorison", + "email": "mark@chromatichq.com" + }, + { + "name": "Kristofer Widholm", + "email": "kristofer@chromatichq.com" + } + ], + "description": "Trait to allow support of different psr/log versions.", + "support": { + "issues": "https://github.com/mpdf/psr-log-aware-trait/issues", + "source": "https://github.com/mpdf/psr-log-aware-trait/tree/v3.0.0" + }, + "time": "2023-05-03T06:19:36+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.13.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "024473a478be9df5fdaca2c793f2232fe788e414" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/024473a478be9df5fdaca2c793f2232fe788e414", + "reference": "024473a478be9df5fdaca2c793f2232fe788e414", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.0" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2025-02-12T12:17:51+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.73.0", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon.git", + "reference": "9228ce90e1035ff2f0db84b40ec2e023ed802075" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/9228ce90e1035ff2f0db84b40ec2e023ed802075", + "reference": "9228ce90e1035ff2f0db84b40ec2e023ed802075", + "shasum": "" + }, + "require": { + "carbonphp/carbon-doctrine-types": "*", + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "psr/clock": "^1.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.1.4 || ^4.0", + "doctrine/orm": "^2.7 || ^3.0", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "ondrejmirtes/better-reflection": "<6", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.99 || ^1.7.14", + "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", + "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", + "squizlabs/php_codesniffer": "^3.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev", + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2025-01-08T20:10:23+00:00" + }, + { + "name": "nette/schema", + "version": "v1.3.2", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "da801d52f0354f70a638673c4a0f04e16529431d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/da801d52f0354f70a638673c4a0f04e16529431d", + "reference": "da801d52f0354f70a638673c4a0f04e16529431d", + "shasum": "" + }, + "require": { + "nette/utils": "^4.0", + "php": "8.1 - 8.4" + }, + "require-dev": { + "nette/tester": "^2.5.2", + "phpstan/phpstan-nette": "^1.0", + "tracy/tracy": "^2.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.3.2" + }, + "time": "2024-10-06T23:10:23+00:00" + }, + { + "name": "nette/utils", + "version": "v4.0.7", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "e67c4061eb40b9c113b218214e42cb5a0dda28f2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/e67c4061eb40b9c113b218214e42cb5a0dda28f2", + "reference": "e67c4061eb40b9c113b218214e42cb5a0dda28f2", + "shasum": "" + }, + "require": { + "php": "8.0 - 8.4" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "^2.5", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.0.7" + }, + "time": "2025-06-03T04:55:08+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.4.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "447a020a1f875a434d62f2a401f53b82a396e494" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/447a020a1f875a434d62f2a401f53b82a396e494", + "reference": "447a020a1f875a434d62f2a401f53b82a396e494", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.4.0" + }, + "time": "2024-12-30T11:07:19+00:00" + }, + { + "name": "nunomaduro/termwind", + "version": "v1.17.0", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/termwind.git", + "reference": "5369ef84d8142c1d87e4ec278711d4ece3cbf301" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/5369ef84d8142c1d87e4ec278711d4ece3cbf301", + "reference": "5369ef84d8142c1d87e4ec278711d4ece3cbf301", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.1", + "symfony/console": "^6.4.15" + }, + "require-dev": { + "illuminate/console": "^10.48.24", + "illuminate/support": "^10.48.24", + "laravel/pint": "^1.18.2", + "pestphp/pest": "^2.36.0", + "pestphp/pest-plugin-mock": "2.0.0", + "phpstan/phpstan": "^1.12.11", + "phpstan/phpstan-strict-rules": "^1.6.1", + "symfony/var-dumper": "^6.4.15", + "thecodingmachine/phpstan-strict-rules": "^1.0.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Termwind\\Laravel\\TermwindServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Termwind\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Its like Tailwind CSS, but for the console.", + "keywords": [ + "cli", + "console", + "css", + "package", + "php", + "style" + ], + "support": { + "issues": "https://github.com/nunomaduro/termwind/issues", + "source": "https://github.com/nunomaduro/termwind/tree/v1.17.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://github.com/xiCO2k", + "type": "github" + } + ], + "time": "2024-11-21T10:36:35+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.100", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", + "shasum": "" + }, + "require": { + "php": ">= 7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/random_compat/issues", + "source": "https://github.com/paragonie/random_compat" + }, + "time": "2020-10-15T08:29:30+00:00" + }, + { + "name": "phenx/php-font-lib", + "version": "0.5.6", + "source": { + "type": "git", + "url": "https://github.com/dompdf/php-font-lib.git", + "reference": "a1681e9793040740a405ac5b189275059e2a9863" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dompdf/php-font-lib/zipball/a1681e9793040740a405ac5b189275059e2a9863", + "reference": "a1681e9793040740a405ac5b189275059e2a9863", + "shasum": "" + }, + "require": { + "ext-mbstring": "*" + }, + "require-dev": { + "symfony/phpunit-bridge": "^3 || ^4 || ^5 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "FontLib\\": "src/FontLib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Fabien Ménager", + "email": "fabien.menager@gmail.com" + } + ], + "description": "A library to read, parse, export and make subsets of different types of font files.", + "homepage": "https://github.com/PhenX/php-font-lib", + "support": { + "issues": "https://github.com/dompdf/php-font-lib/issues", + "source": "https://github.com/dompdf/php-font-lib/tree/0.5.6" + }, + "time": "2024-01-29T14:45:26+00:00" + }, + { + "name": "phenx/php-svg-lib", + "version": "0.5.4", + "source": { + "type": "git", + "url": "https://github.com/dompdf/php-svg-lib.git", + "reference": "46b25da81613a9cf43c83b2a8c2c1bdab27df691" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dompdf/php-svg-lib/zipball/46b25da81613a9cf43c83b2a8c2c1bdab27df691", + "reference": "46b25da81613a9cf43c83b2a8c2c1bdab27df691", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^7.1 || ^8.0", + "sabberworm/php-css-parser": "^8.4" + }, + "require-dev": { + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Svg\\": "src/Svg" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Fabien Ménager", + "email": "fabien.menager@gmail.com" + } + ], + "description": "A library to read, parse and export to PDF SVG files.", + "homepage": "https://github.com/PhenX/php-svg-lib", + "support": { + "issues": "https://github.com/dompdf/php-svg-lib/issues", + "source": "https://github.com/dompdf/php-svg-lib/tree/0.5.4" + }, + "time": "2024-04-08T12:52:34+00:00" + }, + { + "name": "phpoffice/phpspreadsheet", + "version": "1.29.10", + "source": { + "type": "git", + "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", + "reference": "c80041b1628c4f18030407134fe88303661d4e4e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/c80041b1628c4f18030407134fe88303661d4e4e", + "reference": "c80041b1628c4f18030407134fe88303661d4e4e", + "shasum": "" + }, + "require": { + "composer/pcre": "^1||^2||^3", + "ext-ctype": "*", + "ext-dom": "*", + "ext-fileinfo": "*", + "ext-gd": "*", + "ext-iconv": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "ext-xml": "*", + "ext-xmlreader": "*", + "ext-xmlwriter": "*", + "ext-zip": "*", + "ext-zlib": "*", + "ezyang/htmlpurifier": "^4.15", + "maennchen/zipstream-php": "^2.1 || ^3.0", + "markbaker/complex": "^3.0", + "markbaker/matrix": "^3.0", + "php": "^7.4 || ^8.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/simple-cache": "^1.0 || ^2.0 || ^3.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-main", + "dompdf/dompdf": "^1.0 || ^2.0 || ^3.0", + "friendsofphp/php-cs-fixer": "^3.2", + "mitoteam/jpgraph": "^10.3", + "mpdf/mpdf": "^8.1.1", + "phpcompatibility/php-compatibility": "^9.3", + "phpstan/phpstan": "^1.1", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^8.5 || ^9.0", + "squizlabs/php_codesniffer": "^3.7", + "tecnickcom/tcpdf": "^6.5" + }, + "suggest": { + "dompdf/dompdf": "Option for rendering PDF with PDF Writer", + "ext-intl": "PHP Internationalization Functions", + "mitoteam/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", + "mpdf/mpdf": "Option for rendering PDF with PDF Writer", + "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer" + }, + "type": "library", + "autoload": { + "psr-4": { + "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maarten Balliauw", + "homepage": "https://blog.maartenballiauw.be" + }, + { + "name": "Mark Baker", + "homepage": "https://markbakeruk.net" + }, + { + "name": "Franck Lefevre", + "homepage": "https://rootslabs.net" + }, + { + "name": "Erik Tilt" + }, + { + "name": "Adrien Crivelli" + } + ], + "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine", + "homepage": "https://github.com/PHPOffice/PhpSpreadsheet", + "keywords": [ + "OpenXML", + "excel", + "gnumeric", + "ods", + "php", + "spreadsheet", + "xls", + "xlsx" + ], + "support": { + "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues", + "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.29.10" + }, + "time": "2025-02-08T02:56:14+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.3", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/e3fac8b24f56113f7cb96af14958c0dd16330f54", + "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:41:07+00:00" + }, + { + "name": "prettus/l5-repository", + "version": "2.10.1", + "source": { + "type": "git", + "url": "https://github.com/andersao/l5-repository.git", + "reference": "27835088f92f42d73cc7f4f98b9386ddba709dcf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/andersao/l5-repository/zipball/27835088f92f42d73cc7f4f98b9386ddba709dcf", + "reference": "27835088f92f42d73cc7f4f98b9386ddba709dcf", + "shasum": "" + }, + "require": { + "illuminate/config": "~5.0|~6.0|~7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/console": "~5.0|~6.0|~7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/database": "~5.0|~6.0|~7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/filesystem": "~5.0|~6.0|~7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/http": "~5.0|~6.0|~7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/pagination": "~5.0|~6.0|~7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/support": "~5.0|~6.0|~7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/validation": "~5.0|~6.0|~7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "prettus/laravel-validation": "~1.1|~1.2|~1.3|~1.4|~1.5|~1.6|~1.7" + }, + "suggest": { + "league/fractal": "Required to use the Fractal Presenter (0.12.*).", + "prettus/laravel-validation": "Required to provide easy validation with the repository (1.1.*)", + "robclancy/presenter": "Required to use the Presenter Model (1.3.*)" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Prettus\\Repository\\Providers\\RepositoryServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Prettus\\Repository\\": "src/Prettus/Repository/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anderson Andrade", + "email": "contato@andersonandra.de", + "homepage": "http://andersonandra.de", + "role": "Developer" + } + ], + "description": "Laravel 5|6|7|8|9|10|11|12 - Repositories to the database layer", + "homepage": "http://andersao.github.io/l5-repository", + "keywords": [ + "cache", + "eloquent", + "laravel", + "model", + "repository" + ], + "support": { + "docs": "http://andersao.github.io/l5-repository", + "email": "contato@andersonandra.de", + "issues": "https://github.com/andersao/l5-repository/issues", + "source": "https://github.com/andersao/l5-repository", + "wiki": "https://github.com/andersao/l5-repository" + }, + "time": "2025-03-10T11:13:50+00:00" + }, + { + "name": "prettus/laravel-validation", + "version": "1.7.0", + "source": { + "type": "git", + "url": "https://github.com/andersao/laravel-validator.git", + "reference": "fc6ecaaedb482767592eba2a4178792437c86bda" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/andersao/laravel-validator/zipball/fc6ecaaedb482767592eba2a4178792437c86bda", + "reference": "fc6ecaaedb482767592eba2a4178792437c86bda", + "shasum": "" + }, + "require": { + "illuminate/support": "~5.4|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/validation": "~5.4|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "php": ">=5.4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Prettus\\Validator\\": "src/Prettus/Validator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "authors": [ + { + "name": "Anderson Andrade", + "email": "contato@andersonandra.de", + "homepage": "http://andersonandra.de", + "role": "Developer" + } + ], + "description": "Laravel Validation Service", + "homepage": "http://andersao.github.io/laravel-validation", + "keywords": [ + "laravel", + "service", + "validation" + ], + "support": { + "docs": "http://andersao.github.io/laravel-validation", + "email": "contato@andersonandra.de", + "issues": "https://github.com/andersao/laravel-validation/issues", + "source": "https://github.com/andersao/laravel-validation", + "wiki": "https://github.com/andersao/laravel-validation" + }, + "time": "2025-03-07T18:33:05+00:00" + }, + { + "name": "psr/cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "time": "2021-02-03T23:26:27+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/log", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.2" + }, + "time": "2024-09-11T13:17:53+00:00" + }, + { + "name": "psr/simple-cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + }, + "time": "2021-10-29T13:26:27+00:00" + }, + { + "name": "psy/psysh", + "version": "v0.12.7", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "d73fa3c74918ef4522bb8a3bf9cab39161c4b57c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/d73fa3c74918ef4522bb8a3bf9cab39161c4b57c", + "reference": "d73fa3c74918ef4522bb8a3bf9cab39161c4b57c", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^5.0 || ^4.0", + "php": "^8.0 || ^7.4", + "symfony/console": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4" + }, + "conflict": { + "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2" + }, + "suggest": { + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-pdo-sqlite": "The doc command requires SQLite to work.", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": false, + "forward-command": false + }, + "branch-alias": { + "dev-main": "0.12.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "http://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "support": { + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/v0.12.7" + }, + "time": "2024-12-10T01:58:33+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "ramsey/collection", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "3c5990b8a5e0b79cd1cf11c2dc1229e58e93f109" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/3c5990b8a5e0b79cd1cf11c2dc1229e58e93f109", + "reference": "3c5990b8a5e0b79cd1cf11c2dc1229e58e93f109", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.45", + "fakerphp/faker": "^1.24", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^2.1", + "mockery/mockery": "^1.6", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.4", + "phpspec/prophecy-phpunit": "^2.3", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^10.5", + "ramsey/coding-standard": "^2.3", + "ramsey/conventional-commits": "^1.6", + "roave/security-advisories": "dev-latest" + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/2.1.0" + }, + "time": "2025-03-02T04:48:29+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.7.6", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", + "ext-json": "*", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.10", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.8", + "ergebnis/composer-normalize": "^2.15", + "mockery/mockery": "^1.3", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.2", + "php-mock/php-mock-mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^8.5 || ^9", + "ramsey/composer-repl": "^1.4", + "slevomat/coding-standard": "^8.4", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.9" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.7.6" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" + } + ], + "time": "2024-04-27T21:32:50+00:00" + }, + { + "name": "sabberworm/php-css-parser", + "version": "v8.7.0", + "source": { + "type": "git", + "url": "https://github.com/MyIntervals/PHP-CSS-Parser.git", + "reference": "f414ff953002a9b18e3a116f5e462c56f21237cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/f414ff953002a9b18e3a116f5e462c56f21237cf", + "reference": "f414ff953002a9b18e3a116f5e462c56f21237cf", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": "^5.6.20 || ^7.0.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + }, + "require-dev": { + "phpunit/phpunit": "5.7.27 || 6.5.14 || 7.5.20 || 8.5.40" + }, + "suggest": { + "ext-mbstring": "for parsing UTF-8 CSS" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "9.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Sabberworm\\CSS\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Raphael Schweikert" + }, + { + "name": "Oliver Klee", + "email": "github@oliverklee.de" + }, + { + "name": "Jake Hotson", + "email": "jake.github@qzdesign.co.uk" + } + ], + "description": "Parser for CSS Files written in PHP", + "homepage": "https://www.sabberworm.com/blog/2010/6/10/php-css-parser", + "keywords": [ + "css", + "parser", + "stylesheet" + ], + "support": { + "issues": "https://github.com/MyIntervals/PHP-CSS-Parser/issues", + "source": "https://github.com/MyIntervals/PHP-CSS-Parser/tree/v8.7.0" + }, + "time": "2024-10-27T17:38:32+00:00" + }, + { + "name": "setasign/fpdi", + "version": "v2.6.4", + "source": { + "type": "git", + "url": "https://github.com/Setasign/FPDI.git", + "reference": "4b53852fde2734ec6a07e458a085db627c60eada" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Setasign/FPDI/zipball/4b53852fde2734ec6a07e458a085db627c60eada", + "reference": "4b53852fde2734ec6a07e458a085db627c60eada", + "shasum": "" + }, + "require": { + "ext-zlib": "*", + "php": "^7.1 || ^8.0" + }, + "conflict": { + "setasign/tfpdf": "<1.31" + }, + "require-dev": { + "phpunit/phpunit": "^7", + "setasign/fpdf": "~1.8.6", + "setasign/tfpdf": "~1.33", + "squizlabs/php_codesniffer": "^3.5", + "tecnickcom/tcpdf": "^6.8" + }, + "suggest": { + "setasign/fpdf": "FPDI will extend this class but as it is also possible to use TCPDF or tFPDF as an alternative. There's no fixed dependency configured." + }, + "type": "library", + "autoload": { + "psr-4": { + "setasign\\Fpdi\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Slabon", + "email": "jan.slabon@setasign.com", + "homepage": "https://www.setasign.com" + }, + { + "name": "Maximilian Kresse", + "email": "maximilian.kresse@setasign.com", + "homepage": "https://www.setasign.com" + } + ], + "description": "FPDI is a collection of PHP classes facilitating developers to read pages from existing PDF documents and use them as templates in FPDF. Because it is also possible to use FPDI with TCPDF, there are no fixed dependencies defined. Please see suggestions for packages which evaluates the dependencies automatically.", + "homepage": "https://www.setasign.com/fpdi", + "keywords": [ + "fpdf", + "fpdi", + "pdf" + ], + "support": { + "issues": "https://github.com/Setasign/FPDI/issues", + "source": "https://github.com/Setasign/FPDI/tree/v2.6.4" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/setasign/fpdi", + "type": "tidelift" + } + ], + "time": "2025-08-05T09:57:14+00:00" + }, + { + "name": "smalot/pdfparser", + "version": "v2.11.0", + "source": { + "type": "git", + "url": "https://github.com/smalot/pdfparser.git", + "reference": "ac8e6678b0940e4b2ccd5caadd3fb18e68093be6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/smalot/pdfparser/zipball/ac8e6678b0940e4b2ccd5caadd3fb18e68093be6", + "reference": "ac8e6678b0940e4b2ccd5caadd3fb18e68093be6", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "ext-zlib": "*", + "php": ">=7.1", + "symfony/polyfill-mbstring": "^1.18" + }, + "type": "library", + "autoload": { + "psr-0": { + "Smalot\\PdfParser\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0" + ], + "authors": [ + { + "name": "Sebastien MALOT", + "email": "sebastien@malot.fr" + } + ], + "description": "Pdf parser library. Can read and extract information from pdf file.", + "homepage": "https://www.pdfparser.org", + "keywords": [ + "extract", + "parse", + "parser", + "pdf", + "text" + ], + "support": { + "issues": "https://github.com/smalot/pdfparser/issues", + "source": "https://github.com/smalot/pdfparser/tree/v2.11.0" + }, + "time": "2024-08-16T06:48:03+00:00" + }, + { + "name": "stancl/jobpipeline", + "version": "v1.8.1", + "source": { + "type": "git", + "url": "https://github.com/archtechx/jobpipeline.git", + "reference": "c4ba5ef04c99176eb000abb05fc81fb0f44f5d9c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/archtechx/jobpipeline/zipball/c4ba5ef04c99176eb000abb05fc81fb0f44f5d9c", + "reference": "c4ba5ef04c99176eb000abb05fc81fb0f44f5d9c", + "shasum": "" + }, + "require": { + "illuminate/support": "^10.0|^11.0|^12.0", + "php": "^8.0" + }, + "require-dev": { + "ext-redis": "*", + "orchestra/testbench": "^8.0|^9.0|^10.0", + "spatie/valuestore": "^1.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Stancl\\JobPipeline\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Samuel Štancl", + "email": "samuel.stancl@gmail.com" + } + ], + "description": "Turn any series of jobs into Laravel listeners.", + "support": { + "issues": "https://github.com/archtechx/jobpipeline/issues", + "source": "https://github.com/archtechx/jobpipeline/tree/v1.8.1" + }, + "time": "2025-07-29T20:21:17+00:00" + }, + { + "name": "stancl/tenancy", + "version": "v3.9.1", + "source": { + "type": "git", + "url": "https://github.com/archtechx/tenancy.git", + "reference": "d98a170fbd2e114604bfec3bc6267a3d6e02dec1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/archtechx/tenancy/zipball/d98a170fbd2e114604bfec3bc6267a3d6e02dec1", + "reference": "d98a170fbd2e114604bfec3bc6267a3d6e02dec1", + "shasum": "" + }, + "require": { + "ext-json": "*", + "facade/ignition-contracts": "^1.0.2", + "illuminate/support": "^10.0|^11.0|^12.0", + "php": "^8.0", + "ramsey/uuid": "^4.7.3", + "stancl/jobpipeline": "^1.8.0", + "stancl/virtualcolumn": "^1.5.0" + }, + "require-dev": { + "doctrine/dbal": "^3.6.0", + "laravel/framework": "^10.0|^11.0|^12.0", + "league/flysystem-aws-s3-v3": "^3.12.2", + "orchestra/testbench": "^8.0|^9.0|^10.0", + "spatie/valuestore": "^1.3.2" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Tenancy": "Stancl\\Tenancy\\Facades\\Tenancy", + "GlobalCache": "Stancl\\Tenancy\\Facades\\GlobalCache" + }, + "providers": [ + "Stancl\\Tenancy\\TenancyServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Stancl\\Tenancy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Samuel Štancl", + "email": "samuel.stancl@gmail.com" + } + ], + "description": "Automatic multi-tenancy for your Laravel application.", + "keywords": [ + "laravel", + "multi-database", + "multi-tenancy", + "tenancy" + ], + "support": { + "issues": "https://github.com/archtechx/tenancy/issues", + "source": "https://github.com/archtechx/tenancy/tree/v3.9.1" + }, + "funding": [ + { + "url": "https://tenancyforlaravel.com/donate", + "type": "custom" + }, + { + "url": "https://github.com/stancl", + "type": "github" + } + ], + "time": "2025-03-13T16:02:11+00:00" + }, + { + "name": "stancl/virtualcolumn", + "version": "v1.5.0", + "source": { + "type": "git", + "url": "https://github.com/archtechx/virtualcolumn.git", + "reference": "75718edcfeeb19abc1970f5395043f7d43cce5bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/archtechx/virtualcolumn/zipball/75718edcfeeb19abc1970f5395043f7d43cce5bc", + "reference": "75718edcfeeb19abc1970f5395043f7d43cce5bc", + "shasum": "" + }, + "require": { + "illuminate/database": ">=10.0", + "illuminate/support": ">=10.0" + }, + "require-dev": { + "orchestra/testbench": ">=8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Stancl\\VirtualColumn\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Samuel Štancl", + "email": "samuel.stancl@gmail.com" + } + ], + "description": "Eloquent virtual column.", + "support": { + "issues": "https://github.com/archtechx/virtualcolumn/issues", + "source": "https://github.com/archtechx/virtualcolumn/tree/v1.5.0" + }, + "time": "2025-02-25T13:12:44+00:00" + }, + { + "name": "symfony/console", + "version": "v6.4.17", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "799445db3f15768ecc382ac5699e6da0520a0a04" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/799445db3f15768ecc382ac5699e6da0520a0a04", + "reference": "799445db3f15768ecc382ac5699e6da0520a0a04", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^5.4|^6.0|^7.0" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/event-dispatcher": "<5.4", + "symfony/lock": "<5.4", + "symfony/process": "<5.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v6.4.17" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-07T12:07:30+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v7.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/601a5ce9aaad7bf10797e3663faefce9e26c24e2", + "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v7.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v6.4.19", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "3d4e55cd2b8f1979a65eba9ab749d6466c316f71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/3d4e55cd2b8f1979a65eba9ab749d6466c316f71", + "reference": "3d4e55cd2b8f1979a65eba9ab749d6466c316f71", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5", + "symfony/http-kernel": "<6.4" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/serializer": "^5.4|^6.0|^7.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v6.4.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-02-02T20:16:33+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v7.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/910c5db85a5356d0fea57680defec4e99eb9c8c1", + "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v7.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.5.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f", + "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.5-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, + { + "name": "symfony/finder", + "version": "v6.4.17", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "1d0e8266248c5d9ab6a87e3789e6dc482af3c9c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/1d0e8266248c5d9ab6a87e3789e6dc482af3c9c7", + "reference": "1d0e8266248c5d9ab6a87e3789e6dc482af3c9c7", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v6.4.17" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-29T13:51:37+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v6.4.18", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "d0492d6217e5ab48f51fca76f64cf8e78919d0db" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/d0492d6217e5ab48f51fca76f64cf8e78919d0db", + "reference": "d0492d6217e5ab48f51fca76f64cf8e78919d0db", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" + }, + "conflict": { + "symfony/cache": "<6.4.12|>=7.0,<7.1.5" + }, + "require-dev": { + "doctrine/dbal": "^2.13.1|^3|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.4.12|^7.1.5", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v6.4.18" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-01-09T15:48:56+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v6.4.19", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "88f2c9f7feff86bb7b9105c5151bc2c1404cd64c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/88f2c9f7feff86bb7b9105c5151bc2c1404cd64c", + "reference": "88f2c9f7feff86bb7b9105c5151bc2c1404cd64c", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/browser-kit": "<5.4", + "symfony/cache": "<5.4", + "symfony/config": "<6.1", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<5.4", + "symfony/form": "<5.4", + "symfony/http-client": "<5.4", + "symfony/http-client-contracts": "<2.5", + "symfony/mailer": "<5.4", + "symfony/messenger": "<5.4", + "symfony/translation": "<5.4", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<5.4", + "symfony/validator": "<6.4", + "symfony/var-dumper": "<6.3", + "twig/twig": "<2.13" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^5.4|^6.0|^7.0", + "symfony/clock": "^6.2|^7.0", + "symfony/config": "^6.1|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dom-crawler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/property-access": "^5.4.5|^6.0.5|^7.0", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.4.4|^7.0.4", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4|^6.0|^7.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^5.4|^6.0|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^5.4|^6.4|^7.0", + "symfony/var-exporter": "^6.2|^7.0", + "twig/twig": "^2.13|^3.0.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v6.4.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-02-26T10:51:37+00:00" + }, + { + "name": "symfony/mailer", + "version": "v6.4.18", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "e93a6ae2767d7f7578c2b7961d9d8e27580b2b11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/e93a6ae2767d7f7578c2b7961d9d8e27580b2b11", + "reference": "e93a6ae2767d7f7578c2b7961d9d8e27580b2b11", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=8.1", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/mime": "^6.2|^7.0", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<5.4", + "symfony/messenger": "<6.2", + "symfony/mime": "<6.2", + "symfony/twig-bridge": "<6.2.1" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/messenger": "^6.2|^7.0", + "symfony/twig-bridge": "^6.2|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps sending emails", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailer/tree/v6.4.18" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-01-24T15:27:15+00:00" + }, + { + "name": "symfony/mime", + "version": "v6.4.19", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "ac537b6c55ccc2c749f3c979edfa9ec14aaed4f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/ac537b6c55ccc2c749f3c979edfa9ec14aaed4f3", + "reference": "ac537b6c55ccc2c749f3c979edfa9ec14aaed4f3", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<5.4", + "symfony/serializer": "<6.4.3|>7.0,<7.0.3" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.4|^7.0", + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/property-info": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.4.3|^7.0.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v6.4.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-02-17T21:23:52+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.32.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.32.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-01-02T08:10:11+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/process", + "version": "v6.4.19", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "7a1c12e87b08ec9c97abdd188c9b3f5a40e37fc3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/7a1c12e87b08ec9c97abdd188c9b3f5a40e37fc3", + "reference": "7a1c12e87b08ec9c97abdd188c9b3f5a40e37fc3", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v6.4.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-02-04T13:35:48+00:00" + }, + { + "name": "symfony/routing", + "version": "v6.4.18", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "e9bfc94953019089acdfb9be51c1b9142c4afa68" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/e9bfc94953019089acdfb9be51c1b9142c4afa68", + "reference": "e9bfc94953019089acdfb9be51c1b9142c4afa68", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "doctrine/annotations": "<1.12", + "symfony/config": "<6.2", + "symfony/dependency-injection": "<5.4", + "symfony/yaml": "<5.4" + }, + "require-dev": { + "doctrine/annotations": "^1.12|^2", + "psr/log": "^1|^2|^3", + "symfony/config": "^6.2|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v6.4.18" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-01-09T08:51:02+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.5.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.5-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.5.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, + { + "name": "symfony/string", + "version": "v7.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/446e0d146f991dde3e73f45f2c97a9faad773c82", + "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/emoji": "^7.1", + "symfony/error-handler": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v7.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-13T13:31:26+00:00" + }, + { + "name": "symfony/translation", + "version": "v6.4.19", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "3b9bf9f33997c064885a7bfc126c14b9daa0e00e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/3b9bf9f33997c064885a7bfc126c14b9daa0e00e", + "reference": "3b9bf9f33997c064885a7bfc126c14b9daa0e00e", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5|^3.0" + }, + "conflict": { + "symfony/config": "<5.4", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<5.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<5.4", + "symfony/yaml": "<5.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^4.18|^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/intl": "^5.4|^6.0|^7.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v6.4.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-02-13T10:18:43+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.5.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "4667ff3bd513750603a09c8dedbea942487fb07c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/4667ff3bd513750603a09c8dedbea942487fb07c", + "reference": "4667ff3bd513750603a09c8dedbea942487fb07c", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.5-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, + { + "name": "symfony/uid", + "version": "v6.4.13", + "source": { + "type": "git", + "url": "https://github.com/symfony/uid.git", + "reference": "18eb207f0436a993fffbdd811b5b8fa35fa5e007" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/uid/zipball/18eb207f0436a993fffbdd811b5b8fa35fa5e007", + "reference": "18eb207f0436a993fffbdd811b5b8fa35fa5e007", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-uuid": "^1.15" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Uid\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to generate and represent UIDs", + "homepage": "https://symfony.com", + "keywords": [ + "UID", + "ulid", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/uid/tree/v6.4.13" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:18:03+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v6.4.18", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "4ad10cf8b020e77ba665305bb7804389884b4837" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/4ad10cf8b020e77ba665305bb7804389884b4837", + "reference": "4ad10cf8b020e77ba665305bb7804389884b4837", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<5.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^6.3|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/uid": "^5.4|^6.0|^7.0", + "twig/twig": "^2.13|^3.0.4" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v6.4.18" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-01-17T11:26:11+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "v2.3.0", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "0d72ac1c00084279c1816675284073c5a337c20d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/0d72ac1c00084279c1816675284073c5a337c20d", + "reference": "0d72ac1c00084279c1816675284073c5a337c20d", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^7.4 || ^8.0", + "symfony/css-selector": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^8.5.21 || ^9.5.10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "support": { + "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.3.0" + }, + "time": "2024-12-21T16:25:41+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.6.1", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/a59a13791077fe3d44f90e7133eb68e7d22eaff2", + "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.1.3", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3", + "symfony/polyfill-ctype": "^1.24", + "symfony/polyfill-mbstring": "^1.24", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-filter": "*", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "5.6-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:52:34+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "https://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.0.3" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2024-11-21T01:49:47+00:00" + }, + { + "name": "webklex/laravel-imap", + "version": "5.3.0", + "source": { + "type": "git", + "url": "https://github.com/Webklex/laravel-imap.git", + "reference": "a424988a314c09f924390011a7baa8025efb9e14" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Webklex/laravel-imap/zipball/a424988a314c09f924390011a7baa8025efb9e14", + "reference": "a424988a314c09f924390011a7baa8025efb9e14", + "shasum": "" + }, + "require": { + "laravel/framework": ">=6.0.0", + "php": "^8.0.2", + "webklex/php-imap": "^5.3.0" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Client": "Webklex\\IMAP\\Facades\\Client" + }, + "providers": [ + "Webklex\\IMAP\\Providers\\LaravelServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Webklex\\IMAP\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Malte Goldenbaum", + "email": "github@webklex.com", + "role": "Developer" + } + ], + "description": "Laravel IMAP client", + "homepage": "https://github.com/webklex/laravel-imap", + "keywords": [ + "idle", + "imap", + "laravel", + "laravel-imap", + "mail", + "oauth", + "pop3", + "webklex" + ], + "support": { + "issues": "https://github.com/Webklex/laravel-imap/issues", + "source": "https://github.com/Webklex/laravel-imap/tree/5.3.0" + }, + "funding": [ + { + "url": "https://www.buymeacoffee.com/webklex", + "type": "custom" + }, + { + "url": "https://ko-fi.com/webklex", + "type": "ko_fi" + } + ], + "time": "2023-06-20T11:42:58+00:00" + }, + { + "name": "webklex/php-imap", + "version": "5.5.0", + "source": { + "type": "git", + "url": "https://github.com/Webklex/php-imap.git", + "reference": "3c23c8f66b772ce8597772816e068326559e7e4b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Webklex/php-imap/zipball/3c23c8f66b772ce8597772816e068326559e7e4b", + "reference": "3c23c8f66b772ce8597772816e068326559e7e4b", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "ext-iconv": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "ext-zip": "*", + "illuminate/pagination": ">=5.0.0", + "nesbot/carbon": "^2.62.1", + "php": "^8.0.2", + "symfony/http-foundation": ">=2.8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5.10" + }, + "suggest": { + "symfony/mime": "Recomended for better extension support", + "symfony/var-dumper": "Usefull tool for debugging" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Webklex\\PHPIMAP\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Malte Goldenbaum", + "email": "github@webklex.com", + "role": "Developer" + } + ], + "description": "PHP IMAP client", + "homepage": "https://github.com/webklex/php-imap", + "keywords": [ + "imap", + "mail", + "php-imap", + "pop3", + "webklex" + ], + "support": { + "issues": "https://github.com/Webklex/php-imap/issues", + "source": "https://github.com/Webklex/php-imap/tree/5.5.0" + }, + "funding": [ + { + "url": "https://www.buymeacoffee.com/webklex", + "type": "custom" + }, + { + "url": "https://ko-fi.com/webklex", + "type": "ko_fi" + } + ], + "time": "2023-06-28T01:57:03+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + } + ], + "packages-dev": [ + { + "name": "barryvdh/laravel-debugbar", + "version": "v3.15.2", + "source": { + "type": "git", + "url": "https://github.com/barryvdh/laravel-debugbar.git", + "reference": "0bc1e1361e7fffc2be156f46ad1fba6927c01729" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/0bc1e1361e7fffc2be156f46ad1fba6927c01729", + "reference": "0bc1e1361e7fffc2be156f46ad1fba6927c01729", + "shasum": "" + }, + "require": { + "illuminate/routing": "^9|^10|^11|^12", + "illuminate/session": "^9|^10|^11|^12", + "illuminate/support": "^9|^10|^11|^12", + "php": "^8.1", + "php-debugbar/php-debugbar": "~2.1.1", + "symfony/finder": "^6|^7" + }, + "conflict": { + "maximebf/debugbar": "*" + }, + "require-dev": { + "mockery/mockery": "^1.3.3", + "orchestra/testbench-dusk": "^7|^8|^9|^10", + "phpunit/phpunit": "^9.5.10|^10|^11", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Debugbar": "Barryvdh\\Debugbar\\Facades\\Debugbar" + }, + "providers": [ + "Barryvdh\\Debugbar\\ServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "3.15-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Barryvdh\\Debugbar\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "PHP Debugbar integration for Laravel", + "keywords": [ + "debug", + "debugbar", + "dev", + "laravel", + "profiler", + "webprofiler" + ], + "support": { + "issues": "https://github.com/barryvdh/laravel-debugbar/issues", + "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.15.2" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2025-02-25T15:25:22+00:00" + }, + { + "name": "brianium/paratest", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/paratestphp/paratest.git", + "reference": "cf16fcbb9b8107a7df6b97e497fc91e819774d8b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paratestphp/paratest/zipball/cf16fcbb9b8107a7df6b97e497fc91e819774d8b", + "reference": "cf16fcbb9b8107a7df6b97e497fc91e819774d8b", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-simplexml": "*", + "fidry/cpu-core-counter": "^1.2.0", + "jean85/pretty-package-versions": "^2.0.6", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0", + "phpunit/php-code-coverage": "^10.1.16", + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-timer": "^6.0.0", + "phpunit/phpunit": "^10.5.36", + "sebastian/environment": "^6.1.0", + "symfony/console": "^6.4.7 || ^7.1.5", + "symfony/process": "^6.4.7 || ^7.1.5" + }, + "require-dev": { + "doctrine/coding-standard": "^12.0.0", + "ext-pcov": "*", + "ext-posix": "*", + "phpstan/phpstan": "^1.12.6", + "phpstan/phpstan-deprecation-rules": "^1.2.1", + "phpstan/phpstan-phpunit": "^1.4.0", + "phpstan/phpstan-strict-rules": "^1.6.1", + "squizlabs/php_codesniffer": "^3.10.3", + "symfony/filesystem": "^6.4.3 || ^7.1.5" + }, + "bin": [ + "bin/paratest", + "bin/paratest_for_phpstorm" + ], + "type": "library", + "autoload": { + "psr-4": { + "ParaTest\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Scaturro", + "email": "scaturrob@gmail.com", + "role": "Developer" + }, + { + "name": "Filippo Tessarotto", + "email": "zoeslam@gmail.com", + "role": "Developer" + } + ], + "description": "Parallel testing for PHP", + "homepage": "https://github.com/paratestphp/paratest", + "keywords": [ + "concurrent", + "parallel", + "phpunit", + "testing" + ], + "support": { + "issues": "https://github.com/paratestphp/paratest/issues", + "source": "https://github.com/paratestphp/paratest/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://github.com/sponsors/Slamdunk", + "type": "github" + }, + { + "url": "https://paypal.me/filippotessarotto", + "type": "paypal" + } + ], + "time": "2024-10-15T12:45:19+00:00" + }, + { + "name": "fakerphp/faker", + "version": "v1.24.1", + "source": { + "type": "git", + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "psr/container": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "conflict": { + "fzaninotto/faker": "*" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "doctrine/persistence": "^1.3 || ^2.0", + "ext-intl": "*", + "phpunit/phpunit": "^9.5.26", + "symfony/phpunit-bridge": "^5.4.16" + }, + "suggest": { + "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", + "ext-curl": "Required by Faker\\Provider\\Image to download images.", + "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", + "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", + "ext-mbstring": "Required for multibyte Unicode string functionality." + }, + "type": "library", + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "support": { + "issues": "https://github.com/FakerPHP/Faker/issues", + "source": "https://github.com/FakerPHP/Faker/tree/v1.24.1" + }, + "time": "2024-11-21T13:46:39+00:00" + }, + { + "name": "fidry/cpu-core-counter", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/theofidry/cpu-core-counter.git", + "reference": "8520451a140d3f46ac33042715115e290cf5785f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f", + "reference": "8520451a140d3f46ac33042715115e290cf5785f", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "fidry/makefile": "^0.2.0", + "fidry/php-cs-fixer-config": "^1.1.2", + "phpstan/extension-installer": "^1.2.0", + "phpstan/phpstan": "^1.9.2", + "phpstan/phpstan-deprecation-rules": "^1.0.0", + "phpstan/phpstan-phpunit": "^1.2.2", + "phpstan/phpstan-strict-rules": "^1.4.4", + "phpunit/phpunit": "^8.5.31 || ^9.5.26", + "webmozarts/strict-phpunit": "^7.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Fidry\\CpuCoreCounter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com" + } + ], + "description": "Tiny utility to get the number of CPU cores.", + "keywords": [ + "CPU", + "core" + ], + "support": { + "issues": "https://github.com/theofidry/cpu-core-counter/issues", + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0" + }, + "funding": [ + { + "url": "https://github.com/theofidry", + "type": "github" + } + ], + "time": "2024-08-06T10:04:20+00:00" + }, + { + "name": "filp/whoops", + "version": "2.17.0", + "source": { + "type": "git", + "url": "https://github.com/filp/whoops.git", + "reference": "075bc0c26631110584175de6523ab3f1652eb28e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filp/whoops/zipball/075bc0c26631110584175de6523ab3f1652eb28e", + "reference": "075bc0c26631110584175de6523ab3f1652eb28e", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.3", + "symfony/var-dumper": "^4.0 || ^5.0" + }, + "suggest": { + "symfony/var-dumper": "Pretty print complex values better with var-dumper available", + "whoops/soap": "Formats errors as SOAP responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Whoops\\": "src/Whoops/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", + "role": "Developer" + } + ], + "description": "php error handling for cool kids", + "homepage": "https://filp.github.io/whoops/", + "keywords": [ + "error", + "exception", + "handling", + "library", + "throwable", + "whoops" + ], + "support": { + "issues": "https://github.com/filp/whoops/issues", + "source": "https://github.com/filp/whoops/tree/2.17.0" + }, + "funding": [ + { + "url": "https://github.com/denis-sokolov", + "type": "github" + } + ], + "time": "2025-01-25T12:00:00+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "shasum": "" + }, + "require": { + "php": "^5.3|^7.0|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "^1.4 || ^2.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "support": { + "issues": "https://github.com/hamcrest/hamcrest-php/issues", + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" + }, + "time": "2020-07-09T08:09:16+00:00" + }, + { + "name": "jean85/pretty-package-versions", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/Jean85/pretty-package-versions.git", + "reference": "3c4e5f62ba8d7de1734312e4fff32f67a8daaf10" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/3c4e5f62ba8d7de1734312e4fff32f67a8daaf10", + "reference": "3c4e5f62ba8d7de1734312e4fff32f67a8daaf10", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.1.0", + "php": "^7.4|^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "jean85/composer-provided-replaced-stub-package": "^1.0", + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^7.5|^8.5|^9.6", + "vimeo/psalm": "^4.3 || ^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Jean85\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alessandro Lai", + "email": "alessandro.lai85@gmail.com" + } + ], + "description": "A library to get pretty versions strings of installed dependencies", + "keywords": [ + "composer", + "package", + "release", + "versions" + ], + "support": { + "issues": "https://github.com/Jean85/pretty-package-versions/issues", + "source": "https://github.com/Jean85/pretty-package-versions/tree/2.1.0" + }, + "time": "2024-11-18T16:19:46+00:00" + }, + { + "name": "krayin/krayin-package-generator", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/krayin/krayin-package-generator.git", + "reference": "b9a61169ca985e45e83b9225c885b77692793f39" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/krayin/krayin-package-generator/zipball/b9a61169ca985e45e83b9225c885b77692793f39", + "reference": "b9a61169ca985e45e83b9225c885b77692793f39", + "shasum": "" + }, + "default-branch": true, + "type": "library", + "extra": { + "laravel": { + "aliases": [], + "providers": [ + "Webkul\\PackageGenerator\\Providers\\PackageGeneratorServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Webkul\\PackageGenerator\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jitendra Singh", + "email": "jitendra@webkul.com" + } + ], + "description": "Krayin Package Generator", + "support": { + "issues": "https://github.com/krayin/krayin-package-generator/issues", + "source": "https://github.com/krayin/krayin-package-generator/tree/v2.0.0" + }, + "time": "2024-09-27T04:57:16+00:00" + }, + { + "name": "laravel/pint", + "version": "v1.21.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/pint.git", + "reference": "c44bffbb2334e90fba560933c45948fa4a3f3e86" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pint/zipball/c44bffbb2334e90fba560933c45948fa4a3f3e86", + "reference": "c44bffbb2334e90fba560933c45948fa4a3f3e86", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "ext-tokenizer": "*", + "ext-xml": "*", + "php": "^8.2.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.70.2", + "illuminate/view": "^11.44.1", + "larastan/larastan": "^3.1.0", + "laravel-zero/framework": "^11.36.1", + "mockery/mockery": "^1.6.12", + "nunomaduro/termwind": "^2.3", + "pestphp/pest": "^2.36.0" + }, + "bin": [ + "builds/pint" + ], + "type": "project", + "autoload": { + "psr-4": { + "App\\": "app/", + "Database\\Seeders\\": "database/seeders/", + "Database\\Factories\\": "database/factories/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "An opinionated code formatter for PHP.", + "homepage": "https://laravel.com", + "keywords": [ + "format", + "formatter", + "lint", + "linter", + "php" + ], + "support": { + "issues": "https://github.com/laravel/pint/issues", + "source": "https://github.com/laravel/pint" + }, + "time": "2025-03-11T03:22:21+00:00" + }, + { + "name": "laravel/sail", + "version": "v1.41.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/sail.git", + "reference": "fe1a4ada0abb5e4bd99eb4e4b0d87906c00cdeec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sail/zipball/fe1a4ada0abb5e4bd99eb4e4b0d87906c00cdeec", + "reference": "fe1a4ada0abb5e4bd99eb4e4b0d87906c00cdeec", + "shasum": "" + }, + "require": { + "illuminate/console": "^9.52.16|^10.0|^11.0|^12.0", + "illuminate/contracts": "^9.52.16|^10.0|^11.0|^12.0", + "illuminate/support": "^9.52.16|^10.0|^11.0|^12.0", + "php": "^8.0", + "symfony/console": "^6.0|^7.0", + "symfony/yaml": "^6.0|^7.0" + }, + "require-dev": { + "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0", + "phpstan/phpstan": "^1.10" + }, + "bin": [ + "bin/sail" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Sail\\SailServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Docker files for running a basic Laravel application.", + "keywords": [ + "docker", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/sail/issues", + "source": "https://github.com/laravel/sail" + }, + "time": "2025-01-24T15:45:36+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.6.12", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": ">=7.3" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5 || ^9.6.17", + "symplify/easy-coding-standard": "^12.1.14" + }, + "type": "library", + "autoload": { + "files": [ + "library/helpers.php", + "library/Mockery.php" + ], + "psr-4": { + "Mockery\\": "library/Mockery" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "https://github.com/padraic", + "role": "Author" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "https://davedevelopment.co.uk", + "role": "Developer" + }, + { + "name": "Nathanael Esayeas", + "email": "nathanael.esayeas@protonmail.com", + "homepage": "https://github.com/ghostwriter", + "role": "Lead Developer" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework", + "homepage": "https://github.com/mockery/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "support": { + "docs": "https://docs.mockery.io/", + "issues": "https://github.com/mockery/mockery/issues", + "rss": "https://github.com/mockery/mockery/releases.atom", + "security": "https://github.com/mockery/mockery/security/advisories", + "source": "https://github.com/mockery/mockery" + }, + "time": "2024-05-16T03:13:13+00:00" + }, + { + "name": "nunomaduro/collision", + "version": "v7.11.0", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/collision.git", + "reference": "994ea93df5d4132f69d3f1bd74730509df6e8a05" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/994ea93df5d4132f69d3f1bd74730509df6e8a05", + "reference": "994ea93df5d4132f69d3f1bd74730509df6e8a05", + "shasum": "" + }, + "require": { + "filp/whoops": "^2.16.0", + "nunomaduro/termwind": "^1.15.1", + "php": "^8.1.0", + "symfony/console": "^6.4.12" + }, + "conflict": { + "laravel/framework": ">=11.0.0" + }, + "require-dev": { + "brianium/paratest": "^7.3.1", + "laravel/framework": "^10.48.22", + "laravel/pint": "^1.18.1", + "laravel/sail": "^1.36.0", + "laravel/sanctum": "^3.3.3", + "laravel/tinker": "^2.10.0", + "nunomaduro/larastan": "^2.9.8", + "orchestra/testbench-core": "^8.28.3", + "pestphp/pest": "^2.35.1", + "phpunit/phpunit": "^10.5.36", + "sebastian/environment": "^6.1.0", + "spatie/laravel-ignition": "^2.8.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "./src/Adapters/Phpunit/Autoload.php" + ], + "psr-4": { + "NunoMaduro\\Collision\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Cli error handling for console/command-line PHP applications.", + "keywords": [ + "artisan", + "cli", + "command-line", + "console", + "error", + "handling", + "laravel", + "laravel-zero", + "php", + "symfony" + ], + "support": { + "issues": "https://github.com/nunomaduro/collision/issues", + "source": "https://github.com/nunomaduro/collision" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2024-10-15T15:12:40+00:00" + }, + { + "name": "pestphp/pest", + "version": "v2.36.0", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest.git", + "reference": "f8c88bd14dc1772bfaf02169afb601ecdf2724cd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest/zipball/f8c88bd14dc1772bfaf02169afb601ecdf2724cd", + "reference": "f8c88bd14dc1772bfaf02169afb601ecdf2724cd", + "shasum": "" + }, + "require": { + "brianium/paratest": "^7.3.1", + "nunomaduro/collision": "^7.11.0|^8.4.0", + "nunomaduro/termwind": "^1.16.0|^2.1.0", + "pestphp/pest-plugin": "^2.1.1", + "pestphp/pest-plugin-arch": "^2.7.0", + "php": "^8.1.0", + "phpunit/phpunit": "^10.5.36" + }, + "conflict": { + "filp/whoops": "<2.16.0", + "phpunit/phpunit": ">10.5.36", + "sebastian/exporter": "<5.1.0", + "webmozart/assert": "<1.11.0" + }, + "require-dev": { + "pestphp/pest-dev-tools": "^2.17.0", + "pestphp/pest-plugin-type-coverage": "^2.8.7", + "symfony/process": "^6.4.0|^7.1.5" + }, + "bin": [ + "bin/pest" + ], + "type": "library", + "extra": { + "pest": { + "plugins": [ + "Pest\\Plugins\\Bail", + "Pest\\Plugins\\Cache", + "Pest\\Plugins\\Coverage", + "Pest\\Plugins\\Init", + "Pest\\Plugins\\Environment", + "Pest\\Plugins\\Help", + "Pest\\Plugins\\Memory", + "Pest\\Plugins\\Only", + "Pest\\Plugins\\Printer", + "Pest\\Plugins\\ProcessIsolation", + "Pest\\Plugins\\Profile", + "Pest\\Plugins\\Retry", + "Pest\\Plugins\\Snapshot", + "Pest\\Plugins\\Verbose", + "Pest\\Plugins\\Version", + "Pest\\Plugins\\Parallel" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "files": [ + "src/Functions.php", + "src/Pest.php" + ], + "psr-4": { + "Pest\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "The elegant PHP Testing Framework.", + "keywords": [ + "framework", + "pest", + "php", + "test", + "testing", + "unit" + ], + "support": { + "issues": "https://github.com/pestphp/pest/issues", + "source": "https://github.com/pestphp/pest/tree/v2.36.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + } + ], + "time": "2024-10-15T15:30:56+00:00" + }, + { + "name": "pestphp/pest-plugin", + "version": "v2.1.1", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin.git", + "reference": "e05d2859e08c2567ee38ce8b005d044e72648c0b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin/zipball/e05d2859e08c2567ee38ce8b005d044e72648c0b", + "reference": "e05d2859e08c2567ee38ce8b005d044e72648c0b", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.0.0", + "composer-runtime-api": "^2.2.2", + "php": "^8.1" + }, + "conflict": { + "pestphp/pest": "<2.2.3" + }, + "require-dev": { + "composer/composer": "^2.5.8", + "pestphp/pest": "^2.16.0", + "pestphp/pest-dev-tools": "^2.16.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Pest\\Plugin\\Manager" + }, + "autoload": { + "psr-4": { + "Pest\\Plugin\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Pest plugin manager", + "keywords": [ + "framework", + "manager", + "pest", + "php", + "plugin", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin/tree/v2.1.1" + }, + "funding": [ + { + "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2023-08-22T08:40:06+00:00" + }, + { + "name": "pestphp/pest-plugin-arch", + "version": "v2.7.0", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-arch.git", + "reference": "d23b2d7498475354522c3818c42ef355dca3fcda" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-arch/zipball/d23b2d7498475354522c3818c42ef355dca3fcda", + "reference": "d23b2d7498475354522c3818c42ef355dca3fcda", + "shasum": "" + }, + "require": { + "nunomaduro/collision": "^7.10.0|^8.1.0", + "pestphp/pest-plugin": "^2.1.1", + "php": "^8.1", + "ta-tikoma/phpunit-architecture-test": "^0.8.4" + }, + "require-dev": { + "pestphp/pest": "^2.33.0", + "pestphp/pest-dev-tools": "^2.16.0" + }, + "type": "library", + "extra": { + "pest": { + "plugins": [ + "Pest\\Arch\\Plugin" + ] + } + }, + "autoload": { + "files": [ + "src/Autoload.php" + ], + "psr-4": { + "Pest\\Arch\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Arch plugin for Pest PHP.", + "keywords": [ + "arch", + "architecture", + "framework", + "pest", + "php", + "plugin", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin-arch/tree/v2.7.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + } + ], + "time": "2024-01-26T09:46:42+00:00" + }, + { + "name": "pestphp/pest-plugin-laravel", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-laravel.git", + "reference": "53df51169a7f9595e06839cce638c73e59ace5e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-laravel/zipball/53df51169a7f9595e06839cce638c73e59ace5e8", + "reference": "53df51169a7f9595e06839cce638c73e59ace5e8", + "shasum": "" + }, + "require": { + "laravel/framework": "^10.48.9|^11.5.0", + "pestphp/pest": "^2.34.7", + "php": "^8.1.0" + }, + "require-dev": { + "laravel/dusk": "^7.13.0", + "orchestra/testbench": "^8.22.3|^9.0.4", + "pestphp/pest-dev-tools": "^2.16.0" + }, + "type": "library", + "extra": { + "pest": { + "plugins": [ + "Pest\\Laravel\\Plugin" + ] + }, + "laravel": { + "providers": [ + "Pest\\Laravel\\PestServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/Autoload.php" + ], + "psr-4": { + "Pest\\Laravel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Pest Laravel Plugin", + "keywords": [ + "framework", + "laravel", + "pest", + "php", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin-laravel/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + } + ], + "time": "2024-04-27T10:41:54+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "php-debugbar/php-debugbar", + "version": "v2.1.6", + "source": { + "type": "git", + "url": "https://github.com/php-debugbar/php-debugbar.git", + "reference": "16fa68da5617220594aa5e33fa9de415f94784a0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-debugbar/php-debugbar/zipball/16fa68da5617220594aa5e33fa9de415f94784a0", + "reference": "16fa68da5617220594aa5e33fa9de415f94784a0", + "shasum": "" + }, + "require": { + "php": "^8", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^4|^5|^6|^7" + }, + "require-dev": { + "dbrekelmans/bdi": "^1", + "phpunit/phpunit": "^8|^9", + "symfony/panther": "^1|^2.1", + "twig/twig": "^1.38|^2.7|^3.0" + }, + "suggest": { + "kriswallsmith/assetic": "The best way to manage assets", + "monolog/monolog": "Log using Monolog", + "predis/predis": "Redis storage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "psr-4": { + "DebugBar\\": "src/DebugBar/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maxime Bouroumeau-Fuseau", + "email": "maxime.bouroumeau@gmail.com", + "homepage": "http://maximebf.com" + }, + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "Debug bar in the browser for php application", + "homepage": "https://github.com/php-debugbar/php-debugbar", + "keywords": [ + "debug", + "debug bar", + "debugbar", + "dev" + ], + "support": { + "issues": "https://github.com/php-debugbar/php-debugbar/issues", + "source": "https://github.com/php-debugbar/php-debugbar/tree/v2.1.6" + }, + "time": "2025-02-21T17:47:03+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.6.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8", + "reference": "e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.1", + "ext-filter": "*", + "php": "^7.4 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.7", + "phpstan/phpdoc-parser": "^1.7|^2.0", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.5 || ~1.6.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^9.5", + "psalm/phar": "^5.26" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.1" + }, + "time": "2024-12-07T09:39:29+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.10.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/679e3ce485b99e84c775d28e2e96fade9a7fb50a", + "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.3 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.18|^2.0" + }, + "require-dev": { + "ext-tokenizer": "*", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.13.9", + "vimeo/psalm": "^4.25" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.10.0" + }, + "time": "2024-11-09T15:12:26+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", + "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^5.3.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^9.6", + "symfony/process": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.1.0" + }, + "time": "2025-02-19T13:28:12+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "10.1.16", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "7e308268858ed6baedc8704a304727d20bc07c77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77", + "reference": "7e308268858ed6baedc8704a304727d20bc07c77", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.19.1 || ^5.1.0", + "php": ">=8.1", + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-text-template": "^3.0.1", + "sebastian/code-unit-reverse-lookup": "^3.0.0", + "sebastian/complexity": "^3.2.0", + "sebastian/environment": "^6.1.0", + "sebastian/lines-of-code": "^2.0.2", + "sebastian/version": "^4.0.1", + "theseer/tokenizer": "^1.2.3" + }, + "require-dev": { + "phpunit/phpunit": "^10.1" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-08-22T04:31:57+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "4.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T06:24:48+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:56:09+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T14:07:24+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:57:52+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "10.5.36", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "aa0a8ce701ea7ee314b0dfaa8970dc94f3f8c870" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/aa0a8ce701ea7ee314b0dfaa8970dc94f3f8c870", + "reference": "aa0a8ce701ea7ee314b0dfaa8970dc94f3f8c870", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.12.0", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.1", + "phpunit/php-code-coverage": "^10.1.16", + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-invoker": "^4.0.0", + "phpunit/php-text-template": "^3.0.1", + "phpunit/php-timer": "^6.0.0", + "sebastian/cli-parser": "^2.0.1", + "sebastian/code-unit": "^2.0.0", + "sebastian/comparator": "^5.0.2", + "sebastian/diff": "^5.1.1", + "sebastian/environment": "^6.1.0", + "sebastian/exporter": "^5.1.2", + "sebastian/global-state": "^6.0.2", + "sebastian/object-enumerator": "^5.0.0", + "sebastian/recursion-context": "^5.0.0", + "sebastian/type": "^4.0.0", + "sebastian/version": "^4.0.1" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.5-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.36" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2024-10-08T15:36:51+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:12:49+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:58:43+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:59:15+00:00" + }, + { + "name": "sebastian/comparator", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e", + "reference": "a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/diff": "^5.0", + "sebastian/exporter": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-10-18T14:56:07+00:00" + }, + { + "name": "sebastian/complexity", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "68ff824baeae169ec9f2137158ee529584553799" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", + "reference": "68ff824baeae169ec9f2137158ee529584553799", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-21T08:37:17+00:00" + }, + { + "name": "sebastian/diff", + "version": "5.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0", + "symfony/process": "^6.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:15:17+00:00" + }, + { + "name": "sebastian/environment", + "version": "6.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-23T08:47:14+00:00" + }, + { + "name": "sebastian/exporter", + "version": "5.1.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "955288482d97c19a372d3f31006ab3f37da47adf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/955288482d97c19a372d3f31006ab3f37da47adf", + "reference": "955288482d97c19a372d3f31006ab3f37da47adf", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:17:12+00:00" + }, + { + "name": "sebastian/global-state", + "version": "6.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:19:19+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-21T08:38:20+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:08:32+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:06:18+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:05:40+00:00" + }, + { + "name": "sebastian/type", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:10:45+00:00" + }, + { + "name": "sebastian/version", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-07T11:34:05+00:00" + }, + { + "name": "spatie/backtrace", + "version": "1.7.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/backtrace.git", + "reference": "0f2477c520e3729de58e061b8192f161c99f770b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/backtrace/zipball/0f2477c520e3729de58e061b8192f161c99f770b", + "reference": "0f2477c520e3729de58e061b8192f161c99f770b", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "ext-json": "*", + "laravel/serializable-closure": "^1.3 || ^2.0", + "phpunit/phpunit": "^9.3 || ^11.4.3", + "spatie/phpunit-snapshot-assertions": "^4.2 || ^5.1.6", + "symfony/var-dumper": "^5.1 || ^6.0 || ^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Backtrace\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van de Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A better backtrace", + "homepage": "https://github.com/spatie/backtrace", + "keywords": [ + "Backtrace", + "spatie" + ], + "support": { + "source": "https://github.com/spatie/backtrace/tree/1.7.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2024-12-02T13:28:15+00:00" + }, + { + "name": "spatie/error-solutions", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/spatie/error-solutions.git", + "reference": "e495d7178ca524f2dd0fe6a1d99a1e608e1c9936" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/error-solutions/zipball/e495d7178ca524f2dd0fe6a1d99a1e608e1c9936", + "reference": "e495d7178ca524f2dd0fe6a1d99a1e608e1c9936", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "illuminate/broadcasting": "^10.0|^11.0|^12.0", + "illuminate/cache": "^10.0|^11.0|^12.0", + "illuminate/support": "^10.0|^11.0|^12.0", + "livewire/livewire": "^2.11|^3.5.20", + "openai-php/client": "^0.10.1", + "orchestra/testbench": "8.22.3|^9.0|^10.0", + "pestphp/pest": "^2.20|^3.0", + "phpstan/phpstan": "^2.1", + "psr/simple-cache": "^3.0", + "psr/simple-cache-implementation": "^3.0", + "spatie/ray": "^1.28", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "vlucas/phpdotenv": "^5.5" + }, + "suggest": { + "openai-php/client": "Require get solutions from OpenAI", + "simple-cache-implementation": "To cache solutions from OpenAI" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Ignition\\": "legacy/ignition", + "Spatie\\ErrorSolutions\\": "src", + "Spatie\\LaravelIgnition\\": "legacy/laravel-ignition" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ruben Van Assche", + "email": "ruben@spatie.be", + "role": "Developer" + } + ], + "description": "This is my package error-solutions", + "homepage": "https://github.com/spatie/error-solutions", + "keywords": [ + "error-solutions", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/error-solutions/issues", + "source": "https://github.com/spatie/error-solutions/tree/1.1.3" + }, + "funding": [ + { + "url": "https://github.com/Spatie", + "type": "github" + } + ], + "time": "2025-02-14T12:29:50+00:00" + }, + { + "name": "spatie/flare-client-php", + "version": "1.10.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/flare-client-php.git", + "reference": "bf1716eb98bd689451b071548ae9e70738dce62f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/bf1716eb98bd689451b071548ae9e70738dce62f", + "reference": "bf1716eb98bd689451b071548ae9e70738dce62f", + "shasum": "" + }, + "require": { + "illuminate/pipeline": "^8.0|^9.0|^10.0|^11.0|^12.0", + "php": "^8.0", + "spatie/backtrace": "^1.6.1", + "symfony/http-foundation": "^5.2|^6.0|^7.0", + "symfony/mime": "^5.2|^6.0|^7.0", + "symfony/process": "^5.2|^6.0|^7.0", + "symfony/var-dumper": "^5.2|^6.0|^7.0" + }, + "require-dev": { + "dms/phpunit-arraysubset-asserts": "^0.5.0", + "pestphp/pest": "^1.20|^2.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "spatie/pest-plugin-snapshots": "^1.0|^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.3.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\FlareClient\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Send PHP errors to Flare", + "homepage": "https://github.com/spatie/flare-client-php", + "keywords": [ + "exception", + "flare", + "reporting", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/flare-client-php/issues", + "source": "https://github.com/spatie/flare-client-php/tree/1.10.1" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2025-02-14T13:42:06+00:00" + }, + { + "name": "spatie/ignition", + "version": "1.15.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/ignition.git", + "reference": "31f314153020aee5af3537e507fef892ffbf8c85" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/ignition/zipball/31f314153020aee5af3537e507fef892ffbf8c85", + "reference": "31f314153020aee5af3537e507fef892ffbf8c85", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "php": "^8.0", + "spatie/error-solutions": "^1.0", + "spatie/flare-client-php": "^1.7", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "require-dev": { + "illuminate/cache": "^9.52|^10.0|^11.0|^12.0", + "mockery/mockery": "^1.4", + "pestphp/pest": "^1.20|^2.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "psr/simple-cache-implementation": "*", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "vlucas/phpdotenv": "^5.5" + }, + "suggest": { + "openai-php/client": "Require get solutions from OpenAI", + "simple-cache-implementation": "To cache solutions from OpenAI" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Spatie\\Ignition\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Spatie", + "email": "info@spatie.be", + "role": "Developer" + } + ], + "description": "A beautiful error page for PHP applications.", + "homepage": "https://flareapp.io/ignition", + "keywords": [ + "error", + "flare", + "laravel", + "page" + ], + "support": { + "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", + "forum": "https://twitter.com/flareappio", + "issues": "https://github.com/spatie/ignition/issues", + "source": "https://github.com/spatie/ignition" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2025-02-21T14:31:39+00:00" + }, + { + "name": "spatie/laravel-ignition", + "version": "2.9.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-ignition.git", + "reference": "1baee07216d6748ebd3a65ba97381b051838707a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/1baee07216d6748ebd3a65ba97381b051838707a", + "reference": "1baee07216d6748ebd3a65ba97381b051838707a", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "illuminate/support": "^10.0|^11.0|^12.0", + "php": "^8.1", + "spatie/ignition": "^1.15", + "symfony/console": "^6.2.3|^7.0", + "symfony/var-dumper": "^6.2.3|^7.0" + }, + "require-dev": { + "livewire/livewire": "^2.11|^3.3.5", + "mockery/mockery": "^1.5.1", + "openai-php/client": "^0.8.1|^0.10", + "orchestra/testbench": "8.22.3|^9.0|^10.0", + "pestphp/pest": "^2.34|^3.7", + "phpstan/extension-installer": "^1.3.1", + "phpstan/phpstan-deprecation-rules": "^1.1.1|^2.0", + "phpstan/phpstan-phpunit": "^1.3.16|^2.0", + "vlucas/phpdotenv": "^5.5" + }, + "suggest": { + "openai-php/client": "Require get solutions from OpenAI", + "psr/simple-cache-implementation": "Needed to cache solutions from OpenAI" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Flare": "Spatie\\LaravelIgnition\\Facades\\Flare" + }, + "providers": [ + "Spatie\\LaravelIgnition\\IgnitionServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\LaravelIgnition\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Spatie", + "email": "info@spatie.be", + "role": "Developer" + } + ], + "description": "A beautiful error page for Laravel applications.", + "homepage": "https://flareapp.io/ignition", + "keywords": [ + "error", + "flare", + "laravel", + "page" + ], + "support": { + "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", + "forum": "https://twitter.com/flareappio", + "issues": "https://github.com/spatie/laravel-ignition/issues", + "source": "https://github.com/spatie/laravel-ignition" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2025-02-20T13:13:55+00:00" + }, + { + "name": "symfony/yaml", + "version": "v7.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "ac238f173df0c9c1120f862d0f599e17535a87ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/ac238f173df0c9c1120f862d0f599e17535a87ec", + "reference": "ac238f173df0c9c1120f862d0f599e17535a87ec", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v7.2.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-01-07T12:55:42+00:00" + }, + { + "name": "ta-tikoma/phpunit-architecture-test", + "version": "0.8.4", + "source": { + "type": "git", + "url": "https://github.com/ta-tikoma/phpunit-architecture-test.git", + "reference": "89f0dea1cb0f0d5744d3ec1764a286af5e006636" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ta-tikoma/phpunit-architecture-test/zipball/89f0dea1cb0f0d5744d3ec1764a286af5e006636", + "reference": "89f0dea1cb0f0d5744d3ec1764a286af5e006636", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18.0 || ^5.0.0", + "php": "^8.1.0", + "phpdocumentor/reflection-docblock": "^5.3.0", + "phpunit/phpunit": "^10.5.5 || ^11.0.0", + "symfony/finder": "^6.4.0 || ^7.0.0" + }, + "require-dev": { + "laravel/pint": "^1.13.7", + "phpstan/phpstan": "^1.10.52" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPUnit\\Architecture\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ni Shi", + "email": "futik0ma011@gmail.com" + }, + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Methods for testing application architecture", + "keywords": [ + "architecture", + "phpunit", + "stucture", + "test", + "testing" + ], + "support": { + "issues": "https://github.com/ta-tikoma/phpunit-architecture-test/issues", + "source": "https://github.com/ta-tikoma/phpunit-architecture-test/tree/0.8.4" + }, + "time": "2024-01-05T14:10:56+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:36:25+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": { + "krayin/krayin-package-generator": 20 + }, + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^8.2" + }, + "platform-dev": {}, + "plugin-api-version": "2.9.0" +} diff --git a/config/app.php b/config/app.php new file mode 100644 index 0000000..16fef05 --- /dev/null +++ b/config/app.php @@ -0,0 +1,238 @@ + env('APP_NAME', 'Laravel'), + + /* + |-------------------------------------------------------------------------- + | Application Environment + |-------------------------------------------------------------------------- + | + | This value determines the "environment" your application is currently + | running in. This may determine how you prefer to configure various + | services the application utilizes. Set this in your ".env" file. + | + */ + + 'env' => env('APP_ENV', 'production'), + + /* + |-------------------------------------------------------------------------- + | Application Debug Mode + |-------------------------------------------------------------------------- + | + | When your application is in debug mode, detailed error messages with + | stack traces will be shown on every error that occurs within your + | application. If disabled, a simple generic error page is shown. + | + */ + + 'debug' => (bool) env('APP_DEBUG', false), + + /* + |-------------------------------------------------------------------------- + | Application URL + |-------------------------------------------------------------------------- + | + | This URL is used by the console to properly generate URLs when using + | the Artisan command line tool. You should set this to the root of + | your application so that it is used when running Artisan tasks. + | + */ + + 'url' => env('APP_URL', 'http://localhost'), + + /* + |-------------------------------------------------------------------------- + | Application Admin URL + |-------------------------------------------------------------------------- + | + | This URL suffix is used to define the admin url for example + | admin/ or backend/ + | + */ + + 'admin_path' => env('APP_ADMIN_PATH', 'admin'), + + 'asset_url' => env('ASSET_URL', null), + + /* + |-------------------------------------------------------------------------- + | Application Timezone + |-------------------------------------------------------------------------- + | + | Here you may specify the default timezone for your application, which + | will be used by the PHP date and date-time functions. We have gone + | ahead and set this to a sensible default for you out of the box. + | + */ + + 'timezone' => env('APP_TIMEZONE', 'Asia/Kolkata'), + + /* + |-------------------------------------------------------------------------- + | Application Locale Configuration + |-------------------------------------------------------------------------- + | + | The application locale determines the default locale that will be used + | by the translation service provider. You are free to set this value + | to any of the locales which will be supported by the application. + | + */ + + 'locale' => env('APP_LOCALE', 'en'), + + /* + |-------------------------------------------------------------------------- + | Available Locales Configuration + |-------------------------------------------------------------------------- + | + | The application available locale determines the supported locales + | by application + | + */ + + 'available_locales' => [ + 'ar' => 'Arabic', + 'en' => 'English', + 'es' => 'Español', + 'fa' => 'Persian', + 'pt_BR' => 'Portuguese', + 'tr' => 'Türkçe', + 'vi' => 'Vietnamese', + ], + + /* + |-------------------------------------------------------------------------- + | Application Fallback Locale + |-------------------------------------------------------------------------- + | + | The fallback locale determines the locale to use when the current one + | is not available. You may change the value to correspond to any of + | the language folders that are provided through your application. + | + */ + + 'fallback_locale' => 'en', + + /* + |-------------------------------------------------------------------------- + | Faker Locale + |-------------------------------------------------------------------------- + | + | This locale will be used by the Faker PHP library when generating fake + | data for your database seeds. For example, this will be used to get + | localized telephone numbers, street address information and more. + | + */ + + 'faker_locale' => 'en_US', + + /* + |-------------------------------------------------------------------------- + | Base Currency Code + |-------------------------------------------------------------------------- + | + | Here you may specify the base currency code for your application. + | + */ + + 'currency' => env('APP_CURRENCY', 'USD'), + + /* + |-------------------------------------------------------------------------- + | Encryption Key + |-------------------------------------------------------------------------- + | + | This key is used by the Illuminate encrypter service and should be set + | to a random, 32 character string, otherwise these encrypted strings + | will not be safe. Please do this before deploying an application! + | + */ + + 'key' => env('APP_KEY'), + + 'cipher' => 'AES-256-CBC', + + /* + |-------------------------------------------------------------------------- + | Autoloaded Service Providers + |-------------------------------------------------------------------------- + | + | The service providers listed here will be automatically loaded on the + | request to your application. Feel free to add your own services to + | this array to grant expanded functionality to your applications. + | + */ + + 'providers' => ServiceProvider::defaultProviders()->merge([ + /* + * Package Service Providers... + */ + Barryvdh\DomPDF\ServiceProvider::class, + Konekt\Concord\ConcordServiceProvider::class, + Prettus\Repository\Providers\RepositoryServiceProvider::class, + + /* + * Application Service Providers... + */ + App\Providers\AppServiceProvider::class, + App\Providers\AuthServiceProvider::class, + // App\Providers\BroadcastServiceProvider::class, + App\Providers\EventServiceProvider::class, + App\Providers\RouteServiceProvider::class, + App\Providers\TenancyServiceProvider::class, + + /* + * Webkul Service Providers... + */ + Webkul\Activity\Providers\ActivityServiceProvider::class, + Webkul\Admin\Providers\AdminServiceProvider::class, + Webkul\Attribute\Providers\AttributeServiceProvider::class, + Webkul\Automation\Providers\WorkflowServiceProvider::class, + Webkul\Contact\Providers\ContactServiceProvider::class, + Webkul\Core\Providers\CoreServiceProvider::class, + Webkul\DataGrid\Providers\DataGridServiceProvider::class, + Webkul\DataTransfer\Providers\DataTransferServiceProvider::class, + Webkul\EmailTemplate\Providers\EmailTemplateServiceProvider::class, + Webkul\Email\Providers\EmailServiceProvider::class, + Webkul\Marketing\Providers\MarketingServiceProvider::class, + Webkul\Installer\Providers\InstallerServiceProvider::class, + Webkul\Lead\Providers\LeadServiceProvider::class, + Webkul\Product\Providers\ProductServiceProvider::class, + Webkul\Quote\Providers\QuoteServiceProvider::class, + Webkul\Tag\Providers\TagServiceProvider::class, + Webkul\User\Providers\UserServiceProvider::class, + Webkul\Warehouse\Providers\WarehouseServiceProvider::class, + Webkul\WebForm\Providers\WebFormServiceProvider::class, + ])->toArray(), + + /* + |-------------------------------------------------------------------------- + | Class Aliases + |-------------------------------------------------------------------------- + | + | This array of class aliases will be registered when this application + | is started. However, feel free to register as many as you wish as + | the aliases are "lazy" loaded so they don't hinder performance. + | + */ + + 'aliases' => Facade::defaultAliases()->merge([])->toArray(), + +]; diff --git a/config/auth.php b/config/auth.php new file mode 100644 index 0000000..9e0d1c1 --- /dev/null +++ b/config/auth.php @@ -0,0 +1,105 @@ + [ + 'guard' => 'user', + 'passwords' => 'users', + ], + + /* + |-------------------------------------------------------------------------- + | Authentication Guards + |-------------------------------------------------------------------------- + | + | Next, you may define every authentication guard for your application. + | Of course, a great default configuration has been defined for you + | here which uses session storage and the Eloquent user provider. + | + | All authentication drivers have a user provider. This defines how the + | users are actually retrieved out of your database or other storage + | mechanisms used by this application to persist your user's data. + | + | Supported: "session", "token" + | + */ + + 'guards' => [ + 'user' => [ + 'driver' => 'session', + 'provider' => 'users', + ], + ], + + /* + |-------------------------------------------------------------------------- + | User Providers + |-------------------------------------------------------------------------- + | + | All authentication drivers have a user provider. This defines how the + | users are actually retrieved out of your database or other storage + | mechanisms used by this application to persist your user's data. + | + | If you have multiple user tables or models you may configure multiple + | sources which represent each model / table. These sources may then + | be assigned to any extra authentication guards you have defined. + | + | Supported: "database", "eloquent" + | + */ + + 'providers' => [ + 'users' => [ + 'driver' => 'eloquent', + 'model' => Webkul\User\Models\User::class, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Resetting Passwords + |-------------------------------------------------------------------------- + | + | You may specify multiple password reset configurations if you have more + | than one user table or model in the application and you want to have + | separate password reset settings based on the specific user types. + | + | The expire time is the number of minutes that the reset token should be + | considered valid. This security feature keeps tokens short-lived so + | they have less time to be guessed. You may change this as needed. + | + */ + + 'passwords' => [ + 'users' => [ + 'provider' => 'users', + 'table' => 'user_password_resets', + 'expire' => 60, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Password Confirmation Timeout + |-------------------------------------------------------------------------- + | + | Here you may define the amount of seconds before a password confirmation + | times out and the user is prompted to re-enter their password via the + | confirmation screen. By default, the timeout lasts for three hours. + | + */ + + 'password_timeout' => 10800, + +]; diff --git a/config/breadcrumbs.php b/config/breadcrumbs.php new file mode 100644 index 0000000..9a268fa --- /dev/null +++ b/config/breadcrumbs.php @@ -0,0 +1,75 @@ + 'breadcrumbs::bootstrap5', + + /* + |-------------------------------------------------------------------------- + | Breadcrumbs File(s) + |-------------------------------------------------------------------------- + | + | The file(s) where breadcrumbs are defined. e.g. + | + | - base_path('routes/breadcrumbs.php') + | - glob(base_path('breadcrumbs/*.php')) + | + */ + + 'files' => base_path('routes/breadcrumbs.php'), + + /* + |-------------------------------------------------------------------------- + | Exceptions + |-------------------------------------------------------------------------- + | + | Determine when to throw an exception. + | + */ + + // When route-bound breadcrumbs are used but the current route doesn't have a name (UnnamedRouteException) + 'unnamed-route-exception' => true, + + // When route-bound breadcrumbs are used and the matching breadcrumb doesn't exist (InvalidBreadcrumbException) + 'missing-route-bound-breadcrumb-exception' => true, + + // When a named breadcrumb is used but doesn't exist (InvalidBreadcrumbException) + 'invalid-named-breadcrumb-exception' => true, + + /* + |-------------------------------------------------------------------------- + | Classes + |-------------------------------------------------------------------------- + | + | Subclass the default classes for more advanced customisations. + | + */ + + // Manager + 'manager-class' => Diglactic\Breadcrumbs\Manager::class, + + // Generator + 'generator-class' => Diglactic\Breadcrumbs\Generator::class, + +]; diff --git a/config/broadcasting.php b/config/broadcasting.php new file mode 100644 index 0000000..59bccd5 --- /dev/null +++ b/config/broadcasting.php @@ -0,0 +1,64 @@ + env('BROADCAST_DRIVER', 'null'), + + /* + |-------------------------------------------------------------------------- + | Broadcast Connections + |-------------------------------------------------------------------------- + | + | Here you may define all of the broadcast connections that will be used + | to broadcast events to other systems or over websockets. Samples of + | each available type of connection are provided inside this array. + | + */ + + 'connections' => [ + + 'pusher' => [ + 'driver' => 'pusher', + 'key' => env('PUSHER_APP_KEY'), + 'secret' => env('PUSHER_APP_SECRET'), + 'app_id' => env('PUSHER_APP_ID'), + 'options' => [ + 'cluster' => env('PUSHER_APP_CLUSTER'), + 'useTLS' => true, + ], + ], + + 'ably' => [ + 'driver' => 'ably', + 'key' => env('ABLY_KEY'), + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + ], + + 'log' => [ + 'driver' => 'log', + ], + + 'null' => [ + 'driver' => 'null', + ], + + ], + +]; diff --git a/config/cache.php b/config/cache.php new file mode 100644 index 0000000..3e41cb4 --- /dev/null +++ b/config/cache.php @@ -0,0 +1,106 @@ + env('CACHE_DRIVER', 'file'), + + /* + |-------------------------------------------------------------------------- + | Cache Stores + |-------------------------------------------------------------------------- + | + | Here you may define all of the cache "stores" for your application as + | well as their drivers. You may even define multiple stores for the + | same cache driver to group types of items stored in your caches. + | + | Supported drivers: "apc", "array", "database", "file", + | "memcached", "redis", "dynamodb", "null" + | + */ + + 'stores' => [ + + 'apc' => [ + 'driver' => 'apc', + ], + + 'array' => [ + 'driver' => 'array', + 'serialize' => false, + ], + + 'database' => [ + 'driver' => 'database', + 'table' => 'cache', + 'connection' => null, + 'lock_connection' => null, + ], + + 'file' => [ + 'driver' => 'file', + 'path' => storage_path('framework/cache/data'), + ], + + 'memcached' => [ + 'driver' => 'memcached', + 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), + 'sasl' => [ + env('MEMCACHED_USERNAME'), + env('MEMCACHED_PASSWORD'), + ], + 'options' => [ + // Memcached::OPT_CONNECT_TIMEOUT => 2000, + ], + 'servers' => [ + [ + 'host' => env('MEMCACHED_HOST', '127.0.0.1'), + 'port' => env('MEMCACHED_PORT', 11211), + 'weight' => 100, + ], + ], + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'cache', + 'lock_connection' => 'default', + ], + + 'dynamodb' => [ + 'driver' => 'dynamodb', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), + 'endpoint' => env('DYNAMODB_ENDPOINT'), + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Cache Key Prefix + |-------------------------------------------------------------------------- + | + | When utilizing a RAM based store such as APC or Memcached, there might + | be other applications utilizing the same cache. So, we'll specify a + | value to get prefixed to all our keys so we can avoid collisions. + | + */ + + 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache'), + +]; diff --git a/config/concord.php b/config/concord.php new file mode 100644 index 0000000..5f20fa2 --- /dev/null +++ b/config/concord.php @@ -0,0 +1,25 @@ + [ + \Webkul\Activity\Providers\ModuleServiceProvider::class, + \Webkul\Admin\Providers\ModuleServiceProvider::class, + \Webkul\Attribute\Providers\ModuleServiceProvider::class, + \Webkul\Automation\Providers\ModuleServiceProvider::class, + \Webkul\Contact\Providers\ModuleServiceProvider::class, + \Webkul\Core\Providers\ModuleServiceProvider::class, + \Webkul\DataGrid\Providers\ModuleServiceProvider::class, + \Webkul\EmailTemplate\Providers\ModuleServiceProvider::class, + \Webkul\Email\Providers\ModuleServiceProvider::class, + \Webkul\Lead\Providers\ModuleServiceProvider::class, + \Webkul\Product\Providers\ModuleServiceProvider::class, + \Webkul\Quote\Providers\ModuleServiceProvider::class, + \Webkul\Tag\Providers\ModuleServiceProvider::class, + \Webkul\User\Providers\ModuleServiceProvider::class, + \Webkul\Warehouse\Providers\ModuleServiceProvider::class, + \Webkul\WebForm\Providers\ModuleServiceProvider::class, + \Webkul\DataTransfer\Providers\ModuleServiceProvider::class, + ], + + 'register_route_models' => true, +]; diff --git a/config/cors.php b/config/cors.php new file mode 100644 index 0000000..bf767d9 --- /dev/null +++ b/config/cors.php @@ -0,0 +1,64 @@ + [ + 'admin/web-forms/forms/*', + + 'api/*' + ], + + /* + * Matches the request method. `['*']` allows all methods. + */ + 'allowed_methods' => ['*'], + + /* + * Matches the request origin. `['*']` allows all origins. Wildcards can be used, eg `*.mydomain.com` + */ + 'allowed_origins' => ['*'], + + /* + * Patterns that can be used with `preg_match` to match the origin. + */ + 'allowed_origins_patterns' => [], + + /* + * Sets the Access-Control-Allow-Headers response header. `['*']` allows all headers. + */ + 'allowed_headers' => ['*'], + + /* + * Sets the Access-Control-Expose-Headers response header with these headers. + */ + 'exposed_headers' => [], + + /* + * Sets the Access-Control-Max-Age response header when > 0. + */ + 'max_age' => 0, + + /* + * Sets the Access-Control-Allow-Credentials header. + */ + 'supports_credentials' => false, +]; diff --git a/config/database.php b/config/database.php new file mode 100644 index 0000000..427e72d --- /dev/null +++ b/config/database.php @@ -0,0 +1,147 @@ + env('DB_CONNECTION', 'mysql'), + + /* + |-------------------------------------------------------------------------- + | Database Connections + |-------------------------------------------------------------------------- + | + | Here are each of the database connections setup for your application. + | Of course, examples of configuring each database platform that is + | supported by Laravel is shown below to make development simple. + | + | + | All database work in Laravel is done through the PHP PDO facilities + | so make sure you have the driver for your particular database of + | choice installed on your machine before you begin development. + | + */ + + 'connections' => [ + + 'sqlite' => [ + 'driver' => 'sqlite', + 'url' => env('DATABASE_URL'), + 'database' => env('DB_DATABASE', database_path('database.sqlite')), + 'prefix' => env('DB_PREFIX', ''), + 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), + ], + + 'mysql' => [ + 'driver' => 'mysql', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => 'utf8mb4', + 'collation' => 'utf8mb4_unicode_ci', + 'prefix' => env('DB_PREFIX', ''), + 'prefix_indexes' => true, + 'strict' => false, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + + 'pgsql' => [ + 'driver' => 'pgsql', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '5432'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'prefix' => env('DB_PREFIX', ''), + 'prefix_indexes' => true, + 'schema' => 'public', + 'sslmode' => 'prefer', + ], + + 'sqlsrv' => [ + 'driver' => 'sqlsrv', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', 'localhost'), + 'port' => env('DB_PORT', '1433'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'prefix' => env('DB_PREFIX', ''), + 'prefix_indexes' => true, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Migration Repository Table + |-------------------------------------------------------------------------- + | + | This table keeps track of all the migrations that have already run for + | your application. Using this information, we can determine which of + | the migrations on disk haven't actually been run in the database. + | + */ + + 'migrations' => 'migrations', + + /* + |-------------------------------------------------------------------------- + | Redis Databases + |-------------------------------------------------------------------------- + | + | Redis is an open source, fast, and advanced key-value store that also + | provides a richer body of commands than a typical key-value system + | such as APC or Memcached. Laravel makes it easy to dig right in. + | + */ + + 'redis' => [ + + 'client' => env('REDIS_CLIENT', 'phpredis'), + + 'options' => [ + 'cluster' => env('REDIS_CLUSTER', 'redis'), + 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'), + ], + + 'default' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'password' => env('REDIS_PASSWORD', null), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_DB', '0'), + ], + + 'cache' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'password' => env('REDIS_PASSWORD', null), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_CACHE_DB', '1'), + ], + + ], + +]; diff --git a/config/filesystems.php b/config/filesystems.php new file mode 100644 index 0000000..35c62bf --- /dev/null +++ b/config/filesystems.php @@ -0,0 +1,72 @@ + env('FILESYSTEM_DISK', 'public'), + + /* + |-------------------------------------------------------------------------- + | Filesystem Disks + |-------------------------------------------------------------------------- + | + | Here you may configure as many filesystem "disks" as you wish, and you + | may even configure multiple disks of the same driver. Defaults have + | been setup for each driver as an example of the required options. + | + | Supported Drivers: "local", "ftp", "sftp", "s3" + | + */ + + 'disks' => [ + + 'local' => [ + 'driver' => 'local', + 'root' => storage_path('app'), + ], + + 'public' => [ + 'driver' => 'local', + 'root' => storage_path('app/public'), + 'url' => env('APP_URL').'/storage', + 'visibility' => 'public', + ], + + 's3' => [ + 'driver' => 's3', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION'), + 'bucket' => env('AWS_BUCKET'), + 'url' => env('AWS_URL'), + 'endpoint' => env('AWS_ENDPOINT'), + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Symbolic Links + |-------------------------------------------------------------------------- + | + | Here you may configure the symbolic links that will be created when the + | `storage:link` Artisan command is executed. The array keys should be + | the locations of the links and the values should be their targets. + | + */ + + 'links' => [ + public_path('storage') => storage_path('app/public'), + ], + +]; diff --git a/config/hashing.php b/config/hashing.php new file mode 100644 index 0000000..5b10c09 --- /dev/null +++ b/config/hashing.php @@ -0,0 +1,52 @@ + 'bcrypt', + + /* + |-------------------------------------------------------------------------- + | Bcrypt Options + |-------------------------------------------------------------------------- + | + | Here you may specify the configuration options that should be used when + | passwords are hashed using the Bcrypt algorithm. This will allow you + | to control the amount of time it takes to hash the given password. + | + */ + + 'bcrypt' => [ + 'rounds' => env('BCRYPT_ROUNDS', 10), + ], + + /* + |-------------------------------------------------------------------------- + | Argon Options + |-------------------------------------------------------------------------- + | + | Here you may specify the configuration options that should be used when + | passwords are hashed using the Argon algorithm. These will allow you + | to control the amount of time it takes to hash the given password. + | + */ + + 'argon' => [ + 'memory' => 1024, + 'threads' => 2, + 'time' => 2, + ], + +]; diff --git a/config/imap.php b/config/imap.php new file mode 100644 index 0000000..8797565 --- /dev/null +++ b/config/imap.php @@ -0,0 +1,193 @@ + env('IMAP_DEFAULT_ACCOUNT', 'default'), + + /* + |-------------------------------------------------------------------------- + | Default date format + |-------------------------------------------------------------------------- + | + | The default date format is used to convert any given Carbon::class object into a valid date string. + | These are currently known working formats: "d-M-Y", "d-M-y", "d M y" + | + */ + 'date_format' => 'd-M-Y', + + /* + |-------------------------------------------------------------------------- + | Available IMAP accounts + |-------------------------------------------------------------------------- + | + | Please list all IMAP accounts which you are planning to use within the + | array below. + | + */ + 'accounts' => [ + 'default' => [ + 'host' => env('IMAP_HOST', 'localhost'), + 'port' => env('IMAP_PORT', 993), + 'protocol' => env('IMAP_PROTOCOL', 'imap'), // might also use imap, [pop3 or nntp (untested)] + 'encryption' => env('IMAP_ENCRYPTION', 'ssl'), // Supported: false, 'ssl', 'tls', 'notls', 'starttls' + 'validate_cert' => env('IMAP_VALIDATE_CERT', true), + 'username' => env('IMAP_USERNAME', 'root@example.com'), + 'password' => env('IMAP_PASSWORD', ''), + 'authentication' => env('IMAP_AUTHENTICATION', null), + 'proxy' => [ + 'socket' => null, + 'request_fulluri' => false, + 'username' => null, + 'password' => null, + ], + 'timeout' => 30, + 'extensions' => [], + ], + ], + + /* + |-------------------------------------------------------------------------- + | Available IMAP options + |-------------------------------------------------------------------------- + | + | Available php imap config parameters are listed below + | -Delimiter (optional): + | This option is only used when calling $oClient-> + | You can use any supported char such as ".", "/", (...) + | -Fetch option: + | IMAP::FT_UID - Message marked as read by fetching the body message + | IMAP::FT_PEEK - Fetch the message without setting the "seen" flag + | -Fetch sequence id: + | IMAP::ST_UID - Fetch message components using the message uid + | IMAP::ST_MSGN - Fetch message components using the message number + | -Body download option + | Default TRUE + | -Flag download option + | Default TRUE + | -Soft fail + | Default FALSE - Set to TRUE if you want to ignore certain exception while fetching bulk messages + | -RFC822 + | Default TRUE - Set to FALSE to prevent the usage of \imap_rfc822_parse_headers(). + | See https://github.com/Webklex/php-imap/issues/115 for more information. + | -Debug enable to trace communication traffic + | -UID cache enable the UID cache + | -Fallback date is used if the given message date could not be parsed + | -Boundary regex used to detect message boundaries. If you are having problems with empty messages, missing + | attachments or anything like this. Be advised that it likes to break which causes new problems.. + | -Message key identifier option + | You can choose between the following: + | 'id' - Use the MessageID as array key (default, might cause hickups with yahoo mail) + | 'number' - Use the message number as array key (isn't always unique and can cause some interesting behavior) + | 'list' - Use the message list number as array key (incrementing integer (does not always start at 0 or 1) + | 'uid' - Use the message uid as array key (isn't always unique and can cause some interesting behavior) + | -Fetch order + | 'asc' - Order all messages ascending (probably results in oldest first) + | 'desc' - Order all messages descending (probably results in newest first) + | -Disposition types potentially considered an attachment + | Default ['attachment', 'inline'] + | -Common folders + | Default folder locations and paths assumed if none is provided + | -Open IMAP options: + | DISABLE_AUTHENTICATOR - Disable authentication properties. + | Use 'GSSAPI' if you encounter the following + | error: "Kerberos error: No credentials cache + | file found (try running kinit) (...)" + | or ['GSSAPI','PLAIN'] if you are using outlook mail + | -Decoder options (currently only the message subject and attachment name decoder can be set) + | 'utf-8' - Uses imap_utf8($string) to decode a string + | 'mimeheader' - Uses mb_decode_mimeheader($string) to decode a string + | + */ + 'options' => [ + 'delimiter' => '/', + 'fetch' => \Webklex\PHPIMAP\IMAP::FT_PEEK, + 'sequence' => \Webklex\PHPIMAP\IMAP::ST_UID, + 'fetch_body' => true, + 'fetch_flags' => true, + 'soft_fail' => false, + 'rfc822' => true, + 'debug' => false, + 'uid_cache' => true, + // 'fallback_date' => "01.01.1970 00:00:00", + 'boundary' => '/boundary=(.*?(?=;)|(.*))/i', + 'message_key' => 'list', + 'fetch_order' => 'asc', + 'dispositions' => ['attachment', 'inline'], + 'common_folders' => [ + 'root' => 'INBOX', + 'junk' => 'INBOX/Junk', + 'draft' => 'INBOX/Drafts', + 'sent' => 'INBOX/Sent', + 'trash' => 'INBOX/Trash', + ], + 'decoder' => [ + 'message' => 'utf-8', // mimeheader + 'attachment' => 'utf-8', // mimeheader + ], + 'open' => [ + // 'DISABLE_AUTHENTICATOR' => 'GSSAPI' + ], + ], + + /* + |-------------------------------------------------------------------------- + | Available flags + |-------------------------------------------------------------------------- + | + | List all available / supported flags. Set to null to accept all given flags. + */ + 'flags' => ['recent', 'flagged', 'answered', 'deleted', 'seen', 'draft'], + + /* + |-------------------------------------------------------------------------- + | Available events + |-------------------------------------------------------------------------- + | + */ + 'events' => [ + 'message' => [ + 'new' => \Webklex\IMAP\Events\MessageNewEvent::class, + 'moved' => \Webklex\IMAP\Events\MessageMovedEvent::class, + 'copied' => \Webklex\IMAP\Events\MessageCopiedEvent::class, + 'deleted' => \Webklex\IMAP\Events\MessageDeletedEvent::class, + 'restored' => \Webklex\IMAP\Events\MessageRestoredEvent::class, + ], + 'folder' => [ + 'new' => \Webklex\IMAP\Events\FolderNewEvent::class, + 'moved' => \Webklex\IMAP\Events\FolderMovedEvent::class, + 'deleted' => \Webklex\IMAP\Events\FolderDeletedEvent::class, + ], + 'flag' => [ + 'new' => \Webklex\IMAP\Events\FlagNewEvent::class, + 'deleted' => \Webklex\IMAP\Events\FlagDeletedEvent::class, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Available masking options + |-------------------------------------------------------------------------- + | + | By using your own custom masks you can implement your own methods for + | a better and faster access and less code to write. + | + | Checkout the two examples custom_attachment_mask and custom_message_mask + | for a quick start. + | + | The provided masks below are used as the default masks. + */ + 'masks' => [ + 'message' => \Webklex\PHPIMAP\Support\Masks\MessageMask::class, + 'attachment' => \Webklex\PHPIMAP\Support\Masks\AttachmentMask::class, + ], +]; diff --git a/config/krayin-vite.php b/config/krayin-vite.php new file mode 100755 index 0000000..d502a07 --- /dev/null +++ b/config/krayin-vite.php @@ -0,0 +1,32 @@ + [ + 'admin' => [ + 'hot_file' => 'admin-vite.hot', + 'build_directory' => 'admin/build', + 'package_assets_directory' => 'src/Resources/assets', + ], + + 'installer' => [ + 'hot_file' => 'installer-vite.hot', + 'build_directory' => 'installer/build', + 'package_assets_directory' => 'src/Resources/assets', + ], + + 'webform' => [ + 'hot_file' => 'webform-vite.hot', + 'build_directory' => 'webform/build', + 'package_assets_directory' => 'src/Resources/assets', + ], + ], +]; diff --git a/config/logging.php b/config/logging.php new file mode 100644 index 0000000..c1cb04e --- /dev/null +++ b/config/logging.php @@ -0,0 +1,104 @@ + env('LOG_CHANNEL', 'stack'), + + /* + |-------------------------------------------------------------------------- + | Log Channels + |-------------------------------------------------------------------------- + | + | Here you may configure the log channels for your application. Out of + | the box, Laravel uses the Monolog PHP logging library. This gives + | you a variety of powerful log handlers / formatters to utilize. + | + | Available Drivers: "single", "daily", "slack", "syslog", + | "errorlog", "monolog", + | "custom", "stack" + | + */ + + 'channels' => [ + 'stack' => [ + 'driver' => 'stack', + 'channels' => ['single'], + 'ignore_exceptions' => false, + ], + + 'single' => [ + 'driver' => 'single', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + ], + + 'daily' => [ + 'driver' => 'daily', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'days' => 14, + ], + + 'slack' => [ + 'driver' => 'slack', + 'url' => env('LOG_SLACK_WEBHOOK_URL'), + 'username' => 'Laravel Log', + 'emoji' => ':boom:', + 'level' => env('LOG_LEVEL', 'critical'), + ], + + 'papertrail' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => SyslogUdpHandler::class, + 'handler_with' => [ + 'host' => env('PAPERTRAIL_URL'), + 'port' => env('PAPERTRAIL_PORT'), + ], + ], + + 'stderr' => [ + 'driver' => 'monolog', + 'handler' => StreamHandler::class, + 'formatter' => env('LOG_STDERR_FORMATTER'), + 'with' => [ + 'stream' => 'php://stderr', + ], + ], + + 'syslog' => [ + 'driver' => 'syslog', + 'level' => env('LOG_LEVEL', 'debug'), + ], + + 'errorlog' => [ + 'driver' => 'errorlog', + 'level' => env('LOG_LEVEL', 'debug'), + ], + + 'null' => [ + 'driver' => 'monolog', + 'handler' => NullHandler::class, + ], + + 'emergency' => [ + 'path' => storage_path('logs/laravel.log'), + ], + ], + +]; diff --git a/config/mail-receiver.php b/config/mail-receiver.php new file mode 100644 index 0000000..32f1573 --- /dev/null +++ b/config/mail-receiver.php @@ -0,0 +1,17 @@ + env('MAIL_RECEIVER_DRIVER', 'sendgrid'), +]; diff --git a/config/mail.php b/config/mail.php new file mode 100644 index 0000000..2f2f48d --- /dev/null +++ b/config/mail.php @@ -0,0 +1,130 @@ + env('MAIL_MAILER', 'smtp'), + + /* + |-------------------------------------------------------------------------- + | Mailer Configurations + |-------------------------------------------------------------------------- + | + | Here you may configure all of the mailers used by your application plus + | their respective settings. Several examples have been configured for + | you and you are free to add your own as your application requires. + | + | Laravel supports a variety of mail "transport" drivers to be used while + | sending an e-mail. You will specify which one you are using for your + | mailers below. You are free to add additional mailers as required. + | + | Supported: "smtp", "sendmail", "mailgun", "ses", + | "postmark", "log", "array", "failover" + | + */ + + 'mailers' => [ + 'smtp' => [ + 'transport' => 'smtp', + 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), + 'port' => env('MAIL_PORT', 587), + 'encryption' => env('MAIL_ENCRYPTION', 'tls'), + 'username' => env('MAIL_USERNAME'), + 'password' => env('MAIL_PASSWORD'), + 'timeout' => null, + 'verify_peer' => false, + ], + + 'ses' => [ + 'transport' => 'ses', + ], + + 'mailgun' => [ + 'transport' => 'mailgun', + ], + + 'postmark' => [ + 'transport' => 'postmark', + ], + + 'sendmail' => [ + 'transport' => 'sendmail', + 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'), + ], + + 'log' => [ + 'transport' => 'log', + 'channel' => env('MAIL_LOG_CHANNEL'), + ], + + 'array' => [ + 'transport' => 'array', + ], + + 'failover' => [ + 'transport' => 'failover', + 'mailers' => [ + 'smtp', + 'log', + ], + ], + ], + + /* + |-------------------------------------------------------------------------- + | Global "From" Address + |-------------------------------------------------------------------------- + | + | You may wish for all e-mails sent by your application to be sent from + | the same address. Here, you may specify a name and address that is + | used globally for all e-mails that are sent by your application. + | + */ + + 'from' => [ + 'address' => env('MAIL_FROM_ADDRESS'), + 'name' => env('MAIL_FROM_NAME'), + ], + + /* + |-------------------------------------------------------------------------- + | Default Mailer Domain + |-------------------------------------------------------------------------- + | + | This option controls the domain for email message_id that is used to send email + | messages sent by your application. + | + */ + + 'domain' => env('MAIL_DOMAIN', 'webkul.com'), + + /* + |-------------------------------------------------------------------------- + | Markdown Mail Settings + |-------------------------------------------------------------------------- + | + | If you are using Markdown based email rendering, you may configure your + | theme and component paths here, allowing you to customize the design + | of the emails. Or, you may simply stick with the Laravel defaults! + | + */ + + 'markdown' => [ + 'theme' => 'default', + + 'paths' => [ + resource_path('views/vendor/mail'), + ], + ], + +]; diff --git a/config/queue.php b/config/queue.php new file mode 100644 index 0000000..a8bf551 --- /dev/null +++ b/config/queue.php @@ -0,0 +1,89 @@ + env('QUEUE_CONNECTION', 'sync'), + + /* + |-------------------------------------------------------------------------- + | Queue Connections + |-------------------------------------------------------------------------- + | + | Here you may configure the connection information for each server that + | is used by your application. A default configuration has been added + | for each back-end shipped with Laravel. You are free to add more. + | + | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" + | + */ + + 'connections' => [ + + 'sync' => [ + 'driver' => 'sync', + ], + + 'database' => [ + 'driver' => 'database', + 'table' => 'jobs', + 'queue' => 'default', + 'retry_after' => 90, + ], + + 'beanstalkd' => [ + 'driver' => 'beanstalkd', + 'host' => 'localhost', + 'queue' => 'default', + 'retry_after' => 90, + 'block_for' => 0, + ], + + 'sqs' => [ + 'driver' => 'sqs', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), + 'queue' => env('SQS_QUEUE', 'your-queue-name'), + 'suffix' => env('SQS_SUFFIX'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + 'queue' => env('REDIS_QUEUE', 'default'), + 'retry_after' => 90, + 'block_for' => null, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Failed Queue Jobs + |-------------------------------------------------------------------------- + | + | These options configure the behavior of failed queue job logging so you + | can control which database and table are used to store the jobs that + | have failed. You may change them to any database / table you wish. + | + */ + + 'failed' => [ + 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), + 'database' => env('DB_CONNECTION', 'mysql'), + 'table' => 'failed_jobs', + ], + +]; diff --git a/config/repository.php b/config/repository.php new file mode 100644 index 0000000..5fe17d3 --- /dev/null +++ b/config/repository.php @@ -0,0 +1,247 @@ + [ + 'limit' => 15, + ], + + /* + |-------------------------------------------------------------------------- + | Fractal Presenter Config + |-------------------------------------------------------------------------- + | + + Available serializers: + ArraySerializer + DataArraySerializer + JsonApiSerializer + + */ + 'fractal' => [ + 'params' => [ + 'include' => 'include', + ], + 'serializer' => League\Fractal\Serializer\DataArraySerializer::class, + ], + + /* + |-------------------------------------------------------------------------- + | Cache Config + |-------------------------------------------------------------------------- + | + */ + 'cache' => [ + /* + |-------------------------------------------------------------------------- + | Cache Status + |-------------------------------------------------------------------------- + | + | Enable or disable cache + | + */ + 'enabled' => false, + + /* + |-------------------------------------------------------------------------- + | Cache Minutes + |-------------------------------------------------------------------------- + | + | Time of expiration cache + | + */ + 'minutes' => 30, + + /* + |-------------------------------------------------------------------------- + | Cache Repository + |-------------------------------------------------------------------------- + | + | Instance of Illuminate\Contracts\Cache\Repository + | + */ + 'repository' => 'cache', + + /* + |-------------------------------------------------------------------------- + | Cache Clean Listener + |-------------------------------------------------------------------------- + | + | + | + */ + 'clean' => [ + + /* + |-------------------------------------------------------------------------- + | Enable clear cache on repository changes + |-------------------------------------------------------------------------- + | + */ + 'enabled' => true, + + /* + |-------------------------------------------------------------------------- + | Actions in Repository + |-------------------------------------------------------------------------- + | + | create : Clear Cache on create Entry in repository + | update : Clear Cache on update Entry in repository + | delete : Clear Cache on delete Entry in repository + | + */ + 'on' => [ + 'create' => true, + 'update' => true, + 'delete' => true, + ], + ], + + 'params' => [ + /* + |-------------------------------------------------------------------------- + | Skip Cache Params + |-------------------------------------------------------------------------- + | + | + | Ex: http://prettus.local/?search=lorem&skipCache=true + | + */ + 'skipCache' => 'skipCache', + ], + + /* + |-------------------------------------------------------------------------- + | Methods Allowed + |-------------------------------------------------------------------------- + | + | methods cacheable : all, paginate, find, findByField, findWhere, getByCriteria + | + | Ex: + | + | 'only' =>['all','paginate'], + | + | or + | + | 'except' =>['find'], + */ + 'allowed' => [ + 'only' => null, + 'except' => null, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Criteria Config + |-------------------------------------------------------------------------- + | + | Settings of request parameters names that will be used by Criteria + | + */ + 'criteria' => [ + /* + |-------------------------------------------------------------------------- + | Accepted Conditions + |-------------------------------------------------------------------------- + | + | Conditions accepted in consultations where the Criteria + | + | Ex: + | + | 'acceptedConditions'=>['=','like'] + | + | $query->where('foo','=','bar') + | $query->where('foo','like','bar') + | + */ + 'acceptedConditions' => [ + '=', + 'like', + 'in', + ], + /* + |-------------------------------------------------------------------------- + | Request Params + |-------------------------------------------------------------------------- + | + | Request parameters that will be used to filter the query in the repository + | + | Params : + | + | - search : Searched value + | Ex: http://prettus.local/?search=lorem + | + | - searchFields : Fields in which research should be carried out + | Ex: + | http://prettus.local/?search=lorem&searchFields=name;email + | http://prettus.local/?search=lorem&searchFields=name:like;email + | http://prettus.local/?search=lorem&searchFields=name:like + | + | - filter : Fields that must be returned to the response object + | Ex: + | http://prettus.local/?search=lorem&filter=id,name + | + | - orderBy : Order By + | Ex: + | http://prettus.local/?search=lorem&orderBy=id + | + | - sortedBy : Sort + | Ex: + | http://prettus.local/?search=lorem&orderBy=id&sortedBy=asc + | http://prettus.local/?search=lorem&orderBy=id&sortedBy=desc + | + | - searchJoin: Specifies the search method (AND / OR), by default the + | application searches each parameter with OR + | EX: + | http://prettus.local/?search=lorem&searchJoin=and + | http://prettus.local/?search=lorem&searchJoin=or + | + */ + 'params' => [ + 'search' => 'search', + 'searchFields' => 'searchFields', + 'filter' => 'filter', + 'orderBy' => 'orderBy', + 'sortedBy' => 'sortedBy', + 'with' => 'with', + 'searchJoin' => 'searchJoin', + 'withCount' => 'withCount', + ], + ], + /* + |-------------------------------------------------------------------------- + | Generator Config + |-------------------------------------------------------------------------- + | + */ + 'generator' => [ + 'basePath' => app()->path(), + 'rootNamespace' => 'App\\', + 'stubsOverridePath' => app()->path(), + 'paths' => [ + 'models' => 'Entities', + 'repositories' => 'Repositories', + 'interfaces' => 'Repositories', + 'transformers' => 'Transformers', + 'presenters' => 'Presenters', + 'validators' => 'Validators', + 'controllers' => 'Http/Controllers', + 'provider' => 'RepositoryServiceProvider', + 'criteria' => 'Criteria', + ], + ], +]; diff --git a/config/sanctum.php b/config/sanctum.php new file mode 100644 index 0000000..c6c6045 --- /dev/null +++ b/config/sanctum.php @@ -0,0 +1,65 @@ + explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( + '%s%s', + 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1', + env('APP_URL') ? ','.parse_url(env('APP_URL'), PHP_URL_HOST) : '' + ))), + + /* + |-------------------------------------------------------------------------- + | Sanctum Guards + |-------------------------------------------------------------------------- + | + | This array contains the authentication guards that will be checked when + | Sanctum is trying to authenticate a request. If none of these guards + | are able to authenticate the request, Sanctum will use the bearer + | token that's present on an incoming request for authentication. + | + */ + + 'guard' => ['user'], + + /* + |-------------------------------------------------------------------------- + | Expiration Minutes + |-------------------------------------------------------------------------- + | + | This value controls the number of minutes until an issued token will be + | considered expired. If this value is null, personal access tokens do + | not expire. This won't tweak the lifetime of first-party sessions. + | + */ + + 'expiration' => null, + + /* + |-------------------------------------------------------------------------- + | Sanctum Middleware + |-------------------------------------------------------------------------- + | + | When authenticating your first-party SPA with Sanctum you may need to + | customize some of the middleware Sanctum uses while processing the + | request. You may change the middleware listed below as required. + | + */ + + 'middleware' => [ + 'verify_csrf_token' => App\Http\Middleware\VerifyCsrfToken::class, + 'encrypt_cookies' => App\Http\Middleware\EncryptCookies::class, + ], + +]; diff --git a/config/services.php b/config/services.php new file mode 100644 index 0000000..3215b42 --- /dev/null +++ b/config/services.php @@ -0,0 +1,33 @@ + [ + 'domain' => env('MAILGUN_DOMAIN'), + 'secret' => env('MAILGUN_SECRET'), + 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'), + ], + + 'postmark' => [ + 'token' => env('POSTMARK_TOKEN'), + ], + + 'ses' => [ + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + ], + +]; diff --git a/config/session.php b/config/session.php new file mode 100644 index 0000000..3c30e2c --- /dev/null +++ b/config/session.php @@ -0,0 +1,201 @@ + env('SESSION_DRIVER', 'file'), + + /* + |-------------------------------------------------------------------------- + | Session Lifetime + |-------------------------------------------------------------------------- + | + | Here you may specify the number of minutes that you wish the session + | to be allowed to remain idle before it expires. If you want them + | to immediately expire on the browser closing, set that option. + | + */ + + 'lifetime' => env('SESSION_LIFETIME', 120), + + 'expire_on_close' => false, + + /* + |-------------------------------------------------------------------------- + | Session Encryption + |-------------------------------------------------------------------------- + | + | This option allows you to easily specify that all of your session data + | should be encrypted before it is stored. All encryption will be run + | automatically by Laravel and you can use the Session like normal. + | + */ + + 'encrypt' => false, + + /* + |-------------------------------------------------------------------------- + | Session File Location + |-------------------------------------------------------------------------- + | + | When using the native session driver, we need a location where session + | files may be stored. A default has been set for you but a different + | location may be specified. This is only needed for file sessions. + | + */ + + 'files' => storage_path('framework/sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Database Connection + |-------------------------------------------------------------------------- + | + | When using the "database" or "redis" session drivers, you may specify a + | connection that should be used to manage these sessions. This should + | correspond to a connection in your database configuration options. + | + */ + + 'connection' => env('SESSION_CONNECTION', null), + + /* + |-------------------------------------------------------------------------- + | Session Database Table + |-------------------------------------------------------------------------- + | + | When using the "database" session driver, you may specify the table we + | should use to manage the sessions. Of course, a sensible default is + | provided for you; however, you are free to change this as needed. + | + */ + + 'table' => 'sessions', + + /* + |-------------------------------------------------------------------------- + | Session Cache Store + |-------------------------------------------------------------------------- + | + | While using one of the framework's cache driven session backends you may + | list a cache store that should be used for these sessions. This value + | must match with one of the application's configured cache "stores". + | + | Affects: "apc", "dynamodb", "memcached", "redis" + | + */ + + 'store' => env('SESSION_STORE', null), + + /* + |-------------------------------------------------------------------------- + | Session Sweeping Lottery + |-------------------------------------------------------------------------- + | + | Some session drivers must manually sweep their storage location to get + | rid of old sessions from storage. Here are the chances that it will + | happen on a given request. By default, the odds are 2 out of 100. + | + */ + + 'lottery' => [2, 100], + + /* + |-------------------------------------------------------------------------- + | Session Cookie Name + |-------------------------------------------------------------------------- + | + | Here you may change the name of the cookie used to identify a session + | instance by ID. The name specified here will get used every time a + | new session cookie is created by the framework for every driver. + | + */ + + 'cookie' => env( + 'SESSION_COOKIE', + Str::slug(env('APP_NAME', 'laravel'), '_').'_session' + ), + + /* + |-------------------------------------------------------------------------- + | Session Cookie Path + |-------------------------------------------------------------------------- + | + | The session cookie path determines the path for which the cookie will + | be regarded as available. Typically, this will be the root path of + | your application but you are free to change this when necessary. + | + */ + + 'path' => '/', + + /* + |-------------------------------------------------------------------------- + | Session Cookie Domain + |-------------------------------------------------------------------------- + | + | Here you may change the domain of the cookie used to identify a session + | in your application. This will determine which domains the cookie is + | available to in your application. A sensible default has been set. + | + */ + + 'domain' => env('SESSION_DOMAIN') ?: null, + + /* + |-------------------------------------------------------------------------- + | HTTPS Only Cookies + |-------------------------------------------------------------------------- + | + | By setting this option to true, session cookies will only be sent back + | to the server if the browser has a HTTPS connection. This will keep + | the cookie from being sent to you if it can not be done securely. + | + */ + + 'secure' => false, + + /* + |-------------------------------------------------------------------------- + | HTTP Access Only + |-------------------------------------------------------------------------- + | + | Setting this value to true will prevent JavaScript from accessing the + | value of the cookie and the cookie will only be accessible through + | the HTTP protocol. You are free to modify this option if needed. + | + */ + + 'http_only' => true, + + /* + |-------------------------------------------------------------------------- + | Same-Site Cookies + |-------------------------------------------------------------------------- + | + | This option determines how your cookies behave when cross-site requests + | take place, and can be used to mitigate CSRF attacks. By default, we + | will set this value to "lax" since this is a secure default value. + | + | Supported: "lax", "strict", "none", null + | + */ + + 'same_site' => 'lax', + +]; diff --git a/config/tenancy.php b/config/tenancy.php new file mode 100644 index 0000000..bca00ca --- /dev/null +++ b/config/tenancy.php @@ -0,0 +1,201 @@ + App\Models\Tenant::class, + 'id_generator' => Stancl\Tenancy\UUIDGenerator::class, + + 'domain_model' => Domain::class, + + /** + * The list of domains hosting your central app. + * + * Only relevant if you're using the domain or subdomain identification middleware. + */ + 'central_domains' => [ + '127.0.0.1', + 'localhost', + 'localhost:8000', + 'growuppro.com.br', + ], + + /** + * Tenancy bootstrappers are executed when tenancy is initialized. + * Their responsibility is making Laravel features tenant-aware. + * + * To configure their behavior, see the config keys below. + */ + 'bootstrappers' => [ + Stancl\Tenancy\Bootstrappers\DatabaseTenancyBootstrapper::class, + Stancl\Tenancy\Bootstrappers\CacheTenancyBootstrapper::class, + Stancl\Tenancy\Bootstrappers\FilesystemTenancyBootstrapper::class, + Stancl\Tenancy\Bootstrappers\QueueTenancyBootstrapper::class, + // Stancl\Tenancy\Bootstrappers\RedisTenancyBootstrapper::class, // Note: phpredis is needed + ], + + /** + * Database tenancy config. Used by DatabaseTenancyBootstrapper. + */ + 'database' => [ + 'central_connection' => env('DB_CONNECTION', 'central'), + + /** + * Connection used as a "template" for the dynamically created tenant database connection. + * Note: don't name your template connection tenant. That name is reserved by package. + */ + 'template_tenant_connection' => null, + + /** + * Tenant database names are created like this: + * prefix + tenant_id + suffix. + */ + 'prefix' => 'tenant_', + 'suffix' => '', + + /** + * TenantDatabaseManagers are classes that handle the creation & deletion of tenant databases. + */ + 'managers' => [ + 'sqlite' => Stancl\Tenancy\TenantDatabaseManagers\SQLiteDatabaseManager::class, + 'mysql' => Stancl\Tenancy\TenantDatabaseManagers\MySQLDatabaseManager::class, + 'pgsql' => Stancl\Tenancy\TenantDatabaseManagers\PostgreSQLDatabaseManager::class, + + /** + * Use this database manager for MySQL to have a DB user created for each tenant database. + * You can customize the grants given to these users by changing the $grants property. + */ + // 'mysql' => Stancl\Tenancy\TenantDatabaseManagers\PermissionControlledMySQLDatabaseManager::class, + + /** + * Disable the pgsql manager above, and enable the one below if you + * want to separate tenant DBs by schemas rather than databases. + */ + // 'pgsql' => Stancl\Tenancy\TenantDatabaseManagers\PostgreSQLSchemaManager::class, // Separate by schema instead of database + ], + ], + + /** + * Cache tenancy config. Used by CacheTenancyBootstrapper. + * + * This works for all Cache facade calls, cache() helper + * calls and direct calls to injected cache stores. + * + * Each key in cache will have a tag applied on it. This tag is used to + * scope the cache both when writing to it and when reading from it. + * + * You can clear cache selectively by specifying the tag. + */ + 'cache' => [ + 'tag_base' => 'tenant', // This tag_base, followed by the tenant_id, will form a tag that will be applied on each cache call. + ], + + /** + * Filesystem tenancy config. Used by FilesystemTenancyBootstrapper. + * https://tenancyforlaravel.com/docs/v3/tenancy-bootstrappers/#filesystem-tenancy-boostrapper. + */ + 'filesystem' => [ + /** + * Each disk listed in the 'disks' array will be suffixed by the suffix_base, followed by the tenant_id. + */ + 'suffix_base' => 'tenant', + 'disks' => [ + 'local', + 'public', + // 's3', + ], + + /** + * Use this for local disks. + * + * See https://tenancyforlaravel.com/docs/v3/tenancy-bootstrappers/#filesystem-tenancy-boostrapper + */ + 'root_override' => [ + // Disks whose roots should be overridden after storage_path() is suffixed. + 'local' => '%storage_path%/app/', + 'public' => '%storage_path%/app/public/', + ], + + /** + * Should storage_path() be suffixed. + * + * Note: Disabling this will likely break local disk tenancy. Only disable this if you're using an external file storage service like S3. + * + * For the vast majority of applications, this feature should be enabled. But in some + * edge cases, it can cause issues (like using Passport with Vapor - see #196), so + * you may want to disable this if you are experiencing these edge case issues. + */ + 'suffix_storage_path' => true, + + /** + * By default, asset() calls are made multi-tenant too. You can use global_asset() and mix() + * for global, non-tenant-specific assets. However, you might have some issues when using + * packages that use asset() calls inside the tenant app. To avoid such issues, you can + * disable asset() helper tenancy and explicitly use tenant_asset() calls in places + * where you want to use tenant-specific assets (product images, avatars, etc). + */ + 'asset_helper_tenancy' => false, + ], + + /** + * Redis tenancy config. Used by RedisTenancyBootstrapper. + * + * Note: You need phpredis to use Redis tenancy. + * + * Note: You don't need to use this if you're using Redis only for cache. + * Redis tenancy is only relevant if you're making direct Redis calls, + * either using the Redis facade or by injecting it as a dependency. + */ + 'redis' => [ + 'prefix_base' => 'tenant', // Each key in Redis will be prepended by this prefix_base, followed by the tenant id. + 'prefixed_connections' => [ // Redis connections whose keys are prefixed, to separate one tenant's keys from another. + // 'default', + ], + ], + + /** + * Features are classes that provide additional functionality + * not needed for tenancy to be bootstrapped. They are run + * regardless of whether tenancy has been initialized. + * + * See the documentation page for each class to + * understand which ones you want to enable. + */ + 'features' => [ + // Stancl\Tenancy\Features\UserImpersonation::class, + // Stancl\Tenancy\Features\TelescopeTags::class, + Stancl\Tenancy\Features\UniversalRoutes::class, + // Stancl\Tenancy\Features\TenantConfig::class, // https://tenancyforlaravel.com/docs/v3/features/tenant-config + // Stancl\Tenancy\Features\CrossDomainRedirect::class, // https://tenancyforlaravel.com/docs/v3/features/cross-domain-redirect + // Stancl\Tenancy\Features\ViteBundler::class, + ], + + /** + * Should tenancy routes be registered. + * + * Tenancy routes include tenant asset routes. By default, this route is + * enabled. But it may be useful to disable them if you use external + * storage (e.g. S3 / Dropbox) or have a custom asset controller. + */ + 'routes' => true, + + /** + * Parameters used by the tenants:migrate command. + */ + 'migration_parameters' => [ + '--force' => true, // This needs to be true to run migrations in production. + '--path' => [database_path('migrations/tenant')], + '--realpath' => true, + ], + + /** + * Parameters used by the tenants:seed command. + */ + 'seeder_parameters' => [ + '--class' => 'DatabaseSeeder', // root seeder class + // '--force' => true, // This needs to be true to seed tenant databases in production + ], +]; diff --git a/config/tinker.php b/config/tinker.php new file mode 100644 index 0000000..c187942 --- /dev/null +++ b/config/tinker.php @@ -0,0 +1,50 @@ + [ + // App\Console\Commands\ExampleCommand::class, + ], + + /* + |-------------------------------------------------------------------------- + | Auto Aliased Classes + |-------------------------------------------------------------------------- + | + | Tinker will not automatically alias classes in your vendor namespaces + | but you may explicitly allow a subset of classes to get aliased by + | adding the names of each of those classes to the following list. + | + */ + + 'alias' => [ + // + ], + + /* + |-------------------------------------------------------------------------- + | Classes That Should Not Be Aliased + |-------------------------------------------------------------------------- + | + | Typically, Tinker automatically aliases classes as you require them in + | Tinker. However, you may wish to never alias certain classes, which + | you may accomplish by listing the classes in the following array. + | + */ + + 'dont_alias' => [ + 'App\Nova', + ], + +]; diff --git a/config/view.php b/config/view.php new file mode 100644 index 0000000..22b8a18 --- /dev/null +++ b/config/view.php @@ -0,0 +1,36 @@ + [ + resource_path('views'), + ], + + /* + |-------------------------------------------------------------------------- + | Compiled View Path + |-------------------------------------------------------------------------- + | + | This option determines where all the compiled Blade templates will be + | stored for your application. Typically, this is within the storage + | directory. However, as usual, you are free to change this value. + | + */ + + 'compiled' => env( + 'VIEW_COMPILED_PATH', + realpath(storage_path('framework/views')) + ), + +]; diff --git a/configurar-docker.sh b/configurar-docker.sh new file mode 100755 index 0000000..5d11977 --- /dev/null +++ b/configurar-docker.sh @@ -0,0 +1,173 @@ +#!/bin/bash +# Script completo para criar a imagem Docker do Krayin + +# ======================================== +# 1. CRIAR ESTRUTURA DE PASTAS +# ======================================== +mkdir -p docker + +# ======================================== +# 2. CRIAR docker/nginx.conf +# ======================================== +cat > docker/nginx.conf << 'EOF' +server { + listen 80; + server_name _; + root /var/www/html/public; + + add_header X-Frame-Options "SAMEORIGIN"; + add_header X-Content-Type-Options "nosniff"; + + index index.php; + + charset utf-8; + + location / { + try_files $uri $uri/ /index.php?$query_string; + } + + location = /favicon.ico { access_log off; log_not_found off; } + location = /robots.txt { access_log off; log_not_found off; } + + error_page 404 /index.php; + + location ~ \.php$ { + fastcgi_pass 127.0.0.1:9000; + fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; + include fastcgi_params; + } + + location ~ /\.(?!well-known).* { + deny all; + } +} +EOF + +# ======================================== +# 3. CRIAR docker/supervisord.conf +# ======================================== +cat > docker/supervisord.conf << 'EOF' +[supervisord] +nodaemon=true +user=root + +[program:php-fpm] +command=/usr/local/sbin/php-fpm +autostart=true +autorestart=true +priority=5 +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 + +[program:nginx] +command=/usr/sbin/nginx -g "daemon off;" +autostart=true +autorestart=true +priority=10 +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +EOF + +# ======================================== +# 4. CRIAR .dockerignore +# ======================================== +cat > .dockerignore << 'EOF' +.git +.gitignore +.env +node_modules +vendor +storage/logs/* +storage/framework/cache/* +storage/framework/sessions/* +storage/framework/views/* +bootstrap/cache/* +.DS_Store +Thumbs.db +EOF + +# ======================================== +# 5. CRIAR Dockerfile +# ======================================== +cat > Dockerfile << 'EOF' +FROM php:8.1-fpm + +# Instalar dependências do sistema +RUN apt-get update && apt-get install -y \ + git \ + curl \ + libpng-dev \ + libonig-dev \ + libxml2-dev \ + zip \ + unzip \ + libzip-dev \ + nginx \ + supervisor \ + && docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip \ + && apt-get clean && rm -rf /var/lib/apt/lists/* + +# Instalar Composer +COPY --from=composer:latest /usr/bin/composer /usr/bin/composer + +# Criar diretório da aplicação +WORKDIR /var/www/html + +# Copiar arquivos do projeto +COPY . . + +# Instalar dependências do Composer +RUN composer install --no-dev --optimize-autoloader --no-interaction + +# Ajustar permissões +RUN chown -R www-data:www-data /var/www/html \ + && chmod -R 755 /var/www/html/storage \ + && chmod -R 755 /var/www/html/bootstrap/cache + +# Copiar configurações +COPY docker/nginx.conf /etc/nginx/sites-available/default +COPY docker/supervisord.conf /etc/supervisor/conf.d/supervisord.conf + +# Criar script de entrada +RUN echo '#!/bin/bash\n\ +php artisan config:cache\n\ +php artisan route:cache\n\ +php artisan view:cache\n\ +exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf' > /entrypoint.sh \ + && chmod +x /entrypoint.sh + +EXPOSE 80 + +ENTRYPOINT ["/entrypoint.sh"] +EOF + +# ======================================== +# 6. CONSTRUIR A IMAGEM +# ======================================== +echo "Construindo a imagem Docker..." +docker build -t growup:latest . + +# ======================================== +# 7. SALVAR A IMAGEM (opcional) +# ======================================== +echo "Salvando a imagem em arquivo tar..." +docker save growup:latest -o growup-latest.tar + +echo "" +echo "========================================" +echo "IMAGEM CRIADA COM SUCESSO!" +echo "========================================" +echo "" +echo "Para usar no outro servidor:" +echo "1. Copie o arquivo growup-latest.tar para o servidor" +echo "2. Carregue a imagem: docker load -i growup-latest.tar" +echo "3. Use 'image: growup:latest' no seu docker-compose.yml" +echo "" +echo "Ou envie para um registry:" +echo "docker tag growup:latest seu-registry.com/growup:latest" +echo "docker push seu-registry.com/growup:latest" +echo "" diff --git a/database/.gitignore b/database/.gitignore new file mode 100644 index 0000000..97fc976 --- /dev/null +++ b/database/.gitignore @@ -0,0 +1,2 @@ +*.sqlite +*.sqlite-journal diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php new file mode 100644 index 0000000..8556600 --- /dev/null +++ b/database/factories/UserFactory.php @@ -0,0 +1,47 @@ + $this->faker->name, + 'email' => $this->faker->unique()->safeEmail, + 'email_verified_at' => now(), + 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password + 'remember_token' => Str::random(10), + ]; + } + + /** + * Indicate that the model's email address should be unverified. + * + * @return \Illuminate\Database\Eloquent\Factories\Factory + */ + public function unverified() + { + return $this->state(function (array $attributes) { + return [ + 'email_verified_at' => null, + ]; + }); + } +} diff --git a/database/migrations/2019_08_19_000000_create_failed_jobs_table.php b/database/migrations/2019_08_19_000000_create_failed_jobs_table.php new file mode 100644 index 0000000..1719198 --- /dev/null +++ b/database/migrations/2019_08_19_000000_create_failed_jobs_table.php @@ -0,0 +1,36 @@ +id(); + $table->string('uuid')->unique(); + $table->text('connection'); + $table->text('queue'); + $table->longText('payload'); + $table->longText('exception'); + $table->timestamp('failed_at')->useCurrent(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('failed_jobs'); + } +}; diff --git a/database/migrations/2019_09_15_000010_create_tenants_table.php b/database/migrations/2019_09_15_000010_create_tenants_table.php new file mode 100644 index 0000000..ec73065 --- /dev/null +++ b/database/migrations/2019_09_15_000010_create_tenants_table.php @@ -0,0 +1,37 @@ +string('id')->primary(); + + // your custom columns may go here + + $table->timestamps(); + $table->json('data')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down(): void + { + Schema::dropIfExists('tenants'); + } +} diff --git a/database/migrations/2019_09_15_000020_create_domains_table.php b/database/migrations/2019_09_15_000020_create_domains_table.php new file mode 100644 index 0000000..77c1b88 --- /dev/null +++ b/database/migrations/2019_09_15_000020_create_domains_table.php @@ -0,0 +1,37 @@ +increments('id'); + $table->string('domain', 255)->unique(); + $table->string('tenant_id'); + + $table->timestamps(); + $table->foreign('tenant_id')->references('id')->on('tenants')->onUpdate('cascade')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down(): void + { + Schema::dropIfExists('domains'); + } +} diff --git a/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php b/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php new file mode 100644 index 0000000..e828ad8 --- /dev/null +++ b/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php @@ -0,0 +1,33 @@ +id(); + $table->morphs('tokenable'); + $table->string('name'); + $table->string('token', 64)->unique(); + $table->text('abilities')->nullable(); + $table->timestamp('last_used_at')->nullable(); + $table->timestamp('expires_at')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('personal_access_tokens'); + } +}; diff --git a/database/migrations/2020_05_15_000010_create_tenant_user_impersonation_tokens_table.php b/database/migrations/2020_05_15_000010_create_tenant_user_impersonation_tokens_table.php new file mode 100644 index 0000000..32597f3 --- /dev/null +++ b/database/migrations/2020_05_15_000010_create_tenant_user_impersonation_tokens_table.php @@ -0,0 +1,39 @@ +string('token', 128)->primary(); + $table->string('tenant_id'); + $table->string('user_id'); + $table->string('auth_guard'); + $table->string('redirect_url'); + $table->timestamp('created_at'); + + $table->foreign('tenant_id')->references('id')->on('tenants')->onUpdate('cascade')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down(): void + { + Schema::dropIfExists('tenant_user_impersonation_tokens'); + } +} diff --git a/database/migrations/2024_09_09_094040_create_job_batches_table.php b/database/migrations/2024_09_09_094040_create_job_batches_table.php new file mode 100644 index 0000000..226e640 --- /dev/null +++ b/database/migrations/2024_09_09_094040_create_job_batches_table.php @@ -0,0 +1,39 @@ +string('id')->primary(); + $table->string('name'); + $table->integer('total_jobs'); + $table->integer('pending_jobs'); + $table->integer('failed_jobs'); + $table->text('failed_job_ids'); + $table->mediumText('options')->nullable(); + $table->integer('cancelled_at')->nullable(); + $table->integer('created_at'); + $table->integer('finished_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('job_batches'); + } +}; diff --git a/database/migrations/2024_09_09_094042_create_jobs_table.php b/database/migrations/2024_09_09_094042_create_jobs_table.php new file mode 100644 index 0000000..a786a89 --- /dev/null +++ b/database/migrations/2024_09_09_094042_create_jobs_table.php @@ -0,0 +1,36 @@ +bigIncrements('id'); + $table->string('queue')->index(); + $table->longText('payload'); + $table->unsignedTinyInteger('attempts'); + $table->unsignedInteger('reserved_at')->nullable(); + $table->unsignedInteger('available_at'); + $table->unsignedInteger('created_at'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('jobs'); + } +}; diff --git a/database/migrations/2026_02_02_000000_add_last_updated_by_to_tenants_table.php b/database/migrations/2026_02_02_000000_add_last_updated_by_to_tenants_table.php new file mode 100644 index 0000000..b8fc0ba --- /dev/null +++ b/database/migrations/2026_02_02_000000_add_last_updated_by_to_tenants_table.php @@ -0,0 +1,22 @@ +string('last_updated_by')->nullable(); + }); + } + + public function down() + { + Schema::table('tenants', function (Blueprint $table) { + $table->dropColumn('last_updated_by'); + }); + } +}; diff --git a/database/migrations/tenant/2021_03_12_060658_create_core_config_table.php b/database/migrations/tenant/2021_03_12_060658_create_core_config_table.php new file mode 100755 index 0000000..9c5f6cc --- /dev/null +++ b/database/migrations/tenant/2021_03_12_060658_create_core_config_table.php @@ -0,0 +1,33 @@ +increments('id'); + $table->string('code'); + $table->string('value'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('core_config'); + } +}; diff --git a/database/migrations/tenant/2021_03_12_074578_create_groups_table.php b/database/migrations/tenant/2021_03_12_074578_create_groups_table.php new file mode 100755 index 0000000..3efdeca --- /dev/null +++ b/database/migrations/tenant/2021_03_12_074578_create_groups_table.php @@ -0,0 +1,33 @@ +increments('id'); + $table->string('name'); + $table->string('description')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('groups'); + } +}; diff --git a/database/migrations/tenant/2021_03_12_074597_create_roles_table.php b/database/migrations/tenant/2021_03_12_074597_create_roles_table.php new file mode 100755 index 0000000..13e596a --- /dev/null +++ b/database/migrations/tenant/2021_03_12_074597_create_roles_table.php @@ -0,0 +1,35 @@ +increments('id'); + $table->string('name'); + $table->string('description')->nullable(); + $table->string('permission_type'); + $table->json('permissions')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('roles'); + } +}; diff --git a/database/migrations/tenant/2021_03_12_074857_create_users_table.php b/database/migrations/tenant/2021_03_12_074857_create_users_table.php new file mode 100644 index 0000000..3ce8d50 --- /dev/null +++ b/database/migrations/tenant/2021_03_12_074857_create_users_table.php @@ -0,0 +1,38 @@ +increments('id'); + $table->string('name'); + $table->string('email')->unique(); + $table->string('password')->nullable(); + $table->boolean('status')->default(0); + $table->integer('role_id')->unsigned(); + $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade'); + $table->rememberToken(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('users'); + } +}; diff --git a/database/migrations/tenant/2021_03_12_074867_create_user_groups_table.php b/database/migrations/tenant/2021_03_12_074867_create_user_groups_table.php new file mode 100644 index 0000000..ef289d1 --- /dev/null +++ b/database/migrations/tenant/2021_03_12_074867_create_user_groups_table.php @@ -0,0 +1,34 @@ +integer('group_id')->unsigned(); + $table->foreign('group_id')->references('id')->on('groups')->onDelete('cascade'); + + $table->integer('user_id')->unsigned(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('user_groups'); + } +}; diff --git a/database/migrations/tenant/2021_03_12_074957_create_user_password_resets_table.php b/database/migrations/tenant/2021_03_12_074957_create_user_password_resets_table.php new file mode 100755 index 0000000..83f3f4b --- /dev/null +++ b/database/migrations/tenant/2021_03_12_074957_create_user_password_resets_table.php @@ -0,0 +1,32 @@ +string('email')->index(); + $table->string('token'); + $table->timestamp('created_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('user_password_resets'); + } +}; diff --git a/database/migrations/tenant/2021_04_02_080709_create_attributes_table.php b/database/migrations/tenant/2021_04_02_080709_create_attributes_table.php new file mode 100644 index 0000000..eb5d555 --- /dev/null +++ b/database/migrations/tenant/2021_04_02_080709_create_attributes_table.php @@ -0,0 +1,43 @@ +increments('id'); + $table->string('code'); + $table->string('name'); + $table->string('type'); + $table->string('lookup_type')->nullable(); + $table->string('entity_type'); + $table->integer('sort_order')->nullable(); + $table->string('validation')->nullable(); + $table->boolean('is_required')->default(0); + $table->boolean('is_unique')->default(0); + $table->boolean('quick_add')->default(0); + $table->boolean('is_user_defined')->default(1); + $table->unique(['code', 'entity_type']); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('attributes'); + } +}; diff --git a/database/migrations/tenant/2021_04_02_080837_create_attribute_options_table.php b/database/migrations/tenant/2021_04_02_080837_create_attribute_options_table.php new file mode 100644 index 0000000..015e07f --- /dev/null +++ b/database/migrations/tenant/2021_04_02_080837_create_attribute_options_table.php @@ -0,0 +1,34 @@ +increments('id'); + $table->string('name')->nullable(); + $table->integer('sort_order')->nullable(); + $table->integer('attribute_id')->unsigned(); + $table->foreign('attribute_id')->references('id')->on('attributes')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('attribute_options'); + } +}; diff --git a/database/migrations/tenant/2021_04_06_122751_create_attribute_values_table.php b/database/migrations/tenant/2021_04_06_122751_create_attribute_values_table.php new file mode 100644 index 0000000..79b4f9d --- /dev/null +++ b/database/migrations/tenant/2021_04_06_122751_create_attribute_values_table.php @@ -0,0 +1,44 @@ +increments('id'); + $table->string('entity_type')->default('leads'); + $table->text('text_value')->nullable(); + $table->boolean('boolean_value')->nullable(); + $table->integer('integer_value')->nullable(); + $table->double('float_value')->nullable(); + $table->datetime('datetime_value')->nullable(); + $table->date('date_value')->nullable(); + $table->json('json_value')->nullable(); + + $table->integer('entity_id')->unsigned(); + $table->integer('attribute_id')->unsigned(); + + $table->foreign('attribute_id')->references('id')->on('attributes')->onDelete('cascade'); + $table->unique(['entity_type', 'entity_id', 'attribute_id'], 'entity_type_attribute_value_index_unique'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('attribute_values'); + } +}; diff --git a/database/migrations/tenant/2021_04_09_051326_create_organizations_table.php b/database/migrations/tenant/2021_04_09_051326_create_organizations_table.php new file mode 100644 index 0000000..8a2e106 --- /dev/null +++ b/database/migrations/tenant/2021_04_09_051326_create_organizations_table.php @@ -0,0 +1,34 @@ +increments('id'); + $table->string('name'); + $table->json('address')->nullable(); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('organizations'); + } +}; diff --git a/database/migrations/tenant/2021_04_09_065617_create_persons_table.php b/database/migrations/tenant/2021_04_09_065617_create_persons_table.php new file mode 100644 index 0000000..fc98d3b --- /dev/null +++ b/database/migrations/tenant/2021_04_09_065617_create_persons_table.php @@ -0,0 +1,37 @@ +increments('id'); + $table->string('name'); + $table->json('emails'); + $table->json('contact_numbers')->nullable(); + + $table->integer('organization_id')->unsigned()->nullable(); + $table->foreign('organization_id')->references('id')->on('organizations')->onDelete('cascade'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('persons'); + } +}; diff --git a/database/migrations/tenant/2021_04_09_065617_create_products_table.php b/database/migrations/tenant/2021_04_09_065617_create_products_table.php new file mode 100644 index 0000000..4f0d465 --- /dev/null +++ b/database/migrations/tenant/2021_04_09_065617_create_products_table.php @@ -0,0 +1,36 @@ +increments('id'); + $table->string('sku')->unique(); + $table->string('name')->nullable(); + $table->string('description')->nullable(); + $table->integer('quantity')->default(0); + $table->decimal('price', 12, 4)->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('products'); + } +}; diff --git a/database/migrations/tenant/2021_04_12_173232_create_countries_table.php b/database/migrations/tenant/2021_04_12_173232_create_countries_table.php new file mode 100644 index 0000000..274e574 --- /dev/null +++ b/database/migrations/tenant/2021_04_12_173232_create_countries_table.php @@ -0,0 +1,32 @@ +increments('id'); + $table->string('code'); + $table->string('name'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('countries'); + } +}; diff --git a/database/migrations/tenant/2021_04_12_173344_create_country_states_table.php b/database/migrations/tenant/2021_04_12_173344_create_country_states_table.php new file mode 100644 index 0000000..5939026 --- /dev/null +++ b/database/migrations/tenant/2021_04_12_173344_create_country_states_table.php @@ -0,0 +1,36 @@ +increments('id'); + $table->string('country_code'); + $table->string('code'); + $table->string('name'); + + $table->integer('country_id')->unsigned(); + $table->foreign('country_id')->references('id')->on('countries')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('country_states'); + } +}; diff --git a/database/migrations/tenant/2021_04_21_172825_create_lead_sources_table.php b/database/migrations/tenant/2021_04_21_172825_create_lead_sources_table.php new file mode 100644 index 0000000..a9752bf --- /dev/null +++ b/database/migrations/tenant/2021_04_21_172825_create_lead_sources_table.php @@ -0,0 +1,32 @@ +increments('id'); + $table->string('name'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('lead_sources'); + } +}; diff --git a/database/migrations/tenant/2021_04_21_172847_create_lead_types_table.php b/database/migrations/tenant/2021_04_21_172847_create_lead_types_table.php new file mode 100644 index 0000000..a3222aa --- /dev/null +++ b/database/migrations/tenant/2021_04_21_172847_create_lead_types_table.php @@ -0,0 +1,32 @@ +increments('id'); + $table->string('name'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('lead_types'); + } +}; diff --git a/database/migrations/tenant/2021_04_22_153258_create_lead_stages_table.php b/database/migrations/tenant/2021_04_22_153258_create_lead_stages_table.php new file mode 100644 index 0000000..0b3c70e --- /dev/null +++ b/database/migrations/tenant/2021_04_22_153258_create_lead_stages_table.php @@ -0,0 +1,34 @@ +increments('id'); + $table->string('code'); + $table->string('name'); + $table->boolean('is_user_defined')->default(1); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('lead_stages'); + } +}; diff --git a/database/migrations/tenant/2021_04_22_155706_create_lead_pipelines_table.php b/database/migrations/tenant/2021_04_22_155706_create_lead_pipelines_table.php new file mode 100644 index 0000000..785f1e1 --- /dev/null +++ b/database/migrations/tenant/2021_04_22_155706_create_lead_pipelines_table.php @@ -0,0 +1,33 @@ +increments('id'); + $table->string('name'); + $table->boolean('is_default')->default(0); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('lead_pipelines'); + } +}; diff --git a/database/migrations/tenant/2021_04_22_155838_create_lead_pipeline_stages_table.php b/database/migrations/tenant/2021_04_22_155838_create_lead_pipeline_stages_table.php new file mode 100644 index 0000000..45a41dd --- /dev/null +++ b/database/migrations/tenant/2021_04_22_155838_create_lead_pipeline_stages_table.php @@ -0,0 +1,38 @@ +increments('id'); + $table->integer('probability')->default(0); + $table->integer('sort_order')->default(0); + + $table->integer('lead_stage_id')->unsigned(); + $table->foreign('lead_stage_id')->references('id')->on('lead_stages')->onDelete('cascade'); + + $table->integer('lead_pipeline_id')->unsigned(); + $table->foreign('lead_pipeline_id')->references('id')->on('lead_pipelines')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('lead_pipeline_stages'); + } +}; diff --git a/database/migrations/tenant/2021_04_22_164215_create_leads_table.php b/database/migrations/tenant/2021_04_22_164215_create_leads_table.php new file mode 100644 index 0000000..a814a37 --- /dev/null +++ b/database/migrations/tenant/2021_04_22_164215_create_leads_table.php @@ -0,0 +1,56 @@ +increments('id'); + $table->string('title'); + $table->text('description')->nullable(); + $table->decimal('lead_value', 12, 4)->nullable(); + $table->boolean('status')->nullable(); + $table->text('lost_reason')->nullable(); + $table->datetime('closed_at')->nullable(); + + $table->integer('user_id')->unsigned(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + + $table->integer('person_id')->unsigned(); + $table->foreign('person_id')->references('id')->on('persons')->onDelete('cascade'); + + $table->integer('lead_source_id')->unsigned(); + $table->foreign('lead_source_id')->references('id')->on('lead_sources')->onDelete('cascade'); + + $table->integer('lead_type_id')->unsigned(); + $table->foreign('lead_type_id')->references('id')->on('lead_types')->onDelete('cascade'); + + $table->integer('lead_pipeline_id')->unsigned()->nullable(); + $table->foreign('lead_pipeline_id')->references('id')->on('lead_pipelines')->onDelete('cascade'); + + $table->integer('lead_stage_id')->unsigned(); + $table->foreign('lead_stage_id')->references('id')->on('lead_stages')->onDelete('cascade'); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('leads'); + } +}; diff --git a/database/migrations/tenant/2021_04_22_171805_create_lead_products_table.php b/database/migrations/tenant/2021_04_22_171805_create_lead_products_table.php new file mode 100644 index 0000000..6533410 --- /dev/null +++ b/database/migrations/tenant/2021_04_22_171805_create_lead_products_table.php @@ -0,0 +1,40 @@ +increments('id'); + $table->integer('quantity')->default(0); + $table->decimal('price', 12, 4)->nullable(); + $table->decimal('amount', 12, 4)->nullable(); + + $table->integer('lead_id')->unsigned(); + $table->foreign('lead_id')->references('id')->on('leads')->onDelete('cascade'); + + $table->integer('product_id')->unsigned(); + $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('lead_products'); + } +}; diff --git a/database/migrations/tenant/2021_05_12_150329_create_activities_table.php b/database/migrations/tenant/2021_05_12_150329_create_activities_table.php new file mode 100644 index 0000000..2375477 --- /dev/null +++ b/database/migrations/tenant/2021_05_12_150329_create_activities_table.php @@ -0,0 +1,41 @@ +increments('id'); + $table->string('title')->nullable(); + $table->string('type'); + $table->text('comment')->nullable(); + $table->json('additional')->nullable(); + $table->datetime('schedule_from')->nullable(); + $table->datetime('schedule_to')->nullable(); + $table->boolean('is_done')->default(0); + + $table->integer('user_id')->unsigned(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('activities'); + } +}; diff --git a/database/migrations/tenant/2021_05_12_150329_create_lead_activities_table.php b/database/migrations/tenant/2021_05_12_150329_create_lead_activities_table.php new file mode 100644 index 0000000..9165a76 --- /dev/null +++ b/database/migrations/tenant/2021_05_12_150329_create_lead_activities_table.php @@ -0,0 +1,34 @@ +integer('activity_id')->unsigned(); + $table->foreign('activity_id')->references('id')->on('activities')->onDelete('cascade'); + + $table->integer('lead_id')->unsigned(); + $table->foreign('lead_id')->references('id')->on('leads')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('lead_activities'); + } +}; diff --git a/database/migrations/tenant/2021_05_15_151855_create_activity_files_table.php b/database/migrations/tenant/2021_05_15_151855_create_activity_files_table.php new file mode 100644 index 0000000..30d516c --- /dev/null +++ b/database/migrations/tenant/2021_05_15_151855_create_activity_files_table.php @@ -0,0 +1,37 @@ +increments('id'); + $table->string('name'); + $table->string('path'); + + $table->integer('activity_id')->unsigned(); + $table->foreign('activity_id')->references('id')->on('activities')->onDelete('cascade'); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('activity_files'); + } +}; diff --git a/database/migrations/tenant/2021_05_20_141230_create_tags_table.php b/database/migrations/tenant/2021_05_20_141230_create_tags_table.php new file mode 100644 index 0000000..f6e8b08 --- /dev/null +++ b/database/migrations/tenant/2021_05_20_141230_create_tags_table.php @@ -0,0 +1,37 @@ +increments('id'); + $table->string('name'); + $table->string('color')->nullable(); + + $table->integer('user_id')->unsigned(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('tags'); + } +}; diff --git a/database/migrations/tenant/2021_05_20_141240_create_lead_tags_table.php b/database/migrations/tenant/2021_05_20_141240_create_lead_tags_table.php new file mode 100644 index 0000000..aa765eb --- /dev/null +++ b/database/migrations/tenant/2021_05_20_141240_create_lead_tags_table.php @@ -0,0 +1,34 @@ +integer('tag_id')->unsigned(); + $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade'); + + $table->integer('lead_id')->unsigned(); + $table->foreign('lead_id')->references('id')->on('leads')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('lead_tags'); + } +}; diff --git a/database/migrations/tenant/2021_05_24_075618_create_emails_table.php b/database/migrations/tenant/2021_05_24_075618_create_emails_table.php new file mode 100644 index 0000000..187a1da --- /dev/null +++ b/database/migrations/tenant/2021_05_24_075618_create_emails_table.php @@ -0,0 +1,58 @@ +increments('id'); + $table->string('subject')->nullable(); + $table->string('source'); + $table->string('user_type'); + $table->string('name')->nullable(); + $table->text('reply')->nullable(); + $table->boolean('is_read')->default(0); + $table->json('folders')->nullable(); + $table->json('from')->nullable(); + $table->json('sender')->nullable(); + $table->json('reply_to')->nullable(); + $table->json('cc')->nullable(); + $table->json('bcc')->nullable(); + $table->string('unique_id')->nullable()->unique(); + $table->string('message_id')->unique(); + $table->json('reference_ids')->nullable(); + + $table->integer('person_id')->unsigned()->nullable(); + $table->foreign('person_id')->references('id')->on('persons')->onDelete('set null'); + + $table->integer('lead_id')->unsigned()->nullable(); + $table->foreign('lead_id')->references('id')->on('leads')->onDelete('set null'); + + $table->timestamps(); + }); + + Schema::table('emails', function (Blueprint $table) { + $table->integer('parent_id')->unsigned()->nullable(); + $table->foreign('parent_id')->references('id')->on('emails')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('emails'); + } +}; diff --git a/database/migrations/tenant/2021_05_25_072700_create_email_attachments_table.php b/database/migrations/tenant/2021_05_25_072700_create_email_attachments_table.php new file mode 100644 index 0000000..93f2251 --- /dev/null +++ b/database/migrations/tenant/2021_05_25_072700_create_email_attachments_table.php @@ -0,0 +1,40 @@ +increments('id'); + $table->string('name')->nullable(); + $table->string('path'); + $table->integer('size')->nullable(); + $table->string('content_type')->nullable(); + $table->string('content_id')->nullable(); + + $table->integer('email_id')->unsigned(); + $table->foreign('email_id')->references('id')->on('emails')->onDelete('cascade'); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('email_attachments'); + } +}; diff --git a/database/migrations/tenant/2021_06_07_162808_add_lead_view_permission_column_in_users_table.php b/database/migrations/tenant/2021_06_07_162808_add_lead_view_permission_column_in_users_table.php new file mode 100644 index 0000000..71875c4 --- /dev/null +++ b/database/migrations/tenant/2021_06_07_162808_add_lead_view_permission_column_in_users_table.php @@ -0,0 +1,32 @@ +string('view_permission')->after('status')->default('global')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('view_permission'); + }); + } +}; diff --git a/database/migrations/tenant/2021_07_01_230345_create_quotes_table.php b/database/migrations/tenant/2021_07_01_230345_create_quotes_table.php new file mode 100644 index 0000000..01dd071 --- /dev/null +++ b/database/migrations/tenant/2021_07_01_230345_create_quotes_table.php @@ -0,0 +1,52 @@ +increments('id'); + $table->string('subject'); + $table->string('description')->nullable(); + + $table->json('billing_address')->nullable(); + $table->json('shipping_address')->nullable(); + + $table->decimal('discount_percent', 12, 4)->default(0)->nullable(); + $table->decimal('discount_amount', 12, 4)->nullable(); + $table->decimal('tax_amount', 12, 4)->nullable(); + $table->decimal('adjustment_amount', 12, 4)->nullable(); + $table->decimal('sub_total', 12, 4)->nullable(); + $table->decimal('grand_total', 12, 4)->nullable(); + + $table->datetime('expired_at')->nullable(); + + $table->integer('person_id')->unsigned(); + $table->foreign('person_id')->references('id')->on('persons')->onDelete('cascade'); + + $table->integer('user_id')->unsigned(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('quotes'); + } +}; diff --git a/database/migrations/tenant/2021_07_01_231317_create_quote_items_table.php b/database/migrations/tenant/2021_07_01_231317_create_quote_items_table.php new file mode 100644 index 0000000..9173c99 --- /dev/null +++ b/database/migrations/tenant/2021_07_01_231317_create_quote_items_table.php @@ -0,0 +1,49 @@ +increments('id'); + $table->string('sku')->nullable(); + $table->string('name')->nullable(); + $table->integer('quantity')->default(0)->nullable(); + $table->decimal('price', 12, 4)->default(0); + + $table->string('coupon_code')->nullable(); + $table->decimal('discount_percent', 12, 4)->default(0)->nullable(); + $table->decimal('discount_amount', 12, 4)->default(0)->nullable(); + + $table->decimal('tax_percent', 12, 4)->default(0)->nullable(); + $table->decimal('tax_amount', 12, 4)->default(0)->nullable(); + + $table->decimal('total', 12, 4)->default(0); + + $table->integer('product_id')->unsigned(); + $table->integer('quote_id')->unsigned(); + $table->foreign('quote_id')->references('id')->on('quotes')->onDelete('cascade'); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('quote_items'); + } +}; diff --git a/database/migrations/tenant/2021_07_02_201822_create_lead_quotes_table.php b/database/migrations/tenant/2021_07_02_201822_create_lead_quotes_table.php new file mode 100644 index 0000000..c2449df --- /dev/null +++ b/database/migrations/tenant/2021_07_02_201822_create_lead_quotes_table.php @@ -0,0 +1,34 @@ +integer('quote_id')->unsigned(); + $table->foreign('quote_id')->references('id')->on('quotes')->onDelete('cascade'); + + $table->integer('lead_id')->unsigned(); + $table->foreign('lead_id')->references('id')->on('leads')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('lead_quotes'); + } +}; diff --git a/database/migrations/tenant/2021_07_28_142453_create_activity_participants_table.php b/database/migrations/tenant/2021_07_28_142453_create_activity_participants_table.php new file mode 100644 index 0000000..ba72faa --- /dev/null +++ b/database/migrations/tenant/2021_07_28_142453_create_activity_participants_table.php @@ -0,0 +1,39 @@ +increments('id'); + + $table->integer('activity_id')->unsigned(); + $table->foreign('activity_id')->references('id')->on('activities')->onDelete('cascade'); + + $table->integer('user_id')->nullable()->unsigned(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + + $table->integer('person_id')->nullable()->unsigned(); + $table->foreign('person_id')->references('id')->on('persons')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('activity_participants'); + } +}; diff --git a/database/migrations/tenant/2021_08_26_133538_create_workflows_table.php b/database/migrations/tenant/2021_08_26_133538_create_workflows_table.php new file mode 100644 index 0000000..a6f9bac --- /dev/null +++ b/database/migrations/tenant/2021_08_26_133538_create_workflows_table.php @@ -0,0 +1,38 @@ +increments('id'); + $table->string('name'); + $table->string('description')->nullable(); + $table->string('entity_type'); + $table->string('event'); + $table->string('condition_type')->default('and'); + $table->json('conditions')->nullable(); + $table->json('actions')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('workflows'); + } +}; diff --git a/database/migrations/tenant/2021_09_03_172713_create_email_templates_table.php b/database/migrations/tenant/2021_09_03_172713_create_email_templates_table.php new file mode 100644 index 0000000..c39c258 --- /dev/null +++ b/database/migrations/tenant/2021_09_03_172713_create_email_templates_table.php @@ -0,0 +1,34 @@ +increments('id'); + $table->string('name'); + $table->string('subject'); + $table->text('content'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('email_templates'); + } +}; diff --git a/database/migrations/tenant/2021_09_22_194103_add_unique_index_to_name_in_organizations_table.php b/database/migrations/tenant/2021_09_22_194103_add_unique_index_to_name_in_organizations_table.php new file mode 100644 index 0000000..d383cd1 --- /dev/null +++ b/database/migrations/tenant/2021_09_22_194103_add_unique_index_to_name_in_organizations_table.php @@ -0,0 +1,32 @@ +unique('name'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('organizations', function (Blueprint $table) { + $table->dropUnique('organizations_name_unique'); + }); + } +}; diff --git a/database/migrations/tenant/2021_09_22_194622_add_unique_index_to_name_in_groups_table.php b/database/migrations/tenant/2021_09_22_194622_add_unique_index_to_name_in_groups_table.php new file mode 100644 index 0000000..b3bae07 --- /dev/null +++ b/database/migrations/tenant/2021_09_22_194622_add_unique_index_to_name_in_groups_table.php @@ -0,0 +1,32 @@ +unique('name'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('groups', function (Blueprint $table) { + $table->dropUnique('groups_name_unique'); + }); + } +}; diff --git a/database/migrations/tenant/2021_09_23_221138_add_column_expected_close_date_in_leads_table.php b/database/migrations/tenant/2021_09_23_221138_add_column_expected_close_date_in_leads_table.php new file mode 100644 index 0000000..e762fdd --- /dev/null +++ b/database/migrations/tenant/2021_09_23_221138_add_column_expected_close_date_in_leads_table.php @@ -0,0 +1,32 @@ +date('expected_close_date')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('leads', function (Blueprint $table) { + $table->dropColumn('expected_close_date'); + }); + } +}; diff --git a/database/migrations/tenant/2021_09_30_135857_add_column_rotten_days_in_lead_pipelines_table.php b/database/migrations/tenant/2021_09_30_135857_add_column_rotten_days_in_lead_pipelines_table.php new file mode 100644 index 0000000..0086ba8 --- /dev/null +++ b/database/migrations/tenant/2021_09_30_135857_add_column_rotten_days_in_lead_pipelines_table.php @@ -0,0 +1,32 @@ +integer('rotten_days')->after('is_default')->default(30); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('lead_pipelines', function (Blueprint $table) { + $table->dropColumn('rotten_days'); + }); + } +}; diff --git a/database/migrations/tenant/2021_09_30_154222_alter_lead_pipeline_stages_table.php b/database/migrations/tenant/2021_09_30_154222_alter_lead_pipeline_stages_table.php new file mode 100644 index 0000000..d0c3a67 --- /dev/null +++ b/database/migrations/tenant/2021_09_30_154222_alter_lead_pipeline_stages_table.php @@ -0,0 +1,57 @@ +string('code')->after('id')->nullable(); + $table->string('name')->after('code')->nullable(); + }); + + DB::table('lead_pipeline_stages') + ->join('lead_stages', 'lead_pipeline_stages.lead_stage_id', '=', 'lead_stages.id') + ->update([ + 'lead_pipeline_stages.code' => DB::raw($tablePrefix.'lead_stages.code'), + 'lead_pipeline_stages.name' => DB::raw($tablePrefix.'lead_stages.name'), + ]); + + Schema::table('lead_pipeline_stages', function (Blueprint $table) use ($tablePrefix) { + $table->dropForeign($tablePrefix.'lead_pipeline_stages_lead_stage_id_foreign'); + $table->dropColumn('lead_stage_id'); + + $table->unique(['code', 'lead_pipeline_id']); + $table->unique(['name', 'lead_pipeline_id']); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('lead_pipeline_stages', function (Blueprint $table) { + $table->dropColumn('code'); + $table->dropColumn('name'); + + $table->integer('lead_stage_id')->unsigned(); + $table->foreign('lead_stage_id')->references('id')->on('lead_stages')->onDelete('cascade'); + + $table->dropUnique(['lead_pipeline_stages_code_lead_pipeline_id_unique', 'lead_pipeline_stages_name_lead_pipeline_id_unique']); + }); + } +}; diff --git a/database/migrations/tenant/2021_09_30_161722_alter_leads_table.php b/database/migrations/tenant/2021_09_30_161722_alter_leads_table.php new file mode 100644 index 0000000..4df62f5 --- /dev/null +++ b/database/migrations/tenant/2021_09_30_161722_alter_leads_table.php @@ -0,0 +1,50 @@ +integer('lead_pipeline_stage_id')->after('lead_pipeline_id')->unsigned()->nullable(); + $table->foreign('lead_pipeline_stage_id')->references('id')->on('lead_pipeline_stages')->onDelete('cascade'); + }); + + DB::table('leads') + ->update([ + 'leads.lead_pipeline_stage_id' => DB::raw($tablePrefix.'leads.lead_stage_id'), + ]); + + Schema::table('leads', function (Blueprint $table) use ($tablePrefix) { + $table->dropForeign($tablePrefix.'leads_lead_stage_id_foreign'); + $table->dropColumn('lead_stage_id'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('leads', function (Blueprint $table) { + $table->dropForeign(DB::getTablePrefix().'leads_lead_pipeline_stage_id_foreign'); + $table->dropColumn('lead_pipeline_stage_id'); + + $table->integer('lead_stage_id')->unsigned(); + $table->foreign('lead_stage_id')->references('id')->on('lead_stages')->onDelete('cascade'); + }); + } +}; diff --git a/database/migrations/tenant/2021_10_02_170105_insert_expected_closed_date_column_in_attributes_table.php b/database/migrations/tenant/2021_10_02_170105_insert_expected_closed_date_column_in_attributes_table.php new file mode 100644 index 0000000..061d1f7 --- /dev/null +++ b/database/migrations/tenant/2021_10_02_170105_insert_expected_closed_date_column_in_attributes_table.php @@ -0,0 +1,42 @@ +insert([ + [ + 'id' => '7', + 'code' => 'expected_close_date', + 'name' => 'Expected Close Date', + 'type' => 'date', + 'entity_type' => 'leads', + 'lookup_type' => null, + 'validation' => null, + 'sort_order' => '8', + 'is_required' => '0', + 'is_unique' => '0', + 'quick_add' => '1', + 'is_user_defined' => '0', + 'created_at' => Carbon::now(), + 'updated_at' => Carbon::now(), + ], + ]); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() {} +}; diff --git a/database/migrations/tenant/2021_11_12_171510_add_image_column_in_users_table.php b/database/migrations/tenant/2021_11_12_171510_add_image_column_in_users_table.php new file mode 100644 index 0000000..360de0c --- /dev/null +++ b/database/migrations/tenant/2021_11_12_171510_add_image_column_in_users_table.php @@ -0,0 +1,32 @@ +string('image')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('image'); + }); + } +}; diff --git a/database/migrations/tenant/2021_11_17_190943_add_location_column_in_activities_table.php b/database/migrations/tenant/2021_11_17_190943_add_location_column_in_activities_table.php new file mode 100644 index 0000000..53727e1 --- /dev/null +++ b/database/migrations/tenant/2021_11_17_190943_add_location_column_in_activities_table.php @@ -0,0 +1,32 @@ +string('location')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('activities', function (Blueprint $table) { + $table->dropColumn('location'); + }); + } +}; diff --git a/database/migrations/tenant/2021_12_14_213049_create_web_forms_table.php b/database/migrations/tenant/2021_12_14_213049_create_web_forms_table.php new file mode 100644 index 0000000..837b8af --- /dev/null +++ b/database/migrations/tenant/2021_12_14_213049_create_web_forms_table.php @@ -0,0 +1,43 @@ +increments('id'); + $table->string('form_id')->unique(); + $table->string('title'); + $table->text('description')->nullable(); + $table->text('submit_button_label'); + $table->string('submit_success_action'); + $table->string('submit_success_content'); + $table->boolean('create_lead')->default(0); + $table->string('background_color')->nullable(); + $table->string('form_background_color')->nullable(); + $table->string('form_title_color')->nullable(); + $table->string('form_submit_button_color')->nullable(); + $table->string('attribute_label_color')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('web_forms'); + } +}; diff --git a/database/migrations/tenant/2021_12_14_214923_create_web_form_attributes_table.php b/database/migrations/tenant/2021_12_14_214923_create_web_form_attributes_table.php new file mode 100644 index 0000000..c038428 --- /dev/null +++ b/database/migrations/tenant/2021_12_14_214923_create_web_form_attributes_table.php @@ -0,0 +1,41 @@ +increments('id'); + $table->string('name')->nullable(); + $table->string('placeholder')->nullable(); + $table->boolean('is_required')->default(0); + $table->boolean('is_hidden')->default(0); + $table->integer('sort_order')->nullable(); + + $table->integer('attribute_id')->unsigned(); + $table->foreign('attribute_id')->references('id')->on('attributes')->onDelete('cascade'); + + $table->integer('web_form_id')->unsigned(); + $table->foreign('web_form_id')->references('id')->on('web_forms')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('web_form_attributes'); + } +}; diff --git a/database/migrations/tenant/2024_01_11_154640_create_imports_table.php b/database/migrations/tenant/2024_01_11_154640_create_imports_table.php new file mode 100644 index 0000000..0716e8a --- /dev/null +++ b/database/migrations/tenant/2024_01_11_154640_create_imports_table.php @@ -0,0 +1,45 @@ +increments('id'); + $table->string('state')->default('pending'); + $table->boolean('process_in_queue')->default(1); + $table->string('type'); + $table->string('action'); + $table->string('validation_strategy'); + $table->integer('allowed_errors')->default(0); + $table->integer('processed_rows_count')->default(0); + $table->integer('invalid_rows_count')->default(0); + $table->integer('errors_count')->default(0); + $table->json('errors')->nullable(); + $table->string('field_separator'); + $table->string('file_path'); + $table->string('error_file_path')->nullable(); + $table->json('summary')->nullable(); + + $table->datetime('started_at')->nullable(); + $table->datetime('completed_at')->nullable(); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('imports'); + } +}; diff --git a/database/migrations/tenant/2024_01_11_154741_create_import_batches_table.php b/database/migrations/tenant/2024_01_11_154741_create_import_batches_table.php new file mode 100644 index 0000000..0139541 --- /dev/null +++ b/database/migrations/tenant/2024_01_11_154741_create_import_batches_table.php @@ -0,0 +1,32 @@ +increments('id'); + $table->string('state')->default('pending'); + $table->json('data'); + $table->json('summary')->nullable(); + $table->integer('import_id')->unsigned(); + + $table->foreign('import_id')->references('id')->on('imports')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('import_batches'); + } +}; diff --git a/database/migrations/tenant/2024_05_10_152848_create_saved_filters_table.php b/database/migrations/tenant/2024_05_10_152848_create_saved_filters_table.php new file mode 100644 index 0000000..de5d20b --- /dev/null +++ b/database/migrations/tenant/2024_05_10_152848_create_saved_filters_table.php @@ -0,0 +1,33 @@ +id(); + $table->integer('user_id')->unsigned(); + $table->string('name'); + $table->string('src'); + $table->json('applied'); + $table->timestamps(); + + $table->unique(['user_id', 'name', 'src']); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('datagrid_saved_filters'); + } +}; diff --git a/database/migrations/tenant/2024_06_21_160707_create_warehouses_table.php b/database/migrations/tenant/2024_06_21_160707_create_warehouses_table.php new file mode 100644 index 0000000..67f3d98 --- /dev/null +++ b/database/migrations/tenant/2024_06_21_160707_create_warehouses_table.php @@ -0,0 +1,33 @@ +increments('id'); + $table->string('name'); + $table->text('description')->nullable(); + $table->string('contact_name'); + $table->json('contact_emails'); + $table->json('contact_numbers'); + $table->json('contact_address'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('warehouses'); + } +}; diff --git a/database/migrations/tenant/2024_06_21_160735_create_warehouse_locations_table.php b/database/migrations/tenant/2024_06_21_160735_create_warehouse_locations_table.php new file mode 100644 index 0000000..e5c2f0b --- /dev/null +++ b/database/migrations/tenant/2024_06_21_160735_create_warehouse_locations_table.php @@ -0,0 +1,34 @@ +increments('id'); + $table->string('name'); + + $table->integer('warehouse_id')->unsigned(); + $table->foreign('warehouse_id')->references('id')->on('warehouses')->onDelete('cascade'); + + $table->unique(['warehouse_id', 'name']); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('warehouse_locations'); + } +}; diff --git a/database/migrations/tenant/2024_06_24_174241_insert_warehouse_attributes_in_attributes_table.php b/database/migrations/tenant/2024_06_24_174241_insert_warehouse_attributes_in_attributes_table.php new file mode 100644 index 0000000..b1d69d2 --- /dev/null +++ b/database/migrations/tenant/2024_06_24_174241_insert_warehouse_attributes_in_attributes_table.php @@ -0,0 +1,117 @@ +insert([ + [ + 'code' => 'name', + 'name' => trans('installer::app.seeders.attributes.warehouses.name'), + 'type' => 'text', + 'entity_type' => 'warehouses', + 'lookup_type' => null, + 'validation' => null, + 'sort_order' => '1', + 'is_required' => '1', + 'is_unique' => '0', + 'quick_add' => '1', + 'is_user_defined' => '0', + 'created_at' => $now, + 'updated_at' => $now, + ], [ + 'code' => 'description', + 'name' => trans('installer::app.seeders.attributes.warehouses.description'), + 'type' => 'textarea', + 'entity_type' => 'warehouses', + 'lookup_type' => null, + 'validation' => null, + 'sort_order' => '2', + 'is_required' => '0', + 'is_unique' => '0', + 'quick_add' => '1', + 'is_user_defined' => '0', + 'created_at' => $now, + 'updated_at' => $now, + ], [ + 'code' => 'contact_name', + 'name' => trans('installer::app.seeders.attributes.warehouses.contact-name'), + 'type' => 'text', + 'entity_type' => 'warehouses', + 'lookup_type' => null, + 'validation' => null, + 'sort_order' => '3', + 'is_required' => '1', + 'is_unique' => '0', + 'quick_add' => '1', + 'is_user_defined' => '0', + 'created_at' => $now, + 'updated_at' => $now, + ], [ + 'code' => 'contact_emails', + 'name' => trans('installer::app.seeders.attributes.warehouses.contact-emails'), + 'type' => 'email', + 'entity_type' => 'warehouses', + 'lookup_type' => null, + 'validation' => null, + 'sort_order' => '4', + 'is_required' => '1', + 'is_unique' => '1', + 'quick_add' => '1', + 'is_user_defined' => '0', + 'created_at' => $now, + 'updated_at' => $now, + ], [ + 'code' => 'contact_numbers', + 'name' => trans('installer::app.seeders.attributes.warehouses.contact-numbers'), + 'type' => 'phone', + 'entity_type' => 'warehouses', + 'lookup_type' => null, + 'validation' => 'numeric', + 'sort_order' => '5', + 'is_required' => '0', + 'is_unique' => '1', + 'quick_add' => '1', + 'is_user_defined' => '0', + 'created_at' => $now, + 'updated_at' => $now, + ], [ + 'code' => 'contact_address', + 'name' => trans('installer::app.seeders.attributes.warehouses.contact-address'), + 'type' => 'address', + 'entity_type' => 'warehouses', + 'lookup_type' => null, + 'validation' => null, + 'sort_order' => '6', + 'is_required' => '1', + 'is_unique' => '0', + 'quick_add' => '1', + 'is_user_defined' => '0', + 'created_at' => $now, + 'updated_at' => $now, + ], + ]); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('attributes', function (Blueprint $table) { + // + }); + } +}; diff --git a/database/migrations/tenant/2024_06_28_154009_create_product_inventories_table.php b/database/migrations/tenant/2024_06_28_154009_create_product_inventories_table.php new file mode 100644 index 0000000..7cba111 --- /dev/null +++ b/database/migrations/tenant/2024_06_28_154009_create_product_inventories_table.php @@ -0,0 +1,39 @@ +increments('id'); + $table->integer('in_stock')->default(0); + $table->integer('allocated')->default(0); + + $table->integer('product_id')->unsigned(); + $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade'); + + $table->integer('warehouse_id')->unsigned()->nullable(); + $table->foreign('warehouse_id')->references('id')->on('warehouses')->onDelete('cascade'); + + $table->integer('warehouse_location_id')->unsigned()->nullable(); + $table->foreign('warehouse_location_id')->references('id')->on('warehouse_locations')->onDelete('SET NULL'); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('product_inventories'); + } +}; diff --git a/database/migrations/tenant/2024_07_24_150821_create_webhooks_table.php b/database/migrations/tenant/2024_07_24_150821_create_webhooks_table.php new file mode 100644 index 0000000..9554e90 --- /dev/null +++ b/database/migrations/tenant/2024_07_24_150821_create_webhooks_table.php @@ -0,0 +1,37 @@ +id(); + $table->string('name'); + $table->string('entity_type'); + $table->string('description')->nullable(); + $table->string('method'); + $table->string('end_point'); + $table->json('query_params')->nullable(); + $table->json('headers')->nullable(); + $table->string('payload_type'); + $table->string('raw_payload_type'); + $table->json('payload')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('webhooks'); + } +}; diff --git a/database/migrations/tenant/2024_07_31_092951_add_job_title_in_persons_table.php b/database/migrations/tenant/2024_07_31_092951_add_job_title_in_persons_table.php new file mode 100644 index 0000000..ca4514c --- /dev/null +++ b/database/migrations/tenant/2024_07_31_092951_add_job_title_in_persons_table.php @@ -0,0 +1,28 @@ +string('job_title')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('persons', function (Blueprint $table) { + $table->dropColumn('job_title'); + }); + } +}; diff --git a/database/migrations/tenant/2024_07_31_093603_add_organization_sales_owner_attribute_in_attributes_table.php b/database/migrations/tenant/2024_07_31_093603_add_organization_sales_owner_attribute_in_attributes_table.php new file mode 100644 index 0000000..06b87e2 --- /dev/null +++ b/database/migrations/tenant/2024_07_31_093603_add_organization_sales_owner_attribute_in_attributes_table.php @@ -0,0 +1,40 @@ +insert([ + [ + 'code' => 'user_id', + 'name' => trans('installer::app.seeders.attributes.organizations.sales-owner'), + 'type' => 'lookup', + 'entity_type' => 'organizations', + 'lookup_type' => 'users', + 'validation' => null, + 'sort_order' => '5', + 'is_required' => '0', + 'is_unique' => '0', + 'quick_add' => '1', + 'is_user_defined' => '0', + 'created_at' => $now, + 'updated_at' => $now, + ], + ]); + } + + /** + * Reverse the migrations. + */ + public function down(): void {} +}; diff --git a/database/migrations/tenant/2024_07_31_093605_add_person_job_title_attribute_in_attributes_table.php b/database/migrations/tenant/2024_07_31_093605_add_person_job_title_attribute_in_attributes_table.php new file mode 100644 index 0000000..50dbe40 --- /dev/null +++ b/database/migrations/tenant/2024_07_31_093605_add_person_job_title_attribute_in_attributes_table.php @@ -0,0 +1,40 @@ +insert([ + [ + 'code' => 'job_title', + 'name' => trans('installer::app.seeders.attributes.persons.job-title'), + 'type' => 'text', + 'entity_type' => 'persons', + 'lookup_type' => null, + 'validation' => null, + 'sort_order' => '4', + 'is_required' => '0', + 'is_unique' => '0', + 'quick_add' => '1', + 'is_user_defined' => '0', + 'created_at' => $now, + 'updated_at' => $now, + ], + ]); + } + + /** + * Reverse the migrations. + */ + public function down(): void {} +}; diff --git a/database/migrations/tenant/2024_07_31_093605_add_person_sales_owner_attribute_in_attributes_table.php b/database/migrations/tenant/2024_07_31_093605_add_person_sales_owner_attribute_in_attributes_table.php new file mode 100644 index 0000000..3ecb3e5 --- /dev/null +++ b/database/migrations/tenant/2024_07_31_093605_add_person_sales_owner_attribute_in_attributes_table.php @@ -0,0 +1,40 @@ +insert([ + [ + 'code' => 'user_id', + 'name' => trans('installer::app.seeders.attributes.persons.sales-owner'), + 'type' => 'lookup', + 'entity_type' => 'persons', + 'lookup_type' => 'users', + 'validation' => null, + 'sort_order' => '5', + 'is_required' => '0', + 'is_unique' => '0', + 'quick_add' => '1', + 'is_user_defined' => '0', + 'created_at' => $now, + 'updated_at' => $now, + ], + ]); + } + + /** + * Reverse the migrations. + */ + public function down(): void {} +}; diff --git a/database/migrations/tenant/2024_08_06_145943_create_person_tags_table.php b/database/migrations/tenant/2024_08_06_145943_create_person_tags_table.php new file mode 100644 index 0000000..cd7c7dc --- /dev/null +++ b/database/migrations/tenant/2024_08_06_145943_create_person_tags_table.php @@ -0,0 +1,30 @@ +integer('tag_id')->unsigned(); + $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade'); + + $table->integer('person_id')->unsigned(); + $table->foreign('person_id')->references('id')->on('persons')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('person_tags'); + } +}; diff --git a/database/migrations/tenant/2024_08_06_161212_create_person_activities_table.php b/database/migrations/tenant/2024_08_06_161212_create_person_activities_table.php new file mode 100644 index 0000000..90917ef --- /dev/null +++ b/database/migrations/tenant/2024_08_06_161212_create_person_activities_table.php @@ -0,0 +1,30 @@ +integer('activity_id')->unsigned(); + $table->foreign('activity_id')->references('id')->on('activities')->onDelete('cascade'); + + $table->integer('person_id')->unsigned(); + $table->foreign('person_id')->references('id')->on('persons')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('lead_activities'); + } +}; diff --git a/database/migrations/tenant/2024_08_10_100329_create_warehouse_activities_table.php b/database/migrations/tenant/2024_08_10_100329_create_warehouse_activities_table.php new file mode 100644 index 0000000..64cf879 --- /dev/null +++ b/database/migrations/tenant/2024_08_10_100329_create_warehouse_activities_table.php @@ -0,0 +1,34 @@ +integer('activity_id')->unsigned(); + $table->foreign('activity_id')->references('id')->on('activities')->onDelete('cascade'); + + $table->integer('warehouse_id')->unsigned(); + $table->foreign('warehouse_id')->references('id')->on('warehouses')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('warehouse_activities'); + } +}; diff --git a/database/migrations/tenant/2024_08_10_100340_create_warehouse_tags_table.php b/database/migrations/tenant/2024_08_10_100340_create_warehouse_tags_table.php new file mode 100644 index 0000000..9d50f5c --- /dev/null +++ b/database/migrations/tenant/2024_08_10_100340_create_warehouse_tags_table.php @@ -0,0 +1,34 @@ +integer('tag_id')->unsigned(); + $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade'); + + $table->integer('warehouse_id')->unsigned(); + $table->foreign('warehouse_id')->references('id')->on('warehouses')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('warehouse_tags'); + } +}; diff --git a/database/migrations/tenant/2024_08_10_150329_create_product_activities_table.php b/database/migrations/tenant/2024_08_10_150329_create_product_activities_table.php new file mode 100644 index 0000000..bb1fce6 --- /dev/null +++ b/database/migrations/tenant/2024_08_10_150329_create_product_activities_table.php @@ -0,0 +1,34 @@ +integer('activity_id')->unsigned(); + $table->foreign('activity_id')->references('id')->on('activities')->onDelete('cascade'); + + $table->integer('product_id')->unsigned(); + $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('product_activities'); + } +}; diff --git a/database/migrations/tenant/2024_08_10_150340_create_product_tags_table.php b/database/migrations/tenant/2024_08_10_150340_create_product_tags_table.php new file mode 100644 index 0000000..6517e02 --- /dev/null +++ b/database/migrations/tenant/2024_08_10_150340_create_product_tags_table.php @@ -0,0 +1,34 @@ +integer('tag_id')->unsigned(); + $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade'); + + $table->integer('product_id')->unsigned(); + $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('product_tags'); + } +}; diff --git a/database/migrations/tenant/2024_08_14_102116_add_user_id_column_in_persons_table.php b/database/migrations/tenant/2024_08_14_102116_add_user_id_column_in_persons_table.php new file mode 100644 index 0000000..069e669 --- /dev/null +++ b/database/migrations/tenant/2024_08_14_102116_add_user_id_column_in_persons_table.php @@ -0,0 +1,30 @@ +integer('user_id')->unsigned()->nullable(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('set null'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('persons', function (Blueprint $table) { + $table->dropForeign(['user_id']); + $table->dropColumn('user_id'); + }); + } +}; diff --git a/database/migrations/tenant/2024_08_14_102136_add_user_id_column_in_organizations_table.php b/database/migrations/tenant/2024_08_14_102136_add_user_id_column_in_organizations_table.php new file mode 100644 index 0000000..98f2910 --- /dev/null +++ b/database/migrations/tenant/2024_08_14_102136_add_user_id_column_in_organizations_table.php @@ -0,0 +1,30 @@ +integer('user_id')->unsigned()->nullable(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('set null'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('organizations', function (Blueprint $table) { + $table->dropForeign(['user_id']); + $table->dropColumn('user_id'); + }); + } +}; diff --git a/database/migrations/tenant/2024_08_21_153011_add_leads_stage_and_pipeline_attributes.php b/database/migrations/tenant/2024_08_21_153011_add_leads_stage_and_pipeline_attributes.php new file mode 100644 index 0000000..1136f84 --- /dev/null +++ b/database/migrations/tenant/2024_08_21_153011_add_leads_stage_and_pipeline_attributes.php @@ -0,0 +1,57 @@ +insert([ + [ + 'code' => 'lead_pipeline_id', + 'name' => trans('installer::app.seeders.attributes.leads.pipeline'), + 'type' => 'lookup', + 'entity_type' => 'leads', + 'lookup_type' => 'lead_pipelines', + 'validation' => null, + 'sort_order' => '9', + 'is_required' => '1', + 'is_unique' => '0', + 'quick_add' => '1', + 'is_user_defined' => '0', + 'created_at' => $now, + 'updated_at' => $now, + ], [ + 'code' => 'lead_pipeline_stage_id', + 'name' => trans('installer::app.seeders.attributes.leads.stage'), + 'type' => 'lookup', + 'entity_type' => 'leads', + 'lookup_type' => 'lead_pipeline_stages', + 'validation' => null, + 'sort_order' => '10', + 'is_required' => '1', + 'is_unique' => '0', + 'quick_add' => '1', + 'is_user_defined' => '0', + 'created_at' => $now, + 'updated_at' => $now, + ], + ]); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + // + } +}; diff --git a/database/migrations/tenant/2024_08_27_091619_create_email_tags_table.php b/database/migrations/tenant/2024_08_27_091619_create_email_tags_table.php new file mode 100644 index 0000000..45fd477 --- /dev/null +++ b/database/migrations/tenant/2024_08_27_091619_create_email_tags_table.php @@ -0,0 +1,30 @@ +integer('tag_id')->unsigned(); + $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade'); + + $table->integer('email_id')->unsigned(); + $table->foreign('email_id')->references('id')->on('emails')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('email_tags'); + } +}; diff --git a/database/migrations/tenant/2024_09_06_065808_alter_product_inventories_table.php b/database/migrations/tenant/2024_09_06_065808_alter_product_inventories_table.php new file mode 100644 index 0000000..05318a9 --- /dev/null +++ b/database/migrations/tenant/2024_09_06_065808_alter_product_inventories_table.php @@ -0,0 +1,26 @@ +dropForeign(['warehouse_location_id']); + + $table->foreign('warehouse_location_id')->references('id')->on('warehouse_locations')->onDelete('cascade'); + }); + } + + public function down() + { + Schema::table('product_inventories', function (Blueprint $table) { + $table->dropForeign(['warehouse_location_id']); + + $table->foreign('warehouse_location_id')->references('id')->on('warehouse_locations')->onDelete('set null'); + }); + } +}; diff --git a/database/migrations/tenant/2024_09_09_112201_add_unique_id_to_person_table.php b/database/migrations/tenant/2024_09_09_112201_add_unique_id_to_person_table.php new file mode 100644 index 0000000..d6a5b65 --- /dev/null +++ b/database/migrations/tenant/2024_09_09_112201_add_unique_id_to_person_table.php @@ -0,0 +1,41 @@ +string('unique_id')->nullable()->unique(); + }); + + $tableName = DB::getTablePrefix().'persons'; + + DB::statement(" + UPDATE {$tableName} + SET unique_id = CONCAT( + user_id, '|', + organization_id, '|', + JSON_UNQUOTE(JSON_EXTRACT(emails, '$[0].value')), '|', + JSON_UNQUOTE(JSON_EXTRACT(contact_numbers, '$[0].value')) + ) + "); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('persons', function (Blueprint $table) { + $table->dropColumn('unique_id'); + }); + } +}; diff --git a/database/migrations/tenant/2024_10_29_044744_create_marketing_events_table.php b/database/migrations/tenant/2024_10_29_044744_create_marketing_events_table.php new file mode 100644 index 0000000..b78e9ff --- /dev/null +++ b/database/migrations/tenant/2024_10_29_044744_create_marketing_events_table.php @@ -0,0 +1,30 @@ +increments('id'); + $table->string('name'); + $table->string('description'); + $table->date('date'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('marketing_events'); + } +}; diff --git a/database/migrations/tenant/2024_11_04_122500_create_marketing_campaigns_table.php b/database/migrations/tenant/2024_11_04_122500_create_marketing_campaigns_table.php new file mode 100644 index 0000000..34bea0b --- /dev/null +++ b/database/migrations/tenant/2024_11_04_122500_create_marketing_campaigns_table.php @@ -0,0 +1,32 @@ +increments('id'); + $table->string('name'); + $table->string('subject'); + $table->boolean('status')->default(0); + $table->string('type'); + $table->string('mail_to'); + $table->string('spooling')->nullable(); + $table->unsignedInteger('marketing_template_id')->nullable(); + $table->unsignedInteger('marketing_event_id')->nullable(); + $table->timestamps(); + + $table->foreign('marketing_template_id')->references('id')->on('email_templates')->onDelete('set null'); + $table->foreign('marketing_event_id')->references('id')->on('marketing_events')->onDelete('set null'); + }); + } + + public function down(): void + { + Schema::dropIfExists('marketing_campaigns'); + } +}; diff --git a/database/migrations/tenant/2024_11_29_120302_modify_foreign_keys_in_leads_table.php b/database/migrations/tenant/2024_11_29_120302_modify_foreign_keys_in_leads_table.php new file mode 100644 index 0000000..eb076bd --- /dev/null +++ b/database/migrations/tenant/2024_11_29_120302_modify_foreign_keys_in_leads_table.php @@ -0,0 +1,80 @@ +integer('user_id')->unsigned()->nullable()->change(); + $table->integer('person_id')->unsigned()->nullable()->change(); + $table->integer('lead_source_id')->unsigned()->nullable()->change(); + $table->integer('lead_type_id')->unsigned()->nullable()->change(); + + $table->dropForeign(['user_id']); + $table->dropForeign(['person_id']); + $table->dropForeign(['lead_source_id']); + $table->dropForeign(['lead_type_id']); + + $table->foreign('user_id') + ->references('id')->on('users') + ->onDelete('set null'); + + $table->foreign('person_id') + ->references('id')->on('persons') + ->onDelete('restrict'); + + $table->foreign('lead_source_id') + ->references('id')->on('lead_sources') + ->onDelete('restrict'); + + $table->foreign('lead_type_id') + ->references('id')->on('lead_types') + ->onDelete('restrict'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('leads', function (Blueprint $table) { + $table->dropForeign(['user_id']); + $table->dropForeign(['person_id']); + $table->dropForeign(['lead_source_id']); + $table->dropForeign(['lead_type_id']); + + $table->integer('user_id')->unsigned()->nullable()->change(); + $table->integer('person_id')->unsigned()->nullable(false)->change(); + $table->integer('lead_source_id')->unsigned()->nullable(false)->change(); + $table->integer('lead_type_id')->unsigned()->nullable(false)->change(); + + $table->foreign('user_id') + ->references('id')->on('users') + ->onDelete('cascade'); + + $table->foreign('person_id') + ->references('id')->on('persons') + ->onDelete('cascade'); + + $table->foreign('lead_source_id') + ->references('id')->on('lead_sources') + ->onDelete('cascade'); + + $table->foreign('lead_type_id') + ->references('id')->on('lead_types') + ->onDelete('cascade'); + }); + } +}; diff --git a/database/migrations/tenant/2025_01_17_151632_alter_activities_table.php b/database/migrations/tenant/2025_01_17_151632_alter_activities_table.php new file mode 100644 index 0000000..f36b8a1 --- /dev/null +++ b/database/migrations/tenant/2025_01_17_151632_alter_activities_table.php @@ -0,0 +1,52 @@ +dropForeign(['user_id']); + + $table->unsignedInteger('user_id')->nullable()->change(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('activities', function (Blueprint $table) { + $tablePrefix = DB::getTablePrefix(); + + // Disable foreign key checks temporarily. + DB::statement('SET FOREIGN_KEY_CHECKS=0'); + + // Drop the foreign key constraint using raw SQL. + DB::statement('ALTER TABLE '.$tablePrefix.'activities DROP FOREIGN KEY activities_user_id_foreign'); + + // Drop the index. + DB::statement('ALTER TABLE '.$tablePrefix.'activities DROP INDEX activities_user_id_foreign'); + + // Change the column to be non-nullable. + $table->unsignedInteger('user_id')->nullable(false)->change(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + + // Re-enable foreign key checks. + DB::statement('SET FOREIGN_KEY_CHECKS=1'); + }); + } +}; diff --git a/database/migrations/tenant/2025_01_29_133500_update_text_column_type_in_core_config_table.php b/database/migrations/tenant/2025_01_29_133500_update_text_column_type_in_core_config_table.php new file mode 100644 index 0000000..2312701 --- /dev/null +++ b/database/migrations/tenant/2025_01_29_133500_update_text_column_type_in_core_config_table.php @@ -0,0 +1,28 @@ +text('value')->change(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('core_config', function (Blueprint $table) { + $table->string('value')->change(); + }); + } +}; diff --git a/database/migrations/tenant/2025_03_19_132236_update_organization_id_column_in_persons_table.php b/database/migrations/tenant/2025_03_19_132236_update_organization_id_column_in_persons_table.php new file mode 100644 index 0000000..bb26d4a --- /dev/null +++ b/database/migrations/tenant/2025_03_19_132236_update_organization_id_column_in_persons_table.php @@ -0,0 +1,32 @@ +dropForeign(['organization_id']); + + $table->foreign('organization_id')->references('id')->on('organizations')->onDelete('set null'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('persons', function (Blueprint $table) { + $table->dropForeign(['organization_id']); + + $table->foreign('organization_id')->references('id')->on('organizations')->onDelete('cascade'); + }); + } +}; diff --git a/database/migrations/tenant/2025_07_01_133612_alter_lead_pipelines_table.php b/database/migrations/tenant/2025_07_01_133612_alter_lead_pipelines_table.php new file mode 100644 index 0000000..24f238c --- /dev/null +++ b/database/migrations/tenant/2025_07_01_133612_alter_lead_pipelines_table.php @@ -0,0 +1,30 @@ +string('name')->unique()->change(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('lead_pipelines', function (Blueprint $table) { + $table->dropUnique(['name']); + + $table->string('name')->change(); + }); + } +}; diff --git a/database/migrations/tenant/2025_07_02_191710_alter_attribute_values_table.php b/database/migrations/tenant/2025_07_02_191710_alter_attribute_values_table.php new file mode 100644 index 0000000..b0792b9 --- /dev/null +++ b/database/migrations/tenant/2025_07_02_191710_alter_attribute_values_table.php @@ -0,0 +1,39 @@ +string('unique_id')->nullable(); + }); + + $tablePrefix = DB::getTablePrefix(); + + DB::statement('UPDATE '.$tablePrefix."attribute_values SET unique_id = CONCAT(entity_id, '|', attribute_id)"); + + Schema::table('attribute_values', function (Blueprint $table) { + $table->unique('unique_id'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('attribute_values', function (Blueprint $table) { + $table->dropUnique(['unique_id']); + + $table->dropColumn('unique_id'); + }); + } +}; diff --git a/database/migrations/tenant/2025_07_09_133553_alter_email_templates_table.php b/database/migrations/tenant/2025_07_09_133553_alter_email_templates_table.php new file mode 100644 index 0000000..0bee090 --- /dev/null +++ b/database/migrations/tenant/2025_07_09_133553_alter_email_templates_table.php @@ -0,0 +1,30 @@ +string('name')->unique()->change(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('email_templates', function (Blueprint $table) { + $table->dropUnique(['name']); + + $table->string('name')->change(); + }); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php new file mode 100644 index 0000000..4b55b51 --- /dev/null +++ b/database/seeders/DatabaseSeeder.php @@ -0,0 +1,19 @@ +call(KrayinDatabaseSeeder::class); + } +} diff --git a/database/seeders/SuperAdminSeeder.php b/database/seeders/SuperAdminSeeder.php new file mode 100644 index 0000000..ca5da73 --- /dev/null +++ b/database/seeders/SuperAdminSeeder.php @@ -0,0 +1,24 @@ + 'admin@example.com'], + [ + 'name' => 'Super Admin', + 'password' => Hash::make('admin123'), + 'status' => 1, + // 'role_id' => 1, // Skip role_id if strictly checking email + ] + ); + } +} diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml new file mode 100644 index 0000000..eef20d6 --- /dev/null +++ b/docker-compose.dev.yml @@ -0,0 +1,61 @@ +version: '3.8' + +services: + krayin: + build: . + container_name: krayin_app + restart: unless-stopped + ports: + - "8000:80" + volumes: + - .:/var/www/html + environment: + APP_ENV: local + APP_DEBUG: 'true' + APP_URL: http://localhost:8000 + DB_HOST: mysql + DB_PORT: 3306 + DB_DATABASE: laravel-crm + DB_USERNAME: root + DB_PASSWORD: '' + REDIS_HOST: redis + REDIS_PORT: 6379 + CACHE_DRIVER: redis + SESSION_DRIVER: redis + QUEUE_CONNECTION: redis + depends_on: + - mysql + - redis + networks: + - krayin_net + + mysql: + image: mysql:8.0 + container_name: krayin_mysql + restart: unless-stopped + environment: + MYSQL_DATABASE: laravel-crm + MYSQL_ALLOW_EMPTY_PASSWORD: 'yes' + volumes: + - mysql_data:/var/lib/mysql + ports: + - "3306:3306" + networks: + - krayin_net + + redis: + image: redis:alpine + container_name: krayin_redis + restart: unless-stopped + volumes: + - redis_data:/data + networks: + - krayin_net + +networks: + krayin_net: + driver: bridge + +volumes: + mysql_data: + redis_data: diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..03a6053 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,114 @@ +version: "3.7" + +########################################################## +# STACK COMPLETA: Krayin CRM + MySQL + Redis +########################################################## + +services: + + # ===== KRAYIN CRM ===== + krayin: + image: growup:latest # Sua imagem customizada + ports: + - "8090:80" # Ajuste a porta externa conforme necessário + volumes: + - krayin_data:/var/www/html/storage + - krayin_public:/var/www/html/public/storage + networks: + - network_public + environment: + - APP_ENV=production + - APP_DEBUG=false + - APP_URL=https://seudominio.com.br + - DB_CONNECTION=mysql + - DB_HOST=mysql + - DB_PORT=3306 + - DB_DATABASE=krayin + - DB_USERNAME=krayin + - DB_PASSWORD=Mfcd62!!Mfcd62!! + - REDIS_HOST=redis + - REDIS_PORT=6379 + depends_on: + - mysql + - redis + deploy: + mode: replicated + replicas: 1 + placement: + constraints: + - node.role == manager + + # ===== MYSQL ===== + mysql: + image: percona/percona-server:8.0 + environment: + - MYSQL_ROOT_PASSWORD=Mfcd62!!Mfcd62!! + - MYSQL_DATABASE=krayin + - MYSQL_USER=krayin + - MYSQL_PASSWORD=Mfcd62!!Mfcd62!! + - TZ=America/Sao_Paulo + networks: + - network_public + volumes: + - mysql_data:/var/lib/mysql + deploy: + placement: + constraints: + - node.role == manager + resources: + limits: + cpus: '1' + memory: 1024M + command: + [ + "--character-set-server=utf8mb4", + "--collation-server=utf8mb4_general_ci", + "--sql-mode=", + "--default-authentication-plugin=mysql_native_password", + "--max-allowed-packet=512MB", + "--expire_logs_days=7", + "--max_binlog_size=100M" + ] + + # ===== REDIS ===== + redis: + image: redis:latest + command: + [ + "redis-server", + "--appendonly", + "yes", + "--port", + "6379" + ] + volumes: + - redis_data:/data + networks: + - network_public + deploy: + placement: + constraints: + - node.role == manager + resources: + limits: + cpus: "0.5" + memory: 1024M + +networks: + network_public: + external: true + name: network_public + +volumes: + krayin_data: + external: true + name: krayin_data + krayin_public: + external: true + name: krayin_public + mysql_data: + external: true + name: mysql_data + redis_data: + external: true + name: redis_data diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh new file mode 100644 index 0000000..8ddae8c --- /dev/null +++ b/docker-entrypoint.sh @@ -0,0 +1,105 @@ +#!/bin/bash +set -e + +echo "🚀 Iniciando Container v21 (Smart Seed + Key Fix)..." + +# 1. PERMISSÕES +mkdir -p storage/framework/sessions +mkdir -p storage/framework/views +mkdir -p storage/framework/cache +mkdir -p bootstrap/cache +chown -R www-data:www-data storage bootstrap/cache +chmod -R 775 storage + +# 2. AGUARDAR BANCO +DB_HOST=${DB_HOST:-mysql} +DB_PORT=${DB_PORT:-3306} + +echo "⏳ Aguardando Banco ($DB_HOST:$DB_PORT)..." +while ! nc -z $DB_HOST $DB_PORT; do + echo "zzZ... Banco indisponível. Tentando em 3s..." + sleep 3 +done +echo "✅ Banco OK!" + +# 3. PREPARAR .ENV E KEY +if [ ! -f .env ]; then + echo "⚠️ .env não encontrado. Criando a partir do exemplo..." + cp .env.example .env + echo "🔑 Gerando APP_KEY pela primeira vez..." + php artisan key:generate --force +fi + +# Verificação de Segurança da Key +if grep -q "APP_KEY=$" .env || grep -q "APP_KEY=\s*$" .env; then + echo "⚠️ APP_KEY encontrada vazia! Gerando nova chave..." + php artisan key:generate --force +fi + +# 4. CONFIGURAÇÃO DINÂMICA +echo "🇧🇷 Aplicando Configurações..." + +# URL +if [ ! -z "$APP_URL" ]; then + sed -i '/APP_URL=/d' .env + echo "APP_URL=$APP_URL" >> .env +fi + +# Locale e Timezone +sed -i 's/APP_LOCALE=en/APP_LOCALE=pt_BR/g' .env +sed -i 's/APP_CURRENCY=USD/APP_CURRENCY=BRL/g' .env +sed -i 's/APP_TIMEZONE=UTC/APP_TIMEZONE=America\/Sao_Paulo/g' .env +sed -i 's/APP_TIMEZONE=Asia\/Kolkata/APP_TIMEZONE=America\/Sao_Paulo/g' .env + +# Infra +sed -i 's/DB_HOST=127.0.0.1/DB_HOST=mysql/g' .env +sed -i 's/REDIS_HOST=127.0.0.1/REDIS_HOST=redis/g' .env +sed -i 's/MEMCACHED_HOST=127.0.0.1/MEMCACHED_HOST=memcached/g' .env + +# Segurança Session +sed -i '/SESSION_SECURE_COOKIE/d' .env +sed -i '/SESSION_SAME_SITE/d' .env + +if [ "$APP_ENV" = "local" ]; then + echo "SESSION_SECURE_COOKIE=false" >> .env +else + echo "SESSION_SECURE_COOKIE=true" >> .env +fi + +echo "SESSION_SAME_SITE=lax" >> .env +echo "SESSION_COOKIE=growup_session" >> .env +echo "SESSION_DOMAIN=" >> .env + +# 5. LIMPEZA DE CACHE +echo "🔥 Limpando caches..." +rm -f bootstrap/cache/config.php +rm -f bootstrap/cache/packages.php +rm -f bootstrap/cache/services.php +php artisan optimize:clear + +# 6. BANCO E SEED INTELIGENTE (A MUDANÇA ESTÁ AQUI) +echo "📦 Verificando Banco de Dados..." +php artisan migrate --force + +echo "🧐 Verificando existência de usuários..." +# Executa um script PHP rápido para contar usuários na tabela real +USER_COUNT=$(php -r "require __DIR__ . '/vendor/autoload.php'; \$app = require_once __DIR__ . '/bootstrap/app.php'; \$kernel = \$app->make(Illuminate\Contracts\Console\Kernel::class); \$kernel->bootstrap(); try { echo \Illuminate\Support\Facades\DB::table('users')->count(); } catch (\Exception \$e) { echo 0; }") + +echo "📊 Usuários encontrados: $USER_COUNT" + +if [ "$USER_COUNT" -eq "0" ]; then + echo "🌱 Tabela de usuários vazia. Rodando SEED OBRIGATÓRIO..." + php artisan db:seed --force + echo "✅ Seed concluído! Usuário padrão criado." +else + echo "⏩ Já existem usuários no banco ($USER_COUNT). Pulando Seed para evitar duplicidade." +fi + +# 7. OTIMIZAÇÃO FINAL +echo "⚡ Otimizando..." +php artisan optimize +php artisan view:cache +php artisan route:cache + +echo "🏁 Iniciando Apache..." +exec apache2-foreground diff --git a/fix-locale.php b/fix-locale.php new file mode 100644 index 0000000..3599e87 --- /dev/null +++ b/fix-locale.php @@ -0,0 +1,39 @@ +make(\Illuminate\Contracts\Console\Kernel::class)->bootstrap(); + +$tenantId = 'tenant1'; +$tenant = Tenant::find($tenantId); + +if (!$tenant) { + echo "Tenant $tenantId not found.\n"; + exit(1); +} + +tenancy()->initialize($tenant); + +$columns = Schema::getColumnListing('core_config'); +echo "Columns: " . implode(', ', $columns) . "\n"; + +// Update using only available columns +$data = ['value' => 'pt_BR']; +// If locale_code exists, set it? No, usually code key defines it. + +$keys = [ + 'general.general.locale.code', + 'app.locale' +]; + +foreach ($keys as $code) { + DB::table('core_config')->updateOrInsert( + ['code' => $code], + $data + ); + echo "Set $code to pt_BR\n"; +} \ No newline at end of file diff --git a/lang/en/auth.php b/lang/en/auth.php new file mode 100644 index 0000000..24e063b --- /dev/null +++ b/lang/en/auth.php @@ -0,0 +1,20 @@ + 'These credentials do not match our records.', + 'password' => 'The provided password is incorrect.', + 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', + +]; diff --git a/lang/en/pagination.php b/lang/en/pagination.php new file mode 100644 index 0000000..fcab34b --- /dev/null +++ b/lang/en/pagination.php @@ -0,0 +1,19 @@ + '« Previous', + 'next' => 'Next »', + +]; diff --git a/lang/en/passwords.php b/lang/en/passwords.php new file mode 100644 index 0000000..526795f --- /dev/null +++ b/lang/en/passwords.php @@ -0,0 +1,22 @@ + 'Your password has been reset!', + 'sent' => 'We have emailed your password reset link!', + 'throttled' => 'Please wait before retrying.', + 'token' => 'This password reset token is invalid.', + 'user' => "We can't find a user with that email address.", + +]; diff --git a/lang/en/validation.php b/lang/en/validation.php new file mode 100644 index 0000000..5226d4e --- /dev/null +++ b/lang/en/validation.php @@ -0,0 +1,152 @@ + 'The :attribute must be accepted.', + 'active_url' => 'The :attribute is not a valid URL.', + 'after' => 'The :attribute must be a date after :date.', + 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', + 'alpha' => 'The :attribute may only contain letters.', + 'alpha_dash' => 'The :attribute may only contain letters, numbers, dashes and underscores.', + 'alpha_num' => 'The :attribute may only contain letters and numbers.', + 'array' => 'The :attribute must be an array.', + 'before' => 'The :attribute must be a date before :date.', + 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', + 'between' => [ + 'numeric' => 'The :attribute must be between :min and :max.', + 'file' => 'The :attribute must be between :min and :max kilobytes.', + 'string' => 'The :attribute must be between :min and :max characters.', + 'array' => 'The :attribute must have between :min and :max items.', + ], + 'boolean' => 'The :attribute field must be true or false.', + 'confirmed' => 'The :attribute confirmation does not match.', + 'date' => 'The :attribute is not a valid date.', + 'date_equals' => 'The :attribute must be a date equal to :date.', + 'date_format' => 'The :attribute does not match the format :format.', + 'different' => 'The :attribute and :other must be different.', + 'digits' => 'The :attribute must be :digits digits.', + 'digits_between' => 'The :attribute must be between :min and :max digits.', + 'dimensions' => 'The :attribute has invalid image dimensions.', + 'distinct' => 'The :attribute field has a duplicate value.', + 'email' => 'The :attribute must be a valid email address.', + 'ends_with' => 'The :attribute must end with one of the following: :values.', + 'exists' => 'The selected :attribute is invalid.', + 'file' => 'The :attribute must be a file.', + 'filled' => 'The :attribute field must have a value.', + 'gt' => [ + 'numeric' => 'The :attribute must be greater than :value.', + 'file' => 'The :attribute must be greater than :value kilobytes.', + 'string' => 'The :attribute must be greater than :value characters.', + 'array' => 'The :attribute must have more than :value items.', + ], + 'gte' => [ + 'numeric' => 'The :attribute must be greater than or equal :value.', + 'file' => 'The :attribute must be greater than or equal :value kilobytes.', + 'string' => 'The :attribute must be greater than or equal :value characters.', + 'array' => 'The :attribute must have :value items or more.', + ], + 'image' => 'The :attribute must be an image.', + 'in' => 'The selected :attribute is invalid.', + 'in_array' => 'The :attribute field does not exist in :other.', + 'integer' => 'The :attribute must be an integer.', + 'ip' => 'The :attribute must be a valid IP address.', + 'ipv4' => 'The :attribute must be a valid IPv4 address.', + 'ipv6' => 'The :attribute must be a valid IPv6 address.', + 'json' => 'The :attribute must be a valid JSON string.', + 'lt' => [ + 'numeric' => 'The :attribute must be less than :value.', + 'file' => 'The :attribute must be less than :value kilobytes.', + 'string' => 'The :attribute must be less than :value characters.', + 'array' => 'The :attribute must have less than :value items.', + ], + 'lte' => [ + 'numeric' => 'The :attribute must be less than or equal :value.', + 'file' => 'The :attribute must be less than or equal :value kilobytes.', + 'string' => 'The :attribute must be less than or equal :value characters.', + 'array' => 'The :attribute must not have more than :value items.', + ], + 'max' => [ + 'numeric' => 'The :attribute may not be greater than :max.', + 'file' => 'The :attribute may not be greater than :max kilobytes.', + 'string' => 'The :attribute may not be greater than :max characters.', + 'array' => 'The :attribute may not have more than :max items.', + ], + 'mimes' => 'The :attribute must be a file of type: :values.', + 'mimetypes' => 'The :attribute must be a file of type: :values.', + 'min' => [ + 'numeric' => 'The :attribute must be at least :min.', + 'file' => 'The :attribute must be at least :min kilobytes.', + 'string' => 'The :attribute must be at least :min characters.', + 'array' => 'The :attribute must have at least :min items.', + ], + 'multiple_of' => 'The :attribute must be a multiple of :value.', + 'not_in' => 'The selected :attribute is invalid.', + 'not_regex' => 'The :attribute format is invalid.', + 'numeric' => 'The :attribute must be a number.', + 'password' => 'The password is incorrect.', + 'present' => 'The :attribute field must be present.', + 'regex' => 'The :attribute format is invalid.', + 'required' => 'The :attribute field is required.', + 'required_if' => 'The :attribute field is required when :other is :value.', + 'required_unless' => 'The :attribute field is required unless :other is in :values.', + 'required_with' => 'The :attribute field is required when :values is present.', + 'required_with_all' => 'The :attribute field is required when :values are present.', + 'required_without' => 'The :attribute field is required when :values is not present.', + 'required_without_all' => 'The :attribute field is required when none of :values are present.', + 'same' => 'The :attribute and :other must match.', + 'size' => [ + 'numeric' => 'The :attribute must be :size.', + 'file' => 'The :attribute must be :size kilobytes.', + 'string' => 'The :attribute must be :size characters.', + 'array' => 'The :attribute must contain :size items.', + ], + 'starts_with' => 'The :attribute must start with one of the following: :values.', + 'string' => 'The :attribute must be a string.', + 'timezone' => 'The :attribute must be a valid zone.', + 'unique' => 'The :attribute has already been taken.', + 'uploaded' => 'The :attribute failed to upload.', + 'url' => 'The :attribute format is invalid.', + 'uuid' => 'The :attribute must be a valid UUID.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'custom-message', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap our attribute placeholder + | with something more reader friendly such as "E-Mail Address" instead + | of "email". This simply helps us make our message more expressive. + | + */ + + 'attributes' => [], + +]; diff --git a/package.json b/package.json new file mode 100644 index 0000000..f690541 --- /dev/null +++ b/package.json @@ -0,0 +1,13 @@ +{ + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build" + }, + "devDependencies": { + "axios": "^1.6.4", + "laravel-vite-plugin": "^1.0.0", + "vite": "^5.0.0" + } +} diff --git a/packages/Webkul/Activity/composer.json b/packages/Webkul/Activity/composer.json new file mode 100755 index 0000000..0cf8329 --- /dev/null +++ b/packages/Webkul/Activity/composer.json @@ -0,0 +1,28 @@ +{ + "name": "krayin/laravel-activity", + "license": "MIT", + "authors": [ + { + "name": "Jitendra Singh", + "email": "jitendra@webkul.com" + } + ], + "require": { + "krayin/laravel-core": "^1.0", + "krayin/laravel-user": "^1.0" + }, + "autoload": { + "psr-4": { + "Webkul\\Activity\\": "src/" + } + }, + "extra": { + "laravel": { + "providers": [ + "Webkul\\Activity\\Providers\\ActivityServiceProvider" + ], + "aliases": {} + } + }, + "minimum-stability": "dev" +} \ No newline at end of file diff --git a/packages/Webkul/Activity/src/Contracts/Activity.php b/packages/Webkul/Activity/src/Contracts/Activity.php new file mode 100644 index 0000000..9a88b87 --- /dev/null +++ b/packages/Webkul/Activity/src/Contracts/Activity.php @@ -0,0 +1,5 @@ +increments('id'); + $table->string('title')->nullable(); + $table->string('type'); + $table->text('comment')->nullable(); + $table->json('additional')->nullable(); + $table->datetime('schedule_from')->nullable(); + $table->datetime('schedule_to')->nullable(); + $table->boolean('is_done')->default(0); + + $table->integer('user_id')->unsigned(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('activities'); + } +}; diff --git a/packages/Webkul/Activity/src/Database/Migrations/2021_05_15_151855_create_activity_files_table.php b/packages/Webkul/Activity/src/Database/Migrations/2021_05_15_151855_create_activity_files_table.php new file mode 100644 index 0000000..30d516c --- /dev/null +++ b/packages/Webkul/Activity/src/Database/Migrations/2021_05_15_151855_create_activity_files_table.php @@ -0,0 +1,37 @@ +increments('id'); + $table->string('name'); + $table->string('path'); + + $table->integer('activity_id')->unsigned(); + $table->foreign('activity_id')->references('id')->on('activities')->onDelete('cascade'); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('activity_files'); + } +}; diff --git a/packages/Webkul/Activity/src/Database/Migrations/2021_07_28_142453_create_activity_participants_table.php b/packages/Webkul/Activity/src/Database/Migrations/2021_07_28_142453_create_activity_participants_table.php new file mode 100644 index 0000000..ba72faa --- /dev/null +++ b/packages/Webkul/Activity/src/Database/Migrations/2021_07_28_142453_create_activity_participants_table.php @@ -0,0 +1,39 @@ +increments('id'); + + $table->integer('activity_id')->unsigned(); + $table->foreign('activity_id')->references('id')->on('activities')->onDelete('cascade'); + + $table->integer('user_id')->nullable()->unsigned(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + + $table->integer('person_id')->nullable()->unsigned(); + $table->foreign('person_id')->references('id')->on('persons')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('activity_participants'); + } +}; diff --git a/packages/Webkul/Activity/src/Database/Migrations/2021_11_17_190943_add_location_column_in_activities_table.php b/packages/Webkul/Activity/src/Database/Migrations/2021_11_17_190943_add_location_column_in_activities_table.php new file mode 100644 index 0000000..53727e1 --- /dev/null +++ b/packages/Webkul/Activity/src/Database/Migrations/2021_11_17_190943_add_location_column_in_activities_table.php @@ -0,0 +1,32 @@ +string('location')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('activities', function (Blueprint $table) { + $table->dropColumn('location'); + }); + } +}; diff --git a/packages/Webkul/Activity/src/Database/Migrations/2025_01_17_151632_alter_activities_table.php b/packages/Webkul/Activity/src/Database/Migrations/2025_01_17_151632_alter_activities_table.php new file mode 100644 index 0000000..f36b8a1 --- /dev/null +++ b/packages/Webkul/Activity/src/Database/Migrations/2025_01_17_151632_alter_activities_table.php @@ -0,0 +1,52 @@ +dropForeign(['user_id']); + + $table->unsignedInteger('user_id')->nullable()->change(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('activities', function (Blueprint $table) { + $tablePrefix = DB::getTablePrefix(); + + // Disable foreign key checks temporarily. + DB::statement('SET FOREIGN_KEY_CHECKS=0'); + + // Drop the foreign key constraint using raw SQL. + DB::statement('ALTER TABLE '.$tablePrefix.'activities DROP FOREIGN KEY activities_user_id_foreign'); + + // Drop the index. + DB::statement('ALTER TABLE '.$tablePrefix.'activities DROP INDEX activities_user_id_foreign'); + + // Change the column to be non-nullable. + $table->unsignedInteger('user_id')->nullable(false)->change(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + + // Re-enable foreign key checks. + DB::statement('SET FOREIGN_KEY_CHECKS=1'); + }); + } +}; diff --git a/packages/Webkul/Activity/src/Models/Activity.php b/packages/Webkul/Activity/src/Models/Activity.php new file mode 100644 index 0000000..5c866bf --- /dev/null +++ b/packages/Webkul/Activity/src/Models/Activity.php @@ -0,0 +1,111 @@ + 'datetime', + 'schedule_to' => 'datetime', + ]; + + /** + * The attributes that are mass assignable. + * + * @var array + */ + protected $fillable = [ + 'title', + 'type', + 'location', + 'comment', + 'additional', + 'schedule_from', + 'schedule_to', + 'is_done', + 'user_id', + ]; + + /** + * Get the user that owns the activity. + */ + public function user() + { + return $this->belongsTo(UserProxy::modelClass()); + } + + /** + * The participants that belong to the activity. + */ + public function participants() + { + return $this->hasMany(ParticipantProxy::modelClass()); + } + + /** + * Get the file associated with the activity. + */ + public function files() + { + return $this->hasMany(FileProxy::modelClass(), 'activity_id'); + } + + /** + * The leads that belong to the activity. + */ + public function leads() + { + return $this->belongsToMany(LeadProxy::modelClass(), 'lead_activities'); + } + + /** + * The Person that belong to the activity. + */ + public function persons() + { + return $this->belongsToMany(PersonProxy::modelClass(), 'person_activities'); + } + + /** + * The leads that belong to the activity. + */ + public function products() + { + return $this->belongsToMany(ProductProxy::modelClass(), 'product_activities'); + } + + /** + * The Warehouse that belong to the activity. + */ + public function warehouses() + { + return $this->belongsToMany(WarehouseProxy::modelClass(), 'warehouse_activities'); + } +} diff --git a/packages/Webkul/Activity/src/Models/ActivityProxy.php b/packages/Webkul/Activity/src/Models/ActivityProxy.php new file mode 100644 index 0000000..d748e53 --- /dev/null +++ b/packages/Webkul/Activity/src/Models/ActivityProxy.php @@ -0,0 +1,7 @@ +path); + } + + /** + * Get image url for the product image. + */ + public function getUrlAttribute() + { + return $this->url(); + } + + /** + * Get the activity that owns the file. + */ + public function activity() + { + return $this->belongsTo(ActivityProxy::modelClass()); + } + + /** + * @return array + */ + public function toArray() + { + $array = parent::toArray(); + + $array['url'] = $this->url; + + return $array; + } +} diff --git a/packages/Webkul/Activity/src/Models/FileProxy.php b/packages/Webkul/Activity/src/Models/FileProxy.php new file mode 100644 index 0000000..09ff947 --- /dev/null +++ b/packages/Webkul/Activity/src/Models/FileProxy.php @@ -0,0 +1,7 @@ +belongsTo(ActivityProxy::modelClass()); + } + + /** + * Get the user that owns the participant. + */ + public function user() + { + return $this->belongsTo(UserProxy::modelClass()); + } + + /** + * Get the person that owns the participant. + */ + public function person() + { + return $this->belongsTo(PersonProxy::modelClass()); + } +} diff --git a/packages/Webkul/Activity/src/Models/ParticipantProxy.php b/packages/Webkul/Activity/src/Models/ParticipantProxy.php new file mode 100644 index 0000000..c4433af --- /dev/null +++ b/packages/Webkul/Activity/src/Models/ParticipantProxy.php @@ -0,0 +1,7 @@ +loadMigrationsFrom(__DIR__.'/../Database/Migrations'); + } +} diff --git a/packages/Webkul/Activity/src/Providers/ModuleServiceProvider.php b/packages/Webkul/Activity/src/Providers/ModuleServiceProvider.php new file mode 100644 index 0000000..326d643 --- /dev/null +++ b/packages/Webkul/Activity/src/Providers/ModuleServiceProvider.php @@ -0,0 +1,14 @@ +fileRepository->create([ + 'name' => $data['name'] ?? $data['file']->getClientOriginalName(), + 'path' => $data['file']->store('activities/'.$activity->id), + 'activity_id' => $activity->id, + ]); + } + + if (! isset($data['participants'])) { + return $activity; + } + + foreach ($data['participants']['users'] ?? [] as $userId) { + $activity->participants()->create([ + 'user_id' => $userId, + ]); + } + + foreach ($data['participants']['persons'] ?? [] as $personId) { + $activity->participants()->create([ + 'person_id' => $personId, + ]); + } + + return $activity; + } + + /** + * Update pipeline. + * + * @param int $id + * @param string $attribute + * @return \Webkul\Activity\Contracts\Activity + */ + public function update(array $data, $id, $attribute = 'id') + { + $activity = parent::update($data, $id); + + if (isset($data['participants'])) { + $activity->participants()->delete(); + + foreach ($data['participants']['users'] ?? [] as $userId) { + /** + * In some cases, the component exists in an HTML form, and traditional HTML does not send an empty array. + * Therefore, we need to check for an empty string. + * This scenario occurs only when all participants are removed. + */ + if (empty($userId)) { + break; + } + + $activity->participants()->create([ + 'user_id' => $userId, + ]); + } + + foreach ($data['participants']['persons'] ?? [] as $personId) { + /** + * In some cases, the component exists in an HTML form, and traditional HTML does not send an empty array. + * Therefore, we need to check for an empty string. + * This scenario occurs only when all participants are removed. + */ + if (empty($personId)) { + break; + } + + $activity->participants()->create([ + 'person_id' => $personId, + ]); + } + } + + return $activity; + } + + /** + * @param string $dateRange + * @return mixed + */ + public function getActivities($dateRange) + { + $tablePrefix = \DB::getTablePrefix(); + + return $this->select( + 'activities.id', + 'activities.created_at', + 'activities.title', + 'activities.schedule_from as start', + 'activities.schedule_to as end', + 'users.name as user_name', + ) + ->addSelect(\DB::raw('IF('.$tablePrefix.'activities.is_done, "done", "") as class')) + ->leftJoin('activity_participants', 'activities.id', '=', 'activity_participants.activity_id') + ->leftJoin('users', 'activities.user_id', '=', 'users.id') + ->whereIn('type', ['call', 'meeting', 'lunch']) + ->whereBetween('activities.schedule_from', $dateRange) + ->where(function ($query) { + if ($userIds = bouncer()->getAuthorizedUserIds()) { + $query->whereIn('activities.user_id', $userIds) + ->orWhereIn('activity_participants.user_id', $userIds); + } + }) + ->distinct() + ->get(); + } + + /** + * @param string $startFrom + * @param string $endFrom + * @param array $participants + * @param int $id + * @return bool + */ + public function isDurationOverlapping($startFrom, $endFrom, $participants, $id) + { + $queryBuilder = $this->leftJoin('activity_participants', 'activities.id', '=', 'activity_participants.activity_id') + ->where(function ($query) use ($startFrom, $endFrom) { + $query->where([ + ['activities.schedule_from', '<=', $startFrom], + ['activities.schedule_to', '>=', $startFrom], + ])->orWhere([ + ['activities.schedule_from', '>=', $startFrom], + ['activities.schedule_from', '<=', $endFrom], + ]); + }) + ->where(function ($query) use ($participants) { + if (is_null($participants)) { + return; + } + + if (isset($participants['users'])) { + $query->orWhereIn('activity_participants.user_id', $participants['users']); + } + + if (isset($participants['persons'])) { + $query->orWhereIn('activity_participants.person_id', $participants['persons']); + } + }) + ->groupBy('activities.id'); + + if (! is_null($id)) { + $queryBuilder->where('activities.id', '!=', $id); + } + + return $queryBuilder->count() ? true : false; + } +} diff --git a/packages/Webkul/Activity/src/Repositories/FileRepository.php b/packages/Webkul/Activity/src/Repositories/FileRepository.php new file mode 100755 index 0000000..22bfeba --- /dev/null +++ b/packages/Webkul/Activity/src/Repositories/FileRepository.php @@ -0,0 +1,18 @@ +entity ?? $model, 'activities')) { + return; + } + + if (! $model instanceof AttributeValue) { + $activity = app(ActivityRepository::class)->create([ + 'type' => 'system', + 'title' => trans('admin::app.activities.created'), + 'is_done' => 1, + 'user_id' => auth()->check() + ? auth()->id() + : null, + ]); + + $model->activities()->attach($activity->id); + + return; + } + + static::logActivity($model); + }); + + static::updated(function ($model) { + if (! method_exists($model->entity ?? $model, 'activities')) { + return; + } + + static::logActivity($model); + }); + + static::deleting(function ($model) { + if (! method_exists($model->entity ?? $model, 'activities')) { + return; + } + + $model->activities()->delete(); + }); + } + + /** + * Create activity. + */ + protected static function logActivity($model) + { + $customAttributes = []; + + if (method_exists($model, 'getCustomAttributes')) { + $customAttributes = $model->getCustomAttributes()->pluck('code')->toArray(); + } + + $updatedAttributes = static::getUpdatedAttributes($model); + + foreach ($updatedAttributes as $attributeCode => $attributeData) { + if (in_array($attributeCode, $customAttributes)) { + continue; + } + + $attributeCode = $model->attribute?->name ?: $attributeCode; + + $activity = app(ActivityRepository::class)->create([ + 'type' => 'system', + 'title' => trans('admin::app.activities.updated', ['attribute' => $attributeCode]), + 'is_done' => 1, + 'additional' => json_encode([ + 'attribute' => $attributeCode, + 'new' => [ + 'value' => $attributeData['new'], + 'label' => static::getAttributeLabel($attributeData['new'], $model->attribute), + ], + 'old' => [ + 'value' => $attributeData['old'], + 'label' => static::getAttributeLabel($attributeData['old'], $model->attribute), + ], + ]), + 'user_id' => auth()->id(), + ]); + + if ($model instanceof AttributeValue) { + $model->entity->activities()->attach($activity->id); + } else { + $model->activities()->attach($activity->id); + } + } + } + + /** + * Get attribute label. + */ + protected static function getAttributeLabel($value, $attribute) + { + return app(AttributeValueRepository::class)->getAttributeLabel($value, $attribute); + } + + /** + * Create activity. + */ + protected static function getUpdatedAttributes($model) + { + $updatedAttributes = []; + + foreach ($model->getDirty() as $key => $value) { + if (in_array($key, [ + 'id', + 'attribute_id', + 'entity_id', + 'entity_type', + 'updated_at', + ])) { + continue; + } + + $newValue = static::decodeValueIfJson($value); + + $oldValue = static::decodeValueIfJson($model->getOriginal($key)); + + if ($newValue != $oldValue) { + $updatedAttributes[$key] = [ + 'new' => $newValue, + 'old' => $oldValue, + ]; + } + } + + return $updatedAttributes; + } + + /** + * Convert value if json. + */ + protected static function decodeValueIfJson($value) + { + if ( + ! is_array($value) + && json_decode($value, true) + ) { + $value = json_decode($value, true); + } + + if (! is_array($value)) { + return $value; + } + + static::ksortRecursive($value); + + return $value; + } + + /** + * Sort array recursively. + */ + protected static function ksortRecursive(&$array) + { + if (! is_array($array)) { + return; + } + + ksort($array); + + foreach ($array as &$value) { + if (! is_array($value)) { + continue; + } + + static::ksortRecursive($value); + } + } +} diff --git a/packages/Webkul/Admin/.gitignore b/packages/Webkul/Admin/.gitignore new file mode 100755 index 0000000..4d32a59 --- /dev/null +++ b/packages/Webkul/Admin/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/package-lock.json +npm-debug.log +/playwright-report +/test-results \ No newline at end of file diff --git a/packages/Webkul/Admin/composer.json b/packages/Webkul/Admin/composer.json new file mode 100755 index 0000000..78f413c --- /dev/null +++ b/packages/Webkul/Admin/composer.json @@ -0,0 +1,35 @@ +{ + "name": "krayin/laravel-admin", + "license": "MIT", + "authors": [ + { + "name": "Jitendra Singh", + "email": "jitendra@webkul.com" + } + ], + "require": { + "krayin/laravel-attribute": "^1.0", + "krayin/laravel-contact": "^1.0", + "krayin/laravel-core": "^1.0", + "krayin/laravel-email": "^1.0", + "krayin/laravel-lead": "^1.0", + "krayin/laravel-product": "^1.0", + "krayin/laravel-tag": "^1.0", + "krayin/laravel-ui": "^1.0", + "krayin/laravel-user": "^1.0" + }, + "autoload": { + "psr-4": { + "Webkul\\Admin\\": "src/" + } + }, + "extra": { + "laravel": { + "providers": [ + "Webkul\\Admin\\Providers\\AdminServiceProvider" + ], + "aliases": {} + } + }, + "minimum-stability": "dev" +} \ No newline at end of file diff --git a/packages/Webkul/Admin/package.json b/packages/Webkul/Admin/package.json new file mode 100644 index 0000000..5fc9bf0 --- /dev/null +++ b/packages/Webkul/Admin/package.json @@ -0,0 +1,35 @@ +{ + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build" + }, + "devDependencies": { + "@playwright/test": "^1.50.1", + "@types/node": "^22.7.8", + "autoprefixer": "^10.4.16", + "axios": "^1.7.4", + "laravel-vite-plugin": "^1.0", + "postcss": "^8.4.23", + "tailwindcss": "^3.3.2", + "vite": "^5.4.12", + "vue": "^3.4.21" + }, + "dependencies": { + "@vee-validate/i18n": "^4.9.1", + "@vee-validate/rules": "^4.9.1", + "@vitejs/plugin-vue": "^4.2.3", + "chartjs-chart-funnel": "^4.2.1", + "dompurify": "^3.1.7", + "dotenv": "^16.4.7", + "flatpickr": "^4.6.13", + "mitt": "^3.0.1", + "playwright": "^1.48.1", + "readline-sync": "^1.4.10", + "vee-validate": "^4.9.1", + "vue-cal": "^4.9.0", + "vue-flatpickr": "^2.3.0", + "vuedraggable": "^4.1.0" + } +} diff --git a/packages/Webkul/Admin/postcss.config.cjs b/packages/Webkul/Admin/postcss.config.cjs new file mode 100644 index 0000000..818c656 --- /dev/null +++ b/packages/Webkul/Admin/postcss.config.cjs @@ -0,0 +1,3 @@ +module.exports = ({ env }) => ({ + plugins: [require("tailwindcss")(), require("autoprefixer")()], +}); diff --git a/packages/Webkul/Admin/src/Bouncer.php b/packages/Webkul/Admin/src/Bouncer.php new file mode 100755 index 0000000..b53610b --- /dev/null +++ b/packages/Webkul/Admin/src/Bouncer.php @@ -0,0 +1,60 @@ +guard('user')->check() && auth()->guard('user')->user()->role->permission_type == 'all') { + return true; + } else { + if (! auth()->guard('user')->check() || ! auth()->guard('user')->user()->hasPermission($permission)) { + return false; + } + } + + return true; + } + + /** + * Checks if user allowed or not for certain action + * + * @param string $permission + * @return void + */ + public static function allow($permission) + { + if (! auth()->guard('user')->check() || ! auth()->guard('user')->user()->hasPermission($permission)) { + abort(401, 'This action is unauthorized'); + } + } + + /** + * This function will return user ids of current user's groups + * + * @return array|null + */ + public function getAuthorizedUserIds() + { + $user = auth()->guard('user')->user(); + + if ($user->view_permission == 'global') { + return null; + } + + if ($user->view_permission == 'group') { + return app(UserRepository::class)->getCurrentUserGroupsUserIds(); + } else { + return [$user->id]; + } + } +} diff --git a/packages/Webkul/Admin/src/Config/acl.php b/packages/Webkul/Admin/src/Config/acl.php new file mode 100644 index 0000000..bb164d2 --- /dev/null +++ b/packages/Webkul/Admin/src/Config/acl.php @@ -0,0 +1,527 @@ + 'dashboard', + 'name' => 'admin::app.layouts.dashboard', + 'route' => 'admin.dashboard.index', + 'sort' => 1, + ], [ + 'key' => 'leads', + 'name' => 'admin::app.acl.leads', + 'route' => 'admin.leads.index', + 'sort' => 2, + ], [ + 'key' => 'leads.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.leads.create', 'admin.leads.store'], + 'sort' => 1, + ], [ + 'key' => 'leads.view', + 'name' => 'admin::app.acl.view', + 'route' => 'admin.leads.view', + 'sort' => 2, + ], [ + 'key' => 'leads.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.leads.edit', 'admin.leads.update', 'admin.leads.mass_update'], + 'sort' => 3, + ], [ + 'key' => 'leads.delete', + 'name' => 'admin::app.acl.delete', + 'route' => ['admin.leads.delete', 'admin.leads.mass_delete'], + 'sort' => 4, + ], [ + 'key' => 'quotes', + 'name' => 'admin::app.acl.quotes', + 'route' => 'admin.quotes.index', + 'sort' => 3, + ], [ + 'key' => 'quotes.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.quotes.create', 'admin.quotes.store'], + 'sort' => 1, + ], [ + 'key' => 'quotes.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.quotes.edit', 'admin.quotes.update'], + 'sort' => 2, + ], [ + 'key' => 'quotes.print', + 'name' => 'admin::app.acl.print', + 'route' => 'admin.quotes.print', + 'sort' => 3, + ], [ + 'key' => 'quotes.delete', + 'name' => 'admin::app.acl.delete', + 'route' => ['admin.quotes.delete', 'admin.quotes.mass_delete'], + 'sort' => 4, + ], [ + 'key' => 'mail', + 'name' => 'admin::app.acl.mail', + 'route' => 'admin.mail.index', + 'sort' => 4, + ], [ + 'key' => 'mail.inbox', + 'name' => 'admin::app.acl.inbox', + 'route' => 'admin.mail.index', + 'sort' => 1, + ], [ + 'key' => 'mail.draft', + 'name' => 'admin::app.acl.draft', + 'route' => 'admin.mail.index', + 'sort' => 2, + ], [ + 'key' => 'mail.outbox', + 'name' => 'admin::app.acl.outbox', + 'route' => 'admin.mail.index', + 'sort' => 3, + ], [ + 'key' => 'mail.sent', + 'name' => 'admin::app.acl.sent', + 'route' => 'admin.mail.index', + 'sort' => 4, + ], [ + 'key' => 'mail.trash', + 'name' => 'admin::app.acl.trash', + 'route' => 'admin.mail.index', + 'sort' => 5, + ], [ + 'key' => 'mail.compose', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.mail.store'], + 'sort' => 6, + ], [ + 'key' => 'mail.view', + 'name' => 'admin::app.acl.view', + 'route' => 'admin.mail.view', + 'sort' => 7, + ], [ + 'key' => 'mail.edit', + 'name' => 'admin::app.acl.edit', + 'route' => 'admin.mail.update', + 'sort' => 8, + ], [ + 'key' => 'mail.delete', + 'name' => 'admin::app.acl.delete', + 'route' => ['admin.mail.delete', 'admin.mail.mass_delete'], + 'sort' => 9, + ], [ + 'key' => 'activities', + 'name' => 'admin::app.acl.activities', + 'route' => 'admin.activities.index', + 'sort' => 5, + ], [ + 'key' => 'activities.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.activities.create', 'admin.activities.store'], + 'sort' => 1, + ], [ + 'key' => 'activities.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.activities.edit', 'admin.activities.update', 'admin.activities.mass_update'], + 'sort' => 2, + ], [ + 'key' => 'activities.delete', + 'name' => 'admin::app.acl.delete', + 'route' => ['admin.activities.delete', 'admin.activities.mass_delete'], + 'sort' => 3, + ], [ + 'key' => 'contacts', + 'name' => 'admin::app.acl.contacts', + 'route' => 'admin.contacts.users.index', + 'sort' => 6, + ], [ + 'key' => 'contacts.persons', + 'name' => 'admin::app.acl.persons', + 'route' => 'admin.contacts.persons.index', + 'sort' => 1, + ], [ + 'key' => 'contacts.persons.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.contacts.persons.create', 'admin.contacts.persons.store'], + 'sort' => 2, + ], [ + 'key' => 'contacts.persons.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.contacts.persons.edit', 'admin.contacts.persons.update'], + 'sort' => 3, + ], [ + 'key' => 'contacts.persons.delete', + 'name' => 'admin::app.acl.delete', + 'route' => ['admin.contacts.persons.delete', 'admin.contacts.persons.mass_delete'], + 'sort' => 4, + ], [ + 'key' => 'contacts.persons.view', + 'name' => 'admin::app.acl.view', + 'route' => 'admin.contacts.persons.view', + 'sort' => 5, + ], [ + 'key' => 'contacts.organizations', + 'name' => 'admin::app.acl.organizations', + 'route' => 'admin.contacts.organizations.index', + 'sort' => 2, + ], [ + 'key' => 'contacts.organizations.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.contacts.organizations.create', 'admin.contacts.organizations.store'], + 'sort' => 1, + ], [ + 'key' => 'contacts.organizations.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.contacts.organizations.edit', 'admin.contacts.organizations.update'], + 'sort' => 2, + ], [ + 'key' => 'contacts.organizations.delete', + 'name' => 'admin::app.acl.delete', + 'route' => ['admin.contacts.organizations.delete', 'admin.contacts.organizations.mass_delete'], + 'sort' => 3, + ], [ + 'key' => 'products', + 'name' => 'admin::app.acl.products', + 'route' => 'admin.products.index', + 'sort' => 7, + ], [ + 'key' => 'products.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.products.create', 'admin.products.store'], + 'sort' => 1, + ], [ + 'key' => 'products.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.products.edit', 'admin.products.update'], + 'sort' => 2, + ], [ + 'key' => 'products.delete', + 'name' => 'admin::app.acl.delete', + 'route' => ['admin.products.delete', 'admin.products.mass_delete'], + 'sort' => 3, + ], [ + 'key' => 'products.view', + 'name' => 'admin::app.acl.view', + 'route' => 'admin.products.view', + 'sort' => 3, + ], [ + 'key' => 'settings', + 'name' => 'admin::app.acl.settings', + 'route' => 'admin.settings.index', + 'sort' => 8, + ], [ + 'key' => 'settings.user', + 'name' => 'admin::app.acl.user', + 'route' => ['admin.settings.groups.index', 'admin.settings.roles.index', 'admin.settings.users.index'], + 'sort' => 1, + ], [ + 'key' => 'settings.user.groups', + 'name' => 'admin::app.acl.groups', + 'route' => 'admin.settings.groups.index', + 'sort' => 1, + ], [ + 'key' => 'settings.user.groups.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.settings.groups.create', 'admin.settings.groups.store'], + 'sort' => 1, + ], [ + 'key' => 'settings.user.groups.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.settings.groups.edit', 'admin.settings.groups.update'], + 'sort' => 2, + ], [ + 'key' => 'settings.user.groups.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.settings.groups.delete', + 'sort' => 3, + ], [ + 'key' => 'settings.user.roles', + 'name' => 'admin::app.acl.roles', + 'route' => 'admin.settings.roles.index', + 'sort' => 2, + ], [ + 'key' => 'settings.user.roles.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.settings.roles.create', 'admin.settings.roles.store'], + 'sort' => 1, + ], [ + 'key' => 'settings.user.roles.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.settings.roles.edit', 'admin.settings.roles.update'], + 'sort' => 2, + ], [ + 'key' => 'settings.user.roles.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.settings.roles.delete', + 'sort' => 3, + ], [ + 'key' => 'settings.user.users', + 'name' => 'admin::app.acl.users', + 'route' => 'admin.settings.users.index', + 'sort' => 3, + ], [ + 'key' => 'settings.user.users.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.settings.users.create', 'admin.settings.users.store'], + 'sort' => 1, + ], [ + 'key' => 'settings.user.users.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.settings.users.edit', 'admin.settings.users.update', 'admin.settings.users.mass_update'], + 'sort' => 2, + ], [ + 'key' => 'settings.user.users.delete', + 'name' => 'admin::app.acl.delete', + 'route' => ['admin.settings.users.delete', 'admin.settings.users.mass_delete'], + 'sort' => 3, + ], [ + 'key' => 'settings.lead', + 'name' => 'admin::app.acl.lead', + 'route' => ['admin.settings.pipelines.index', 'admin.settings.sources.index', 'admin.settings.types.index'], + 'sort' => 2, + ], [ + 'key' => 'settings.lead.pipelines', + 'name' => 'admin::app.acl.pipelines', + 'route' => 'admin.settings.pipelines.index', + 'sort' => 1, + ], [ + 'key' => 'settings.lead.pipelines.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.settings.pipelines.create', 'admin.settings.pipelines.store'], + 'sort' => 1, + ], [ + 'key' => 'settings.lead.pipelines.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.settings.pipelines.edit', 'admin.settings.pipelines.update'], + 'sort' => 2, + ], [ + 'key' => 'settings.lead.pipelines.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.settings.pipelines.delete', + 'sort' => 3, + ], [ + 'key' => 'settings.lead.sources', + 'name' => 'admin::app.acl.sources', + 'route' => 'admin.settings.sources.index', + 'sort' => 2, + ], [ + 'key' => 'settings.lead.sources.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.settings.sources.store'], + 'sort' => 1, + ], [ + 'key' => 'settings.lead.sources.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.settings.sources.edit', 'admin.settings.sources.update'], + 'sort' => 2, + ], [ + 'key' => 'settings.lead.sources.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.settings.sources.delete', + 'sort' => 3, + ], [ + 'key' => 'settings.lead.types', + 'name' => 'admin::app.acl.types', + 'route' => 'admin.settings.types.index', + 'sort' => 3, + ], [ + 'key' => 'settings.lead.types.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.settings.types.store'], + 'sort' => 1, + ], [ + 'key' => 'settings.lead.types.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.settings.types.edit', 'admin.settings.types.update'], + 'sort' => 2, + ], [ + 'key' => 'settings.lead.types.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.settings.types.delete', + 'sort' => 3, + ], [ + 'key' => 'settings.automation', + 'name' => 'admin::app.acl.automation', + 'route' => ['admin.settings.attributes.index', 'admin.settings.email_templates.index', 'admin.settings.workflows.index'], + 'sort' => 3, + ], [ + 'key' => 'settings.automation.attributes', + 'name' => 'admin::app.acl.attributes', + 'route' => 'admin.settings.attributes.index', + 'sort' => 1, + ], [ + 'key' => 'settings.automation.attributes.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.settings.attributes.create', 'admin.settings.attributes.store'], + 'sort' => 1, + ], [ + 'key' => 'settings.automation.attributes.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.settings.attributes.edit', 'admin.settings.attributes.update', 'admin.settings.attributes.mass_update'], + 'sort' => 2, + ], [ + 'key' => 'settings.automation.attributes.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.settings.attributes.delete', + 'sort' => 3, + ], [ + 'key' => 'settings.automation.email_templates', + 'name' => 'admin::app.acl.email-templates', + 'route' => 'admin.settings.email_templates.index', + 'sort' => 7, + ], [ + 'key' => 'settings.automation.email_templates.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.settings.email_templates.create', 'admin.settings.email_templates.store'], + 'sort' => 1, + ], [ + 'key' => 'settings.automation.email_templates.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.settings.email_templates.edit', 'admin.settings.email_templates.update'], + 'sort' => 2, + ], [ + 'key' => 'settings.automation.email_templates.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.settings.email_templates.delete', + 'sort' => 3, + ], [ + 'key' => 'settings.automation.workflows', + 'name' => 'admin::app.acl.workflows', + 'route' => 'admin.settings.workflows.index', + 'sort' => 2, + ], [ + 'key' => 'settings.automation.workflows.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.settings.workflows.create', 'admin.settings.workflows.store'], + 'sort' => 1, + ], [ + 'key' => 'settings.automation.workflows.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.settings.workflows.edit', 'admin.settings.workflows.update'], + 'sort' => 2, + ], [ + 'key' => 'settings.automation.workflows.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.settings.workflows.delete', + 'sort' => 3, + ], [ + 'key' => 'settings.automation.events', + 'name' => 'admin::app.acl.event', + 'route' => 'admin.settings.marketing.events.index', + 'sort' => 2, + ], [ + 'key' => 'settings.automation.events.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.settings.marketing.events.create', 'admin.settings.marketing.events.store'], + 'sort' => 1, + ], [ + 'key' => 'settings.automation.events.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.settings.marketing.events.edit', 'admin.settings.marketing.events.update'], + 'sort' => 2, + ], [ + 'key' => 'settings.automation.events.delete', + 'name' => 'admin::app.acl.delete', + 'route' => ['admin.settings.marketing.events.delete', 'admin.settings.marketing.events.mass_delete'], + 'sort' => 3, + ], [ + 'key' => 'settings.automation.campaigns', + 'name' => 'admin::app.acl.campaigns', + 'route' => 'admin.settings.marketing.campaigns.index', + 'sort' => 2, + ], [ + 'key' => 'settings.automation.campaigns.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.settings.marketing.campaigns.create', 'admin.settings.marketing.campaigns.store'], + 'sort' => 1, + ], [ + 'key' => 'settings.automation.campaigns.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.settings.marketing.campaigns.edit', 'admin.settings.marketing.campaigns.update'], + 'sort' => 2, + ], [ + 'key' => 'settings.automation.campaigns.delete', + 'name' => 'admin::app.acl.delete', + 'route' => ['admin.settings.marketing.campaigns.delete', 'admin.settings.marketing.campaigns.mass_delete'], + 'sort' => 3, + ], [ + 'key' => 'settings.automation.webhooks', + 'name' => 'admin::app.acl.webhook', + 'route' => 'admin.settings.webhooks.index', + 'sort' => 1, + ], [ + 'key' => 'settings.automation.webhooks.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.settings.webhooks.create', 'admin.settings.webhooks.store'], + 'sort' => 1, + ], [ + 'key' => 'settings.automation.webhooks.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.settings.webhooks.edit', 'admin.settings.webhooks.update'], + 'sort' => 2, + ], [ + 'key' => 'settings.automation.webhooks.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.settings.webhooks.delete', + 'sort' => 3, + ], [ + 'key' => 'settings.other_settings', + 'name' => 'admin::app.acl.other-settings', + 'route' => 'admin.settings.tags.index', + 'sort' => 4, + ], [ + 'key' => 'settings.other_settings.tags', + 'name' => 'admin::app.acl.tags', + 'route' => 'admin.settings.tags.index', + 'sort' => 1, + ], [ + 'key' => 'settings.other_settings.tags.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.settings.tags.create', 'admin.settings.tags.store', 'admin.leads.tags.attach'], + 'sort' => 1, + ], [ + 'key' => 'settings.other_settings.tags.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.settings.tags.edit', 'admin.settings.tags.update'], + 'sort' => 1, + ], [ + 'key' => 'settings.other_settings.tags.delete', + 'name' => 'admin::app.acl.delete', + 'route' => ['admin.settings.tags.delete', 'admin.settings.tags.mass_delete', 'admin.leads.tags.detach'], + 'sort' => 2, + ], + [ + 'key' => 'settings.data_transfer', + 'name' => 'admin::app.acl.data-transfer', + 'route' => 'admin.settings.data_transfer.imports.index', + 'sort' => 10, + ], [ + 'key' => 'settings.data_transfer.imports', + 'name' => 'admin::app.acl.imports', + 'route' => 'admin.settings.data_transfer.imports.index', + 'sort' => 1, + ], [ + 'key' => 'settings.data_transfer.imports.create', + 'name' => 'admin::app.acl.create', + 'route' => 'admin.settings.data_transfer.imports.create', + 'sort' => 1, + ], [ + 'key' => 'settings.data_transfer.imports.edit', + 'name' => 'admin::app.acl.edit', + 'route' => 'admin.settings.data_transfer.imports.edit', + 'sort' => 2, + ], [ + 'key' => 'settings.data_transfer.imports.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.settings.data_transfer.imports.delete', + 'sort' => 3, + ], [ + 'key' => 'settings.data_transfer.imports.import', + 'name' => 'admin::app.acl.import', + 'route' => 'admin.settings.data_transfer.imports.imports', + 'sort' => 4, + ], + [ + 'key' => 'configuration', + 'name' => 'admin::app.acl.configuration', + 'route' => 'admin.configuration.index', + 'sort' => 9, + ], +]; diff --git a/packages/Webkul/Admin/src/Config/attribute_entity_types.php b/packages/Webkul/Admin/src/Config/attribute_entity_types.php new file mode 100644 index 0000000..a55b688 --- /dev/null +++ b/packages/Webkul/Admin/src/Config/attribute_entity_types.php @@ -0,0 +1,33 @@ + [ + 'name' => 'admin::app.leads.index.title', + 'repository' => 'Webkul\Lead\Repositories\LeadRepository', + ], + + 'persons' => [ + 'name' => 'admin::app.contacts.persons.index.title', + 'repository' => 'Webkul\Contact\Repositories\PersonRepository', + ], + + 'organizations' => [ + 'name' => 'admin::app.contacts.organizations.index.title', + 'repository' => 'Webkul\Contact\Repositories\OrganizationRepository', + ], + + 'products' => [ + 'name' => 'admin::app.products.index.title', + 'repository' => 'Webkul\Product\Repositories\ProductRepository', + ], + + 'quotes' => [ + 'name' => 'admin::app.quotes.index.title', + 'repository' => 'Webkul\Quote\Repositories\QuoteRepository', + ], + + 'warehouses' => [ + 'name' => 'admin::app.settings.warehouses.index.title', + 'repository' => 'Webkul\Warehouse\Repositories\WarehouseRepository', + ], +]; diff --git a/packages/Webkul/Admin/src/Config/attribute_lookups.php b/packages/Webkul/Admin/src/Config/attribute_lookups.php new file mode 100644 index 0000000..f1ba92d --- /dev/null +++ b/packages/Webkul/Admin/src/Config/attribute_lookups.php @@ -0,0 +1,54 @@ + [ + 'name' => 'Leads', + 'repository' => 'Webkul\Lead\Repositories\LeadRepository', + 'label_column' => 'title', + ], + + 'lead_sources' => [ + 'name' => 'Lead Sources', + 'repository' => 'Webkul\Lead\Repositories\SourceRepository', + ], + + 'lead_types' => [ + 'name' => 'Lead Types', + 'repository' => 'Webkul\Lead\Repositories\TypeRepository', + ], + + 'lead_pipelines' => [ + 'name' => 'Lead Pipelines', + 'repository' => 'Webkul\Lead\Repositories\PipelineRepository', + ], + + 'lead_pipeline_stages' => [ + 'name' => 'Lead Pipeline Stages', + 'repository' => 'Webkul\Lead\Repositories\StageRepository', + ], + + 'users' => [ + 'name' => 'Sales Owners', + 'repository' => 'Webkul\User\Repositories\UserRepository', + ], + + 'organizations' => [ + 'name' => 'Organizations', + 'repository' => 'Webkul\Contact\Repositories\OrganizationRepository', + ], + + 'persons' => [ + 'name' => 'Persons', + 'repository' => 'Webkul\Contact\Repositories\PersonRepository', + ], + + 'warehouses' => [ + 'name' => 'Warehouses', + 'repository' => 'Webkul\Warehouse\Repositories\WarehouseRepository', + ], + + 'locations' => [ + 'name' => 'Locations', + 'repository' => 'Webkul\Warehouse\Repositories\LocationRepository', + ], +]; diff --git a/packages/Webkul/Admin/src/Config/core_config.php b/packages/Webkul/Admin/src/Config/core_config.php new file mode 100644 index 0000000..9c843da --- /dev/null +++ b/packages/Webkul/Admin/src/Config/core_config.php @@ -0,0 +1,314 @@ + 'general', + 'name' => 'admin::app.configuration.index.general.title', + 'info' => 'admin::app.configuration.index.general.info', + 'sort' => 1, + ], [ + 'key' => 'general.general', + 'name' => 'admin::app.configuration.index.general.general.title', + 'info' => 'admin::app.configuration.index.general.general.info', + 'icon' => 'icon-setting', + 'sort' => 1, + ], [ + 'key' => 'general.general.locale_settings', + 'name' => 'admin::app.configuration.index.general.general.locale-settings.title', + 'info' => 'admin::app.configuration.index.general.general.locale-settings.title-info', + 'sort' => 1, + 'fields' => [ + [ + 'name' => 'locale', + 'title' => 'admin::app.configuration.index.general.general.locale-settings.title', + 'type' => 'select', + 'default' => 'en', + 'options' => 'Webkul\Core\Core@locales', + ], + ], + ], [ + 'key' => 'general.general.admin_logo', + 'name' => 'admin::app.configuration.index.general.general.admin-logo.title', + 'info' => 'admin::app.configuration.index.general.general.admin-logo.title-info', + 'sort' => 2, + 'fields' => [ + [ + 'name' => 'logo_image', + 'title' => 'admin::app.configuration.index.general.general.admin-logo.logo-image', + 'type' => 'image', + 'validation' => 'mimes:bmp,jpeg,jpg,png,webp,svg', + ], + ], + ], [ + 'key' => 'general.settings', + 'name' => 'admin::app.configuration.index.general.settings.title', + 'info' => 'admin::app.configuration.index.general.settings.info', + 'icon' => 'icon-configuration', + 'sort' => 2, + ], [ + 'key' => 'general.settings.footer', + 'name' => 'admin::app.configuration.index.general.settings.footer.title', + 'info' => 'admin::app.configuration.index.general.settings.footer.info', + 'sort' => 1, + 'fields' => [ + [ + 'name' => 'label', + 'title' => 'admin::app.configuration.index.general.settings.footer.powered-by', + 'type' => 'editor', + 'default' => 'Powered by Krayin, an open-source project by Webkul.', + 'tinymce' => true, + ], + ], + ], [ + 'key' => 'general.settings.menu', + 'name' => 'admin::app.configuration.index.general.settings.menu.title', + 'info' => 'admin::app.configuration.index.general.settings.menu.info', + 'sort' => 2, + 'fields' => [ + [ + 'name' => 'dashboard', + 'title' => 'admin::app.configuration.index.general.settings.menu.dashboard', + 'type' => 'text', + 'default' => 'Dashboard', + 'validation' => 'max:20', + ], [ + 'name' => 'leads', + 'title' => 'admin::app.configuration.index.general.settings.menu.leads', + 'type' => 'text', + 'default' => 'Leads', + 'validation' => 'max:20', + ], [ + 'name' => 'quotes', + 'title' => 'admin::app.configuration.index.general.settings.menu.quotes', + 'type' => 'text', + 'default' => 'Quotes', + 'validation' => 'max:20', + ], [ + 'name' => 'mail.mail', + 'title' => 'admin::app.configuration.index.general.settings.menu.mail', + 'type' => 'text', + 'default' => 'Mail', + 'validation' => 'max:20', + ], [ + 'name' => 'mail.inbox', + 'title' => 'admin::app.configuration.index.general.settings.menu.inbox', + 'type' => 'text', + 'default' => 'Inbox', + 'validation' => 'max:20', + ], [ + 'name' => 'mail.draft', + 'title' => 'admin::app.configuration.index.general.settings.menu.draft', + 'type' => 'text', + 'default' => 'Draft', + 'validation' => 'max:20', + ], [ + 'name' => 'mail.outbox', + 'title' => 'admin::app.configuration.index.general.settings.menu.outbox', + 'type' => 'text', + 'default' => 'Outbox', + 'validation' => 'max:20', + ], [ + 'name' => 'mail.sent', + 'title' => 'admin::app.configuration.index.general.settings.menu.sent', + 'type' => 'text', + 'default' => 'Sent', + 'validation' => 'max:20', + ], [ + 'name' => 'mail.trash', + 'title' => 'admin::app.configuration.index.general.settings.menu.trash', + 'type' => 'text', + 'default' => 'Trash', + 'validation' => 'max:20', + ], [ + 'name' => 'activities', + 'title' => 'admin::app.configuration.index.general.settings.menu.activities', + 'type' => 'text', + 'default' => 'Activities', + 'validation' => 'max:20', + ], [ + 'name' => 'contacts.contacts', + 'title' => 'admin::app.configuration.index.general.settings.menu.contacts', + 'type' => 'text', + 'default' => 'Contacts', + 'validation' => 'max:20', + ], [ + 'name' => 'contacts.persons', + 'title' => 'admin::app.configuration.index.general.settings.menu.persons', + 'type' => 'text', + 'default' => 'Persons', + 'validation' => 'max:20', + ], [ + 'name' => 'contacts.organizations', + 'title' => 'admin::app.configuration.index.general.settings.menu.organizations', + 'type' => 'text', + 'default' => 'Organizations', + 'validation' => 'max:20', + ], [ + 'name' => 'products', + 'title' => 'admin::app.configuration.index.general.settings.menu.products', + 'type' => 'text', + 'default' => 'Products', + 'validation' => 'max:20', + ], [ + 'name' => 'settings', + 'title' => 'admin::app.configuration.index.general.settings.menu.settings', + 'type' => 'text', + 'default' => 'Settings', + 'validation' => 'max:20', + ], [ + 'name' => 'configuration', + 'title' => 'admin::app.configuration.index.general.settings.menu.configuration', + 'type' => 'text', + 'default' => 'Configuration', + 'validation' => 'max:20', + ], + ], + ], [ + 'key' => 'general.settings.menu_color', + 'name' => 'admin::app.configuration.index.general.settings.menu-color.title', + 'info' => 'admin::app.configuration.index.general.settings.menu-color.info', + 'sort' => 3, + 'fields' => [ + [ + 'name' => 'brand_color', + 'title' => 'admin::app.configuration.index.general.settings.menu-color.brand-color', + 'type' => 'color', + 'default' => '#0E90D9', + ], + ], + ], [ + 'key' => 'general.magic_ai', + 'name' => 'admin::app.configuration.index.magic-ai.title', + 'info' => 'admin::app.configuration.index.magic-ai.info', + 'icon' => 'icon-setting', + 'sort' => 3, + ], [ + 'key' => 'general.magic_ai.settings', + 'name' => 'admin::app.configuration.index.magic-ai.settings.title', + 'info' => 'admin::app.configuration.index.magic-ai.settings.info', + 'sort' => 1, + 'fields' => [ + [ + 'name' => 'enable', + 'title' => 'admin::app.configuration.index.magic-ai.settings.enable', + 'type' => 'boolean', + 'channel_based' => true, + ], [ + 'name' => 'api_key', + 'title' => 'admin::app.configuration.index.magic-ai.settings.api-key', + 'type' => 'password', + 'depends' => 'enable:1', + 'validation' => 'required_if:enable,1', + 'info' => 'admin::app.configuration.index.magic-ai.settings.api-key-info', + ], [ + 'name' => 'model', + 'title' => 'admin::app.configuration.index.magic-ai.settings.models.title', + 'type' => 'select', + 'channel_based' => true, + 'depends' => 'enable:1', + 'options' => [ + [ + 'title' => 'admin::app.configuration.index.magic-ai.settings.models.gpt-4o', + 'value' => 'openai/chatgpt-4o-latest', + ], [ + 'title' => 'admin::app.configuration.index.magic-ai.settings.models.gpt-4o-mini', + 'value' => 'openai/gpt-4o-mini', + ], [ + 'title' => 'admin::app.configuration.index.magic-ai.settings.models.gemini-2-0-flash-001', + 'value' => 'google/gemini-2.0-flash-001', + ], [ + 'title' => 'admin::app.configuration.index.magic-ai.settings.models.deepseek-r1', + 'value' => 'deepseek/deepseek-r1-distill-llama-8b', + ], [ + 'title' => 'admin::app.configuration.index.magic-ai.settings.models.llama-3-2-3b-instruct', + 'value' => 'meta-llama/llama-3.2-3b-instruct', + ], [ + 'title' => 'admin::app.configuration.index.magic-ai.settings.models.grok-2-1212', + 'value' => 'x-ai/grok-2-1212', + ], + ], + ], [ + 'name' => 'other_model', + 'title' => 'admin::app.configuration.index.magic-ai.settings.other', + 'type' => 'text', + 'info' => 'admin::app.configuration.index.magic-ai.settings.other-model', + 'default' => null, + 'depends' => 'enable:1', + ], + ], + ], [ + 'key' => 'general.magic_ai.doc_generation', + 'name' => 'admin::app.configuration.index.magic-ai.settings.doc-generation', + 'info' => 'admin::app.configuration.index.magic-ai.settings.doc-generation-info', + 'sort' => 2, + 'fields' => [ + [ + 'name' => 'enabled', + 'title' => 'admin::app.configuration.index.magic-ai.settings.enable', + 'type' => 'boolean', + ], + ], + ], + + /** + * Email. + */ + [ + 'key' => 'email', + 'name' => 'admin::app.configuration.index.email.title', + 'info' => 'admin::app.configuration.index.email.info', + 'sort' => 2, + ], [ + 'key' => 'email.imap', + 'name' => 'admin::app.configuration.index.email.imap.title', + 'info' => 'admin::app.configuration.index.email.imap.info', + 'icon' => 'icon-setting', + 'sort' => 1, + ], [ + 'key' => 'email.imap.account', + 'name' => 'admin::app.configuration.index.email.imap.account.title', + 'info' => 'admin::app.configuration.index.email.imap.account.title-info', + 'sort' => 1, + 'fields' => [ + [ + 'name' => 'host', + 'title' => 'admin::app.configuration.index.email.imap.account.host', + 'type' => 'text', + 'default' => config('imap.accounts.default.host'), + ], + [ + 'name' => 'port', + 'title' => 'admin::app.configuration.index.email.imap.account.port', + 'type' => 'text', + 'default' => config('imap.accounts.default.port'), + ], + [ + 'name' => 'encryption', + 'title' => 'admin::app.configuration.index.email.imap.account.encryption', + 'type' => 'text', + 'default' => config('imap.accounts.default.encryption'), + ], + [ + 'name' => 'validate_cert', + 'title' => 'admin::app.configuration.index.email.imap.account.validate-cert', + 'type' => 'boolean', + 'default' => config('imap.accounts.default.validate_cert'), + ], + [ + 'name' => 'username', + 'title' => 'admin::app.configuration.index.email.imap.account.username', + 'type' => 'text', + 'default' => config('imap.accounts.default.username'), + ], + [ + 'name' => 'password', + 'title' => 'admin::app.configuration.index.email.imap.account.password', + 'type' => 'password', + 'default' => config('imap.accounts.default.password'), + ], + ], + ], +]; diff --git a/packages/Webkul/Admin/src/Config/menu.php b/packages/Webkul/Admin/src/Config/menu.php new file mode 100644 index 0000000..cab5a37 --- /dev/null +++ b/packages/Webkul/Admin/src/Config/menu.php @@ -0,0 +1,299 @@ + 'dashboard', + 'name' => 'admin::app.layouts.dashboard', + 'route' => 'admin.dashboard.index', + 'sort' => 1, + 'icon-class' => 'icon-dashboard', + ], + + /** + * Leads. + */ + [ + 'key' => 'leads', + 'name' => 'admin::app.layouts.leads', + 'route' => 'admin.leads.index', + 'sort' => 2, + 'icon-class' => 'icon-leads', + ], + + /** + * Quotes. + */ + [ + 'key' => 'quotes', + 'name' => 'admin::app.layouts.quotes', + 'route' => 'admin.quotes.index', + 'sort' => 3, + 'icon-class' => 'icon-quote', + ], + + /** + * Emails. + */ + [ + 'key' => 'mail', + 'name' => 'admin::app.layouts.mail.title', + 'route' => 'admin.mail.index', + 'params' => ['route' => 'inbox'], + 'sort' => 4, + 'icon-class' => 'icon-mail', + ], [ + 'key' => 'mail.inbox', + 'name' => 'admin::app.layouts.mail.inbox', + 'route' => 'admin.mail.index', + 'params' => ['route' => 'inbox'], + 'sort' => 2, + 'icon-class' => '', + ], [ + 'key' => 'mail.draft', + 'name' => 'admin::app.layouts.mail.draft', + 'route' => 'admin.mail.index', + 'params' => ['route' => 'draft'], + 'sort' => 3, + 'icon-class' => '', + ], [ + 'key' => 'mail.outbox', + 'name' => 'admin::app.layouts.mail.outbox', + 'route' => 'admin.mail.index', + 'params' => ['route' => 'outbox'], + 'sort' => 4, + 'icon-class' => '', + ], [ + 'key' => 'mail.sent', + 'name' => 'admin::app.layouts.mail.sent', + 'route' => 'admin.mail.index', + 'params' => ['route' => 'sent'], + 'sort' => 4, + 'icon-class' => '', + ], [ + 'key' => 'mail.trash', + 'name' => 'admin::app.layouts.mail.trash', + 'route' => 'admin.mail.index', + 'params' => ['route' => 'trash'], + 'sort' => 5, + 'icon-class' => '', + ], + // , [ + // 'key' => 'mail.setting', + // 'name' => 'admin::app.layouts.mail.setting', + // 'route' => 'admin.mail.index', + // 'params' => ['route' => 'setting'], + // 'sort' => 5, + // ] + + /** + * Activities. + */ + [ + 'key' => 'activities', + 'name' => 'admin::app.layouts.activities', + 'route' => 'admin.activities.index', + 'sort' => 5, + 'icon-class' => 'icon-activity', + ], + + /** + * Contacts. + */ + [ + 'key' => 'contacts', + 'name' => 'admin::app.layouts.contacts', + 'route' => 'admin.contacts.persons.index', + 'sort' => 6, + 'icon-class' => 'icon-contact', + ], [ + 'key' => 'contacts.persons', + 'name' => 'admin::app.layouts.persons', + 'route' => 'admin.contacts.persons.index', + 'sort' => 1, + 'icon-class' => '', + ], [ + 'key' => 'contacts.organizations', + 'name' => 'admin::app.layouts.organizations', + 'route' => 'admin.contacts.organizations.index', + 'sort' => 2, + 'icon-class' => '', + ], + + /** + * Products. + */ + [ + 'key' => 'products', + 'name' => 'admin::app.layouts.products', + 'route' => 'admin.products.index', + 'sort' => 7, + 'icon-class' => 'icon-product', + ], + + /** + * Settings. + */ + [ + 'key' => 'settings', + 'name' => 'admin::app.layouts.settings', + 'route' => 'admin.settings.index', + 'sort' => 8, + 'icon-class' => 'icon-setting', + ], [ + 'key' => 'settings.user', + 'name' => 'admin::app.layouts.user', + 'route' => 'admin.settings.groups.index', + 'info' => 'admin::app.layouts.user-info', + 'sort' => 1, + 'icon-class' => 'icon-settings-group', + ], [ + 'key' => 'settings.user.groups', + 'name' => 'admin::app.layouts.groups', + 'info' => 'admin::app.layouts.groups-info', + 'route' => 'admin.settings.groups.index', + 'sort' => 1, + 'icon-class' => 'icon-settings-group', + ], [ + 'key' => 'settings.user.roles', + 'name' => 'admin::app.layouts.roles', + 'info' => 'admin::app.layouts.roles-info', + 'route' => 'admin.settings.roles.index', + 'sort' => 2, + 'icon-class' => 'icon-role', + ], [ + 'key' => 'settings.user.users', + 'name' => 'admin::app.layouts.users', + 'info' => 'admin::app.layouts.users-info', + 'route' => 'admin.settings.users.index', + 'sort' => 3, + 'icon-class' => 'icon-user', + ], [ + 'key' => 'settings.lead', + 'name' => 'admin::app.layouts.lead', + 'info' => 'admin::app.layouts.lead-info', + 'route' => 'admin.settings.pipelines.index', + 'sort' => 2, + 'icon-class' => '', + ], [ + 'key' => 'settings.lead.pipelines', + 'name' => 'admin::app.layouts.pipelines', + 'info' => 'admin::app.layouts.pipelines-info', + 'route' => 'admin.settings.pipelines.index', + 'sort' => 1, + 'icon-class' => 'icon-settings-pipeline', + ], [ + 'key' => 'settings.lead.sources', + 'name' => 'admin::app.layouts.sources', + 'info' => 'admin::app.layouts.sources-info', + 'route' => 'admin.settings.sources.index', + 'sort' => 2, + 'icon-class' => 'icon-settings-sources', + ], [ + 'key' => 'settings.lead.types', + 'name' => 'admin::app.layouts.types', + 'info' => 'admin::app.layouts.types-info', + 'route' => 'admin.settings.types.index', + 'sort' => 3, + 'icon-class' => 'icon-settings-type', + ], [ + 'key' => 'settings.warehouse', + 'name' => 'admin::app.layouts.warehouse', + 'info' => 'admin::app.layouts.warehouses-info', + 'route' => 'admin.settings.pipelines.index', + 'icon-class' => '', + 'sort' => 2, + ], [ + 'key' => 'settings.warehouse.warehouses', + 'name' => 'admin::app.layouts.warehouses', + 'info' => 'admin::app.layouts.warehouses-info', + 'route' => 'admin.settings.warehouses.index', + 'sort' => 1, + 'icon-class' => 'icon-settings-warehouse', + ], [ + 'key' => 'settings.automation', + 'name' => 'admin::app.layouts.automation', + 'info' => 'admin::app.layouts.automation-info', + 'route' => 'admin.settings.attributes.index', + 'sort' => 3, + 'icon-class' => '', + ], [ + 'key' => 'settings.automation.attributes', + 'name' => 'admin::app.layouts.attributes', + 'info' => 'admin::app.layouts.attributes-info', + 'route' => 'admin.settings.attributes.index', + 'sort' => 1, + 'icon-class' => 'icon-attribute', + ], [ + 'key' => 'settings.automation.email_templates', + 'name' => 'admin::app.layouts.email-templates', + 'info' => 'admin::app.layouts.email-templates-info', + 'route' => 'admin.settings.email_templates.index', + 'sort' => 2, + 'icon-class' => 'icon-settings-mail', + ], [ + 'key' => 'settings.automation.events', + 'name' => 'admin::app.layouts.events', + 'info' => 'admin::app.layouts.events-info', + 'route' => 'admin.settings.marketing.events.index', + 'sort' => 2, + 'icon-class' => 'icon-calendar', + ], [ + 'key' => 'settings.automation.campaigns', + 'name' => 'admin::app.layouts.campaigns', + 'info' => 'admin::app.layouts.campaigns-info', + 'route' => 'admin.settings.marketing.campaigns.index', + 'sort' => 2, + 'icon-class' => 'icon-note', + ], [ + 'key' => 'settings.automation.webhooks', + 'name' => 'admin::app.layouts.webhooks', + 'info' => 'admin::app.layouts.webhooks-info', + 'route' => 'admin.settings.webhooks.index', + 'sort' => 2, + 'icon-class' => 'icon-settings-webhooks', + ], [ + 'key' => 'settings.automation.workflows', + 'name' => 'admin::app.layouts.workflows', + 'info' => 'admin::app.layouts.workflows-info', + 'route' => 'admin.settings.workflows.index', + 'sort' => 3, + 'icon-class' => 'icon-settings-flow', + ], + [ + 'key' => 'settings.automation.data_transfer', + 'name' => 'admin::app.layouts.data_transfer', + 'info' => 'admin::app.layouts.data_transfer_info', + 'route' => 'admin.settings.data_transfer.imports.index', + 'sort' => 4, + 'icon-class' => 'icon-download', + ], [ + 'key' => 'settings.other_settings', + 'name' => 'admin::app.layouts.other-settings', + 'info' => 'admin::app.layouts.other-settings-info', + 'route' => 'admin.settings.tags.index', + 'sort' => 4, + 'icon-class' => 'icon-settings', + ], [ + 'key' => 'settings.other_settings.tags', + 'name' => 'admin::app.layouts.tags', + 'info' => 'admin::app.layouts.tags-info', + 'route' => 'admin.settings.tags.index', + 'sort' => 1, + 'icon-class' => 'icon-settings-tag', + ], + + /** + * Configuration. + */ + [ + 'key' => 'configuration', + 'name' => 'admin::app.layouts.configuration', + 'route' => 'admin.configuration.index', + 'sort' => 9, + 'icon-class' => 'icon-configuration', + ], + +]; diff --git a/packages/Webkul/Admin/src/DataGrids/Activity/ActivityDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Activity/ActivityDataGrid.php new file mode 100644 index 0000000..d481825 --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Activity/ActivityDataGrid.php @@ -0,0 +1,235 @@ +distinct() + ->select( + 'activities.*', + 'leads.id as lead_id', + 'leads.title as lead_title', + 'leads.lead_pipeline_id', + 'users.id as created_by_id', + 'users.name as created_by', + ) + ->leftJoin('activity_participants', 'activities.id', '=', 'activity_participants.activity_id') + ->leftJoin('lead_activities', 'activities.id', '=', 'lead_activities.activity_id') + ->leftJoin('leads', 'lead_activities.lead_id', '=', 'leads.id') + ->leftJoin('users', 'activities.user_id', '=', 'users.id') + ->whereIn('type', ['call', 'meeting', 'lunch']) + ->where(function ($query) { + if ($userIds = bouncer()->getAuthorizedUserIds()) { + $query->whereIn('activities.user_id', $userIds) + ->orWhereIn('activity_participants.user_id', $userIds); + } + })->groupBy('activities.id', 'leads.id', 'users.id'); + + $this->addFilter('id', 'activities.id'); + $this->addFilter('title', 'activities.title'); + $this->addFilter('schedule_from', 'activities.schedule_from'); + $this->addFilter('created_by', 'users.name'); + $this->addFilter('created_by_id', 'users.name'); + $this->addFilter('created_at', 'activities.created_at'); + $this->addFilter('lead_title', 'leads.title'); + + return $queryBuilder; + } + + /** + * Prepare columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.activities.index.datagrid.id'), + 'type' => 'integer', + 'searchable' => true, + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'is_done', + 'label' => trans('admin::app.activities.index.datagrid.is_done'), + 'type' => 'string', + 'dropdown_options' => $this->getBooleanDropdownOptions('yes_no'), + 'searchable' => false, + 'closure' => fn ($row) => view('admin::activities.datagrid.is-done', compact('row'))->render(), + ]); + + $this->addColumn([ + 'index' => 'title', + 'label' => trans('admin::app.activities.index.datagrid.title'), + 'type' => 'string', + 'searchable' => true, + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'created_by_id', + 'label' => trans('admin::app.activities.index.datagrid.created_by'), + 'type' => 'string', + 'searchable' => false, + 'sortable' => true, + 'filterable' => true, + 'filterable_type' => 'searchable_dropdown', + 'filterable_options' => [ + 'repository' => UserRepository::class, + 'column' => [ + 'label' => 'name', + 'value' => 'name', + ], + ], + 'closure' => function ($row) { + $route = urldecode(route('admin.settings.users.index', ['id[eq]' => $row->created_by_id])); + + return "".$row->created_by.''; + }, + ]); + + $this->addColumn([ + 'index' => 'comment', + 'label' => trans('admin::app.activities.index.datagrid.comment'), + 'type' => 'string', + ]); + + $this->addColumn([ + 'index' => 'lead_title', + 'label' => trans('admin::app.activities.index.datagrid.lead'), + 'type' => 'string', + 'searchable' => true, + 'sortable' => true, + 'filterable' => true, + 'filterable_type' => 'searchable_dropdown', + 'filterable_options' => [ + 'repository' => LeadRepository::class, + 'column' => [ + 'label' => 'title', + 'value' => 'title', + ], + ], + 'closure' => function ($row) { + if ($row->lead_title == null) { + return "N/A"; + } + + $route = urldecode(route('admin.leads.view', $row->lead_id)); + + return "".$row->lead_title.''; + }, + ]); + + $this->addColumn([ + 'index' => 'type', + 'label' => trans('admin::app.activities.index.datagrid.type'), + 'type' => 'string', + 'searchable' => false, + 'filterable' => false, + 'sortable' => true, + 'closure' => fn ($row) => trans('admin::app.activities.index.datagrid.'.$row->type), + ]); + + $this->addColumn([ + 'index' => 'schedule_from', + 'label' => trans('admin::app.activities.index.datagrid.schedule_from'), + 'type' => 'date', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + 'closure' => fn ($row) => core()->formatDate($row->schedule_from), + ]); + + $this->addColumn([ + 'index' => 'schedule_to', + 'label' => trans('admin::app.activities.index.datagrid.schedule_to'), + 'type' => 'date', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + 'closure' => fn ($row) => core()->formatDate($row->schedule_to), + ]); + + $this->addColumn([ + 'index' => 'created_at', + 'label' => trans('admin::app.activities.index.datagrid.created_at'), + 'type' => 'date', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + 'closure' => fn ($row) => core()->formatDate($row->created_at), + ]); + } + + /** + * Prepare actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('activities.edit')) { + $this->addAction([ + 'index' => 'edit', + 'icon' => 'icon-edit', + 'title' => trans('admin::app.activities.index.datagrid.edit'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.activities.edit', $row->id), + ]); + } + + if (bouncer()->hasPermission('activities.delete')) { + $this->addAction([ + 'index' => 'delete', + 'icon' => 'icon-delete', + 'title' => trans('admin::app.activities.index.datagrid.update'), + 'method' => 'DELETE', + 'url' => fn ($row) => route('admin.activities.delete', $row->id), + ]); + } + } + + /** + * Prepare mass actions. + */ + public function prepareMassActions(): void + { + + $this->addMassAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.activities.index.datagrid.mass-delete'), + 'method' => 'POST', + 'url' => route('admin.activities.mass_delete'), + ]); + + $this->addMassAction([ + 'title' => trans('admin::app.activities.index.datagrid.mass-update'), + 'url' => route('admin.activities.mass_update'), + 'method' => 'POST', + 'options' => [ + [ + 'label' => trans('admin::app.activities.index.datagrid.done'), + 'value' => 1, + ], [ + 'label' => trans('admin::app.activities.index.datagrid.not-done'), + 'value' => 0, + ], + ], + ]); + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Contact/OrganizationDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Contact/OrganizationDataGrid.php new file mode 100644 index 0000000..240d71b --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Contact/OrganizationDataGrid.php @@ -0,0 +1,124 @@ +addSelect( + 'organizations.id', + 'organizations.name', + 'organizations.address', + 'organizations.created_at' + ); + + if ($userIds = bouncer()->getAuthorizedUserIds()) { + $queryBuilder->whereIn('organizations.user_id', $userIds); + } + + $this->addFilter('id', 'organizations.id'); + + $this->addFilter('organization', 'organizations.name'); + } + + /** + * Add columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.contacts.organizations.index.datagrid.id'), + 'type' => 'integer', + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'name', + 'label' => trans('admin::app.contacts.organizations.index.datagrid.name'), + 'type' => 'string', + 'sortable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'persons_count', + 'label' => trans('admin::app.contacts.organizations.index.datagrid.persons-count'), + 'type' => 'string', + 'searchable' => false, + 'sortable' => false, + 'filterable' => false, + 'closure' => function ($row) { + $personsCount = $this->personRepository->findWhere(['organization_id' => $row->id])->count(); + + return $personsCount; + }, + ]); + + $this->addColumn([ + 'index' => 'created_at', + 'label' => trans('admin::app.settings.tags.index.datagrid.created-at'), + 'type' => 'date', + 'searchable' => true, + 'filterable' => true, + 'filterable_type' => 'date_range', + 'sortable' => true, + 'closure' => fn ($row) => core()->formatDate($row->created_at), + ]); + } + + /** + * Prepare actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('contacts.organizations.edit')) { + $this->addAction([ + 'icon' => 'icon-edit', + 'title' => trans('admin::app.contacts.organizations.index.datagrid.edit'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.contacts.organizations.edit', $row->id), + ]); + } + + if (bouncer()->hasPermission('contacts.organizations.delete')) { + $this->addAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.contacts.organizations.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => fn ($row) => route('admin.contacts.organizations.delete', $row->id), + ]); + } + } + + /** + * Prepare mass actions. + */ + public function prepareMassActions(): void + { + $this->addMassAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.contacts.organizations.index.datagrid.delete'), + 'method' => 'PUT', + 'url' => route('admin.contacts.organizations.mass_delete'), + ]); + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Contact/PersonDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Contact/PersonDataGrid.php new file mode 100644 index 0000000..3ddf66c --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Contact/PersonDataGrid.php @@ -0,0 +1,160 @@ +addSelect( + 'persons.id', + 'persons.name as person_name', + 'persons.emails', + 'persons.contact_numbers', + 'organizations.name as organization', + 'organizations.id as organization_id' + ) + ->leftJoin('organizations', 'persons.organization_id', '=', 'organizations.id'); + + if ($userIds = bouncer()->getAuthorizedUserIds()) { + $queryBuilder->whereIn('persons.user_id', $userIds); + } + + $this->addFilter('id', 'persons.id'); + $this->addFilter('person_name', 'persons.name'); + $this->addFilter('organization', 'organizations.name'); + + return $queryBuilder; + } + + /** + * Add columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.contacts.persons.index.datagrid.id'), + 'type' => 'integer', + 'filterable' => true, + 'sortable' => true, + 'searchable' => true, + ]); + + $this->addColumn([ + 'index' => 'person_name', + 'label' => trans('admin::app.contacts.persons.index.datagrid.name'), + 'type' => 'string', + 'sortable' => true, + 'filterable' => true, + 'searchable' => true, + ]); + + $this->addColumn([ + 'index' => 'emails', + 'label' => trans('admin::app.contacts.persons.index.datagrid.emails'), + 'type' => 'string', + 'sortable' => false, + 'filterable' => true, + 'searchable' => true, + 'closure' => fn ($row) => collect(json_decode($row->emails, true) ?? [])->pluck('value')->join(', '), + ]); + + $this->addColumn([ + 'index' => 'contact_numbers', + 'label' => trans('admin::app.contacts.persons.index.datagrid.contact-numbers'), + 'type' => 'string', + 'sortable' => true, + 'filterable' => true, + 'searchable' => true, + 'closure' => fn ($row) => collect(json_decode($row->contact_numbers, true) ?? [])->pluck('value')->join(', '), + ]); + + $this->addColumn([ + 'index' => 'organization', + 'label' => trans('admin::app.contacts.persons.index.datagrid.organization-name'), + 'type' => 'string', + 'searchable' => true, + 'filterable' => true, + 'sortable' => true, + 'filterable_type' => 'searchable_dropdown', + 'filterable_options' => [ + 'repository' => OrganizationRepository::class, + 'column' => [ + 'label' => 'name', + 'value' => 'name', + ], + ], + ]); + } + + /** + * Prepare actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('contacts.persons.view')) { + $this->addAction([ + 'icon' => 'icon-eye', + 'title' => trans('admin::app.contacts.persons.index.datagrid.view'), + 'method' => 'GET', + 'url' => function ($row) { + return route('admin.contacts.persons.view', $row->id); + }, + ]); + } + + if (bouncer()->hasPermission('contacts.persons.edit')) { + $this->addAction([ + 'icon' => 'icon-edit', + 'title' => trans('admin::app.contacts.persons.index.datagrid.edit'), + 'method' => 'GET', + 'url' => function ($row) { + return route('admin.contacts.persons.edit', $row->id); + }, + ]); + } + + if (bouncer()->hasPermission('contacts.persons.delete')) { + $this->addAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.contacts.persons.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => function ($row) { + return route('admin.contacts.persons.delete', $row->id); + }, + ]); + } + } + + /** + * Prepare mass actions. + */ + public function prepareMassActions(): void + { + if (bouncer()->hasPermission('contacts.persons.delete')) { + $this->addMassAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.contacts.persons.index.datagrid.delete'), + 'method' => 'POST', + 'url' => route('admin.contacts.persons.mass_delete'), + ]); + } + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Lead/LeadDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Lead/LeadDataGrid.php new file mode 100644 index 0000000..21bccde --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Lead/LeadDataGrid.php @@ -0,0 +1,326 @@ +pipeline = $this->pipelineRepository->find(request('pipeline_id')); + } else { + $this->pipeline = $this->pipelineRepository->getDefaultPipeline(); + } + } + + /** + * Prepare query builder. + */ + public function prepareQueryBuilder(): Builder + { + $tablePrefix = DB::getTablePrefix(); + + $queryBuilder = DB::table('leads') + ->addSelect( + 'leads.id', + 'leads.title', + 'leads.status', + 'leads.lead_value', + 'leads.expected_close_date', + 'lead_sources.name as lead_source_name', + 'lead_types.name as lead_type_name', + 'leads.created_at', + 'lead_pipeline_stages.name as stage', + 'lead_tags.tag_id as tag_id', + 'users.id as user_id', + 'users.name as sales_person', + 'persons.id as person_id', + 'persons.name as person_name', + 'tags.name as tag_name', + 'lead_pipelines.rotten_days as pipeline_rotten_days', + 'lead_pipeline_stages.code as stage_code', + DB::raw('CASE WHEN DATEDIFF(NOW(),'.$tablePrefix.'leads.created_at) >='.$tablePrefix.'lead_pipelines.rotten_days THEN 1 ELSE 0 END as rotten_lead'), + ) + ->leftJoin('users', 'leads.user_id', '=', 'users.id') + ->leftJoin('persons', 'leads.person_id', '=', 'persons.id') + ->leftJoin('lead_types', 'leads.lead_type_id', '=', 'lead_types.id') + ->leftJoin('lead_pipeline_stages', 'leads.lead_pipeline_stage_id', '=', 'lead_pipeline_stages.id') + ->leftJoin('lead_sources', 'leads.lead_source_id', '=', 'lead_sources.id') + ->leftJoin('lead_pipelines', 'leads.lead_pipeline_id', '=', 'lead_pipelines.id') + ->leftJoin('lead_tags', 'leads.id', '=', 'lead_tags.lead_id') + ->leftJoin('tags', 'tags.id', '=', 'lead_tags.tag_id') + ->groupBy('leads.id') + ->where('leads.lead_pipeline_id', $this->pipeline->id); + + if ($userIds = bouncer()->getAuthorizedUserIds()) { + $queryBuilder->whereIn('leads.user_id', $userIds); + } + + if (! is_null(request()->input('rotten_lead.in'))) { + $queryBuilder->havingRaw($tablePrefix.'rotten_lead = '.request()->input('rotten_lead.in')); + } + + $this->addFilter('id', 'leads.id'); + $this->addFilter('user', 'leads.user_id'); + $this->addFilter('sales_person', 'users.name'); + $this->addFilter('lead_source_name', 'lead_sources.id'); + $this->addFilter('lead_type_name', 'lead_types.id'); + $this->addFilter('person_name', 'persons.name'); + $this->addFilter('type', 'lead_pipeline_stages.code'); + $this->addFilter('stage', 'lead_pipeline_stages.id'); + $this->addFilter('tag_name', 'tags.name'); + $this->addFilter('expected_close_date', 'leads.expected_close_date'); + $this->addFilter('created_at', 'leads.created_at'); + $this->addFilter('rotten_lead', DB::raw('DATEDIFF(NOW(), '.$tablePrefix.'leads.created_at) >= '.$tablePrefix.'lead_pipelines.rotten_days')); + + return $queryBuilder; + } + + /** + * Prepare columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.leads.index.datagrid.id'), + 'type' => 'integer', + 'sortable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'sales_person', + 'label' => trans('admin::app.leads.index.datagrid.sales-person'), + 'type' => 'string', + 'searchable' => false, + 'sortable' => true, + 'filterable' => true, + 'filterable_type' => 'searchable_dropdown', + 'filterable_options' => [ + 'repository' => UserRepository::class, + 'column' => [ + 'label' => 'name', + 'value' => 'name', + ], + ], + ]); + + $this->addColumn([ + 'index' => 'title', + 'label' => trans('admin::app.leads.index.datagrid.subject'), + 'type' => 'string', + 'searchable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'lead_source_name', + 'label' => trans('admin::app.leads.index.datagrid.source'), + 'type' => 'string', + 'searchable' => false, + 'sortable' => true, + 'filterable' => true, + 'filterable_type' => 'dropdown', + 'filterable_options' => $this->sourceRepository->all(['name as label', 'id as value'])->toArray(), + ]); + + $this->addColumn([ + 'index' => 'lead_value', + 'label' => trans('admin::app.leads.index.datagrid.lead-value'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => false, + 'filterable' => true, + 'closure' => fn ($row) => core()->formatBasePrice($row->lead_value, 2), + ]); + + $this->addColumn([ + 'index' => 'lead_type_name', + 'label' => trans('admin::app.leads.index.datagrid.lead-type'), + 'type' => 'string', + 'searchable' => false, + 'sortable' => true, + 'filterable' => true, + 'filterable_type' => 'dropdown', + 'filterable_options' => $this->typeRepository->all(['name as label', 'id as value'])->toArray(), + ]); + + $this->addColumn([ + 'index' => 'tag_name', + 'label' => trans('admin::app.leads.index.datagrid.tag-name'), + 'type' => 'string', + 'searchable' => false, + 'sortable' => true, + 'filterable' => true, + 'filterable_type' => 'searchable_dropdown', + 'closure' => fn ($row) => $row->tag_name ?? '--', + 'filterable_options' => [ + 'repository' => TagRepository::class, + 'column' => [ + 'label' => 'name', + 'value' => 'name', + ], + ], + ]); + + $this->addColumn([ + 'index' => 'person_name', + 'label' => trans('admin::app.leads.index.datagrid.contact-person'), + 'type' => 'string', + 'searchable' => false, + 'sortable' => true, + 'filterable' => true, + 'filterable_type' => 'searchable_dropdown', + 'filterable_options' => [ + 'repository' => \Webkul\Contact\Repositories\PersonRepository::class, + 'column' => [ + 'label' => 'name', + 'value' => 'name', + ], + ], + 'closure' => function ($row) { + $route = route('admin.contacts.persons.view', $row->person_id); + + return "".$row->person_name.''; + }, + ]); + + $this->addColumn([ + 'index' => 'stage', + 'label' => trans('admin::app.leads.index.datagrid.stage'), + 'type' => 'string', + 'searchable' => false, + 'sortable' => true, + 'filterable' => true, + 'filterable_type' => 'dropdown', + 'filterable_options' => $this->pipeline->stages->pluck('name', 'id') + ->map(function ($name, $id) { + return ['value' => $id, 'label' => $name]; + }) + ->values() + ->all(), + ]); + + $this->addColumn([ + 'index' => 'rotten_lead', + 'label' => trans('admin::app.leads.index.datagrid.rotten-lead'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => false, + 'closure' => function ($row) { + if (! $row->rotten_lead) { + return trans('admin::app.leads.index.datagrid.no'); + } + + if (in_array($row->stage_code, ['won', 'lost'])) { + return trans('admin::app.leads.index.datagrid.no'); + } + + return trans('admin::app.leads.index.datagrid.yes'); + }, + ]); + + $this->addColumn([ + 'index' => 'expected_close_date', + 'label' => trans('admin::app.leads.index.datagrid.date-to'), + 'type' => 'date', + 'searchable' => false, + 'sortable' => true, + 'filterable' => true, + 'filterable_type' => 'date_range', + 'closure' => function ($row) { + if (! $row->expected_close_date) { + return '--'; + } + + return $row->expected_close_date; + }, + ]); + + $this->addColumn([ + 'index' => 'created_at', + 'label' => trans('admin::app.leads.index.datagrid.created-at'), + 'type' => 'date', + 'searchable' => false, + 'sortable' => true, + 'filterable' => true, + 'filterable_type' => 'date_range', + ]); + } + + /** + * Prepare actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('leads.view')) { + $this->addAction([ + 'icon' => 'icon-eye', + 'title' => trans('admin::app.leads.index.datagrid.view'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.leads.view', $row->id), + ]); + } + + if (bouncer()->hasPermission('leads.delete')) { + $this->addAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.leads.index.datagrid.delete'), + 'method' => 'delete', + 'url' => fn ($row) => route('admin.leads.delete', $row->id), + ]); + } + } + + /** + * Prepare mass actions. + */ + public function prepareMassActions(): void + { + $this->addMassAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.leads.index.datagrid.mass-delete'), + 'method' => 'POST', + 'url' => route('admin.leads.mass_delete'), + ]); + + $this->addMassAction([ + 'title' => trans('admin::app.leads.index.datagrid.mass-update'), + 'url' => route('admin.leads.mass_update'), + 'method' => 'POST', + 'options' => $this->pipeline->stages->map(fn ($stage) => [ + 'label' => $stage->name, + 'value' => $stage->id, + ])->toArray(), + ]); + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Mail/EmailDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Mail/EmailDataGrid.php new file mode 100644 index 0000000..dd0ccf8 --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Mail/EmailDataGrid.php @@ -0,0 +1,212 @@ +select( + 'emails.id', + 'emails.name', + 'emails.from', + 'emails.subject', + 'emails.reply', + 'emails.is_read', + 'emails.created_at', + 'tags.name as tags', + DB::raw('COUNT(DISTINCT '.DB::getTablePrefix().'email_attachments.id) as attachments') + ) + ->leftJoin('email_attachments', 'emails.id', '=', 'email_attachments.email_id') + ->leftJoin('email_tags', 'emails.id', '=', 'email_tags.email_id') + ->leftJoin('tags', 'tags.id', '=', 'email_tags.tag_id') + ->groupBy('emails.id') + ->where('folders', 'like', '%"'.request('route').'"%') + ->whereNull('parent_id'); + + $this->addFilter('id', 'emails.id'); + $this->addFilter('name', 'emails.name'); + $this->addFilter('tags', 'tags.name'); + $this->addFilter('created_at', 'emails.created_at'); + + return $queryBuilder; + } + + /** + * Prepare Columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'attachments', + 'label' => trans('admin::app.mail.index.datagrid.attachments'), + 'type' => 'string', + 'searchable' => false, + 'filterable' => false, + 'sortable' => false, + 'closure' => fn ($row) => $row->attachments ? '' : '', + ]); + + $this->addColumn([ + 'index' => 'name', + 'label' => trans('admin::app.mail.index.datagrid.from'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + 'closure' => function ($row) { + return $row->name + ? trim($row->name, '"') + : trim($row->from, '"'); + }, + ]); + + $this->addColumn([ + 'index' => 'subject', + 'label' => trans('admin::app.mail.index.datagrid.subject'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'reply', + 'label' => trans('admin::app.mail.index.datagrid.content'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'tags', + 'label' => trans('admin::app.mail.index.datagrid.tags'), + 'type' => 'string', + 'searchable' => false, + 'sortable' => true, + 'filterable' => true, + 'filterable_type' => 'searchable_dropdown', + 'closure' => function ($row) { + if ($email = app(EmailRepository::class)->find($row->id)) { + return $email->tags; + } + + return '--'; + }, + 'filterable_options' => [ + 'repository' => TagRepository::class, + 'column' => [ + 'label' => 'name', + 'value' => 'name', + ], + ], + ]); + + $this->addColumn([ + 'index' => 'created_at', + 'label' => trans('admin::app.mail.index.datagrid.date'), + 'type' => 'date', + 'searchable' => true, + 'filterable' => true, + 'filterable_type' => 'date_range', + 'sortable' => true, + 'closure' => function ($row) { + return Carbon::parse($row->created_at)->isToday() + ? Carbon::parse($row->created_at)->format('h:i A') + : Carbon::parse($row->created_at)->format('M d'); + }, + ]); + } + + /** + * Prepare actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('mail.view')) { + $this->addAction([ + 'index' => 'edit', + 'icon' => request('route') == 'draft' + ? 'icon-edit' + : 'icon-eye', + 'title' => request('route') == 'draft' + ? trans('admin::app.mail.index.datagrid.edit') + : trans('admin::app.mail.index.datagrid.view'), + 'method' => 'GET', + 'params' => [ + 'type' => request('route') == 'trash' + ? 'delete' + : 'trash', + ], + 'url' => fn ($row) => route('admin.mail.view', [request('route'), $row->id]), + ]); + } + + if (bouncer()->hasPermission('mail.delete')) { + $this->addAction([ + 'index' => 'delete', + 'icon' => 'icon-delete', + 'title' => trans('admin::app.mail.index.datagrid.delete'), + 'method' => 'DELETE', + 'params' => [ + 'type' => request('route') == 'trash' + ? 'delete' + : 'trash', + ], + 'url' => fn ($row) => route('admin.mail.delete', $row->id), + ]); + } + } + + /** + * Prepare mass actions. + */ + public function prepareMassActions(): void + { + if (request('route') == 'trash') { + $this->addMassAction([ + 'title' => trans('admin::app.mail.index.datagrid.move-to-inbox'), + 'method' => 'POST', + 'url' => route('admin.mail.mass_update', ['folders' => ['inbox']]), + 'options' => [ + [ + 'value' => 'trash', + 'label' => trans('admin::app.mail.index.datagrid.move-to-inbox'), + ], + ], + ]); + } + + $this->addMassAction([ + 'icon' => 'icon-delete', + 'title' => request('route') == 'trash' + ? trans('admin::app.mail.index.datagrid.delete') + : trans('admin::app.mail.index.datagrid.move-to-trash'), + 'method' => 'POST', + 'url' => route('admin.mail.mass_delete', [ + 'type' => request('route') == 'trash' + ? 'delete' + : 'trash', + ]), + ]); + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Product/ProductDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Product/ProductDataGrid.php new file mode 100644 index 0000000..1044535 --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Product/ProductDataGrid.php @@ -0,0 +1,169 @@ +leftJoin('product_inventories', 'products.id', '=', 'product_inventories.product_id') + ->leftJoin('product_tags', 'products.id', '=', 'product_tags.product_id') + ->leftJoin('tags', 'tags.id', '=', 'product_tags.tag_id') + ->select( + 'products.id', + 'products.sku', + 'products.name', + 'products.price', + 'tags.name as tag_name', + ) + ->addSelect(DB::raw('SUM('.$tablePrefix.'product_inventories.in_stock) as total_in_stock')) + ->addSelect(DB::raw('SUM('.$tablePrefix.'product_inventories.allocated) as total_allocated')) + ->addSelect(DB::raw('SUM('.$tablePrefix.'product_inventories.in_stock - '.$tablePrefix.'product_inventories.allocated) as total_on_hand')) + ->groupBy('products.id'); + + if (request()->route('id')) { + $queryBuilder->where('product_inventories.warehouse_id', request()->route('id')); + } + + $this->addFilter('id', 'products.id'); + $this->addFilter('total_in_stock', DB::raw('SUM('.$tablePrefix.'product_inventories.in_stock')); + $this->addFilter('total_allocated', DB::raw('SUM('.$tablePrefix.'product_inventories.allocated')); + $this->addFilter('total_on_hand', DB::raw('SUM('.$tablePrefix.'product_inventories.in_stock - '.$tablePrefix.'product_inventories.allocated')); + $this->addFilter('tag_name', 'tags.name'); + + return $queryBuilder; + } + + /** + * Add columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'sku', + 'label' => trans('admin::app.products.index.datagrid.sku'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'name', + 'label' => trans('admin::app.products.index.datagrid.name'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'price', + 'label' => trans('admin::app.products.index.datagrid.price'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + 'closure' => fn ($row) => round($row->price, 2), + ]); + + $this->addColumn([ + 'index' => 'total_in_stock', + 'label' => trans('admin::app.products.index.datagrid.in-stock'), + 'type' => 'string', + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'total_allocated', + 'label' => trans('admin::app.products.index.datagrid.allocated'), + 'type' => 'string', + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'total_on_hand', + 'label' => trans('admin::app.products.index.datagrid.on-hand'), + 'type' => 'string', + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'tag_name', + 'label' => trans('admin::app.products.index.datagrid.tag-name'), + 'type' => 'string', + 'searchable' => false, + 'sortable' => true, + 'filterable' => true, + 'filterable_type' => 'searchable_dropdown', + 'closure' => fn ($row) => $row->tag_name ?? '--', + 'filterable_options' => [ + 'repository' => TagRepository::class, + 'column' => [ + 'label' => 'name', + 'value' => 'name', + ], + ], + ]); + } + + /** + * Prepare actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('products.view')) { + $this->addAction([ + 'index' => 'view', + 'icon' => 'icon-eye', + 'title' => trans('admin::app.products.index.datagrid.view'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.products.view', $row->id), + ]); + } + + if (bouncer()->hasPermission('products.edit')) { + $this->addAction([ + 'index' => 'edit', + 'icon' => 'icon-edit', + 'title' => trans('admin::app.products.index.datagrid.edit'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.products.edit', $row->id), + ]); + } + + if (bouncer()->hasPermission('products.delete')) { + $this->addAction([ + 'index' => 'delete', + 'icon' => 'icon-delete', + 'title' => trans('admin::app.products.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => fn ($row) => route('admin.products.delete', $row->id), + ]); + } + } + + /** + * Prepare mass actions. + */ + public function prepareMassActions(): void + { + $this->addMassAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.products.index.datagrid.delete'), + 'method' => 'POST', + 'url' => route('admin.products.mass_delete'), + ]); + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Quote/QuoteDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Quote/QuoteDataGrid.php new file mode 100644 index 0000000..914db49 --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Quote/QuoteDataGrid.php @@ -0,0 +1,229 @@ +addSelect( + 'quotes.id', + 'quotes.subject', + 'quotes.expired_at', + 'quotes.sub_total', + 'quotes.discount_amount', + 'quotes.tax_amount', + 'quotes.adjustment_amount', + 'quotes.grand_total', + 'quotes.created_at', + 'users.id as user_id', + 'users.name as sales_person', + 'persons.id as person_id', + 'persons.name as person_name', + 'quotes.expired_at as expired_quotes' + ) + ->leftJoin('users', 'quotes.user_id', '=', 'users.id') + ->leftJoin('persons', 'quotes.person_id', '=', 'persons.id'); + + if ($userIds = bouncer()->getAuthorizedUserIds()) { + $queryBuilder->whereIn('quotes.user_id', $userIds); + } + + $this->addFilter('id', 'quotes.id'); + $this->addFilter('user', 'quotes.user_id'); + $this->addFilter('sales_person', 'users.name'); + $this->addFilter('person_name', 'persons.name'); + $this->addFilter('expired_at', 'quotes.expired_at'); + $this->addFilter('created_at', 'quotes.created_at'); + + if (request()->input('expired_quotes.in') == 1) { + $this->addFilter('expired_quotes', DB::raw('DATEDIFF(NOW(), '.$tablePrefix.'quotes.expired_at) >= '.$tablePrefix.'NOW()')); + } else { + $this->addFilter('expired_quotes', DB::raw('DATEDIFF(NOW(), '.$tablePrefix.'quotes.expired_at) < '.$tablePrefix.'NOW()')); + } + + return $queryBuilder; + } + + /** + * Prepare columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'subject', + 'label' => trans('admin::app.quotes.index.datagrid.subject'), + 'type' => 'string', + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'sales_person', + 'label' => trans('admin::app.quotes.index.datagrid.sales-person'), + 'type' => 'string', + 'sortable' => true, + 'filterable' => true, + 'filterable_type' => 'searchable_dropdown', + 'filterable_options' => [ + 'repository' => \Webkul\User\Repositories\UserRepository::class, + 'column' => [ + 'label' => 'name', + 'value' => 'name', + ], + ], + ]); + + $this->addColumn([ + 'index' => 'person_name', + 'label' => trans('admin::app.quotes.index.datagrid.person'), + 'type' => 'string', + 'sortable' => true, + 'filterable' => true, + 'filterable_type' => 'searchable_dropdown', + 'filterable_options' => [ + 'repository' => \Webkul\Contact\Repositories\PersonRepository::class, + 'column' => [ + 'label' => 'name', + 'value' => 'name', + ], + ], + 'closure' => function ($row) { + $route = route('admin.contacts.persons.view', $row->person_id); + + return "".$row->person_name.''; + }, + ]); + + $this->addColumn([ + 'index' => 'sub_total', + 'label' => trans('admin::app.quotes.index.datagrid.subtotal'), + 'type' => 'string', + 'sortable' => true, + 'filterable' => true, + 'closure' => fn ($row) => core()->formatBasePrice($row->sub_total, 2), + ]); + + $this->addColumn([ + 'index' => 'discount_amount', + 'label' => trans('admin::app.quotes.index.datagrid.discount'), + 'type' => 'string', + 'sortable' => true, + 'filterable' => true, + 'closure' => fn ($row) => core()->formatBasePrice($row->discount_amount, 2), + ]); + + $this->addColumn([ + 'index' => 'tax_amount', + 'label' => trans('admin::app.quotes.index.datagrid.tax'), + 'type' => 'string', + 'filterable' => true, + 'sortable' => true, + 'closure' => fn ($row) => core()->formatBasePrice($row->tax_amount, 2), + ]); + + $this->addColumn([ + 'index' => 'adjustment_amount', + 'label' => trans('admin::app.quotes.index.datagrid.adjustment'), + 'type' => 'string', + 'sortable' => true, + 'filterable' => false, + 'closure' => fn ($row) => core()->formatBasePrice($row->adjustment_amount, 2), + ]); + + $this->addColumn([ + 'index' => 'grand_total', + 'label' => trans('admin::app.quotes.index.datagrid.grand-total'), + 'type' => 'string', + 'sortable' => true, + 'filterable' => true, + 'closure' => fn ($row) => core()->formatBasePrice($row->grand_total, 2), + ]); + + $this->addColumn([ + 'index' => 'expired_at', + 'label' => trans('admin::app.quotes.index.datagrid.expired-at'), + 'type' => 'date', + 'searchable' => false, + 'sortable' => true, + 'filterable' => true, + 'closure' => fn ($row) => core()->formatDate($row->expired_at, 'd M Y'), + ]); + + $this->addColumn([ + 'index' => 'created_at', + 'label' => trans('admin::app.quotes.index.datagrid.created-at'), + 'type' => 'date', + 'searchable' => false, + 'sortable' => true, + 'filterable' => true, + 'closure' => fn ($row) => core()->formatDate($row->created_at), + ]); + } + + /** + * Prepare actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('quotes.edit')) { + $this->addAction([ + 'index' => 'edit', + 'icon' => 'icon-edit', + 'title' => trans('admin::app.quotes.index.datagrid.edit'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.quotes.edit', $row->id), + ]); + } + + if (bouncer()->hasPermission('quotes.print')) { + $this->addAction([ + 'index' => 'print', + 'icon' => 'icon-print', + 'title' => trans('admin::app.quotes.index.datagrid.print'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.quotes.print', $row->id), + ]); + } + + if (bouncer()->hasPermission('quotes.delete')) { + $this->addAction([ + 'index' => 'delete', + 'icon' => 'icon-delete', + 'title' => trans('admin::app.quotes.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => fn ($row) => route('admin.quotes.delete', $row->id), + ]); + } + } + + /** + * Prepare mass actions. + */ + public function prepareMassActions(): void + { + $this->addMassAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.quotes.index.datagrid.delete'), + 'method' => 'POST', + 'url' => route('admin.quotes.mass_delete'), + ]); + + $this->addMassAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.quotes.index.datagrid.delete'), + 'method' => 'POST', + 'url' => route('admin.quotes.mass_delete'), + ]); + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Settings/AttributeDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Settings/AttributeDataGrid.php new file mode 100644 index 0000000..bbbeeb9 --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Settings/AttributeDataGrid.php @@ -0,0 +1,153 @@ +select( + 'attributes.id', + 'attributes.code', + 'attributes.name', + 'attributes.type', + 'attributes.entity_type', + 'attributes.is_user_defined as attribute_type' + ) + ->where('entity_type', '<>', 'locations'); + + $this->addFilter('id', 'attributes.id'); + $this->addFilter('type', 'attributes.type'); + $this->addFilter('attribute_type', 'attributes.is_user_defined'); + + return $queryBuilder; + } + + /** + * Prepare columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.settings.attributes.index.datagrid.id'), + 'type' => 'string', + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'code', + 'label' => trans('admin::app.settings.attributes.index.datagrid.code'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'name', + 'label' => trans('admin::app.settings.attributes.index.datagrid.name'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'entity_type', + 'label' => trans('admin::app.settings.attributes.index.datagrid.entity-type'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => false, + 'filterable' => true, + 'filterable_type' => 'dropdown', + 'filterable_options' => app(AttributeRepository::class) + ->select('entity_type as label', 'entity_type as value') + ->distinct() + ->get() + ->map(function ($item) { + $item->label = trans('admin::app.settings.attributes.index.datagrid.entity-types.'.$item->label); + + return $item; + }) + ->toArray(), + 'closure' => fn ($row) => ucfirst($row->entity_type), + ]); + + $this->addColumn([ + 'index' => 'type', + 'label' => trans('admin::app.settings.attributes.index.datagrid.type'), + 'type' => 'string', + 'sortable' => true, + 'filterable' => true, + 'filterable_type' => 'dropdown', + 'filterable_options' => app(AttributeRepository::class) + ->select('type as label', 'type as value') + ->distinct() + ->get() + ->map(function ($item) { + $item->label = trans('admin::app.settings.attributes.index.datagrid.types.'.$item->label); + + return $item; + }) + ->toArray(), + ]); + + $this->addColumn([ + 'index' => 'attribute_type', + 'label' => trans('admin::app.settings.attributes.index.datagrid.is-default'), + 'type' => 'boolean', + 'searchable' => true, + 'filterable' => false, + 'sortable' => true, + 'closure' => fn ($value) => trans('admin::app.settings.attributes.index.datagrid.'.($value->attribute_type ? 'no' : 'yes')), + ]); + } + + /** + * Prepare actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('settings.automation.attributes.edit')) { + $this->addAction([ + 'icon' => 'icon-edit', + 'title' => trans('admin::app.settings.attributes.index.datagrid.edit'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.settings.attributes.edit', $row->id), + ]); + } + + if (bouncer()->hasPermission('settings.automation.attributes.delete')) { + $this->addAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.attributes.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => fn ($row) => route('admin.settings.attributes.delete', $row->id), + ]); + } + } + + /** + * Prepare mass actions. + */ + public function prepareMassActions(): void + { + $this->addMassAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.attributes.index.datagrid.delete'), + 'method' => 'POST', + 'url' => route('admin.settings.attributes.mass_delete'), + ]); + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Settings/DataTransfer/ImportDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Settings/DataTransfer/ImportDataGrid.php new file mode 100644 index 0000000..f2539d3 --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Settings/DataTransfer/ImportDataGrid.php @@ -0,0 +1,161 @@ +select( + 'id', + 'state', + 'file_path', + 'error_file_path', + 'started_at', + 'completed_at', + 'type', + 'summary', + ); + } + + /** + * Prepare Columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.settings.data-transfer.imports.index.datagrid.id'), + 'type' => 'integer', + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'type', + 'label' => trans('admin::app.settings.data-transfer.imports.index.datagrid.type'), + 'type' => 'string', + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'state', + 'label' => trans('admin::app.settings.data-transfer.imports.index.datagrid.state'), + 'type' => 'string', + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'file_path', + 'label' => trans('admin::app.settings.data-transfer.imports.index.datagrid.uploaded-file'), + 'type' => 'string', + 'closure' => function ($row) { + return ''.$row->file_path.''; + }, + ]); + + $this->addColumn([ + 'index' => 'error_file_path', + 'label' => trans('admin::app.settings.data-transfer.imports.index.datagrid.error-file'), + 'type' => 'string', + 'closure' => function ($row) { + if (empty($row->error_file_path)) { + return ''; + } + + return ''.$row->error_file_path.''; + }, + ]); + + $this->addColumn([ + 'index' => 'started_at', + 'label' => trans('admin::app.settings.data-transfer.imports.index.datagrid.started-at'), + 'type' => 'date', + 'filterable' => true, + 'filterable_type' => 'date_range', + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'completed_at', + 'label' => trans('admin::app.settings.data-transfer.imports.index.datagrid.completed-at'), + 'type' => 'date', + 'filterable' => true, + 'filterable_type' => 'date_range', + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'summary', + 'label' => trans('admin::app.settings.data-transfer.imports.index.datagrid.summary'), + 'type' => 'string', + 'closure' => function ($row) { + if (empty($row->summary)) { + return ''; + } + + $summary = json_decode($row->summary, true); + + $stats = []; + + foreach ($summary as $type => $value) { + $stats[] = trans('admin::app.settings.data-transfer.imports.index.datagrid.'.$type).': '.$summary[$type]; + } + + return implode(', ', $stats); + }, + ]); + } + + /** + * Prepare actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('settings.data_transfer.imports.import')) { + $this->addAction([ + 'index' => 'import', + 'icon' => 'icon-import', + 'title' => trans('admin::app.settings.data-transfer.imports.index.datagrid.import'), + 'method' => 'GET', + 'url' => function ($row) { + return route('admin.settings.data_transfer.imports.import', $row->id); + }, + ]); + } + + if (bouncer()->hasPermission('settings.data_transfer.imports.edit')) { + $this->addAction([ + 'index' => 'edit', + 'icon' => 'icon-edit', + 'title' => trans('admin::app.settings.data-transfer.imports.index.datagrid.edit'), + 'method' => 'GET', + 'url' => function ($row) { + return route('admin.settings.data_transfer.imports.edit', $row->id); + }, + ]); + } + + if (bouncer()->hasPermission('settings.data_transfer.imports.delete')) { + $this->addAction([ + 'index' => 'delete', + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.data-transfer.imports.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => function ($row) { + return route('admin.settings.data_transfer.imports.delete', $row->id); + }, + ]); + } + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Settings/EmailTemplateDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Settings/EmailTemplateDataGrid.php new file mode 100644 index 0000000..eaa3cd2 --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Settings/EmailTemplateDataGrid.php @@ -0,0 +1,87 @@ +addSelect( + 'email_templates.id', + 'email_templates.name', + 'email_templates.subject', + ); + + $this->addFilter('id', 'email_templates.id'); + + return $queryBuilder; + } + + /** + * Add columns. + * + * @return void + */ + public function prepareColumns() + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.settings.email-template.index.datagrid.id'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'name', + 'label' => trans('admin::app.settings.email-template.index.datagrid.name'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'subject', + 'label' => trans('admin::app.settings.email-template.index.datagrid.subject'), + 'type' => 'string', + 'sortable' => true, + ]); + } + + /** + * Prepare actions. + * + * @return void + */ + public function prepareActions() + { + if (bouncer()->hasPermission('settings.automation.email_templates.edit')) { + $this->addAction([ + 'index' => 'delete', + 'icon' => 'icon-edit', + 'title' => trans('admin::app.settings.email-template.index.datagrid.edit'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.settings.email_templates.edit', $row->id), + ]); + } + + if (bouncer()->hasPermission('settings.automation.email_templates.delete')) { + $this->addAction([ + 'index' => 'delete', + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.email-template.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => fn ($row) => route('admin.settings.email_templates.delete', $row->id), + ]); + } + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Settings/GroupDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Settings/GroupDataGrid.php new file mode 100644 index 0000000..0d6e266 --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Settings/GroupDataGrid.php @@ -0,0 +1,84 @@ +addSelect( + 'groups.id', + 'groups.name', + 'groups.description' + ); + + $this->addFilter('id', 'groups.id'); + + return $queryBuilder; + } + + /** + * Prepare columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.settings.groups.index.datagrid.id'), + 'type' => 'string', + 'searchable' => true, + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'name', + 'type' => 'string', + 'label' => trans('admin::app.settings.groups.index.datagrid.name'), + 'searchable' => true, + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'description', + 'label' => trans('admin::app.settings.groups.index.datagrid.description'), + 'type' => 'string', + 'sortable' => false, + ]); + } + + /** + * Prepare actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('settings.user.groups.edit')) { + $this->addAction([ + 'index' => 'edit', + 'icon' => 'icon-edit', + 'title' => trans('admin::app.settings.groups.index.datagrid.edit'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.settings.groups.edit', $row->id), + ]); + } + + if (bouncer()->hasPermission('settings.user.groups.delete')) { + $this->addAction([ + 'index' => 'delete', + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.groups.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => fn ($row) => route('admin.settings.groups.delete', $row->id), + ]); + } + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Settings/Marketing/CampaignDatagrid.php b/packages/Webkul/Admin/src/DataGrids/Settings/Marketing/CampaignDatagrid.php new file mode 100644 index 0000000..9f77f01 --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Settings/Marketing/CampaignDatagrid.php @@ -0,0 +1,110 @@ +addSelect( + 'marketing_campaigns.id', + 'marketing_campaigns.name', + 'marketing_campaigns.subject', + 'marketing_campaigns.status', + ); + + $this->addFilter('id', 'marketing_campaigns.id'); + + return $queryBuilder; + } + + /** + * Add columns. + * + * @return void + */ + public function prepareColumns() + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.settings.marketing.campaigns.index.datagrid.id'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'name', + 'label' => trans('admin::app.settings.marketing.campaigns.index.datagrid.name'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'subject', + 'label' => trans('admin::app.settings.marketing.campaigns.index.datagrid.subject'), + 'type' => 'string', + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'status', + 'label' => trans('admin::app.settings.marketing.campaigns.index.datagrid.status'), + 'type' => 'string', + 'sortable' => true, + ]); + } + + /** + * Prepare actions. + * + * @return void + */ + public function prepareActions() + { + if (bouncer()->hasPermission('settings.automation.campaigns.edit')) { + $this->addAction([ + 'index' => 'edit', + 'icon' => 'icon-edit', + 'title' => trans('admin::app.settings.marketing.campaigns.index.datagrid.edit'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.settings.marketing.campaigns.edit', $row->id), + ]); + } + + if (bouncer()->hasPermission('settings.automation.campaigns.delete')) { + $this->addAction([ + 'index' => 'delete', + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.marketing.campaigns.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => fn ($row) => route('admin.settings.marketing.campaigns.delete', $row->id), + ]); + } + } + + /** + * Prepare mass actions. + */ + public function prepareMassActions(): void + { + if (bouncer()->hasPermission('settings.automation.campaigns.mass_delete')) { + $this->addMassAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.marketing.campaigns.index.datagrid.delete'), + 'method' => 'POST', + 'url' => route('admin.settings.marketing.campaigns.mass_delete'), + ]); + } + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Settings/Marketing/EventDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Settings/Marketing/EventDataGrid.php new file mode 100644 index 0000000..446d041 --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Settings/Marketing/EventDataGrid.php @@ -0,0 +1,110 @@ +addSelect( + 'marketing_events.id', + 'marketing_events.name', + 'marketing_events.description', + 'marketing_events.date', + ); + + $this->addFilter('id', 'marketing_events.id'); + + return $queryBuilder; + } + + /** + * Add columns. + * + * @return void + */ + public function prepareColumns() + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.settings.marketing.events.index.datagrid.id'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'name', + 'label' => trans('admin::app.settings.marketing.events.index.datagrid.name'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'description', + 'label' => trans('admin::app.settings.marketing.events.index.datagrid.description'), + 'type' => 'string', + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'date', + 'label' => trans('admin::app.settings.marketing.events.index.datagrid.date'), + 'type' => 'string', + 'sortable' => true, + ]); + } + + /** + * Prepare actions. + * + * @return void + */ + public function prepareActions() + { + if (bouncer()->hasPermission('settings.automation.events.edit')) { + $this->addAction([ + 'index' => 'edit', + 'icon' => 'icon-edit', + 'title' => trans('admin::app.settings.marketing.events.index.datagrid.edit'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.settings.marketing.events.edit', $row->id), + ]); + } + + if (bouncer()->hasPermission('settings.automation.events.delete')) { + $this->addAction([ + 'index' => 'delete', + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.marketing.events.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => fn ($row) => route('admin.settings.marketing.events.delete', $row->id), + ]); + } + } + + /** + * Prepare mass actions. + */ + public function prepareMassActions(): void + { + if (bouncer()->hasPermission('settings.automation.events.delete')) { + $this->addMassAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.marketing.events.index.datagrid.delete'), + 'method' => 'POST', + 'url' => route('admin.settings.marketing.events.mass_delete'), + ]); + } + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Settings/PipelineDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Settings/PipelineDataGrid.php new file mode 100644 index 0000000..9dc68af --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Settings/PipelineDataGrid.php @@ -0,0 +1,93 @@ +addSelect( + 'lead_pipelines.id', + 'lead_pipelines.name', + 'lead_pipelines.rotten_days', + 'lead_pipelines.is_default', + ); + + $this->addFilter('id', 'lead_pipelines.id'); + + return $queryBuilder; + } + + /** + * Prepare columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.settings.pipelines.index.datagrid.id'), + 'type' => 'string', + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'name', + 'label' => trans('admin::app.settings.pipelines.index.datagrid.name'), + 'type' => 'string', + 'searchable' => true, + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'rotten_days', + 'label' => trans('admin::app.settings.pipelines.index.datagrid.rotten-days'), + 'type' => 'string', + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'is_default', + 'label' => trans('admin::app.settings.pipelines.index.datagrid.is-default'), + 'type' => 'boolean', + 'searchable' => true, + 'filterable' => true, + 'sortable' => true, + 'closure' => fn ($value) => trans('admin::app.settings.pipelines.index.datagrid.'.($value->is_default ? 'yes' : 'no')), + ]); + } + + /** + * Prepare actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('settings.lead.pipelines.edit')) { + $this->addAction([ + 'index' => 'edit', + 'icon' => 'icon-edit', + 'title' => trans('admin::app.settings.pipelines.index.datagrid.edit'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.settings.pipelines.edit', $row->id), + ]); + } + + if (bouncer()->hasPermission('settings.lead.pipelines.delete')) { + $this->addAction([ + 'index' => 'delete', + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.pipelines.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => fn ($row) => route('admin.settings.pipelines.delete', $row->id), + ]); + } + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Settings/RoleDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Settings/RoleDataGrid.php new file mode 100644 index 0000000..557c709 --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Settings/RoleDataGrid.php @@ -0,0 +1,102 @@ +addSelect( + 'roles.id', + 'roles.name', + 'roles.description', + 'roles.permission_type' + ); + + $this->addFilter('id', 'roles.id'); + $this->addFilter('name', 'roles.name'); + + return $queryBuilder; + } + + /** + * Prepare Columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.settings.roles.index.datagrid.id'), + 'type' => 'string', + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'name', + 'label' => trans('admin::app.settings.roles.index.datagrid.name'), + 'type' => 'string', + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'description', + 'label' => trans('admin::app.settings.roles.index.datagrid.description'), + 'type' => 'string', + 'sortable' => false, + ]); + + $this->addColumn([ + 'index' => 'permission_type', + 'label' => trans('admin::app.settings.roles.index.datagrid.permission-type'), + 'type' => 'string', + 'searchable' => true, + 'filterable' => true, + 'filterable_type' => 'dropdown', + 'filterable_options' => [ + [ + 'label' => trans('admin::app.settings.roles.index.datagrid.custom'), + 'value' => 'custom', + ], + [ + 'label' => trans('admin::app.settings.roles.index.datagrid.all'), + 'value' => 'all', + ], + ], + 'sortable' => true, + ]); + } + + /** + * Prepare actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('settings.user.roles.edit')) { + $this->addAction([ + 'icon' => 'icon-edit', + 'title' => trans('admin::app.settings.roles.index.datagrid.edit'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.settings.roles.edit', $row->id), + ]); + } + + if (bouncer()->hasPermission('settings.user.roles.delete')) { + $this->addAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.roles.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => fn ($row) => route('admin.settings.roles.delete', $row->id), + ]); + } + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Settings/SourceDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Settings/SourceDataGrid.php new file mode 100644 index 0000000..9a8af03 --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Settings/SourceDataGrid.php @@ -0,0 +1,74 @@ +addSelect( + 'lead_sources.id', + 'lead_sources.name' + ); + + $this->addFilter('id', 'lead_sources.id'); + + return $queryBuilder; + } + + /** + * Prepare Columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.settings.sources.index.datagrid.id'), + 'type' => 'string', + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'name', + 'label' => trans('admin::app.settings.sources.index.datagrid.name'), + 'type' => 'string', + 'searchable' => true, + 'filterable' => true, + 'sortable' => true, + ]); + } + + /** + * Prepare actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('settings.lead.sources.edit')) { + $this->addAction([ + 'index' => 'edit', + 'icon' => 'icon-edit', + 'title' => trans('admin::app.settings.sources.index.datagrid.edit'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.settings.sources.edit', $row->id), + ]); + } + + if (bouncer()->hasPermission('settings.lead.sources.delete')) { + $this->addAction([ + 'index' => 'delete', + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.sources.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => fn ($row) => route('admin.settings.sources.delete', $row->id), + ]); + } + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Settings/TagDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Settings/TagDataGrid.php new file mode 100644 index 0000000..f41a88d --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Settings/TagDataGrid.php @@ -0,0 +1,124 @@ +addSelect( + 'tags.id', + 'tags.name', + 'tags.color', + 'tags.created_at', + 'users.name as user_name', + ) + ->leftJoin('users', 'tags.user_id', '=', 'users.id'); + + if ($userIds = bouncer()->getAuthorizedUserIds()) { + $queryBuilder->whereIn('tags.user_id', $userIds); + } + + $this->addFilter('id', 'tags.id'); + $this->addFilter('name', 'tags.name'); + $this->addFilter('created_at', 'tags.created_at'); + $this->addFilter('user_name', 'users.id'); + + return $queryBuilder; + } + + /** + * Prepare Columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.settings.tags.index.datagrid.id'), + 'type' => 'string', + 'searchable' => true, + 'sortable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'name', + 'label' => trans('admin::app.settings.tags.index.datagrid.name'), + 'type' => 'string', + 'searchable' => true, + 'sortable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'user_name', + 'label' => trans('admin::app.settings.tags.index.datagrid.users'), + 'type' => 'string', + 'searchable' => true, + 'sortable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'created_at', + 'label' => trans('admin::app.settings.tags.index.datagrid.created-at'), + 'type' => 'date', + 'searchable' => true, + 'filterable' => true, + 'sortable' => true, + 'filterable_type' => 'date_range', + 'closure' => fn ($row) => core()->formatDate($row->created_at), + ]); + } + + /** + * Prepare actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('settings.other_settings.tags.edit')) { + $this->addAction([ + 'index' => 'edit', + 'icon' => 'icon-edit', + 'title' => trans('admin::app.settings.tags.index.datagrid.edit'), + 'method' => 'GET', + 'url' => function ($row) { + return route('admin.settings.tags.edit', $row->id); + }, + ]); + } + + if (bouncer()->hasPermission('settings.other_settings.tags.delete')) { + $this->addAction([ + 'index' => 'delete', + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.tags.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => function ($row) { + return route('admin.settings.tags.delete', $row->id); + }, + ]); + } + } + + /** + * Prepare mass actions. + */ + public function prepareMassActions(): void + { + $this->addMassAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.tags.index.datagrid.delete'), + 'method' => 'POST', + 'url' => route('admin.settings.tags.mass_delete'), + ]); + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Settings/TypeDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Settings/TypeDataGrid.php new file mode 100644 index 0000000..42b08ac --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Settings/TypeDataGrid.php @@ -0,0 +1,74 @@ +addSelect( + 'lead_types.id', + 'lead_types.name' + ); + + $this->addFilter('id', 'lead_types.id'); + + return $queryBuilder; + } + + /** + * Prepare Columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.settings.types.index.datagrid.id'), + 'type' => 'string', + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'name', + 'label' => trans('admin::app.settings.types.index.datagrid.name'), + 'type' => 'string', + 'filterable' => true, + 'sortable' => true, + ]); + } + + /** + * Prepare Actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('settings.lead.types.edit')) { + $this->addAction([ + 'index' => 'edit', + 'icon' => 'icon-edit', + 'title' => trans('admin::app.settings.roles.index.datagrid.edit'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.settings.types.update', $row->id), + ]); + } + + if (bouncer()->hasPermission('settings.lead.types.delete')) { + $this->addAction([ + 'index' => 'delete', + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.roles.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => fn ($row) => route('admin.settings.types.delete', $row->id), + ]); + } + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Settings/UserDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Settings/UserDataGrid.php new file mode 100644 index 0000000..41e71a6 --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Settings/UserDataGrid.php @@ -0,0 +1,146 @@ +distinct() + ->addSelect( + 'id', + 'name', + 'email', + 'image', + 'status', + 'created_at' + ) + ->leftJoin('user_groups', 'id', '=', 'user_groups.user_id'); + + if ($userIds = bouncer()->getAuthorizedUserIds()) { + $queryBuilder->whereIn('id', $userIds); + } + + return $queryBuilder; + } + + /** + * Add columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.settings.users.index.datagrid.id'), + 'type' => 'string', + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'name', + 'label' => trans('admin::app.settings.users.index.datagrid.name'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + 'closure' => function ($row) { + return [ + 'image' => $row->image ? Storage::url($row->image) : null, + 'name' => $row->name, + ]; + }, + ]); + + $this->addColumn([ + 'index' => 'email', + 'label' => trans('admin::app.settings.users.index.datagrid.email'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'status', + 'label' => trans('admin::app.settings.users.index.datagrid.status'), + 'type' => 'boolean', + 'filterable' => true, + 'sortable' => true, + 'searchable' => true, + ]); + + $this->addColumn([ + 'index' => 'created_at', + 'label' => trans('admin::app.settings.users.index.datagrid.created-at'), + 'type' => 'date', + 'sortable' => true, + 'searchable' => true, + 'filterable_type' => 'date_range', + 'filterable' => true, + ]); + } + + /** + * Prepare actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('settings.user.users.edit')) { + $this->addAction([ + 'index' => 'edit', + 'icon' => 'icon-edit', + 'title' => trans('admin::app.settings.users.index.datagrid.edit'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.settings.users.edit', $row->id), + ]); + } + + if (bouncer()->hasPermission('settings.user.users.delete')) { + $this->addAction([ + 'index' => 'delete', + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.users.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => fn ($row) => route('admin.settings.users.delete', $row->id), + ]); + } + } + + /** + * Prepare mass actions. + */ + public function prepareMassActions(): void + { + $this->addMassAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.users.index.datagrid.delete'), + 'method' => 'POST', + 'url' => route('admin.settings.users.mass_delete'), + ]); + + $this->addMassAction([ + 'title' => trans('admin::app.settings.users.index.datagrid.update-status'), + 'method' => 'POST', + 'url' => route('admin.settings.users.mass_update'), + 'options' => [ + [ + 'label' => trans('admin::app.settings.users.index.datagrid.active'), + 'value' => 1, + ], + [ + 'label' => trans('admin::app.settings.users.index.datagrid.inactive'), + 'value' => 0, + ], + ], + ]); + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Settings/WarehouseDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Settings/WarehouseDataGrid.php new file mode 100644 index 0000000..64b78d4 --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Settings/WarehouseDataGrid.php @@ -0,0 +1,153 @@ +leftJoin('product_inventories', 'warehouses.id', '=', 'product_inventories.warehouse_id') + ->select( + 'warehouses.id', + 'warehouses.name', + 'warehouses.contact_name', + 'warehouses.contact_emails', + 'warehouses.contact_numbers', + 'warehouses.created_at', + ) + ->addSelect(DB::raw('count(DISTINCT '.DB::getTablePrefix().'product_inventories.product_id) as products')) + ->groupBy('warehouses.id'); + + $this->addFilter('id', 'warehouses.id'); + $this->addFilter('created_at', 'warehouses.created_at'); + + return $queryBuilder; + } + + /** + * Add columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.settings.warehouses.index.datagrid.id'), + 'type' => 'string', + 'sortable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'name', + 'label' => trans('admin::app.settings.warehouses.index.datagrid.name'), + 'type' => 'string', + 'sortable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'contact_name', + 'label' => trans('admin::app.settings.warehouses.index.datagrid.contact-name'), + 'type' => 'string', + 'searchable' => true, + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'contact_emails', + 'label' => trans('admin::app.settings.warehouses.index.datagrid.contact-emails'), + 'type' => 'string', + 'searchable' => true, + 'filterable' => true, + 'sortable' => true, + 'closure' => function ($row) { + $emails = json_decode($row->contact_emails, true); + + if ($emails) { + return collect($emails)->pluck('value')->join(', '); + } + }, + ]); + + $this->addColumn([ + 'index' => 'contact_numbers', + 'label' => trans('admin::app.settings.warehouses.index.datagrid.contact-numbers'), + 'type' => 'string', + 'sortable' => false, + 'closure' => function ($row) { + $numbers = json_decode($row->contact_numbers, true); + + if ($numbers) { + return collect($numbers)->pluck('value')->join(', '); + } + }, + ]); + + $this->addColumn([ + 'index' => 'products', + 'label' => trans('admin::app.settings.warehouses.index.datagrid.products'), + 'type' => 'string', + 'sortable' => true, + 'filterable' => false, + ]); + + $this->addColumn([ + 'index' => 'created_at', + 'label' => trans('admin::app.settings.warehouses.index.datagrid.created-at'), + 'type' => 'date', + 'searchable' => true, + 'filterable' => true, + 'filterable_type' => 'date_range', + 'sortable' => true, + 'closure' => function ($row) { + return core()->formatDate($row->created_at); + }, + ]); + } + + /** + * Prepare actions. + * + * @return void + */ + public function prepareActions() + { + $this->addAction([ + 'icon' => 'icon-eye', + 'title' => trans('admin::app.settings.warehouses.index.datagrid.view'), + 'method' => 'GET', + 'url' => function ($row) { + return route('admin.settings.warehouses.view', $row->id); + }, + ]); + + $this->addAction([ + 'icon' => 'icon-edit', + 'title' => trans('admin::app.settings.warehouses.index.datagrid.edit'), + 'method' => 'GET', + 'url' => function ($row) { + return route('admin.settings.warehouses.edit', $row->id); + }, + ]); + + $this->addAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.warehouses.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => function ($row) { + return route('admin.settings.warehouses.delete', $row->id); + }, + ]); + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Settings/WebhookDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Settings/WebhookDataGrid.php new file mode 100644 index 0000000..233f640 --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Settings/WebhookDataGrid.php @@ -0,0 +1,96 @@ +addSelect( + 'webhooks.id', + 'webhooks.name', + 'webhooks.entity_type', + 'webhooks.end_point', + ); + + $this->addFilter('id', 'webhooks.id'); + + return $queryBuilder; + } + + /** + * Prepare Columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.settings.webhooks.index.datagrid.id'), + 'type' => 'string', + 'searchable' => true, + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'name', + 'label' => trans('admin::app.settings.webhooks.index.datagrid.name'), + 'type' => 'string', + 'searchable' => true, + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'entity_type', + 'label' => trans('admin::app.settings.webhooks.index.datagrid.entity-type'), + 'type' => 'string', + 'searchable' => true, + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'end_point', + 'label' => trans('admin::app.settings.webhooks.index.datagrid.end-point'), + 'type' => 'string', + 'searchable' => true, + 'filterable' => true, + 'sortable' => true, + ]); + } + + /** + * Prepare actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('settings.automation.webhooks.edit')) { + $this->addAction([ + 'index' => 'edit', + 'icon' => 'icon-edit', + 'title' => trans('admin::app.settings.webhooks.index.datagrid.edit'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.settings.webhooks.edit', $row->id), + ]); + } + + if (bouncer()->hasPermission('settings.automation.webhooks.delete')) { + $this->addAction([ + 'index' => 'delete', + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.webhooks.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => fn ($row) => route('admin.settings.webhooks.delete', $row->id), + ]); + } + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Settings/WorkflowDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Settings/WorkflowDataGrid.php new file mode 100644 index 0000000..d6ceac5 --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Settings/WorkflowDataGrid.php @@ -0,0 +1,76 @@ +addSelect( + 'workflows.id', + 'workflows.name' + ); + + $this->addFilter('id', 'workflows.id'); + + return $queryBuilder; + } + + /** + * Prepare Columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.settings.workflows.index.datagrid.id'), + 'type' => 'string', + 'searchable' => true, + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'name', + 'label' => trans('admin::app.settings.workflows.index.datagrid.name'), + 'type' => 'string', + 'searchable' => true, + 'filterable' => true, + 'sortable' => true, + ]); + } + + /** + * Prepare actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('settings.automation.workflows.edit')) { + $this->addAction([ + 'index' => 'edit', + 'icon' => 'icon-edit', + 'title' => trans('admin::app.settings.workflows.index.datagrid.edit'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.settings.workflows.edit', $row->id), + ]); + } + + if (bouncer()->hasPermission('settings.automation.workflows.delete')) { + $this->addAction([ + 'index' => 'delete', + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.workflows.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => fn ($row) => route('admin.settings.workflows.delete', $row->id), + ]); + } + } +} diff --git a/packages/Webkul/Admin/src/Database/Migrations/2021_06_07_162808_add_lead_view_permission_column_in_users_table.php b/packages/Webkul/Admin/src/Database/Migrations/2021_06_07_162808_add_lead_view_permission_column_in_users_table.php new file mode 100644 index 0000000..71875c4 --- /dev/null +++ b/packages/Webkul/Admin/src/Database/Migrations/2021_06_07_162808_add_lead_view_permission_column_in_users_table.php @@ -0,0 +1,32 @@ +string('view_permission')->after('status')->default('global')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('view_permission'); + }); + } +}; diff --git a/packages/Webkul/Admin/src/Database/Migrations/2021_10_02_170105_insert_expected_closed_date_column_in_attributes_table.php b/packages/Webkul/Admin/src/Database/Migrations/2021_10_02_170105_insert_expected_closed_date_column_in_attributes_table.php new file mode 100644 index 0000000..061d1f7 --- /dev/null +++ b/packages/Webkul/Admin/src/Database/Migrations/2021_10_02_170105_insert_expected_closed_date_column_in_attributes_table.php @@ -0,0 +1,42 @@ +insert([ + [ + 'id' => '7', + 'code' => 'expected_close_date', + 'name' => 'Expected Close Date', + 'type' => 'date', + 'entity_type' => 'leads', + 'lookup_type' => null, + 'validation' => null, + 'sort_order' => '8', + 'is_required' => '0', + 'is_unique' => '0', + 'quick_add' => '1', + 'is_user_defined' => '0', + 'created_at' => Carbon::now(), + 'updated_at' => Carbon::now(), + ], + ]); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() {} +}; diff --git a/packages/Webkul/Admin/src/Exceptions/Handler.php b/packages/Webkul/Admin/src/Exceptions/Handler.php new file mode 100755 index 0000000..be4dc59 --- /dev/null +++ b/packages/Webkul/Admin/src/Exceptions/Handler.php @@ -0,0 +1,117 @@ +jsonErrorMessages = [ + '404' => trans('admin::app.common.resource-not-found'), + '403' => trans('admin::app.common.forbidden-error'), + '401' => trans('admin::app.common.unauthenticated'), + '500' => trans('admin::app.common.internal-server-error'), + ]; + } + + /** + * Render an exception into an HTTP response. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function render($request, Throwable $exception) + { + if (! config('app.debug')) { + return $this->renderCustomResponse($exception); + } + + return parent::render($request, $exception); + } + + /** + * Convert an authentication exception into a response. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + protected function unauthenticated($request, AuthenticationException $exception) + { + if ($request->expectsJson()) { + return response()->json(['message' => $this->jsonErrorMessages[401]], 401); + } + + return redirect()->guest(route('customer.session.index')); + } + + /** + * Render custom HTTP response. + * + * @return \Illuminate\Http\Response|null + */ + private function renderCustomResponse(Throwable $exception) + { + if ($exception instanceof HttpException) { + $statusCode = in_array($exception->getStatusCode(), [401, 403, 404, 503]) + ? $exception->getStatusCode() + : 500; + + return $this->response($statusCode); + } + + if ($exception instanceof ValidationException) { + return parent::render(request(), $exception); + } + + if ($exception instanceof ModelNotFoundException) { + return $this->response(404); + } elseif ($exception instanceof PDOException || $exception instanceof \ParseError) { + return $this->response(500); + } else { + return $this->response(500); + } + } + + /** + * Return custom response. + * + * @param string $path + * @param string $errorCode + * @return mixed + */ + private function response($errorCode) + { + if (request()->expectsJson()) { + return response()->json([ + 'message' => isset($this->jsonErrorMessages[$errorCode]) + ? $this->jsonErrorMessages[$errorCode] + : trans('admin::app.common.something-went-wrong'), + ], $errorCode); + } + + return response()->view('admin::errors.index', compact('errorCode')); + } +} diff --git a/packages/Webkul/Admin/src/Facades/Bouncer.php b/packages/Webkul/Admin/src/Facades/Bouncer.php new file mode 100755 index 0000000..b62fed9 --- /dev/null +++ b/packages/Webkul/Admin/src/Facades/Bouncer.php @@ -0,0 +1,18 @@ + $this->leadReporting->getTotalWonLeadValueProgress(), + 'total_lost_revenue' => $this->leadReporting->getTotalLostLeadValueProgress(), + ]; + } + + /** + * Returns the overall statistics. + */ + public function getOverAllStats(): array + { + return [ + 'total_leads' => $this->leadReporting->getTotalLeadsProgress(), + 'average_lead_value' => $this->leadReporting->getAverageLeadValueProgress(), + 'average_leads_per_day' => $this->leadReporting->getAverageLeadsPerDayProgress(), + 'total_quotations' => $this->quoteReporting->getTotalQuotesProgress(), + 'total_persons' => $this->personReporting->getTotalPersonsProgress(), + 'total_organizations' => $this->organizationReporting->getTotalOrganizationsProgress(), + ]; + } + + /** + * Returns leads statistics. + */ + public function getTotalLeadsStats(): array + { + return [ + 'all' => [ + 'over_time' => $this->leadReporting->getTotalLeadsOverTime(), + ], + + 'won' => [ + 'over_time' => $this->leadReporting->getTotalWonLeadsOverTime(), + ], + 'lost' => [ + 'over_time' => $this->leadReporting->getTotalLostLeadsOverTime(), + ], + ]; + } + + /** + * Returns leads revenue statistics by sources. + */ + public function getLeadsStatsBySources(): mixed + { + return $this->leadReporting->getTotalWonLeadValueBySources(); + } + + /** + * Returns leads revenue statistics by types. + */ + public function getLeadsStatsByTypes(): mixed + { + return $this->leadReporting->getTotalWonLeadValueByTypes(); + } + + /** + * Returns open leads statistics by states. + */ + public function getOpenLeadsByStates(): mixed + { + return $this->leadReporting->getOpenLeadsByStates(); + } + + /** + * Returns top selling products statistics. + */ + public function getTopSellingProducts(): Collection + { + return $this->productReporting->getTopSellingProductsByRevenue(5); + } + + /** + * Returns top selling products statistics. + */ + public function getTopPersons(): Collection + { + return $this->personReporting->getTopCustomersByRevenue(5); + } + + /** + * Get the start date. + * + * @return \Carbon\Carbon + */ + public function getStartDate(): Carbon + { + return $this->leadReporting->getStartDate(); + } + + /** + * Get the end date. + * + * @return \Carbon\Carbon + */ + public function getEndDate(): Carbon + { + return $this->leadReporting->getEndDate(); + } + + /** + * Returns date range + */ + public function getDateRange(): string + { + return $this->getStartDate()->format('d M').' - '.$this->getEndDate()->format('d M'); + } +} diff --git a/packages/Webkul/Admin/src/Helpers/Reporting/AbstractReporting.php b/packages/Webkul/Admin/src/Helpers/Reporting/AbstractReporting.php new file mode 100644 index 0000000..56fd1bd --- /dev/null +++ b/packages/Webkul/Admin/src/Helpers/Reporting/AbstractReporting.php @@ -0,0 +1,343 @@ +setStartDate(request()->date('start')); + + $this->setEndDate(request()->date('end')); + } + + /** + * Set the start date or default to 30 days ago if not provided. + * + * @param \Carbon\Carbon|null $startDate + * @return void + */ + public function setStartDate(?Carbon $startDate = null): self + { + $this->startDate = $startDate ? $startDate->startOfDay() : now()->subDays(30)->startOfDay(); + + $this->setLastStartDate(); + + return $this; + } + + /** + * Sets the end date to the provided date's end of day, or to the current + * date if not provided or if the provided date is in the future. + * + * @param \Carbon\Carbon|null $endDate + * @return void + */ + public function setEndDate(?Carbon $endDate = null): self + { + $this->endDate = ($endDate && $endDate->endOfDay() <= now()) ? $endDate->endOfDay() : now(); + + $this->setLastEndDate(); + + return $this; + } + + /** + * Get the start date. + * + * @return \Carbon\Carbon + */ + public function getStartDate(): Carbon + { + return $this->startDate; + } + + /** + * Get the end date. + * + * @return \Carbon\Carbon + */ + public function getEndDate(): Carbon + { + return $this->endDate; + } + + /** + * Sets the start date for the last period. + */ + private function setLastStartDate(): void + { + if (! isset($this->startDate)) { + $this->setStartDate(request()->date('start')); + } + + if (! isset($this->endDate)) { + $this->setEndDate(request()->date('end')); + } + + $this->lastStartDate = $this->startDate->clone()->subDays($this->startDate->diffInDays($this->endDate)); + } + + /** + * Sets the end date for the last period. + */ + private function setLastEndDate(): void + { + $this->lastEndDate = $this->startDate->clone(); + } + + /** + * Get the last start date. + * + * @return \Carbon\Carbon + */ + public function getLastStartDate(): Carbon + { + return $this->lastStartDate; + } + + /** + * Get the last end date. + * + * @return \Carbon\Carbon + */ + public function getLastEndDate(): Carbon + { + return $this->lastEndDate; + } + + /** + * Calculate the percentage change between previous and current values. + * + * @param float|int $previous + * @param float|int $current + */ + public function getPercentageChange($previous, $current): float|int + { + if (! $previous) { + return $current ? 100 : 0; + } + + return ($current - $previous) / $previous * 100; + } + + /** + * Returns time intervals. + * + * @param \Carbon\Carbon $startDate + * @param \Carbon\Carbon $endDate + * @param string $period + * @return array + */ + public function getTimeInterval($startDate, $endDate, $dateColumn, $period) + { + if ($period == 'auto') { + $totalMonths = $startDate->diffInMonths($endDate) + 1; + + /** + * If the difference between the start and end date is more than 5 months + */ + $intervals = $this->getMonthsInterval($startDate, $endDate); + + if (! empty($intervals)) { + return [ + 'group_column' => "MONTH($dateColumn)", + 'intervals' => $intervals, + ]; + } + + /** + * If the difference between the start and end date is more than 6 weeks + */ + $intervals = $this->getWeeksInterval($startDate, $endDate); + + if (! empty($intervals)) { + return [ + 'group_column' => "WEEK($dateColumn)", + 'intervals' => $intervals, + ]; + } + + /** + * If the difference between the start and end date is less than 6 weeks + */ + return [ + 'group_column' => "DAYOFYEAR($dateColumn)", + 'intervals' => $this->getDaysInterval($startDate, $endDate), + ]; + } else { + $datePeriod = CarbonPeriod::create($this->startDate, "1 $period", $this->endDate); + + if ($period == 'year') { + $formatter = '?'; + } elseif ($period == 'month') { + $formatter = '?-?'; + } else { + $formatter = '?-?-?'; + } + + $groupColumn = 'DATE_FORMAT('.$dateColumn.', "'.Str::replaceArray('?', ['%Y', '%m', '%d'], $formatter).'")'; + + $intervals = []; + + foreach ($datePeriod as $date) { + $formattedDate = $date->format(Str::replaceArray('?', ['Y', 'm', 'd'], $formatter)); + + $intervals[] = [ + 'filter' => $formattedDate, + 'start' => $formattedDate, + ]; + } + + return [ + 'group_column' => $groupColumn, + 'intervals' => $intervals, + ]; + } + } + + /** + * Returns time intervals. + * + * @param \Carbon\Carbon $startDate + * @param \Carbon\Carbon $endDate + * @return array + */ + public function getMonthsInterval($startDate, $endDate) + { + $intervals = []; + + $totalMonths = $startDate->diffInMonths($endDate) + 1; + + /** + * If the difference between the start and end date is less than 5 months + */ + if ($totalMonths <= 5) { + return $intervals; + } + + for ($i = 0; $i < $totalMonths; $i++) { + $intervalStartDate = clone $startDate; + + $intervalStartDate->addMonths($i); + + $start = $intervalStartDate->startOfDay(); + + $end = ($totalMonths - 1 == $i) + ? $endDate + : $intervalStartDate->addMonth()->subDay()->endOfDay(); + + $intervals[] = [ + 'filter' => $start->month, + 'start' => $start->format('d M'), + 'end' => $end->format('d M'), + ]; + } + + return $intervals; + } + + /** + * Returns time intervals. + * + * @param \Carbon\Carbon $startDate + * @param \Carbon\Carbon $endDate + * @return array + */ + public function getWeeksInterval($startDate, $endDate) + { + $intervals = []; + + $startWeekDay = Carbon::createFromTimeString(core()->xWeekRange($startDate, 0).' 00:00:01'); + + $endWeekDay = Carbon::createFromTimeString(core()->xWeekRange($endDate, 1).' 23:59:59'); + + $totalWeeks = $startWeekDay->diffInWeeks($endWeekDay); + + /** + * If the difference between the start and end date is less than 6 weeks + */ + if ($totalWeeks <= 6) { + return $intervals; + } + + for ($i = 0; $i < $totalWeeks; $i++) { + $intervalStartDate = clone $startDate; + + $intervalStartDate->addWeeks($i); + + $start = $i == 0 + ? $startDate + : Carbon::createFromTimeString(core()->xWeekRange($intervalStartDate, 0).' 00:00:01'); + + $end = ($totalWeeks - 1 == $i) + ? $endDate + : Carbon::createFromTimeString(core()->xWeekRange($intervalStartDate->subDay(), 1).' 23:59:59'); + + $intervals[] = [ + 'filter' => $start->week, + 'start' => $start->format('d M'), + 'end' => $end->format('d M'), + ]; + } + + return $intervals; + } + + /** + * Returns time intervals. + * + * @param \Carbon\Carbon $startDate + * @param \Carbon\Carbon $endDate + * @return array + */ + public function getDaysInterval($startDate, $endDate) + { + $intervals = []; + + $totalDays = $startDate->diffInDays($endDate) + 1; + + for ($i = 0; $i < $totalDays; $i++) { + $intervalStartDate = clone $startDate; + + $intervalStartDate->addDays($i); + + $intervals[] = [ + 'filter' => $intervalStartDate->dayOfYear, + 'start' => $intervalStartDate->startOfDay()->format('d M'), + 'end' => $intervalStartDate->endOfDay()->format('d M'), + ]; + } + + return $intervals; + } +} diff --git a/packages/Webkul/Admin/src/Helpers/Reporting/Activity.php b/packages/Webkul/Admin/src/Helpers/Reporting/Activity.php new file mode 100644 index 0000000..4c5cc72 --- /dev/null +++ b/packages/Webkul/Admin/src/Helpers/Reporting/Activity.php @@ -0,0 +1,5 @@ +allStageIds = $this->stageRepository->pluck('id')->toArray(); + + $this->wonStageIds = $this->stageRepository->where('code', 'won')->pluck('id')->toArray(); + + $this->lostStageIds = $this->stageRepository->where('code', 'lost')->pluck('id')->toArray(); + + parent::__construct(); + } + + /** + * Returns current customers over time + * + * @param string $period + */ + public function getTotalLeadsOverTime($period = 'auto'): array + { + $this->stageIds = $this->allStageIds; + + $period = $this->determinePeriod($period); + + return $this->getOverTimeStats($this->startDate, $this->endDate, 'leads.id', 'created_at', $period); + } + + /** + * Returns current customers over time + * + * @param string $period + */ + public function getTotalWonLeadsOverTime($period = 'auto'): array + { + $this->stageIds = $this->wonStageIds; + + $period = $this->determinePeriod($period); + + return $this->getOverTimeStats($this->startDate, $this->endDate, 'leads.id', 'closed_at', $period); + } + + /** + * Returns current customers over time + * + * @param string $period + */ + public function getTotalLostLeadsOverTime($period = 'auto'): array + { + $this->stageIds = $this->lostStageIds; + + $period = $this->determinePeriod($period); + + return $this->getOverTimeStats($this->startDate, $this->endDate, 'leads.id', 'closed_at', $period); + } + + /** + * Determine the appropriate period based on date range + * + * @param string $period + */ + protected function determinePeriod($period = 'auto'): string + { + if ($period !== 'auto') { + return $period; + } + + $diffInDays = $this->startDate->diffInDays($this->endDate); + $diffInMonths = $this->startDate->diffInMonths($this->endDate); + $diffInYears = $this->startDate->diffInYears($this->endDate); + + if ($diffInYears > 3) { + return 'year'; + } elseif ($diffInMonths > 6) { + return 'month'; + } elseif ($diffInDays > 60) { + return 'week'; + } else { + return 'day'; + } + } + + /** + * Retrieves total leads and their progress. + */ + public function getTotalLeadsProgress(): array + { + return [ + 'previous' => $previous = $this->getTotalLeads($this->lastStartDate, $this->lastEndDate), + 'current' => $current = $this->getTotalLeads($this->startDate, $this->endDate), + 'progress' => $this->getPercentageChange($previous, $current), + ]; + } + + /** + * Retrieves total leads by date + * + * @param \Carbon\Carbon $startDate + * @param \Carbon\Carbon $endDate + */ + public function getTotalLeads($startDate, $endDate): int + { + return $this->leadRepository + ->resetModel() + ->whereBetween('created_at', [$startDate, $endDate]) + ->count(); + } + + /** + * Retrieves average leads per day and their progress. + */ + public function getAverageLeadsPerDayProgress(): array + { + return [ + 'previous' => $previous = $this->getAverageLeadsPerDay($this->lastStartDate, $this->lastEndDate), + 'current' => $current = $this->getAverageLeadsPerDay($this->startDate, $this->endDate), + 'progress' => $this->getPercentageChange($previous, $current), + ]; + } + + /** + * Retrieves average leads per day + * + * @param \Carbon\Carbon $startDate + * @param \Carbon\Carbon $endDate + */ + public function getAverageLeadsPerDay($startDate, $endDate): float + { + $days = $startDate->diffInDays($endDate); + + if ($days == 0) { + return 0; + } + + return $this->getTotalLeads($startDate, $endDate) / $days; + } + + /** + * Retrieves total lead value and their progress. + */ + public function getTotalLeadValueProgress(): array + { + return [ + 'previous' => $previous = $this->getTotalLeadValue($this->lastStartDate, $this->lastEndDate), + 'current' => $current = $this->getTotalLeadValue($this->startDate, $this->endDate), + 'formatted_total' => core()->formatBasePrice($current), + 'progress' => $this->getPercentageChange($previous, $current), + ]; + } + + /** + * Retrieves total lead value + * + * @param \Carbon\Carbon $startDate + * @param \Carbon\Carbon $endDate + */ + public function getTotalLeadValue($startDate, $endDate): float + { + return $this->leadRepository + ->resetModel() + ->whereBetween('created_at', [$startDate, $endDate]) + ->sum('lead_value'); + } + + /** + * Retrieves average lead value and their progress. + */ + public function getAverageLeadValueProgress(): array + { + return [ + 'previous' => $previous = $this->getAverageLeadValue($this->lastStartDate, $this->lastEndDate), + 'current' => $current = $this->getAverageLeadValue($this->startDate, $this->endDate), + 'formatted_total' => core()->formatBasePrice($current), + 'progress' => $this->getPercentageChange($previous, $current), + ]; + } + + /** + * Retrieves average lead value + * + * @param \Carbon\Carbon $startDate + * @param \Carbon\Carbon $endDate + */ + public function getAverageLeadValue($startDate, $endDate): float + { + return $this->leadRepository + ->resetModel() + ->whereBetween('created_at', [$startDate, $endDate]) + ->avg('lead_value') ?? 0; + } + + /** + * Retrieves total won lead value and their progress. + */ + public function getTotalWonLeadValueProgress(): array + { + return [ + 'previous' => $previous = $this->getTotalWonLeadValue($this->lastStartDate, $this->lastEndDate), + 'current' => $current = $this->getTotalWonLeadValue($this->startDate, $this->endDate), + 'formatted_total' => core()->formatBasePrice($current), + 'progress' => $this->getPercentageChange($previous, $current), + ]; + } + + /** + * Retrieves average won lead value + * + * @param \Carbon\Carbon $startDate + * @param \Carbon\Carbon $endDate + * @return array + */ + public function getTotalWonLeadValue($startDate, $endDate): ?float + { + return $this->leadRepository + ->resetModel() + ->whereIn('lead_pipeline_stage_id', $this->wonStageIds) + ->whereBetween('created_at', [$startDate, $endDate]) + ->sum('lead_value'); + } + + /** + * Retrieves average lost lead value and their progress. + */ + public function getTotalLostLeadValueProgress(): array + { + return [ + 'previous' => $previous = $this->getTotalLostLeadValue($this->lastStartDate, $this->lastEndDate), + 'current' => $current = $this->getTotalLostLeadValue($this->startDate, $this->endDate), + 'formatted_total' => core()->formatBasePrice($current), + 'progress' => $this->getPercentageChange($previous, $current), + ]; + } + + /** + * Retrieves average lost lead value + * + * @param \Carbon\Carbon $startDate + * @param \Carbon\Carbon $endDate + * @return array + */ + public function getTotalLostLeadValue($startDate, $endDate): ?float + { + return $this->leadRepository + ->resetModel() + ->whereIn('lead_pipeline_stage_id', $this->lostStageIds) + ->whereBetween('created_at', [$startDate, $endDate]) + ->sum('lead_value'); + } + + /** + * Retrieves total lead value by sources. + */ + public function getTotalWonLeadValueBySources() + { + return $this->leadRepository + ->resetModel() + ->select( + 'lead_sources.name', + DB::raw('SUM(lead_value) as total') + ) + ->leftJoin('lead_sources', 'leads.lead_source_id', '=', 'lead_sources.id') + ->whereIn('lead_pipeline_stage_id', $this->wonStageIds) + ->whereBetween('leads.created_at', [$this->startDate, $this->endDate]) + ->groupBy('lead_source_id') + ->get(); + } + + /** + * Retrieves total lead value by types. + */ + public function getTotalWonLeadValueByTypes() + { + return $this->leadRepository + ->resetModel() + ->select( + 'lead_types.name', + DB::raw('SUM(lead_value) as total') + ) + ->leftJoin('lead_types', 'leads.lead_type_id', '=', 'lead_types.id') + ->whereIn('lead_pipeline_stage_id', $this->wonStageIds) + ->whereBetween('leads.created_at', [$this->startDate, $this->endDate]) + ->groupBy('lead_type_id') + ->get(); + } + + /** + * Retrieves open leads by states. + */ + public function getOpenLeadsByStates() + { + return $this->leadRepository + ->resetModel() + ->select( + 'lead_pipeline_stages.name', + DB::raw('COUNT(lead_value) as total') + ) + ->leftJoin('lead_pipeline_stages', 'leads.lead_pipeline_stage_id', '=', 'lead_pipeline_stages.id') + ->whereNotIn('lead_pipeline_stage_id', $this->wonStageIds) + ->whereNotIn('lead_pipeline_stage_id', $this->lostStageIds) + ->whereBetween('leads.created_at', [$this->startDate, $this->endDate]) + ->groupBy('lead_pipeline_stage_id') + ->orderByDesc('total') + ->get(); + } + + /** + * Returns over time stats. + * + * @param \Carbon\Carbon $startDate + * @param \Carbon\Carbon $endDate + * @param string $valueColumn + * @param string $dateColumn + * @param string $period + */ + public function getOverTimeStats($startDate, $endDate, $valueColumn, $dateColumn = 'created_at', $period = 'auto'): array + { + $period = $this->determinePeriod($period); + + $intervals = $this->generateTimeIntervals($startDate, $endDate, $period); + + $groupColumn = $this->getGroupColumn($dateColumn, $period); + + $query = $this->leadRepository + ->resetModel() + ->select( + DB::raw("$groupColumn AS date"), + DB::raw('COUNT(DISTINCT id) AS count'), + DB::raw('SUM('.\DB::getTablePrefix()."$valueColumn) AS total") + ) + ->whereIn('lead_pipeline_stage_id', $this->stageIds) + ->whereBetween($dateColumn, [$startDate, $endDate]) + ->groupBy(DB::raw($groupColumn)) + ->orderBy(DB::raw($groupColumn)); + + $results = $query->get(); + $resultLookup = $results->keyBy('date'); + + $stats = []; + + foreach ($intervals as $interval) { + $result = $resultLookup->get($interval['key']); + + $stats[] = [ + 'label' => $interval['label'], + 'count' => $result ? (int) $result->count : 0, + 'total' => $result ? (float) $result->total : 0, + ]; + } + + return $stats; + } + + /** + * Generate time intervals based on period + */ + protected function generateTimeIntervals(Carbon $startDate, Carbon $endDate, string $period): array + { + $intervals = []; + $current = $startDate->copy(); + + while ($current <= $endDate) { + $interval = [ + 'key' => $this->formatDateForGrouping($current, $period), + 'label' => $this->formatDateForLabel($current, $period), + ]; + + $intervals[] = $interval; + + switch ($period) { + case 'day': + $current->addDay(); + + break; + case 'week': + $current->addWeek(); + + break; + case 'month': + $current->addMonth(); + + break; + case 'year': + $current->addYear(); + + break; + } + } + + return $intervals; + } + + /** + * Get the SQL group column based on period + */ + protected function getGroupColumn(string $dateColumn, string $period): string + { + switch ($period) { + case 'day': + return "DATE($dateColumn)"; + case 'week': + return "DATE_FORMAT($dateColumn, '%Y-%u')"; + case 'month': + return "DATE_FORMAT($dateColumn, '%Y-%m')"; + case 'year': + return "YEAR($dateColumn)"; + default: + return "DATE($dateColumn)"; + } + } + + /** + * Format date for grouping key + */ + protected function formatDateForGrouping(Carbon $date, string $period): string + { + switch ($period) { + case 'day': + return $date->format('Y-m-d'); + case 'week': + return $date->format('Y-W'); + case 'month': + return $date->format('Y-m'); + case 'year': + return $date->format('Y'); + default: + return $date->format('Y-m-d'); + } + } + + /** + * Format date for display label + */ + protected function formatDateForLabel(Carbon $date, string $period): string + { + switch ($period) { + case 'day': + return $date->format('M d'); + case 'week': + return 'Week '.$date->format('W, Y'); + case 'month': + return $date->format('M Y'); + case 'year': + return $date->format('Y'); + default: + return $date->format('M d'); + } + } +} diff --git a/packages/Webkul/Admin/src/Helpers/Reporting/Organization.php b/packages/Webkul/Admin/src/Helpers/Reporting/Organization.php new file mode 100644 index 0000000..4ede2ec --- /dev/null +++ b/packages/Webkul/Admin/src/Helpers/Reporting/Organization.php @@ -0,0 +1,80 @@ + $previous = $this->getTotalOrganizations($this->lastStartDate, $this->lastEndDate), + 'current' => $current = $this->getTotalOrganizations($this->startDate, $this->endDate), + 'progress' => $this->getPercentageChange($previous, $current), + ]; + } + + /** + * Retrieves total organizations by date + * + * @param \Carbon\Carbon $startDate + * @param \Carbon\Carbon $endDate + */ + public function getTotalOrganizations($startDate, $endDate): int + { + return $this->organizationRepository + ->resetModel() + ->whereBetween('created_at', [$startDate, $endDate]) + ->count(); + } + + /** + * Gets top customers by revenue. + * + * @param int $limit + */ + public function getTopOrganizationsByRevenue($limit = null): Collection + { + $tablePrefix = DB::getTablePrefix(); + + $items = $this->organizationRepository + ->resetModel() + ->leftJoin('persons', 'organizations.id', '=', 'persons.organization_id') + ->leftJoin('leads', 'persons.id', '=', 'leads.person_id') + ->select('*', 'persons.id as id') + ->addSelect(DB::raw('SUM('.$tablePrefix.'leads.lead_value) as revenue')) + ->whereBetween('leads.closed_at', [$this->startDate, $this->endDate]) + ->having(DB::raw('SUM('.$tablePrefix.'leads.lead_value)'), '>', 0) + ->groupBy('organization_id') + ->orderBy('revenue', 'DESC') + ->limit($limit) + ->get(); + + $items = $items->map(function ($item) { + return [ + 'id' => $item->id, + 'name' => $item->name, + 'revenue' => $item->revenue, + 'formatted_revenue' => core()->formatBasePrice($item->revenue), + ]; + }); + + return $items; + } +} diff --git a/packages/Webkul/Admin/src/Helpers/Reporting/Person.php b/packages/Webkul/Admin/src/Helpers/Reporting/Person.php new file mode 100644 index 0000000..91b891d --- /dev/null +++ b/packages/Webkul/Admin/src/Helpers/Reporting/Person.php @@ -0,0 +1,81 @@ + $previous = $this->getTotalPersons($this->lastStartDate, $this->lastEndDate), + 'current' => $current = $this->getTotalPersons($this->startDate, $this->endDate), + 'progress' => $this->getPercentageChange($previous, $current), + ]; + } + + /** + * Retrieves total persons by date + * + * @param \Carbon\Carbon $startDate + * @param \Carbon\Carbon $endDate + */ + public function getTotalPersons($startDate, $endDate): int + { + return $this->personRepository + ->resetModel() + ->whereBetween('created_at', [$startDate, $endDate]) + ->count(); + } + + /** + * Gets top customers by revenue. + * + * @param int $limit + */ + public function getTopCustomersByRevenue($limit = null): Collection + { + $tablePrefix = DB::getTablePrefix(); + + $items = $this->personRepository + ->resetModel() + ->leftJoin('leads', 'persons.id', '=', 'leads.person_id') + ->select('*', 'persons.id as id') + ->addSelect(DB::raw('SUM('.$tablePrefix.'leads.lead_value) as revenue')) + ->whereBetween('leads.closed_at', [$this->startDate, $this->endDate]) + ->having(DB::raw('SUM('.$tablePrefix.'leads.lead_value)'), '>', 0) + ->groupBy('person_id') + ->orderBy('revenue', 'DESC') + ->limit($limit) + ->get(); + + $items = $items->map(function ($item) { + return [ + 'id' => $item->id, + 'name' => $item->name, + 'emails' => $item->emails, + 'contact_numbers' => $item->contact_numbers, + 'revenue' => $item->revenue, + 'formatted_revenue' => core()->formatBasePrice($item->revenue), + ]; + }); + + return $items; + } +} diff --git a/packages/Webkul/Admin/src/Helpers/Reporting/Product.php b/packages/Webkul/Admin/src/Helpers/Reporting/Product.php new file mode 100644 index 0000000..f695b46 --- /dev/null +++ b/packages/Webkul/Admin/src/Helpers/Reporting/Product.php @@ -0,0 +1,94 @@ +productRepository + ->resetModel() + ->with('product') + ->leftJoin('leads', 'lead_products.lead_id', '=', 'leads.id') + ->leftJoin('products', 'lead_products.product_id', '=', 'products.id') + ->select('*') + ->addSelect(DB::raw('SUM('.$tablePrefix.'lead_products.amount) as revenue')) + ->whereBetween('leads.closed_at', [$this->startDate, $this->endDate]) + ->having(DB::raw('SUM('.$tablePrefix.'lead_products.amount)'), '>', 0) + ->groupBy('product_id') + ->orderBy('revenue', 'DESC') + ->limit($limit) + ->get(); + + $items = $items->map(function ($item) { + return [ + 'id' => $item->product_id, + 'name' => $item->name, + 'price' => $item->product?->price, + 'formatted_price' => core()->formatBasePrice($item->price), + 'revenue' => $item->revenue, + 'formatted_revenue' => core()->formatBasePrice($item->revenue), + ]; + }); + + return $items; + } + + /** + * Gets top-selling products by quantity. + * + * @param int $limit + */ + public function getTopSellingProductsByQuantity($limit = null): Collection + { + $tablePrefix = DB::getTablePrefix(); + + $items = $this->productRepository + ->resetModel() + ->with('product') + ->leftJoin('leads', 'lead_products.lead_id', '=', 'leads.id') + ->leftJoin('products', 'lead_products.product_id', '=', 'products.id') + ->select('*') + ->addSelect(DB::raw('SUM('.$tablePrefix.'lead_products.quantity) as total_qty_ordered')) + ->whereBetween('leads.closed_at', [$this->startDate, $this->endDate]) + ->having(DB::raw('SUM('.$tablePrefix.'lead_products.quantity)'), '>', 0) + ->groupBy('product_id') + ->orderBy('total_qty_ordered', 'DESC') + ->limit($limit) + ->get(); + + $items = $items->map(function ($item) { + return [ + 'id' => $item->product_id, + 'name' => $item->name, + 'price' => $item->product?->price, + 'formatted_price' => core()->formatBasePrice($item->price), + 'total_qty_ordered' => $item->total_qty_ordered, + ]; + }); + + return $items; + } +} diff --git a/packages/Webkul/Admin/src/Helpers/Reporting/Quote.php b/packages/Webkul/Admin/src/Helpers/Reporting/Quote.php new file mode 100644 index 0000000..fada058 --- /dev/null +++ b/packages/Webkul/Admin/src/Helpers/Reporting/Quote.php @@ -0,0 +1,44 @@ + $previous = $this->getTotalQuotes($this->lastStartDate, $this->lastEndDate), + 'current' => $current = $this->getTotalQuotes($this->startDate, $this->endDate), + 'progress' => $this->getPercentageChange($previous, $current), + ]; + } + + /** + * Retrieves total quotes by date + * + * @param \Carbon\Carbon $startDate + * @param \Carbon\Carbon $endDate + */ + public function getTotalQuotes($startDate, $endDate): int + { + return $this->quoteRepository + ->resetModel() + ->whereBetween('created_at', [$startDate, $endDate]) + ->count(); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Activity/ActivityController.php b/packages/Webkul/Admin/src/Http/Controllers/Activity/ActivityController.php new file mode 100755 index 0000000..02a7369 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Activity/ActivityController.php @@ -0,0 +1,261 @@ +has('view_type')) { + return datagrid(ActivityDataGrid::class)->process(); + } + + $startDate = request()->get('startDate') + ? Carbon::createFromTimeString(request()->get('startDate').' 00:00:01') + : Carbon::now()->startOfWeek()->format('Y-m-d H:i:s'); + + $endDate = request()->get('endDate') + ? Carbon::createFromTimeString(request()->get('endDate').' 23:59:59') + : Carbon::now()->endOfWeek()->format('Y-m-d H:i:s'); + + $activities = $this->activityRepository->getActivities([$startDate, $endDate])->toArray(); + + return response()->json([ + 'activities' => $activities, + ]); + } + + /** + * Store a newly created resource in storage. + */ + public function store(): RedirectResponse|JsonResponse + { + $this->validate(request(), [ + 'type' => 'required', + 'comment' => 'required_if:type,note', + 'schedule_from' => 'required_unless:type,note,file', + 'schedule_to' => 'required_unless:type,note,file', + 'file' => 'required_if:type,file', + ]); + + if (request('type') === 'meeting') { + /** + * Check if meeting is overlapping with other meetings. + */ + $isOverlapping = $this->activityRepository->isDurationOverlapping( + request()->input('schedule_from'), + request()->input('schedule_to'), + request()->input('participants'), + request()->input('id') + ); + + if ($isOverlapping) { + if (request()->ajax()) { + return response()->json([ + 'message' => trans('admin::app.activities.overlapping-error'), + ], 400); + } + + session()->flash('success', trans('admin::app.activities.overlapping-error')); + + return redirect()->back(); + } + } + + Event::dispatch('activity.create.before'); + + $activity = $this->activityRepository->create(array_merge(request()->all(), [ + 'is_done' => request('type') == 'note' ? 1 : 0, + 'user_id' => auth()->guard('user')->user()->id, + ])); + + Event::dispatch('activity.create.after', $activity); + + if (request()->ajax()) { + return response()->json([ + 'data' => new ActivityResource($activity), + 'message' => trans('admin::app.activities.create-success'), + ]); + } + + session()->flash('success', trans('admin::app.activities.create-success')); + + return redirect()->back(); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(int $id): View + { + $activity = $this->activityRepository->findOrFail($id); + + $leadId = old('lead_id') ?? optional($activity->leads()->first())->id; + + $lookUpEntityData = $this->attributeRepository->getLookUpEntity('leads', $leadId); + + return view('admin::activities.edit', compact('activity', 'lookUpEntityData')); + } + + /** + * Update the specified resource in storage. + */ + public function update($id): RedirectResponse|JsonResponse + { + Event::dispatch('activity.update.before', $id); + + $data = request()->all(); + + $activity = $this->activityRepository->update($data, $id); + + /** + * We will not use `empty` directly here because `lead_id` can be a blank string + * from the activity form. However, on the activity view page, we are only updating the + * `is_done` field, so `lead_id` will not be present in that case. + */ + if (isset($data['lead_id'])) { + $activity->leads()->sync( + ! empty($data['lead_id']) + ? [$data['lead_id']] + : [] + ); + } + + Event::dispatch('activity.update.after', $activity); + + if (request()->ajax()) { + return response()->json([ + 'data' => new ActivityResource($activity), + 'message' => trans('admin::app.activities.update-success'), + ]); + } + + session()->flash('success', trans('admin::app.activities.update-success')); + + return redirect()->route('admin.activities.index'); + } + + /** + * Mass Update the specified resources. + */ + public function massUpdate(MassUpdateRequest $massUpdateRequest): JsonResponse + { + $activities = $this->activityRepository->findWhereIn('id', $massUpdateRequest->input('indices')); + + foreach ($activities as $activity) { + Event::dispatch('activity.update.before', $activity->id); + + $activity = $this->activityRepository->update([ + 'is_done' => $massUpdateRequest->input('value'), + ], $activity->id); + + Event::dispatch('activity.update.after', $activity); + } + + return response()->json([ + 'message' => trans('admin::app.activities.mass-update-success'), + ]); + } + + /** + * Download file from storage. + */ + public function download(int $id): StreamedResponse + { + try { + $file = $this->fileRepository->findOrFail($id); + + return Storage::download($file->path); + } catch (\Exception $exception) { + abort(404); + } + } + + /* + * Remove the specified resource from storage. + */ + public function destroy(int $id): JsonResponse + { + $activity = $this->activityRepository->findOrFail($id); + + try { + Event::dispatch('activity.delete.before', $id); + + $activity?->delete($id); + + Event::dispatch('activity.delete.after', $id); + + return response()->json([ + 'message' => trans('admin::app.activities.destroy-success'), + ], 200); + } catch (\Exception $exception) { + return response()->json([ + 'message' => trans('admin::app.activities.destroy-failed'), + ], 400); + } + } + + /** + * Mass Delete the specified resources. + */ + public function massDestroy(MassDestroyRequest $massDestroyRequest): JsonResponse + { + $activities = $this->activityRepository->findWhereIn('id', $massDestroyRequest->input('indices')); + + try { + foreach ($activities as $activity) { + Event::dispatch('activity.delete.before', $activity->id); + + $this->activityRepository->delete($activity->id); + + Event::dispatch('activity.delete.after', $activity->id); + } + + return response()->json([ + 'message' => trans('admin::app.activities.mass-destroy-success'), + ]); + } catch (\Exception $exception) { + return response()->json([ + 'message' => trans('admin::app.activities.mass-delete-failed'), + ], 400); + } + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Configuration/ConfigurationController.php b/packages/Webkul/Admin/src/Http/Controllers/Configuration/ConfigurationController.php new file mode 100644 index 0000000..4d12b11 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Configuration/ConfigurationController.php @@ -0,0 +1,84 @@ +route('slug') + && request()->route('slug2') + ) { + return view('admin::configuration.edit'); + } + + return view('admin::configuration.index'); + } + + /** + * Store a newly created resource in storage. + */ + public function store(ConfigurationForm $request): RedirectResponse + { + Event::dispatch('core.configuration.save.before'); + + $this->configurationRepository->create($request->all()); + + Event::dispatch('core.configuration.save.after'); + + session()->flash('success', trans('admin::app.configuration.index.save-success')); + + return redirect()->back(); + } + + /** + * download the file for the specified resource. + * + * @return \Illuminate\Http\Response + */ + public function download() + { + $path = request()->route()->parameters()['path']; + + $fileName = 'configuration/'.$path; + + $config = $this->configurationRepository->findOneByField('value', $fileName); + + return Storage::download($config['value']); + } + + /** + * Search for configurations. + */ + public function search(): JsonResponse + { + $results = $this->configurationRepository->search( + system_config()->getItems(), + request()->query('query') + ); + + return new JsonResponse([ + 'data' => $results, + ]); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Contact/OrganizationController.php b/packages/Webkul/Admin/src/Http/Controllers/Contact/OrganizationController.php new file mode 100644 index 0000000..6845a6c --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Contact/OrganizationController.php @@ -0,0 +1,130 @@ +request->add(['entity_type' => 'organizations']); + } + + /** + * Display a listing of the resource. + */ + public function index(): View|JsonResponse + { + if (request()->ajax()) { + return datagrid(OrganizationDataGrid::class)->process(); + } + + return view('admin::contacts.organizations.index'); + } + + /** + * Show the form for creating a new resource. + */ + public function create(): View + { + return view('admin::contacts.organizations.create'); + } + + /** + * Store a newly created resource in storage. + */ + public function store(AttributeForm $request): RedirectResponse + { + Event::dispatch('contacts.organization.create.before'); + + $organization = $this->organizationRepository->create(request()->all()); + + Event::dispatch('contacts.organization.create.after', $organization); + + session()->flash('success', trans('admin::app.contacts.organizations.index.create-success')); + + return redirect()->route('admin.contacts.organizations.index'); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(int $id): View + { + $organization = $this->organizationRepository->findOrFail($id); + + return view('admin::contacts.organizations.edit', compact('organization')); + } + + /** + * Update the specified resource in storage. + */ + public function update(AttributeForm $request, int $id): RedirectResponse + { + Event::dispatch('contacts.organization.update.before', $id); + + $organization = $this->organizationRepository->update(request()->all(), $id); + + Event::dispatch('contacts.organization.update.after', $organization); + + session()->flash('success', trans('admin::app.contacts.organizations.index.update-success')); + + return redirect()->route('admin.contacts.organizations.index'); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(int $id): JsonResponse + { + try { + Event::dispatch('contact.organization.delete.before', $id); + + $this->organizationRepository->delete($id); + + Event::dispatch('contact.organization.delete.after', $id); + + return response()->json([ + 'message' => trans('admin::app.contacts.organizations.index.delete-success'), + ], 200); + } catch (\Exception $exception) { + return response()->json([ + 'message' => trans('admin::app.contacts.organizations.index.delete-failed'), + ], 400); + } + } + + /** + * Mass Delete the specified resources. + */ + public function massDestroy(MassDestroyRequest $massDestroyRequest): JsonResponse + { + $organizations = $this->organizationRepository->findWhereIn('id', $massDestroyRequest->input('indices')); + + foreach ($organizations as $organization) { + Event::dispatch('contact.organization.delete.before', $organization); + + $this->organizationRepository->delete($organization->id); + + Event::dispatch('contact.organization.delete.after', $organization); + } + + return response()->json([ + 'message' => trans('admin::app.contacts.organizations.index.delete-success'), + ]); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Contact/Persons/ActivityController.php b/packages/Webkul/Admin/src/Http/Controllers/Contact/Persons/ActivityController.php new file mode 100644 index 0000000..49292c5 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Contact/Persons/ActivityController.php @@ -0,0 +1,88 @@ +activityRepository + ->leftJoin('person_activities', 'activities.id', '=', 'person_activities.activity_id') + ->where('person_activities.person_id', $id) + ->get(); + + return ActivityResource::collection($this->concatEmailAsActivities($id, $activities)); + } + + /** + * Store a newly created resource in storage. + */ + public function concatEmailAsActivities($personId, $activities) + { + $emails = DB::table('emails as child') + ->select('child.*') + ->join('emails as parent', 'child.parent_id', '=', 'parent.id') + ->where('parent.person_id', $personId) + ->union(DB::table('emails as parent')->where('parent.person_id', $personId)) + ->get(); + + return $activities->concat($emails->map(function ($email) { + return (object) [ + 'id' => $email->id, + 'parent_id' => $email->parent_id, + 'title' => $email->subject, + 'type' => 'email', + 'is_done' => 1, + 'comment' => $email->reply, + 'schedule_from' => null, + 'schedule_to' => null, + 'user' => auth()->guard('user')->user(), + 'participants' => [], + 'location' => null, + 'additional' => [ + 'folders' => json_decode($email->folders), + 'from' => json_decode($email->from), + 'to' => json_decode($email->reply_to), + 'cc' => json_decode($email->cc), + 'bcc' => json_decode($email->bcc), + ], + 'files' => $this->attachmentRepository->findWhere(['email_id' => $email->id])->map(function ($attachment) { + return (object) [ + 'id' => $attachment->id, + 'name' => $attachment->name, + 'path' => $attachment->path, + 'url' => $attachment->url, + 'created_at' => $attachment->created_at, + 'updated_at' => $attachment->updated_at, + ]; + }), + 'created_at' => $email->created_at, + 'updated_at' => $email->updated_at, + ]; + }))->sortByDesc('id')->sortByDesc('created_at'); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Contact/Persons/PersonController.php b/packages/Webkul/Admin/src/Http/Controllers/Contact/Persons/PersonController.php new file mode 100644 index 0000000..656f64c --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Contact/Persons/PersonController.php @@ -0,0 +1,235 @@ +request->add(['entity_type' => 'persons']); + } + + /** + * Display a listing of the resource. + */ + public function index() + { + if (request()->ajax()) { + return datagrid(PersonDataGrid::class)->process(); + } + + return view('admin::contacts.persons.index'); + } + + /** + * Show the form for creating a new resource. + */ + public function create(): View + { + return view('admin::contacts.persons.create'); + } + + /** + * Store a newly created resource in storage. + */ + public function store(AttributeForm $request): RedirectResponse|JsonResponse + { + Event::dispatch('contacts.person.create.before'); + + $person = $this->personRepository->create($request->all()); + + Event::dispatch('contacts.person.create.after', $person); + + if (request()->ajax()) { + return response()->json([ + 'data' => $person, + 'message' => trans('admin::app.contacts.persons.index.create-success'), + ]); + } + + session()->flash('success', trans('admin::app.contacts.persons.index.create-success')); + + return redirect()->route('admin.contacts.persons.index'); + } + + /** + * Display the specified resource. + */ + public function show(int $id): View + { + $person = $this->personRepository->findOrFail($id); + + return view('admin::contacts.persons.view', compact('person')); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(int $id): View + { + $person = $this->personRepository->findOrFail($id); + + return view('admin::contacts.persons.edit', compact('person')); + } + + /** + * Update the specified resource in storage. + */ + public function update(AttributeForm $request, int $id): RedirectResponse|JsonResponse + { + Event::dispatch('contacts.person.update.before', $id); + + $person = $this->personRepository->update($request->all(), $id); + + Event::dispatch('contacts.person.update.after', $person); + + if (request()->ajax()) { + return response()->json([ + 'data' => $person, + 'message' => trans('admin::app.contacts.persons.index.update-success'), + ], 200); + } + + session()->flash('success', trans('admin::app.contacts.persons.index.update-success')); + + return redirect()->route('admin.contacts.persons.index'); + } + + /** + * Search person results. + */ + public function search(): JsonResource + { + if ($userIds = bouncer()->getAuthorizedUserIds()) { + $persons = $this->personRepository + ->pushCriteria(app(RequestCriteria::class)) + ->findWhereIn('user_id', $userIds); + } else { + $persons = $this->personRepository + ->pushCriteria(app(RequestCriteria::class)) + ->all(); + } + + return PersonResource::collection($persons); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(int $id): JsonResponse + { + $person = $this->personRepository->findOrFail($id); + + if ( + $person->leads + && $person->leads->count() > 0 + ) { + return response()->json([ + 'message' => trans('admin::app.contacts.persons.index.delete-failed'), + ], 400); + } + + try { + Event::dispatch('contacts.person.delete.before', $person); + + $person->delete(); + + Event::dispatch('contacts.person.delete.after', $person); + + return response()->json([ + 'message' => trans('admin::app.contacts.persons.index.delete-success'), + ], 200); + + } catch (Exception $exception) { + return response()->json([ + 'message' => trans('admin::app.contacts.persons.index.delete-failed'), + ], 400); + } + } + + /** + * Mass destroy the specified resources from storage. + */ + public function massDestroy(MassDestroyRequest $request): JsonResponse + { + try { + $persons = $this->personRepository->findWhereIn('id', $request->input('indices', [])); + + $deletedCount = 0; + + $blockedCount = 0; + + foreach ($persons as $person) { + if ( + $person->leads + && $person->leads->count() > 0 + ) { + $blockedCount++; + + continue; + } + + Event::dispatch('contact.person.delete.before', $person); + + $this->personRepository->delete($person->id); + + Event::dispatch('contact.person.delete.after', $person); + + $deletedCount++; + } + + $statusCode = 200; + + switch (true) { + case $deletedCount > 0 && $blockedCount === 0: + $message = trans('admin::app.contacts.persons.index.all-delete-success'); + + break; + + case $deletedCount > 0 && $blockedCount > 0: + $message = trans('admin::app.contacts.persons.index.partial-delete-warning'); + + break; + + case $deletedCount === 0 && $blockedCount > 0: + $message = trans('admin::app.contacts.persons.index.none-delete-warning'); + + $statusCode = 400; + + break; + + default: + $message = trans('admin::app.contacts.persons.index.no-selection'); + + $statusCode = 400; + + break; + } + + return response()->json(['message' => $message], $statusCode); + } catch (Exception $exception) { + return response()->json([ + 'message' => trans('admin::app.contacts.persons.index.delete-failed'), + ], 400); + } + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Contact/Persons/TagController.php b/packages/Webkul/Admin/src/Http/Controllers/Contact/Persons/TagController.php new file mode 100644 index 0000000..232b1ec --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Contact/Persons/TagController.php @@ -0,0 +1,56 @@ +personRepository->find($id); + + if (! $person->tags->contains(request()->input('tag_id'))) { + $person->tags()->attach(request()->input('tag_id')); + } + + Event::dispatch('persons.tag.create.after', $person); + + return response()->json([ + 'message' => trans('admin::app.contacts.persons.view.tags.create-success'), + ]); + } + + /** + * Remove the specified resource from storage. + */ + public function detach(int $personId): JsonResponse + { + Event::dispatch('persons.tag.delete.before', $personId); + + $person = $this->personRepository->find($personId); + + $person->tags()->detach(request()->input('tag_id')); + + Event::dispatch('persons.tag.delete.after', $person); + + return response()->json([ + 'message' => trans('admin::app.contacts.persons.view.tags.destroy-success'), + ]); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Controller.php b/packages/Webkul/Admin/src/Http/Controllers/Controller.php new file mode 100755 index 0000000..0254c13 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Controller.php @@ -0,0 +1,23 @@ +route('admin.session.create'); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/DashboardController.php b/packages/Webkul/Admin/src/Http/Controllers/DashboardController.php new file mode 100755 index 0000000..cc4d1d9 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/DashboardController.php @@ -0,0 +1,59 @@ + 'getOverAllStats', + 'revenue-stats' => 'getRevenueStats', + 'total-leads' => 'getTotalLeadsStats', + 'revenue-by-sources' => 'getLeadsStatsBySources', + 'revenue-by-types' => 'getLeadsStatsByTypes', + 'top-selling-products' => 'getTopSellingProducts', + 'top-persons' => 'getTopPersons', + 'open-leads-by-states' => 'getOpenLeadsByStates', + ]; + + /** + * Create a new controller instance. + * + * @return void + */ + public function __construct(protected Dashboard $dashboardHelper) {} + + /** + * Display a listing of the resource. + * + * @return \Illuminate\View\View + */ + public function index() + { + return view('admin::dashboard.index')->with([ + 'startDate' => $this->dashboardHelper->getStartDate(), + 'endDate' => $this->dashboardHelper->getEndDate(), + ]); + } + + /** + * Display a listing of the resource. + * + * @return \Illuminate\Http\JsonResponse + */ + public function stats() + { + $stats = $this->dashboardHelper->{$this->typeFunctions[request()->query('type')]}(); + + return response()->json([ + 'statistics' => $stats, + 'date_range' => $this->dashboardHelper->getDateRange(), + ]); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/DataGrid/SavedFilterController.php b/packages/Webkul/Admin/src/Http/Controllers/DataGrid/SavedFilterController.php new file mode 100644 index 0000000..c0aabde --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/DataGrid/SavedFilterController.php @@ -0,0 +1,117 @@ +guard()->user()->id; + + $this->validate(request(), [ + 'name' => 'required|unique:datagrid_saved_filters,name,NULL,id,src,'.request('src').',user_id,'.$userId, + ]); + + Event::dispatch('datagrid.saved_filter.create.before'); + + $savedFilter = $this->savedFilterRepository->create([ + 'user_id' => $userId, + 'name' => request('name'), + 'src' => request('src'), + 'applied' => request('applied'), + ]); + + Event::dispatch('datagrid.saved_filter.create.after', $savedFilter); + + return response()->json([ + 'data' => $savedFilter, + 'message' => trans('admin::app.components.datagrid.toolbar.filter.saved-success'), + ]); + } + + /** + * Retrieves the saved filters. + */ + public function get() + { + $savedFilters = $this->savedFilterRepository->findWhere([ + 'src' => request()->get('src'), + 'user_id' => auth()->guard()->user()->id, + ]); + + return response()->json(['data' => $savedFilters]); + } + + /** + * Update the saved filter. + */ + public function update(int $id) + { + $userId = auth()->guard()->user()->id; + + $this->validate(request(), [ + 'name' => 'required|unique:datagrid_saved_filters,name,'.$id.',id,src,'.request('src').',user_id,'.$userId, + ]); + + $savedFilter = $this->savedFilterRepository->findOneWhere([ + 'id' => $id, + 'user_id' => auth()->guard()->user()->id, + ]); + + if (! $savedFilter) { + return response()->json([], 404); + } + + Event::dispatch('datagrid.saved_filter.update.before', $id); + + $updatedFilter = $this->savedFilterRepository->update(request()->only([ + 'name', + 'src', + 'applied', + ]), $id); + + Event::dispatch('datagrid.saved_filter.update.after', $updatedFilter); + + return response()->json([ + 'data' => $updatedFilter, + 'message' => trans('admin::app.components.datagrid.toolbar.filter.updated-success'), + ]); + } + + /** + * Delete the saved filter. + */ + public function destroy(int $id) + { + Event::dispatch('datagrid.saved_filter.delete.before', $id); + + $success = $this->savedFilterRepository->deleteWhere([ + 'id' => $id, + 'user_id' => auth()->guard()->user()->id, + ]); + + Event::dispatch('datagrid.saved_filter.delete.after', $id); + + if (! $success) { + return response()->json([ + 'message' => trans('admin::app.components.datagrid.toolbar.filter.delete-error'), + ]); + } + + return response()->json([ + 'message' => trans('admin::app.components.datagrid.toolbar.filter.delete-success'), + ]); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/DataGridController.php b/packages/Webkul/Admin/src/Http/Controllers/DataGridController.php new file mode 100644 index 0000000..9693f84 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/DataGridController.php @@ -0,0 +1,42 @@ +validate(request(), [ + 'datagrid_id' => ['required'], + 'column' => ['required'], + 'search' => ['required', 'min:2'], + ]); + + /** + * Preparing the datagrid instance and only columns. + */ + $datagrid = app(Crypt::decryptString($params['datagrid_id'])); + $datagrid->prepareColumns(); + + /** + * Finding the first column from the collection. + */ + $column = collect($datagrid->getColumns())->map(fn ($column) => $column->toArray())->where('index', $params['column'])->firstOrFail(); + + /** + * Fetching on the basis of column options. + */ + return app($column['filterable_options']['repository']) + ->select([$column['filterable_options']['column']['label'].' as label', $column['filterable_options']['column']['value'].' as value']) + ->where($column['filterable_options']['column']['label'], 'LIKE', '%'.$params['search'].'%') + ->get(); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Lead/ActivityController.php b/packages/Webkul/Admin/src/Http/Controllers/Lead/ActivityController.php new file mode 100644 index 0000000..f12e144 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Lead/ActivityController.php @@ -0,0 +1,88 @@ +activityRepository + ->leftJoin('lead_activities', 'activities.id', '=', 'lead_activities.activity_id') + ->where('lead_activities.lead_id', $id) + ->get(); + + return ActivityResource::collection($this->concatEmailAsActivities($id, $activities)); + } + + /** + * Store a newly created resource in storage. + */ + public function concatEmailAsActivities($leadId, $activities) + { + $emails = DB::table('emails as child') + ->select('child.*') + ->join('emails as parent', 'child.parent_id', '=', 'parent.id') + ->where('parent.lead_id', $leadId) + ->union(DB::table('emails as parent')->where('parent.lead_id', $leadId)) + ->get(); + + return $activities->concat($emails->map(function ($email) { + return (object) [ + 'id' => $email->id, + 'parent_id' => $email->parent_id, + 'title' => $email->subject, + 'type' => 'email', + 'is_done' => 1, + 'comment' => $email->reply, + 'schedule_from' => null, + 'schedule_to' => null, + 'user' => auth()->guard('user')->user(), + 'participants' => [], + 'location' => null, + 'additional' => [ + 'folders' => json_decode($email->folders), + 'from' => json_decode($email->from), + 'to' => json_decode($email->reply_to), + 'cc' => json_decode($email->cc), + 'bcc' => json_decode($email->bcc), + ], + 'files' => $this->attachmentRepository->findWhere(['email_id' => $email->id])->map(function ($attachment) { + return (object) [ + 'id' => $attachment->id, + 'name' => $attachment->name, + 'path' => $attachment->path, + 'url' => $attachment->url, + 'created_at' => $attachment->created_at, + 'updated_at' => $attachment->updated_at, + ]; + }), + 'created_at' => $email->created_at, + 'updated_at' => $email->updated_at, + ]; + }))->sortByDesc('id')->sortByDesc('created_at'); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Lead/EmailController.php b/packages/Webkul/Admin/src/Http/Controllers/Lead/EmailController.php new file mode 100644 index 0000000..d13de16 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Lead/EmailController.php @@ -0,0 +1,83 @@ +getContent(), true); + + return response()->json([ + 'data' => $this->transformToActivity($response['data']), + 'message' => $response['message'], + ]); + + return $response; + } + + /** + * Store a newly created resource in storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function detach($id) + { + Event::dispatch('email.update.before', request()->input('email_id')); + + $email = $this->emailRepository->update([ + 'lead_id' => null, + ], request()->input('email_id')); + + Event::dispatch('email.update.after', $email); + + return response()->json([ + 'message' => trans('admin::app.mail.update-success'), + ]); + } + + /** + * Transform the email data to activity resource. + * + * @param array $data + * @return \Webkul\Admin\Http\Resources\ActivityResource + */ + public function transformToActivity($data) + { + return new ActivityResource((object) [ + 'id' => $data['id'], + 'parent_id' => $data['parent_id'], + 'title' => $data['subject'], + 'type' => 'email', + 'is_done' => 1, + 'comment' => $data['reply'], + 'schedule_from' => null, + 'schedule_to' => null, + 'user' => auth()->guard('user')->user(), + 'participants' => [], + 'location' => null, + 'additional' => json_encode([ + 'folders' => $data['folders'], + 'from' => $data['from'], + 'to' => $data['reply_to'], + 'cc' => $data['cc'], + 'bcc' => $data['bcc'], + ]), + 'files' => array_map(function ($attachment) { + return (object) $attachment; + }, $data['attachments']), + 'created_at' => $data['created_at'], + 'updated_at' => $data['updated_at'], + ]); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Lead/LeadController.php b/packages/Webkul/Admin/src/Http/Controllers/Lead/LeadController.php new file mode 100755 index 0000000..0b258fd --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Lead/LeadController.php @@ -0,0 +1,734 @@ +request->add(['entity_type' => 'leads']); + } + + /** + * Display a listing of the resource. + */ + public function index() + { + if (request()->ajax()) { + return datagrid(LeadDataGrid::class)->process(); + } + + if (request('pipeline_id')) { + $pipeline = $this->pipelineRepository->find(request('pipeline_id')); + } else { + $pipeline = $this->pipelineRepository->getDefaultPipeline(); + } + + return view('admin::leads.index', [ + 'pipeline' => $pipeline, + 'columns' => $this->getKanbanColumns(), + ]); + } + + /** + * Returns a listing of the resource. + */ + public function get(): JsonResponse + { + if (request()->query('pipeline_id')) { + $pipeline = $this->pipelineRepository->find(request()->query('pipeline_id')); + } else { + $pipeline = $this->pipelineRepository->getDefaultPipeline(); + } + + if ($stageId = request()->query('pipeline_stage_id')) { + $stages = $pipeline->stages->where('id', request()->query('pipeline_stage_id')); + } else { + $stages = $pipeline->stages; + } + + foreach ($stages as $stage) { + /** + * We have to create a new instance of the lead repository every time, which is + * why we're not using the injected one. + */ + $query = app(LeadRepository::class) + ->pushCriteria(app(RequestCriteria::class)) + ->where([ + 'lead_pipeline_id' => $pipeline->id, + 'lead_pipeline_stage_id' => $stage->id, + ]); + + if ($userIds = bouncer()->getAuthorizedUserIds()) { + $query->whereIn('leads.user_id', $userIds); + } + + $stage->lead_value = (clone $query)->sum('lead_value'); + + $data[$stage->sort_order] = (new StageResource($stage))->jsonSerialize(); + + $data[$stage->sort_order]['leads'] = [ + 'data' => LeadResource::collection($paginator = $query->with([ + 'tags', + 'type', + 'source', + 'user', + 'person', + 'person.organization', + 'pipeline', + 'pipeline.stages', + 'stage', + 'attribute_values', + ])->paginate(10)), + + 'meta' => [ + 'current_page' => $paginator->currentPage(), + 'from' => $paginator->firstItem(), + 'last_page' => $paginator->lastPage(), + 'per_page' => $paginator->perPage(), + 'to' => $paginator->lastItem(), + 'total' => $paginator->total(), + ], + ]; + } + + return response()->json($data); + } + + /** + * Show the form for creating a new resource. + */ + public function create(): View + { + return view('admin::leads.create'); + } + + /** + * Store a newly created resource in storage. + */ + public function store(LeadForm $request): RedirectResponse|JsonResponse + { + Event::dispatch('lead.create.before'); + + $data = request()->all(); + + $data['status'] = 1; + + if (! empty($data['lead_pipeline_stage_id'])) { + $stage = $this->stageRepository->findOrFail($data['lead_pipeline_stage_id']); + + $data['lead_pipeline_id'] = $stage->lead_pipeline_id; + } else { + if (empty($data['lead_pipeline_id'])) { + $pipeline = $this->pipelineRepository->getDefaultPipeline(); + + $data['lead_pipeline_id'] = $pipeline->id; + } else { + $pipeline = $this->pipelineRepository->findOrFail($data['lead_pipeline_id']); + } + + $stage = $pipeline->stages()->first(); + + $data['lead_pipeline_stage_id'] = $stage->id; + } + + if (in_array($stage->code, ['won', 'lost'])) { + $data['closed_at'] = Carbon::now(); + } + + $lead = $this->leadRepository->create($data); + + if (request()->ajax()) { + return response()->json([ + 'message' => trans('admin::app.leads.create-success'), + 'data' => new LeadResource($lead), + ]); + } + + Event::dispatch('lead.create.after', $lead); + + session()->flash('success', trans('admin::app.leads.create-success')); + + if (! empty($data['lead_pipeline_id'])) { + $params['pipeline_id'] = $data['lead_pipeline_id']; + } + + return redirect()->route('admin.leads.index', $params ?? []); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(int $id): View + { + $lead = $this->leadRepository->findOrFail($id); + + return view('admin::leads.edit', compact('lead')); + } + + /** + * Display a resource. + */ + public function view(int $id) + { + $lead = $this->leadRepository->findOrFail($id); + + $userIds = bouncer()->getAuthorizedUserIds(); + + if ( + $userIds + && ! in_array($lead->user_id, $userIds) + ) { + return redirect()->route('admin.leads.index'); + } + + return view('admin::leads.view', compact('lead')); + } + + /** + * Update the specified resource in storage. + */ + public function update(LeadForm $request, int $id): RedirectResponse|JsonResponse + { + Event::dispatch('lead.update.before', $id); + + $data = $request->all(); + + if (isset($data['lead_pipeline_stage_id'])) { + $stage = $this->stageRepository->findOrFail($data['lead_pipeline_stage_id']); + + $data['lead_pipeline_id'] = $stage->lead_pipeline_id; + } else { + $pipeline = $this->pipelineRepository->getDefaultPipeline(); + + $stage = $pipeline->stages()->first(); + + $data['lead_pipeline_id'] = $pipeline->id; + + $data['lead_pipeline_stage_id'] = $stage->id; + } + + $lead = $this->leadRepository->update($data, $id); + + Event::dispatch('lead.update.after', $lead); + + if (request()->ajax()) { + return response()->json([ + 'message' => trans('admin::app.leads.update-success'), + ]); + } + + session()->flash('success', trans('admin::app.leads.update-success')); + + if (request()->has('closed_at')) { + return redirect()->back(); + } else { + return redirect()->route('admin.leads.index', $data['lead_pipeline_id']); + } + } + + /** + * Update the lead attributes. + */ + public function updateAttributes(int $id) + { + $data = request()->all(); + + $attributes = $this->attributeRepository->findWhere([ + 'entity_type' => 'leads', + ['code', 'NOTIN', ['title', 'description']], + ]); + + Event::dispatch('lead.update.before', $id); + + $lead = $this->leadRepository->update($data, $id, $attributes); + + Event::dispatch('lead.update.after', $lead); + + return response()->json([ + 'message' => trans('admin::app.leads.update-success'), + ]); + } + + /** + * Update the lead stage. + */ + public function updateStage(int $id) + { + $this->validate(request(), [ + 'lead_pipeline_stage_id' => 'required', + ]); + + $lead = $this->leadRepository->findOrFail($id); + + $stage = $lead->pipeline->stages() + ->where('id', request()->input('lead_pipeline_stage_id')) + ->firstOrFail(); + + Event::dispatch('lead.update.before', $id); + + $payload = request()->merge([ + 'entity_type' => 'leads', + 'lead_pipeline_stage_id' => $stage->id, + ])->only([ + 'closed_at', + 'lost_reason', + 'lead_pipeline_stage_id', + 'entity_type', + ]); + + $lead = $this->leadRepository->update($payload, $id, ['lead_pipeline_stage_id']); + + Event::dispatch('lead.update.after', $lead); + + return response()->json([ + 'message' => trans('admin::app.leads.update-success'), + ]); + } + + /** + * Search person results. + */ + public function search(): AnonymousResourceCollection + { + if ($userIds = bouncer()->getAuthorizedUserIds()) { + $results = $this->leadRepository + ->pushCriteria(app(RequestCriteria::class)) + ->findWhereIn('user_id', $userIds); + } else { + $results = $this->leadRepository + ->pushCriteria(app(RequestCriteria::class)) + ->all(); + } + + return LeadResource::collection($results); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(int $id): JsonResponse + { + $this->leadRepository->findOrFail($id); + + try { + Event::dispatch('lead.delete.before', $id); + + $this->leadRepository->delete($id); + + Event::dispatch('lead.delete.after', $id); + + return response()->json([ + 'message' => trans('admin::app.leads.destroy-success'), + ]); + } catch (\Exception $exception) { + return response()->json([ + 'message' => trans('admin::app.leads.destroy-failed'), + ], 400); + } + } + + /** + * Mass update the specified resources. + */ + public function massUpdate(MassUpdateRequest $massUpdateRequest): JsonResponse + { + $leads = $this->leadRepository->findWhereIn('id', $massUpdateRequest->input('indices')); + + try { + foreach ($leads as $lead) { + Event::dispatch('lead.update.before', $lead->id); + + $lead = $this->leadRepository->find($lead->id); + + $lead?->update(['lead_pipeline_stage_id' => $massUpdateRequest->input('value')]); + + Event::dispatch('lead.update.before', $lead->id); + } + + return response()->json([ + 'message' => trans('admin::app.leads.update-success'), + ]); + } catch (\Exception $th) { + return response()->json([ + 'message' => trans('admin::app.leads.update-failed'), + ], 400); + } + } + + /** + * Mass delete the specified resources. + */ + public function massDestroy(MassDestroyRequest $massDestroyRequest): JsonResponse + { + $leads = $this->leadRepository->findWhereIn('id', $massDestroyRequest->input('indices')); + + try { + foreach ($leads as $lead) { + Event::dispatch('lead.delete.before', $lead->id); + + $this->leadRepository->delete($lead->id); + + Event::dispatch('lead.delete.after', $lead->id); + } + + return response()->json([ + 'message' => trans('admin::app.leads.destroy-success'), + ]); + } catch (\Exception $exception) { + return response()->json([ + 'message' => trans('admin::app.leads.destroy-failed'), + ]); + } + } + + /** + * Attach product to lead. + */ + public function addProduct(int $leadId): JsonResponse + { + $product = $this->productRepository->updateOrCreate( + [ + 'lead_id' => $leadId, + 'product_id' => request()->input('product_id'), + ], + array_merge( + request()->all(), + [ + 'lead_id' => $leadId, + 'amount' => request()->input('price') * request()->input('quantity'), + ], + ) + ); + + return response()->json([ + 'data' => $product, + 'message' => trans('admin::app.leads.update-success'), + ]); + } + + /** + * Remove product attached to lead. + */ + public function removeProduct(int $id): JsonResponse + { + try { + Event::dispatch('lead.product.delete.before', $id); + + $this->productRepository->deleteWhere([ + 'lead_id' => $id, + 'product_id' => request()->input('product_id'), + ]); + + Event::dispatch('lead.product.delete.after', $id); + + return response()->json([ + 'message' => trans('admin::app.leads.destroy-success'), + ]); + } catch (\Exception $exception) { + return response()->json([ + 'message' => trans('admin::app.leads.destroy-failed'), + ]); + } + } + + /** + * Kanban lookup. + */ + public function kanbanLookup() + { + $params = $this->validate(request(), [ + 'column' => ['required'], + 'search' => ['required', 'min:2'], + ]); + + /** + * Finding the first column from the collection. + */ + $column = collect($this->getKanbanColumns())->where('index', $params['column'])->firstOrFail(); + + /** + * Fetching on the basis of column options. + */ + return app($column['filterable_options']['repository']) + ->select([$column['filterable_options']['column']['label'].' as label', $column['filterable_options']['column']['value'].' as value']) + ->where($column['filterable_options']['column']['label'], 'LIKE', '%'.$params['search'].'%') + ->get() + ->map + ->only('label', 'value'); + } + + /** + * Get columns for the kanban view. + */ + private function getKanbanColumns(): array + { + return [ + [ + 'index' => 'id', + 'label' => trans('admin::app.leads.index.kanban.columns.id'), + 'type' => 'integer', + 'searchable' => false, + 'search_field' => 'in', + 'filterable' => true, + 'filterable_type' => null, + 'filterable_options' => [], + 'allow_multiple_values' => true, + 'sortable' => true, + 'visibility' => true, + ], + [ + 'index' => 'lead_value', + 'label' => trans('admin::app.leads.index.kanban.columns.lead-value'), + 'type' => 'string', + 'searchable' => false, + 'search_field' => 'in', + 'filterable' => true, + 'filterable_type' => null, + 'filterable_options' => [], + 'allow_multiple_values' => true, + 'sortable' => true, + 'visibility' => true, + ], + [ + 'index' => 'user_id', + 'label' => trans('admin::app.leads.index.kanban.columns.sales-person'), + 'type' => 'string', + 'searchable' => false, + 'search_field' => 'in', + 'filterable' => true, + 'filterable_type' => 'searchable_dropdown', + 'filterable_options' => [ + 'repository' => UserRepository::class, + 'column' => [ + 'label' => 'name', + 'value' => 'id', + ], + ], + 'allow_multiple_values' => true, + 'sortable' => true, + 'visibility' => true, + ], + [ + 'index' => 'person.id', + 'label' => trans('admin::app.leads.index.kanban.columns.contact-person'), + 'type' => 'string', + 'searchable' => false, + 'search_field' => 'in', + 'filterable' => true, + 'filterable_options' => [], + 'allow_multiple_values' => true, + 'sortable' => true, + 'visibility' => true, + 'filterable_type' => 'searchable_dropdown', + 'filterable_options' => [ + 'repository' => PersonRepository::class, + 'column' => [ + 'label' => 'name', + 'value' => 'id', + ], + ], + ], + [ + 'index' => 'lead_type_id', + 'label' => trans('admin::app.leads.index.kanban.columns.lead-type'), + 'type' => 'string', + 'searchable' => false, + 'search_field' => 'in', + 'filterable' => true, + 'filterable_type' => 'dropdown', + 'filterable_options' => $this->typeRepository->all(['name as label', 'id as value'])->toArray(), + 'allow_multiple_values' => true, + 'sortable' => true, + 'visibility' => true, + ], + [ + 'index' => 'lead_source_id', + 'label' => trans('admin::app.leads.index.kanban.columns.source'), + 'type' => 'string', + 'searchable' => false, + 'search_field' => 'in', + 'filterable' => true, + 'filterable_type' => 'dropdown', + 'filterable_options' => $this->sourceRepository->all(['name as label', 'id as value'])->toArray(), + 'allow_multiple_values' => true, + 'sortable' => true, + 'visibility' => true, + ], + [ + 'index' => 'tags.name', + 'label' => trans('admin::app.leads.index.kanban.columns.tags'), + 'type' => 'string', + 'searchable' => false, + 'search_field' => 'in', + 'filterable' => true, + 'filterable_options' => [], + 'allow_multiple_values' => true, + 'sortable' => true, + 'visibility' => true, + 'filterable_type' => 'searchable_dropdown', + 'filterable_options' => [ + 'repository' => TagRepository::class, + 'column' => [ + 'label' => 'name', + 'value' => 'name', + ], + ], + ], + ]; + } + + /** + * Create lead with specified AI. + */ + public function createByAI() + { + $leadData = []; + + $errorMessages = []; + + foreach (request()->file('files') as $file) { + $lead = $this->processFile($file); + + if ( + isset($lead['status']) + && $lead['status'] === 'error' + ) { + $errorMessages[] = $lead['message']; + } else { + $leadData[] = $lead; + } + } + + if (isset($errorMessages[0]['code'])) { + return response()->json(MagicAI::errorHandler($errorMessages[0]['message'])); + } + + if ( + empty($leadData) + && ! empty($errorMessages) + ) { + return response()->json(MagicAI::errorHandler(implode(', ', $errorMessages)), 400); + } + + if (empty($leadData)) { + return response()->json(MagicAI::errorHandler(trans('admin::app.leads.no-valid-files')), 400); + } + + return response()->json([ + 'message' => trans('admin::app.leads.create-success'), + 'leads' => $this->createLeads($leadData), + ]); + } + + /** + * Process file. + * + * @param mixed $file + */ + private function processFile($file) + { + $validator = Validator::make( + ['file' => $file], + ['file' => 'required|extensions:'.str_replace(' ', '', self::SUPPORTED_TYPES)] + ); + + if ($validator->fails()) { + return MagicAI::errorHandler($validator->errors()->first()); + } + + $base64Pdf = base64_encode(file_get_contents($file->getRealPath())); + + $extractedData = MagicAIService::extractDataFromFile($base64Pdf); + + $lead = MagicAI::mapAIDataToLead($extractedData); + + return $lead; + } + + /** + * Create multiple leads. + */ + private function createLeads($rawLeads): array + { + $leads = []; + + foreach ($rawLeads as $rawLead) { + Event::dispatch('lead.create.before'); + + foreach ($rawLead['person']['emails'] as $email) { + $person = $this->personRepository + ->whereJsonContains('emails', [['value' => $email['value']]]) + ->first(); + + if ($person) { + $rawLead['person']['id'] = $person->id; + + break; + } + } + + $pipeline = $this->pipelineRepository->getDefaultPipeline(); + + $stage = $pipeline->stages()->first(); + + $lead = $this->leadRepository->create(array_merge($rawLead, [ + 'lead_pipeline_id' => $pipeline->id, + 'lead_pipeline_stage_id' => $stage->id, + ])); + + Event::dispatch('lead.create.after', $lead); + + $leads[] = $lead; + } + + return $leads; + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Lead/QuoteController.php b/packages/Webkul/Admin/src/Http/Controllers/Lead/QuoteController.php new file mode 100644 index 0000000..e189c0e --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Lead/QuoteController.php @@ -0,0 +1,66 @@ +leadRepository->find($id); + + if (! $lead->quotes->contains(request('id'))) { + $lead->quotes()->attach(request('id')); + } + + Event::dispatch('leads.quote.create.after', $lead); + + return response()->json([ + 'message' => trans('admin::app.leads.quote-create-success'), + ], 200); + } + + /** + * Remove the specified resource from storage. + * + * @param int $leadId + * @param int $tagId + * @return \Illuminate\Http\Response + */ + public function delete($leadId) + { + Event::dispatch('leads.quote.delete.before', $leadId); + + $lead = $this->leadRepository->find($leadId); + + $lead->quotes()->detach(request('quote_id')); + + Event::dispatch('leads.quote.delete.after', $lead); + + return response()->json([ + 'message' => trans('admin::app.leads.view.quotes.destroy-success'), + ], 200); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Lead/TagController.php b/packages/Webkul/Admin/src/Http/Controllers/Lead/TagController.php new file mode 100644 index 0000000..4558394 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Lead/TagController.php @@ -0,0 +1,61 @@ +leadRepository->find($id); + + if (! $lead->tags->contains(request()->input('tag_id'))) { + $lead->tags()->attach(request()->input('tag_id')); + } + + Event::dispatch('leads.tag.create.after', $lead); + + return response()->json([ + 'message' => trans('admin::app.leads.view.tags.create-success'), + ]); + } + + /** + * Remove the specified resource from storage. + * + * @param int $leadId + * @return \Illuminate\Http\Response + */ + public function detach($leadId) + { + Event::dispatch('leads.tag.delete.before', $leadId); + + $lead = $this->leadRepository->find($leadId); + + $lead->tags()->detach(request()->input('tag_id')); + + Event::dispatch('leads.tag.delete.after', $lead); + + return response()->json([ + 'message' => trans('admin::app.leads.view.tags.destroy-success'), + ]); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Mail/EmailController.php b/packages/Webkul/Admin/src/Http/Controllers/Mail/EmailController.php new file mode 100644 index 0000000..3cd8aab --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Mail/EmailController.php @@ -0,0 +1,336 @@ +route('admin.mail.index', ['route' => 'inbox']); + } + + if (! bouncer()->hasPermission('mail.'.request('route'))) { + abort(401, 'This action is unauthorized'); + } + + switch (request('route')) { + case 'compose': + return view('admin::mail.compose'); + + default: + if (request()->ajax()) { + return datagrid(EmailDataGrid::class)->process(); + } + + return view('admin::mail.index'); + } + } + + /** + * Display a resource. + * + * @return \Illuminate\View\View + */ + public function view() + { + $email = $this->emailRepository + ->with(['emails', 'attachments', 'emails.attachments', 'lead', 'lead.person', 'lead.tags', 'lead.source', 'lead.type', 'person']) + ->findOrFail(request('id')); + + if ($userIds = bouncer()->getAuthorizedUserIds()) { + $results = $this->leadRepository->findWhere([ + ['id', '=', $email->lead_id], + ['user_id', 'IN', $userIds], + ]); + } else { + $results = $this->leadRepository->findWhere([ + ['id', '=', $email->lead_id], + ]); + } + + if (empty($results->toArray())) { + unset($email->lead_id); + } + + if (request('route') == 'draft') { + return response()->json([ + 'data' => new EmailResource($email), + ]); + } + + return view('admin::mail.view', compact('email')); + } + + /** + * Store a newly created resource in storage. + * + * @return \Illuminate\Http\Response + */ + public function store() + { + $this->validate(request(), [ + 'reply_to' => 'required|array|min:1', + 'reply_to.*' => 'email', + 'reply' => 'required', + ]); + + Event::dispatch('email.create.before'); + + $email = $this->emailRepository->create(request()->all()); + + if (! request('is_draft')) { + try { + Mail::send(new Email($email)); + + $this->emailRepository->update([ + 'folders' => ['sent'], + ], $email->id); + } catch (\Exception $e) { + } + } + + Event::dispatch('email.create.after', $email); + + if (request()->ajax()) { + return response()->json([ + 'data' => new EmailResource($email), + 'message' => trans('admin::app.mail.create-success'), + ]); + } + + if (request('is_draft')) { + session()->flash('success', trans('admin::app.mail.saved-to-draft')); + + return redirect()->route('admin.mail.index', ['route' => 'draft']); + } + + session()->flash('success', trans('admin::app.mail.create-success')); + + return redirect()->route('admin.mail.index', ['route' => 'sent']); + } + + /** + * Update the specified resource in storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update($id) + { + Event::dispatch('email.update.before', $id); + + $data = request()->all(); + + if (! is_null(request('is_draft'))) { + $data['folders'] = request('is_draft') ? ['draft'] : ['outbox']; + } + + $email = $this->emailRepository->update($data, request('id') ?? $id); + + Event::dispatch('email.update.after', $email); + + if (! is_null(request('is_draft')) && ! request('is_draft')) { + try { + Mail::send(new Email($email)); + + $this->emailRepository->update([ + 'folders' => ['inbox', 'sent'], + ], $email->id); + } catch (\Exception $e) { + } + } + + if (! is_null(request('is_draft'))) { + if (request('is_draft')) { + session()->flash('success', trans('admin::app.mail.saved-to-draft')); + + return redirect()->route('admin.mail.index', ['route' => 'draft']); + } else { + session()->flash('success', trans('admin::app.mail.create-success')); + + return redirect()->route('admin.mail.index', ['route' => 'inbox']); + } + } + + if (request()->ajax()) { + return response()->json([ + 'data' => new EmailResource($email->refresh()), + 'message' => trans('admin::app.mail.update-success'), + ]); + } + + session()->flash('success', trans('admin::app.mail.update-success')); + + return redirect()->back(); + } + + /** + * Run process inbound parse email. + * + * @return \Illuminate\Http\Response + */ + public function inboundParse(InboundEmailProcessor $inboundEmailProcessor) + { + $inboundEmailProcessor->processMessage(request('email')); + + return response()->json([], 200); + } + + /** + * Download file from storage + * + * @param int $id + * @return \Illuminate\View\View + */ + public function download($id) + { + $attachment = $this->attachmentRepository->findOrFail($id); + + try { + return Storage::download($attachment->path); + } catch (\Exception $e) { + session()->flash('error', $e->getMessage()); + + return redirect()->back(); + } + } + + /** + * Mass Update the specified resources. + */ + public function massUpdate(MassUpdateRequest $massUpdateRequest): JsonResponse + { + $emails = $this->emailRepository->findWhereIn('id', $massUpdateRequest->input('indices')); + + try { + foreach ($emails as $email) { + Event::dispatch('email.update.before', $email->id); + + $this->emailRepository->update([ + 'folders' => request('folders'), + ], $email->id); + + Event::dispatch('email.update.after', $email->id); + } + + return response()->json([ + 'message' => trans('admin::app.mail.mass-update-success'), + ]); + } catch (Exception) { + return response()->json([ + 'message' => trans('admin::app.mail.mass-update-success'), + ], 400); + } + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(int $id): JsonResponse|RedirectResponse + { + $email = $this->emailRepository->findOrFail($id); + + try { + Event::dispatch('email.'.request('type').'.before', $id); + + $parentId = $email->parent_id; + + if (request('type') == 'trash') { + $this->emailRepository->update([ + 'folders' => ['trash'], + ], $id); + } else { + $this->emailRepository->delete($id); + } + + Event::dispatch('email.'.request('type').'.after', $id); + + if (request()->ajax()) { + return response()->json([ + 'message' => trans('admin::app.mail.delete-success'), + ], 200); + } + + session()->flash('success', trans('admin::app.mail.delete-success')); + + if ($parentId) { + return redirect()->back(); + } + + return redirect()->route('admin.mail.index', ['route' => 'inbox']); + } catch (\Exception $exception) { + if (request()->ajax()) { + return response()->json([ + 'message' => trans('admin::app.mail.delete-failed'), + ], 400); + } + + session()->flash('error', trans('admin::app.mail.delete-failed')); + + return redirect()->back(); + } + } + + /** + * Mass Delete the specified resources. + */ + public function massDestroy(MassDestroyRequest $massDestroyRequest): JsonResponse + { + $mails = $this->emailRepository->findWhereIn('id', $massDestroyRequest->input('indices')); + + try { + foreach ($mails as $email) { + Event::dispatch('email.'.$massDestroyRequest->input('type').'.before', $email->id); + + if ($massDestroyRequest->input('type') == 'trash') { + $this->emailRepository->update(['folders' => ['trash']], $email->id); + } else { + $this->emailRepository->delete($email->id); + } + + Event::dispatch('email.'.$massDestroyRequest->input('type').'.after', $email->id); + } + + return response()->json([ + 'message' => trans('admin::app.mail.delete-success'), + ]); + } catch (\Exception $e) { + return response()->json([ + 'message' => trans('admin::app.mail.delete-success'), + ]); + } + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Mail/TagController.php b/packages/Webkul/Admin/src/Http/Controllers/Mail/TagController.php new file mode 100644 index 0000000..29877e4 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Mail/TagController.php @@ -0,0 +1,56 @@ +emailRepository->find($id); + + if (! $mail->tags->contains(request()->input('tag_id'))) { + $mail->tags()->attach(request()->input('tag_id')); + } + + Event::dispatch('mails.tag.create.after', $mail); + + return response()->json([ + 'message' => trans('admin::app.mail.view.tags.create-success'), + ]); + } + + /** + * Remove the specified resource from storage. + */ + public function detach(int $mailId): JsonResponse + { + Event::dispatch('mails.tag.delete.before', $mailId); + + $mail = $this->emailRepository->find($mailId); + + $mail->tags()->detach(request()->input('tag_id')); + + Event::dispatch('mails.tag.delete.after', $mail); + + return response()->json([ + 'message' => trans('admin::app.mail.view.tags.destroy-success'), + ]); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Products/ActivityController.php b/packages/Webkul/Admin/src/Http/Controllers/Products/ActivityController.php new file mode 100644 index 0000000..e342b33 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Products/ActivityController.php @@ -0,0 +1,45 @@ +activityRepository + ->leftJoin('product_activities', 'activities.id', '=', 'product_activities.activity_id') + ->where('product_activities.product_id', $id) + ->get(); + + return ActivityResource::collection($this->concatEmail($activities)); + } + + /** + * Store a newly created resource in storage. + */ + public function concatEmail($activities) + { + return $activities->sortByDesc('id')->sortByDesc('created_at'); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Products/ProductController.php b/packages/Webkul/Admin/src/Http/Controllers/Products/ProductController.php new file mode 100644 index 0000000..58edcf2 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Products/ProductController.php @@ -0,0 +1,216 @@ +request->add(['entity_type' => 'products']); + } + + /** + * Display a listing of the resource. + */ + public function index(): View|JsonResponse + { + if (request()->ajax()) { + return datagrid(ProductDataGrid::class)->process(); + } + + return view('admin::products.index'); + } + + /** + * Show the form for creating a new resource. + */ + public function create(): View + { + return view('admin::products.create'); + } + + /** + * Store a newly created resource in storage. + * + * @return \Illuminate\Http\Response + */ + public function store(AttributeForm $request) + { + Event::dispatch('product.create.before'); + + $product = $this->productRepository->create($request->all()); + + Event::dispatch('product.create.after', $product); + + session()->flash('success', trans('admin::app.products.index.create-success')); + + return redirect()->route('admin.products.index'); + } + + /** + * Show the form for viewing the specified resource. + */ + public function view(int $id): View + { + $product = $this->productRepository->findOrFail($id); + + return view('admin::products.view', compact('product')); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(int $id): View|JsonResponse + { + $product = $this->productRepository->findOrFail($id); + + $inventories = $product->inventories() + ->with('location') + ->get() + ->map(function ($inventory) { + return [ + 'id' => $inventory->id, + 'name' => $inventory->location->name, + 'warehouse_id' => $inventory->warehouse_id, + 'warehouse_location_id' => $inventory->warehouse_location_id, + 'in_stock' => $inventory->in_stock, + 'allocated' => $inventory->allocated, + ]; + }); + + return view('admin::products.edit', compact('product', 'inventories')); + } + + /** + * Update the specified resource in storage. + */ + public function update(AttributeForm $request, int $id) + { + Event::dispatch('product.update.before', $id); + + $product = $this->productRepository->update($request->all(), $id); + + Event::dispatch('product.update.after', $product); + + if (request()->ajax()) { + return response()->json([ + 'message' => trans('admin::app.products.index.update-success'), + ]); + } + + session()->flash('success', trans('admin::app.products.index.update-success')); + + return redirect()->route('admin.products.index'); + } + + /** + * Store a newly created resource in storage. + */ + public function storeInventories(int $id, ?int $warehouseId = null): JsonResponse + { + $this->validate(request(), [ + 'inventories' => 'array', + 'inventories.*.warehouse_location_id' => 'required', + 'inventories.*.warehouse_id' => 'required', + 'inventories.*.in_stock' => 'required|integer|min:0', + 'inventories.*.allocated' => 'required|integer|min:0', + ]); + + $product = $this->productRepository->findOrFail($id); + + Event::dispatch('product.update.before', $id); + + $this->productRepository->saveInventories(request()->all(), $id, $warehouseId); + + Event::dispatch('product.update.after', $product); + + return new JsonResponse([ + 'message' => trans('admin::app.products.index.update-success'), + ], 200); + } + + /** + * Search product results + */ + public function search(): JsonResource + { + $products = $this->productRepository + ->pushCriteria(app(RequestCriteria::class)) + ->orderBy('created_at', 'desc') + ->take(5) + ->get(); + + return ProductResource::collection($products); + } + + /** + * Returns product inventories grouped by warehouse. + */ + public function warehouses(int $id): JsonResponse + { + $warehouses = $this->productRepository->getInventoriesGroupedByWarehouse($id); + + return response()->json(array_values($warehouses)); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(int $id): JsonResponse + { + $product = $this->productRepository->findOrFail($id); + + try { + Event::dispatch('settings.products.delete.before', $id); + + $product->delete($id); + + Event::dispatch('settings.products.delete.after', $id); + + return new JsonResponse([ + 'message' => trans('admin::app.products.index.delete-success'), + ], 200); + } catch (\Exception $exception) { + return new JsonResponse([ + 'message' => trans('admin::app.products.index.delete-failed'), + ], 400); + } + } + + /** + * Mass Delete the specified resources. + */ + public function massDestroy(MassDestroyRequest $massDestroyRequest): JsonResponse + { + $indices = $massDestroyRequest->input('indices'); + + foreach ($indices as $index) { + Event::dispatch('product.delete.before', $index); + + $this->productRepository->delete($index); + + Event::dispatch('product.delete.after', $index); + } + + return new JsonResponse([ + 'message' => trans('admin::app.products.index.delete-success'), + ]); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Products/TagController.php b/packages/Webkul/Admin/src/Http/Controllers/Products/TagController.php new file mode 100644 index 0000000..9a6beea --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Products/TagController.php @@ -0,0 +1,61 @@ +productRepository->findOrFail($id); + + if (! $product->tags->contains(request()->input('tag_id'))) { + $product->tags()->attach(request()->input('tag_id')); + } + + Event::dispatch('products.tag.create.after', $product); + + return response()->json([ + 'message' => trans('admin::app.leads.view.tags.create-success'), + ]); + } + + /** + * Remove the specified resource from storage. + * + * @param int $productId + * @return \Illuminate\Http\Response + */ + public function detach($productId) + { + Event::dispatch('products.tag.delete.before', $productId); + + $product = $this->productRepository->find($productId); + + $product->tags()->detach(request()->input('tag_id')); + + Event::dispatch('products.tag.delete.after', $product); + + return response()->json([ + 'message' => trans('admin::app.leads.view.tags.destroy-success'), + ]); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Quote/QuoteController.php b/packages/Webkul/Admin/src/Http/Controllers/Quote/QuoteController.php new file mode 100644 index 0000000..6747798 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Quote/QuoteController.php @@ -0,0 +1,198 @@ +request->add(['entity_type' => 'quotes']); + } + + /** + * Display a listing of the resource. + */ + public function index(): View|JsonResponse + { + if (request()->ajax()) { + return datagrid(QuoteDataGrid::class)->process(); + } + + return view('admin::quotes.index'); + } + + /** + * Show the form for creating a new resource. + */ + public function create(): View + { + $lead = $this->leadRepository->find(request('id')); + + return view('admin::quotes.create', compact('lead')); + } + + /** + * Store a newly created resource in storage. + */ + public function store(AttributeForm $request): RedirectResponse + { + Event::dispatch('quote.create.before'); + + $quote = $this->quoteRepository->create($request->all()); + + $leadId = request('lead_id'); + + if ($leadId) { + $lead = $this->leadRepository->find($leadId); + + $lead->quotes()->attach($quote->id); + } + + Event::dispatch('quote.create.after', $quote); + + session()->flash('success', trans('admin::app.quotes.index.create-success')); + + return request()->query('from') === 'lead' && $leadId + ? redirect()->route('admin.leads.view', ['id' => $leadId, 'from' => 'quotes']) + : redirect()->route('admin.quotes.index'); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(int $id): View + { + $quote = $this->quoteRepository->findOrFail($id); + + return view('admin::quotes.edit', compact('quote')); + } + + /** + * Update the specified resource in storage. + */ + public function update(AttributeForm $request, int $id): RedirectResponse + { + Event::dispatch('quote.update.before', $id); + + $quote = $this->quoteRepository->update($request->all(), $id); + + $quote->leads()->detach(); + + $leadId = request('lead_id'); + + if ($leadId) { + $lead = $this->leadRepository->find($leadId); + + $lead->quotes()->attach($quote->id); + } + + Event::dispatch('quote.update.after', $quote); + + session()->flash('success', trans('admin::app.quotes.index.update-success')); + + return request()->query('from') === 'lead' && $leadId + ? redirect()->route('admin.leads.view', ['id' => $leadId, 'from' => 'quotes']) + : redirect()->route('admin.quotes.index'); + } + + /** + * Search the quotes. + */ + public function search(): AnonymousResourceCollection + { + $quotes = $this->quoteRepository + ->pushCriteria(app(RequestCriteria::class)) + ->all(); + + return QuoteResource::collection($quotes); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(int $id): JsonResponse + { + $this->quoteRepository->findOrFail($id); + + try { + Event::dispatch('quote.delete.before', $id); + + $this->quoteRepository->delete($id); + + Event::dispatch('quote.delete.after', $id); + + return response()->json([ + 'message' => trans('admin::app.quotes.index.delete-success'), + ], 200); + } catch (\Exception $exception) { + return response()->json([ + 'message' => trans('admin::app.quotes.index.delete-failed'), + ], 400); + } + } + + /** + * Mass Delete the specified resources. + */ + public function massDestroy(MassDestroyRequest $massDestroyRequest): JsonResponse + { + $quotes = $this->quoteRepository->findWhereIn('id', $massDestroyRequest->input('indices')); + + try { + foreach ($quotes as $quotes) { + Event::dispatch('quote.delete.before', $quotes->id); + + $this->quoteRepository->delete($quotes->id); + + Event::dispatch('quote.delete.after', $quotes->id); + } + + return response()->json([ + 'message' => trans('admin::app.quotes.index.delete-success'), + ]); + } catch (\Exception $exception) { + return response()->json([ + 'message' => trans('admin::app.quotes.index.delete-failed'), + ], 400); + } + } + + /** + * Print and download the for the specified resource. + */ + public function print($id): Response|StreamedResponse + { + $quote = $this->quoteRepository->findOrFail($id); + + return $this->downloadPDF( + view('admin::quotes.pdf', compact('quote'))->render(), + 'Quote_'.$quote->subject.'_'.$quote->created_at->format('d-m-Y') + ); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/AttributeController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/AttributeController.php new file mode 100644 index 0000000..1f00526 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/AttributeController.php @@ -0,0 +1,236 @@ +ajax()) { + return datagrid(AttributeDataGrid::class)->process(); + } + + return view('admin::settings.attributes.index'); + } + + /** + * Show the form for creating a new resource. + */ + public function create(): View + { + return view('admin::settings.attributes.create'); + } + + /** + * Store a newly created resource in storage. + */ + public function store(): RedirectResponse + { + $this->validate(request(), [ + 'code' => ['required', 'unique:attributes,code,NULL,NULL,entity_type,'.request('entity_type'), new Code], + 'name' => 'required', + 'type' => 'required', + ]); + + Event::dispatch('settings.attribute.create.before'); + + request()->request->add(['quick_add' => 1]); + + $attribute = $this->attributeRepository->create(request()->all()); + + Event::dispatch('settings.attribute.create.after', $attribute); + + session()->flash('success', trans('admin::app.settings.attributes.index.create-success')); + + return redirect()->route('admin.settings.attributes.index'); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(int $id): View + { + $attribute = $this->attributeRepository->findOrFail($id); + + return view('admin::settings.attributes.edit', compact('attribute')); + } + + /** + * Update the specified resource in storage. + */ + public function update($id): RedirectResponse + { + $this->validate(request(), [ + 'code' => ['required', 'unique:attributes,code,NULL,NULL,entity_type,'.$id, new Code], + 'name' => 'required', + 'type' => 'required', + ]); + + Event::dispatch('settings.attribute.update.before', $id); + + $attribute = $this->attributeRepository->update(request()->all(), $id); + + Event::dispatch('settings.attribute.update.after', $attribute); + + session()->flash('success', trans('admin::app.settings.attributes.index.update-success')); + + return redirect()->route('admin.settings.attributes.index'); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(int $id): JsonResponse + { + $attribute = $this->attributeRepository->findOrFail($id); + + if (! $attribute->is_user_defined) { + return response()->json([ + 'message' => trans('admin::app.settings.attributes.index.user-define-error'), + ], 400); + } + + try { + Event::dispatch('settings.attribute.delete.before', $id); + + $this->attributeRepository->delete($id); + + Event::dispatch('settings.attribute.delete.after', $id); + + return response()->json([ + 'status' => true, + 'message' => trans('admin::app.settings.attributes.index.delete-success'), + ], 200); + } catch (\Exception $exception) { + return response()->json([ + 'message' => trans('admin::app.settings.attributes.index.delete-failed'), + ], 400); + } + } + + /** + * Check unique validation. + * + * @return void + */ + public function checkUniqueValidation() + { + $attribute = $this->attributeRepository->findOneWhere([ + 'code' => request('attribute_code'), + ]); + + return response()->json([ + 'validated' => $this->attributeValueRepository->isValueUnique( + request('entity_id'), + request('entity_type'), + $attribute, + request('attribute_value'), + ), + ]); + } + + /** + * Search attribute lookup results + */ + public function lookup($lookup): JsonResponse + { + $results = $this->attributeRepository->getLookUpOptions($lookup, request()->input('query')); + + return response()->json($results); + } + + /** + * Search attribute lookup results + */ + public function lookupEntity(string $lookup): JsonResponse + { + $result = $this->attributeRepository->getLookUpEntity($lookup, request()->input('query')); + + return response()->json($result); + } + + /** + * Mass Delete the specified resources. + */ + public function massDestroy(MassDestroyRequest $massDestroyRequest): JsonResponse + { + $count = 0; + + $attributes = $this->attributeRepository->findWhereIn('id', $massDestroyRequest->input('indices')); + + foreach ($attributes as $attribute) { + $attribute = $this->attributeRepository->find($attribute->id); + + if (! $attribute->is_user_defined) { + continue; + } + + Event::dispatch('settings.attribute.delete.before', $attribute->id); + + $this->attributeRepository->delete($attribute->id); + + Event::dispatch('settings.attribute.delete.after', $attribute->id); + + $count++; + } + + if (! $count) { + return response()->json([ + 'message' => trans('admin::app.settings.attributes.index.mass-delete-failed'), + ], 400); + } + + return response()->json([ + 'message' => trans('admin::app.settings.attributes.index.delete-success'), + ]); + } + + /** + * Get attribute options associated with attribute. + * + * @return \Illuminate\View\View + */ + public function getAttributeOptions(int $id) + { + $attribute = $this->attributeRepository->findOrFail($id); + + return $attribute->options()->orderBy('sort_order')->get(); + } + + /** + * Download image or file + */ + public function download() + { + if (! request('path')) { + return false; + } + + return Storage::download(request('path')); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/DataTransfer/ImportController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/DataTransfer/ImportController.php new file mode 100755 index 0000000..242d54a --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/DataTransfer/ImportController.php @@ -0,0 +1,491 @@ +ajax()) { + return datagrid(ImportDataGrid::class)->process(); + } + + return view('admin::settings.data-transfer.imports.index'); + } + + /** + * Show the form for creating a new resource. + */ + public function create(): View + { + return view('admin::settings.data-transfer.imports.create'); + } + + /** + * Store a newly created resource in storage. + */ + public function store(): RedirectResponse + { + $importers = array_keys(config('importers')); + + $this->validate(request(), [ + 'type' => 'required|in:'.implode(',', $importers), + 'action' => 'required:in:append,delete', + 'validation_strategy' => 'required:in:stop-on-errors,skip-errors', + 'allowed_errors' => 'required|integer|min:0', + 'field_separator' => 'required', + 'file' => 'required|mimes:csv,xls,xlsx,txt', + ]); + + Event::dispatch('data_transfer.imports.create.before'); + + $data = request()->only([ + 'type', + 'action', + 'process_in_queue', + 'validation_strategy', + 'validation_strategy', + 'allowed_errors', + 'field_separator', + ]); + + if (! isset($data['process_in_queue'])) { + $data['process_in_queue'] = false; + } else { + $data['process_in_queue'] = true; + } + + $import = $this->importRepository->create( + array_merge( + [ + 'file_path' => request()->file('file')->storeAs( + 'imports', + time().'-'.request()->file('file')->getClientOriginalName(), + 'public' + ), + ], + $data + ) + ); + + Event::dispatch('data_transfer.imports.create.after', $import); + + session()->flash('success', trans('admin::app.settings.data-transfer.imports.create-success')); + + return redirect()->route('admin.settings.data_transfer.imports.import', $import->id); + } + + /** + * Show the form for editing a new resource. + */ + public function edit(int $id): View + { + $import = $this->importRepository->findOrFail($id); + + return view('admin::settings.data-transfer.imports.edit', compact('import')); + } + + /** + * Update a resource in storage. + */ + public function update(int $id): RedirectResponse + { + $importers = array_keys(config('importers')); + + $import = $this->importRepository->findOrFail($id); + + $this->validate(request(), [ + 'type' => 'required|in:'.implode(',', $importers), + 'action' => 'required:in:append,delete', + 'validation_strategy' => 'required:in:stop-on-errors,skip-errors', + 'allowed_errors' => 'required|integer|min:0', + 'field_separator' => 'required', + 'file' => 'mimes:csv,xls,xlsx,txt', + ]); + + Event::dispatch('data_transfer.imports.update.before'); + + $data = array_merge( + request()->only([ + 'type', + 'action', + 'process_in_queue', + 'validation_strategy', + 'validation_strategy', + 'allowed_errors', + 'field_separator', + ]), + [ + 'state' => 'pending', + 'processed_rows_count' => 0, + 'invalid_rows_count' => 0, + 'errors_count' => 0, + 'errors' => null, + 'error_file_path' => null, + 'started_at' => null, + 'completed_at' => null, + 'summary' => null, + ] + ); + + Storage::disk('public')->delete($import->error_file_path ?? ''); + + if (request()->file('file') && request()->file('file')->isValid()) { + Storage::disk('public')->delete($import->file_path); + + $data['file_path'] = request()->file('file')->storeAs( + 'imports', + time().'-'.request()->file('file')->getClientOriginalName(), + 'public' + ); + } + + if (! isset($data['process_in_queue'])) { + $data['process_in_queue'] = false; + } + + $import = $this->importRepository->update($data, $import->id); + + Event::dispatch('data_transfer.imports.update.after', $import); + + session()->flash('success', trans('admin::app.settings.data-transfer.imports.update-success')); + + return redirect()->route('admin.settings.data_transfer.imports.import', $import->id); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(int $id): JsonResponse + { + $import = $this->importRepository->findOrFail($id); + + try { + Storage::disk('public')->delete($import->file_path); + + Storage::disk('public')->delete($import->error_file_path ?? ''); + + $this->importRepository->delete($id); + + return response()->json([ + 'message' => trans('admin::app.settings.data-transfer.imports.delete-success'), + ]); + } catch (\Exception $e) { + } + + return response()->json([ + 'message' => trans('admin::app.settings.data-transfer.imports.delete-failed'), + ], 500); + } + + /** + * Show the form for creating a new resource. + */ + public function import(int $id): View + { + $import = $this->importRepository->findOrFail($id); + + $isValid = $this->importHelper + ->setImport($import) + ->isValid(); + + if ($import->state == Import::STATE_LINKING) { + if ($this->importHelper->isIndexingRequired()) { + $state = Import::STATE_INDEXING; + } else { + $state = Import::STATE_COMPLETED; + } + } elseif ($import->state == Import::STATE_INDEXING) { + $state = Import::STATE_COMPLETED; + } else { + $state = Import::STATE_COMPLETED; + } + + $stats = $this->importHelper->stats($state); + + $import->unsetRelations(); + + return view('admin::settings.data-transfer.imports.import', compact('import', 'isValid', 'stats')); + } + + /** + * Store a newly created resource in storage. + */ + public function validateImport(int $id): JsonResponse + { + $import = $this->importRepository->findOrFail($id); + + $isValid = $this->importHelper + ->setImport($import) + ->validate(); + + return new JsonResponse([ + 'is_valid' => $isValid, + 'import' => $this->importHelper->getImport()->unsetRelations(), + ]); + } + + /** + * Store a newly created resource in storage. + */ + public function start(int $id): JsonResponse + { + $import = $this->importRepository->findOrFail($id); + + if (! $import->processed_rows_count) { + return new JsonResponse([ + 'message' => trans('admin::app.settings.data-transfer.imports.nothing-to-import'), + ], 400); + } + + $this->importHelper->setImport($import); + + if (! $this->importHelper->isValid()) { + return new JsonResponse([ + 'message' => trans('admin::app.settings.data-transfer.imports.not-valid'), + ], 400); + } + + if ( + $import->process_in_queue + && config('queue.default') == 'sync' + ) { + return new JsonResponse([ + 'message' => trans('admin::app.settings.data-transfer.imports.setup-queue-error'), + ], 400); + } + + /** + * Set the import state to processing + */ + if ($import->state == Import::STATE_VALIDATED) { + $this->importHelper->started(); + } + + /** + * Get the first pending batch to import + */ + $importBatch = $import->batches->where('state', Import::STATE_PENDING)->first(); + + if ($importBatch) { + /** + * Start the import process + */ + try { + if ($import->process_in_queue) { + $this->importHelper->start(); + } else { + $this->importHelper->start($importBatch); + } + } catch (\Exception $e) { + return new JsonResponse([ + 'message' => $e->getMessage(), + ], 400); + } + } else { + if ($this->importHelper->isLinkingRequired()) { + $this->importHelper->linking(); + } elseif ($this->importHelper->isIndexingRequired()) { + $this->importHelper->indexing(); + } else { + $this->importHelper->completed(); + } + } + + return new JsonResponse([ + 'stats' => $this->importHelper->stats(Import::STATE_PROCESSED), + 'import' => $this->importHelper->getImport()->unsetRelations(), + ]); + } + + /** + * Store a newly created resource in storage. + */ + public function link(int $id): JsonResponse + { + $import = $this->importRepository->findOrFail($id); + + if (! $import->processed_rows_count) { + return new JsonResponse([ + 'message' => trans('admin::app.settings.data-transfer.imports.nothing-to-import'), + ], 400); + } + + $this->importHelper->setImport($import); + + if (! $this->importHelper->isValid()) { + return new JsonResponse([ + 'message' => trans('admin::app.settings.data-transfer.imports.not-valid'), + ], 400); + } + + /** + * Set the import state to linking + */ + if ($import->state == Import::STATE_PROCESSED) { + $this->importHelper->linking(); + } + + /** + * Get the first processing batch to link + */ + $importBatch = $import->batches->where('state', Import::STATE_PROCESSED)->first(); + + /** + * Set the import state to linking/completed + */ + if ($importBatch) { + /** + * Start the resource linking process + */ + try { + $this->importHelper->link($importBatch); + } catch (\Exception $e) { + return new JsonResponse([ + 'message' => $e->getMessage(), + ], 400); + } + } else { + if ($this->importHelper->isIndexingRequired()) { + $this->importHelper->indexing(); + } else { + $this->importHelper->completed(); + } + } + + return new JsonResponse([ + 'stats' => $this->importHelper->stats(Import::STATE_LINKED), + 'import' => $this->importHelper->getImport()->unsetRelations(), + ]); + } + + /** + * Store a newly created resource in storage. + */ + public function indexData(int $id): JsonResponse + { + $import = $this->importRepository->findOrFail($id); + + if (! $import->processed_rows_count) { + return new JsonResponse([ + 'message' => trans('admin::app.settings.data-transfer.imports.nothing-to-import'), + ], 400); + } + + $this->importHelper->setImport($import); + + if (! $this->importHelper->isValid()) { + return new JsonResponse([ + 'message' => trans('admin::app.settings.data-transfer.imports.not-valid'), + ], 400); + } + + /** + * Set the import state to linking + */ + if ($import->state == Import::STATE_LINKED) { + $this->importHelper->indexing(); + } + + /** + * Get the first processing batch to link + */ + $importBatch = $import->batches->where('state', Import::STATE_LINKED)->first(); + + /** + * Set the import state to linking/completed + */ + if ($importBatch) { + /** + * Start the resource linking process + */ + try { + $this->importHelper->index($importBatch); + } catch (\Exception $e) { + return new JsonResponse([ + 'message' => $e->getMessage(), + ], 400); + } + } else { + /** + * Set the import state to completed + */ + $this->importHelper->completed(); + } + + return new JsonResponse([ + 'stats' => $this->importHelper->stats(Import::STATE_INDEXED), + 'import' => $this->importHelper->getImport()->unsetRelations(), + ]); + } + + /** + * Returns import stats + */ + public function stats(int $id, string $state = Import::STATE_PROCESSED): JsonResponse + { + $import = $this->importRepository->findOrFail($id); + + $stats = $this->importHelper + ->setImport($import) + ->stats($state); + + return new JsonResponse([ + 'stats' => $stats, + 'import' => $this->importHelper->getImport()->unsetRelations(), + ]); + } + + /** + * Download import error report + */ + public function downloadSample(string $type) + { + $importer = config('importers.'.$type); + + return Storage::download($importer['sample_path']); + } + + /** + * Download import error report + */ + public function download(int $id) + { + $import = $this->importRepository->findOrFail($id); + + return Storage::disk('public')->download($import->file_path); + } + + /** + * Download import error report + */ + public function downloadErrorReport(int $id) + { + $import = $this->importRepository->findOrFail($id); + + return Storage::disk('public')->download($import->file_path); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/EmailTemplateController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/EmailTemplateController.php new file mode 100755 index 0000000..8ae99c6 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/EmailTemplateController.php @@ -0,0 +1,133 @@ +ajax()) { + return datagrid(EmailTemplateDataGrid::class)->process(); + } + + return view('admin::settings.email-templates.index'); + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\View\View + */ + public function create() + { + $placeholders = $this->workflowEntityHelper->getEmailTemplatePlaceholders(); + + return view('admin::settings.email-templates.create', compact('placeholders')); + } + + /** + * Store a newly created email templates in storage. + */ + public function store(): RedirectResponse + { + $this->validate(request(), [ + 'name' => 'required|unique:email_templates,name', + 'subject' => 'required', + 'content' => 'required', + ]); + + Event::dispatch('settings.email_templates.create.before'); + + $emailTemplate = $this->emailTemplateRepository->create(request()->all()); + + Event::dispatch('settings.email_templates.create.after', $emailTemplate); + + session()->flash('success', trans('admin::app.settings.email-template.index.create-success')); + + return redirect()->route('admin.settings.email_templates.index'); + } + + /** + * Show the form for editing the specified email template. + */ + public function edit(int $id): View + { + $emailTemplate = $this->emailTemplateRepository->findOrFail($id); + + $placeholders = $this->workflowEntityHelper->getEmailTemplatePlaceholders(); + + return view('admin::settings.email-templates.edit', compact('emailTemplate', 'placeholders')); + } + + /** + * Update the specified email template in storage. + */ + public function update(int $id): RedirectResponse + { + $this->validate(request(), [ + 'name' => 'required|unique:email_templates,name,'.$id, + 'subject' => 'required', + 'content' => 'required', + ]); + + Event::dispatch('settings.email_templates.update.before', $id); + + $emailTemplate = $this->emailTemplateRepository->update(request()->all(), $id); + + Event::dispatch('settings.email_templates.update.after', $emailTemplate); + + session()->flash('success', trans('admin::app.settings.email-template.index.update-success')); + + return redirect()->route('admin.settings.email_templates.index'); + } + + /** + * Remove the specified email template from storage. + */ + public function destroy(int $id): JsonResponse + { + $emailTemplate = $this->emailTemplateRepository->findOrFail($id); + + try { + Event::dispatch('settings.email_templates.delete.before', $id); + + $emailTemplate->delete($id); + + Event::dispatch('settings.email_templates.delete.after', $id); + + return response()->json([ + 'message' => trans('admin::app.settings.email-template.index.delete-success'), + ], 200); + } catch (\Exception $exception) { + return response()->json([ + 'message' => trans('admin::app.settings.email-template.index.delete-failed'), + ], 400); + } + + return response()->json([ + 'message' => trans('admin::app.settings.email-template.index.delete-failed'), + ], 400); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/GroupController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/GroupController.php new file mode 100755 index 0000000..ab44e99 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/GroupController.php @@ -0,0 +1,127 @@ +ajax()) { + return datagrid(GroupDataGrid::class)->process(); + } + + return view('admin::settings.groups.index'); + } + + /** + * Store a newly created resource in storage. + */ + public function store(): JsonResponse + { + $this->validate(request(), [ + 'name' => 'required|unique:groups,name|max:50', + 'description' => 'required|max:250', + ]); + + Event::dispatch('settings.group.create.before'); + + $group = $this->groupRepository->create(request()->only([ + 'name', + 'description', + ])); + + Event::dispatch('settings.group.create.after', $group); + + return new JsonResponse([ + 'data' => $group, + 'message' => trans('admin::app.settings.groups.index.create-success'), + ]); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(int $id): JsonResource + { + $group = $this->groupRepository->findOrFail($id); + + return new JsonResource([ + 'data' => $group, + ]); + } + + /** + * Update the specified resource in storage. + */ + public function update(int $id): JsonResponse + { + $this->validate(request(), [ + 'name' => 'required|max:50|unique:groups,name,'.$id, + 'description' => 'required|max:250', + ]); + + Event::dispatch('settings.group.update.before', $id); + + $group = $this->groupRepository->update(request()->only([ + 'name', + 'description', + ]), $id); + + Event::dispatch('settings.group.update.after', $group); + + return new JsonResponse([ + 'data' => $group, + 'message' => trans('admin::app.settings.groups.index.update-success'), + ]); + } + + /** + * Remove the specified resource from storage. + * + * @return \Illuminate\Http\Response + */ + public function destroy(int $id): JsonResponse + { + $group = $this->groupRepository->findOrFail($id); + + if ($group->users()->exists()) { + return response()->json([ + 'message' => trans('admin::app.settings.groups.index.delete-failed-associated-users'), + ], 400); + } + + try { + Event::dispatch('settings.group.delete.before', $id); + + $group->delete($id); + + Event::dispatch('settings.group.delete.after', $id); + + return new JsonResponse([ + 'message' => trans('admin::app.settings.groups.index.destroy-success'), + ], 200); + } catch (\Exception $exception) { + return new JsonResponse([ + 'message' => trans('admin::app.settings.groups.index.delete-failed'), + ], 400); + } + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/LocationController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/LocationController.php new file mode 100644 index 0000000..c783637 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/LocationController.php @@ -0,0 +1,79 @@ +locationRepository + ->pushCriteria(app(RequestCriteria::class)) + ->all(); + + return response()->json([ + 'data' => $results, + ]); + } + + /** + * Store a newly created resource in storage. + */ + public function store(AttributeForm $request): JsonResponse + { + Event::dispatch('settings.location.create.before'); + + $location = $this->locationRepository->create(request()->all()); + + Event::dispatch('settings.location.create.after', $location); + + return new JsonResponse([ + 'data' => $location, + 'message' => trans('admin::app.settings.warehouses.view.locations.create-success'), + ]); + } + + /** + * Remove the specified resource from storage. + * + * @return \Illuminate\Http\Response + */ + public function destroy(int $id): JsonResponse + { + $this->locationRepository->findOrFail($id); + + try { + Event::dispatch('settings.location.delete.before', $id); + + $this->locationRepository->delete($id); + + Event::dispatch('settings.location.delete.after', $id); + + return new JsonResponse([ + 'message' => trans('admin::app.settings.warehouses.view.locations.delete-success'), + ], 200); + } catch (\Exception $exception) { + return new JsonResponse([ + 'message' => trans('admin::app.settings.warehouses.view.locations.delete-failed'), + ], 400); + } + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/Marketing/CampaignsController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/Marketing/CampaignsController.php new file mode 100644 index 0000000..1958c1e --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/Marketing/CampaignsController.php @@ -0,0 +1,157 @@ +isXmlHttpRequest()) { + return datagrid(CampaignDatagrid::class)->process(); + } + + return view('admin::settings.marketing.campaigns.index'); + } + + /** + * Get marketing events. + */ + public function getEvents(): JsonResponse + { + $events = $this->eventRepository->get(['id', 'name']); + + return response()->json([ + 'data' => $events, + ]); + } + + /** + * Get Email Templates. + */ + public function getEmailTemplates(): JsonResponse + { + $emailTemplates = $this->emailTemplateRepository->get(['id', 'name']); + + return response()->json([ + 'data' => $emailTemplates, + ]); + } + + /** + * Store a newly created marketing campaign in storage. + */ + public function store(): JsonResponse + { + $validatedData = $this->validate(request(), [ + 'name' => 'required|string|max:255', + 'subject' => 'required|string|max:255', + 'marketing_template_id' => 'required|exists:email_templates,id', + 'marketing_event_id' => 'required|exists:marketing_events,id', + 'status' => 'sometimes|required|in:0,1', + ]); + + Event::dispatch('settings.marketing.campaigns.create.before'); + + $marketingCampaign = $this->campaignRepository->create($validatedData); + + Event::dispatch('settings.marketing.campaigns.create.after', $marketingCampaign); + + return response()->json([ + 'message' => trans('admin::app.settings.marketing.campaigns.index.create-success'), + ]); + } + + /** + * Show the specified Resource. + */ + public function show(int $id): JsonResponse + { + $campaign = $this->campaignRepository->findOrFail($id); + + return response()->json([ + 'data' => $campaign, + ]); + } + + /** + * Update the specified marketing campaign in storage. + */ + public function update(int $id): JsonResponse + { + $validatedData = $this->validate(request(), [ + 'name' => 'required|string|max:255', + 'subject' => 'required|string|max:255', + 'marketing_template_id' => 'required|exists:email_templates,id', + 'marketing_event_id' => 'required|exists:marketing_events,id', + 'status' => 'sometimes|required|in:0,1', + ]); + + Event::dispatch('settings.marketing.campaigns.update.before', $id); + + $marketingCampaign = $this->campaignRepository->update($validatedData, $id); + + Event::dispatch('settings.marketing.campaigns.update.after', $marketingCampaign); + + return response()->json([ + 'message' => trans('admin::app.settings.marketing.campaigns.index.update-success'), + ]); + } + + /** + * Remove the specified marketing campaign from storage. + */ + public function destroy(int $id): JsonResponse + { + Event::dispatch('settings.marketing.campaigns.delete.before', $id); + + $this->campaignRepository->delete($id); + + Event::dispatch('settings.marketing.campaigns.delete.after', $id); + + return response()->json([ + 'message' => trans('admin::app.settings.marketing.campaigns.index.delete-success'), + ]); + } + + /** + * Remove the specified marketing campaigns from storage. + */ + public function massDestroy(MassDestroyRequest $massDestroyRequest): JsonResponse + { + $campaigns = $this->campaignRepository->findWhereIn('id', $massDestroyRequest->input('indices')); + + foreach ($campaigns as $campaign) { + Event::dispatch('settings.marketing.campaigns.delete.before', $campaign); + + $this->campaignRepository->delete($campaign->id); + + Event::dispatch('settings.marketing.campaigns.delete.after', $campaign); + } + + return response()->json([ + 'message' => trans('admin::app.settings.marketing.campaigns.index.mass-delete-success'), + ]); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/Marketing/EventController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/Marketing/EventController.php new file mode 100644 index 0000000..7fe5896 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/Marketing/EventController.php @@ -0,0 +1,169 @@ +ajax()) { + return datagrid(EventDataGrid::class)->process(); + } + + return view('admin::settings.marketing.events.index'); + } + + /** + * Store a newly created marketing event in storage. + */ + public function store(): JsonResponse + { + $validatedData = $this->validate(request(), [ + 'name' => 'required|max:60', + 'description' => 'required', + 'date' => 'required|date|after_or_equal:today', + ]); + + Event::dispatch('settings.marketing.events.create.before'); + + $marketingEvent = $this->eventRepository->create($validatedData); + + Event::dispatch('settings.marketing.events.create.after', $marketingEvent); + + return response()->json([ + 'message' => trans('admin::app.settings.marketing.events.index.create-success'), + 'data' => $marketingEvent, + ]); + } + + /** + * Update the specified marketing event in storage. + */ + public function update(int $id): JsonResponse + { + $validatedData = $this->validate(request(), [ + 'name' => 'required|max:60', + 'description' => 'required', + 'date' => 'required|date|after_or_equal:today', + ]); + + Event::dispatch('settings.marketing.events.update.before', $id); + + $marketingEvent = $this->eventRepository->update($validatedData, $id); + + Event::dispatch('settings.marketing.events.update.after', $marketingEvent); + + return response()->json([ + 'message' => trans('admin::app.settings.marketing.events.index.update-success'), + 'data' => $marketingEvent, + ]); + } + + /** + * Remove the specified marketing event from storage. + */ + public function destroy(int $id): JsonResponse + { + $event = $this->eventRepository->findOrFail($id); + + if ($event->campaigns->isNotEmpty()) { + return response()->json([ + 'message' => trans('admin::app.settings.marketing.events.index.delete-failed-associated-campaigns'), + ], 422); + } + + Event::dispatch('settings.marketing.events.delete.before', $event); + + $this->eventRepository->delete($event->id); + + Event::dispatch('settings.marketing.events.delete.after', $event); + + return response()->json([ + 'message' => trans('admin::app.settings.marketing.events.index.delete-success'), + ]); + } + + /** + * Remove the specified marketing events from storage. + */ + public function massDestroy(MassDestroyRequest $request): JsonResponse + { + try { + $events = $this->eventRepository->findWhereIn('id', $request->input('indices', [])); + + $deletedCount = 0; + + $blockedCount = 0; + + foreach ($events as $event) { + if ( + $event->campaigns + && $event->campaigns->isNotEmpty() + ) { + $blockedCount++; + + continue; + } + + Event::dispatch('settings.marketing.events.delete.before', $event); + + $this->eventRepository->delete($event->id); + + Event::dispatch('settings.marketing.events.delete.after', $event); + + $deletedCount++; + } + + $statusCode = 200; + + switch (true) { + case $deletedCount > 0 && $blockedCount === 0: + $message = trans('admin::app.settings.marketing.events.index.mass-delete-success'); + + break; + + case $deletedCount > 0 && $blockedCount > 0: + $message = trans('admin::app.settings.marketing.events.index.partial-delete-warning'); + + break; + + case $deletedCount === 0 && $blockedCount > 0: + $message = trans('admin::app.settings.marketing.events.index.none-delete-warning'); + + $statusCode = 400; + + break; + + default: + $message = trans('admin::app.settings.marketing.events.index.no-selection'); + + $statusCode = 400; + + break; + } + + return response()->json(['message' => $message], $statusCode); + } catch (Exception $e) { + return response()->json([ + 'message' => trans('admin::app.settings.marketing.events.index.mass-delete-failed'), + ], 400); + } + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/PipelineController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/PipelineController.php new file mode 100644 index 0000000..6d9cf73 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/PipelineController.php @@ -0,0 +1,152 @@ +ajax()) { + return datagrid(PipelineDataGrid::class)->process(); + } + + return view('admin::settings.pipelines.index'); + } + + /** + * Show the form for creating a new resource. + */ + public function create(): View + { + return view('admin::settings.pipelines.create'); + } + + /** + * Store a newly created resource in storage. + */ + public function store(PipelineForm $request): RedirectResponse + { + $request->validated(); + + $request->merge([ + 'is_default' => request()->has('is_default') ? 1 : 0, + ]); + + Event::dispatch('settings.pipeline.create.before'); + + $pipeline = $this->pipelineRepository->create($request->all()); + + Event::dispatch('settings.pipeline.create.after', $pipeline); + + session()->flash('success', trans('admin::app.settings.pipelines.index.create-success')); + + return redirect()->route('admin.settings.pipelines.index'); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(int $id): View + { + $pipeline = $this->pipelineRepository->findOrFail($id); + + return view('admin::settings.pipelines.edit', compact('pipeline')); + } + + /** + * Update the specified resource in storage. + */ + public function update(PipelineForm $request, int $id): RedirectResponse + { + $request->validated(); + + $isDefault = request()->has('is_default') ? 1 : 0; + + if (! $isDefault) { + $defaultCount = $this->pipelineRepository->findWhere(['is_default' => 1])->count(); + + $pipeline = $this->pipelineRepository->find($id); + + if ( + $defaultCount === 1 + && $pipeline->is_default + ) { + session()->flash('error', trans('admin::app.settings.pipelines.index.default-required')); + + return redirect()->back(); + } + } + + $request->merge(['is_default' => $isDefault]); + + Event::dispatch('settings.pipeline.update.before', $id); + + $pipeline = $this->pipelineRepository->update($request->all(), $id); + + Event::dispatch('settings.pipeline.update.after', $pipeline); + + session()->flash('success', trans('admin::app.settings.pipelines.index.update-success')); + + return redirect()->route('admin.settings.pipelines.index'); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy($id): JsonResponse + { + $pipeline = $this->pipelineRepository->findOrFail($id); + + if ($pipeline->is_default) { + return response()->json([ + 'message' => trans('admin::app.settings.pipelines.index.default-delete-error'), + ], 400); + } else { + $defaultPipeline = $this->pipelineRepository->getDefaultPipeline(); + + $pipeline->leads()->update([ + 'lead_pipeline_id' => $defaultPipeline->id, + 'lead_pipeline_stage_id' => $defaultPipeline->stages()->first()->id, + ]); + } + + try { + Event::dispatch('settings.pipeline.delete.before', $id); + + $this->pipelineRepository->delete($id); + + Event::dispatch('settings.pipeline.delete.after', $id); + + return response()->json([ + 'message' => trans('admin::app.settings.pipelines.index.delete-success'), + ], 200); + } catch (\Exception $exception) { + return response()->json([ + 'message' => trans('admin::app.settings.pipelines.index.delete-failed'), + ], 400); + } + + return response()->json([ + 'message' => trans('admin::app.settings.pipelines.index.delete-failed'), + ], 400); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/RoleController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/RoleController.php new file mode 100755 index 0000000..cc703ca --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/RoleController.php @@ -0,0 +1,168 @@ +ajax()) { + return datagrid(RoleDataGrid::class)->process(); + } + + return view('admin::settings.roles.index'); + } + + /** + * Show the form for creating a new resource. + */ + public function create(): View + { + return view('admin::settings.roles.create'); + } + + /** + * Store a newly created resource in storage. + */ + public function store(): RedirectResponse + { + $this->validate(request(), [ + 'name' => 'required', + 'permission_type' => 'required|in:all,custom', + 'description' => 'required', + ]); + + if (request('permission_type') == 'custom') { + $this->validate(request(), [ + 'permissions' => 'required', + ]); + } + + Event::dispatch('settings.role.create.before'); + + $data = request()->only([ + 'name', + 'description', + 'permission_type', + 'permissions', + ]); + + $role = $this->roleRepository->create($data); + + Event::dispatch('settings.role.create.after', $role); + + session()->flash('success', trans('admin::app.settings.roles.index.create-success')); + + return redirect()->route('admin.settings.roles.index'); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(int $id): View + { + $role = $this->roleRepository->findOrFail($id); + + return view('admin::settings.roles.edit', compact('role')); + } + + /** + * Update the specified resource in storage. + */ + public function update(int $id): RedirectResponse + { + $this->validate(request(), [ + 'name' => 'required', + 'permission_type' => 'required|in:all,custom', + 'description' => 'required', + 'permissions' => 'required_if:permission_type,custom', + ]); + + Event::dispatch('settings.role.update.before', $id); + + $data = array_merge(request()->only([ + 'name', + 'description', + 'permission_type', + ]), [ + 'permissions' => request()->has('permissions') ? request('permissions') : [], + ]); + + $role = $this->roleRepository->update($data, $id); + + Event::dispatch('settings.role.update.after', $role); + + session()->flash('success', trans('admin::app.settings.roles.index.update-success')); + + return redirect()->back(); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(int $id): JsonResponse + { + $response = [ + 'responseCode' => 400, + ]; + + $role = $this->roleRepository->findOrFail($id); + + if ($role->users && $role->users->count() >= 1) { + $response['message'] = trans('admin::app.settings.roles.index.being-used'); + + session()->flash('error', $response['message']); + } elseif ($this->roleRepository->count() == 1) { + $response['message'] = trans('admin::app.settings.roles.index.last-delete-error'); + + session()->flash('error', $response['message']); + } else { + try { + Event::dispatch('settings.role.delete.before', $id); + + if (auth()->guard('user')->user()->role_id == $id) { + $response['message'] = trans('admin::app.settings.roles.index.current-role-delete-error'); + } else { + $this->roleRepository->delete($id); + + Event::dispatch('settings.role.delete.after', $id); + + $message = trans('admin::app.settings.roles.index.delete-success'); + + $response = [ + 'responseCode' => 200, + 'message' => $message, + ]; + + session()->flash('success', $message); + } + } catch (\Exception $exception) { + $message = $exception->getMessage(); + + $response['message'] = $message; + + session()->flash('error', $message); + } + } + + return response()->json($response, $response['responseCode']); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/SettingController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/SettingController.php new file mode 100644 index 0000000..ac1d7ea --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/SettingController.php @@ -0,0 +1,97 @@ +query('query')); + + if (empty($query)) { + return response()->json(['data' => []]); + } + + $results = $this->searchMenuItems($this->getSettingsConfig(), $query); + + return response()->json([ + 'data' => $results->values(), + ]); + } + + /** + * Recursively search through menu items and children. + * + * @param Collection $menuItems + * @return Collection> + */ + protected function searchMenuItems(Collection $menuItems, string $query): Collection + { + $results = collect(); + + foreach ($menuItems as $item) { + if ($this->matchesQuery($item, $query)) { + $results->push([ + 'name' => $item->getName(), + 'url' => $item->getUrl(), + 'icon' => $item->getIcon(), + 'key' => $item->getKey(), + ]); + } + + if ($item->haveChildren()) { + $childResults = $this->searchMenuItems($item->getChildren(), $query); + + $results = $results->merge($childResults); + } + } + + return $results; + } + + /** + * Determine if the menu item matches the query. + */ + protected function matchesQuery(MenuItem $item, string $query): bool + { + $query = strtolower($query); + $url = strtolower($item->getUrl()); + + if ( + ! $url + || ! str_contains($url, $query) + ) { + return false; + } + + return true; + } + + /** + * Get the settings configuration. + */ + protected function getSettingsConfig(): Collection + { + return menu() + ->getItems('admin') + ->filter(fn (MenuItem $item) => $item->getKey() === 'settings'); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/SourceController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/SourceController.php new file mode 100755 index 0000000..861016c --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/SourceController.php @@ -0,0 +1,117 @@ +ajax()) { + return datagrid(SourceDataGrid::class)->process(); + } + + return view('admin::settings.sources.index'); + } + + /** + * Store a newly created resource in storage. + */ + public function store(): JsonResponse + { + $this->validate(request(), [ + 'name' => ['required', 'unique:lead_sources,name'], + ]); + + Event::dispatch('settings.source.create.before'); + + $source = $this->sourceRepository->create(request()->only(['name'])); + + Event::dispatch('settings.source.create.after', $source); + + return new JsonResponse([ + 'data' => $source, + 'message' => trans('admin::app.settings.sources.index.create-success'), + ]); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(int $id): View|JsonResponse + { + $source = $this->sourceRepository->findOrFail($id); + + return new JsonResponse([ + 'data' => $source, + ]); + } + + /** + * Update the specified resource in storage. + */ + public function update(int $id): JsonResponse + { + $this->validate(request(), [ + 'name' => 'required|unique:lead_sources,name,'.$id, + ]); + + Event::dispatch('settings.source.update.before', $id); + + $source = $this->sourceRepository->update(request()->only(['name']), $id); + + Event::dispatch('settings.source.update.after', $source); + + return new JsonResponse([ + 'data' => $source, + 'message' => trans('admin::app.settings.sources.index.update-success'), + ]); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(int $id): JsonResponse + { + $source = $this->sourceRepository->findOrFail($id); + + if ($source->leads()->count() > 0) { + return new JsonResponse([ + 'message' => trans('admin::app.settings.sources.index.delete-failed-associated-leads'), + ], 400); + } + + try { + Event::dispatch('settings.source.delete.before', $id); + + $source->delete(); + + Event::dispatch('settings.source.delete.after', $id); + + return new JsonResponse([ + 'message' => trans('admin::app.settings.sources.index.delete-success'), + ], 200); + } catch (Exception $exception) { + return new JsonResponse([ + 'message' => trans('admin::app.settings.sources.index.delete-failed'), + ], 400); + } + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/TagController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/TagController.php new file mode 100755 index 0000000..ed4b3bc --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/TagController.php @@ -0,0 +1,161 @@ +ajax()) { + return datagrid(TagDataGrid::class)->process(); + } + + return view('admin::settings.tags.index'); + } + + /** + * Store a newly created resource in storage. + */ + public function store(): JsonResponse + { + $this->validate(request(), [ + 'name' => ['required', 'unique:tags,name', 'max:50'], + ]); + + Event::dispatch('settings.tag.create.before'); + + $tag = $this->tagRepository->create(array_merge(request()->only([ + 'name', + 'color', + ]), [ + 'user_id' => auth()->guard('user')->user()->id, + ])); + + Event::dispatch('settings.tag.create.after', $tag); + + return new JsonResponse([ + 'data' => new TagResource($tag), + 'message' => trans('admin::app.settings.tags.index.create-success'), + ]); + } + + /** + * Show the form for editing the specified tag. + */ + public function edit(int $id): View|JsonResponse + { + $tag = $this->tagRepository->findOrFail($id); + + return new JsonResponse([ + 'data' => $tag, + ]); + } + + /** + * Update the specified tag in storage. + */ + public function update(int $id): JsonResponse + { + $this->validate(request(), [ + 'name' => 'required|max:50|unique:tags,name,'.$id, + ]); + + Event::dispatch('settings.tag.update.before', $id); + + $tag = $this->tagRepository->update(request()->only([ + 'name', + 'color', + ]), $id); + + Event::dispatch('settings.tag.update.after', $tag); + + return new JsonResponse([ + 'data' => new TagResource($tag), + 'message' => trans('admin::app.settings.tags.index.update-success'), + ]); + } + + /** + * Remove the specified type from storage. + */ + public function destroy(int $id): JsonResponse + { + $tag = $this->tagRepository->findOrFail($id); + + try { + Event::dispatch('settings.tag.delete.before', $id); + + $tag->delete($id); + + Event::dispatch('settings.tag.delete.after', $id); + + return new JsonResponse([ + 'message' => trans('admin::app.settings.tags.index.delete-success'), + ], 200); + } catch (\Exception $exception) { + return new JsonResponse([ + 'message' => trans('admin::app.settings.tags.index.delete-failed'), + ], 400); + } + } + + /** + * Search tag results + * + * @return \Illuminate\Http\Response + */ + public function search() + { + $tags = $this->tagRepository + ->pushCriteria(app(RequestCriteria::class)) + ->all(); + + return TagResource::collection($tags); + } + + /** + * Mass Delete the specified resources. + */ + public function massDestroy(MassDestroyRequest $massDestroyRequest): JsonResponse + { + $indices = $massDestroyRequest->input('indices'); + + try { + foreach ($indices as $index) { + Event::dispatch('settings.tag.delete.before', $index); + + $this->tagRepository->delete($index); + + Event::dispatch('settings.tag.delete.after', $index); + } + + return new JsonResponse([ + 'message' => trans('admin::app.customers.reviews.index.datagrid.mass-delete-success'), + ], 200); + } catch (\Exception $e) { + return new JsonResponse([ + 'message' => $e->getMessage(), + ], 500); + } + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/TypeController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/TypeController.php new file mode 100755 index 0000000..a14203d --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/TypeController.php @@ -0,0 +1,110 @@ +ajax()) { + return datagrid(TypeDataGrid::class)->process(); + } + + return view('admin::settings.types.index'); + } + + /** + * Store a newly created type in storage. + */ + public function store(): JsonResponse + { + $this->validate(request(), [ + 'name' => ['required', 'unique:lead_types,name'], + ]); + + Event::dispatch('settings.type.create.before'); + + $type = $this->typeRepository->create(request()->only(['name'])); + + Event::dispatch('settings.type.create.after', $type); + + return new JsonResponse([ + 'data' => $type, + 'message' => trans('admin::app.settings.types.index.create-success'), + ]); + } + + /** + * Show the form for editing the specified type. + */ + public function edit(int $id): View|JsonResponse + { + $type = $this->typeRepository->findOrFail($id); + + return new JsonResponse([ + 'data' => $type, + ]); + } + + /** + * Update the specified type in storage. + */ + public function update(int $id): JsonResponse + { + $this->validate(request(), [ + 'name' => 'required|unique:lead_types,name,'.$id, + ]); + + Event::dispatch('settings.type.update.before', $id); + + $type = $this->typeRepository->update(request()->only(['name']), $id); + + Event::dispatch('settings.type.update.after', $type); + + return new JsonResponse([ + 'data' => $type, + 'message' => trans('admin::app.settings.types.index.update-success'), + ]); + } + + /** + * Remove the specified type from storage. + */ + public function destroy(int $id): JsonResponse + { + $type = $this->typeRepository->findOrFail($id); + + try { + Event::dispatch('settings.type.delete.before', $id); + + $type->delete($id); + + Event::dispatch('settings.type.delete.after', $id); + + return new JsonResponse([ + 'message' => trans('admin::app.settings.types.index.delete-success'), + ], 200); + } catch (\Exception $exception) { + return new JsonResponse([ + 'message' => trans('admin::app.settings.types.index.delete-failed'), + ], 400); + } + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/UserController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/UserController.php new file mode 100755 index 0000000..8d9943d --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/UserController.php @@ -0,0 +1,260 @@ +ajax()) { + return datagrid(UserDataGrid::class)->process(); + } + + $roles = $this->roleRepository->all(); + + $groups = $this->groupRepository->all(); + + return view('admin::settings.users.index', compact('roles', 'groups')); + } + + /** + * Store a newly created resource in storage. + */ + public function store(): View|JsonResponse + { + $this->validate(request(), [ + 'email' => 'required|email|unique:users,email', + 'name' => 'required', + 'password' => 'nullable', + 'confirm_password' => 'nullable|required_with:password|same:password', + 'role_id' => 'required', + 'status' => 'boolean|in:0,1', + 'view_permission' => 'string|in:global,group,individual', + ]); + + $data = request()->all(); + + if ( + isset($data['password']) + && $data['password'] + ) { + $data['password'] = bcrypt($data['password']); + } + + Event::dispatch('settings.user.create.before'); + + $admin = $this->userRepository->create($data); + + $admin->groups()->sync($data['groups'] ?? []); + + try { + Mail::queue(new UserCreatedNotification($admin)); + } catch (\Exception $e) { + report($e); + } + + Event::dispatch('settings.user.create.after', $admin); + + return new JsonResponse([ + 'data' => $admin, + 'message' => trans('admin::app.settings.users.index.create-success'), + ]); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(int $id): View|JsonResponse + { + $admin = $this->userRepository->with(['role', 'groups'])->findOrFail($id); + + return new JsonResponse([ + 'data' => $admin, + ]); + } + + /** + * Update the specified resource in storage. + */ + public function update(int $id): JsonResponse + { + $this->validate(request(), [ + 'email' => 'required|email|unique:users,email,'.$id, + 'name' => 'required|string', + 'password' => 'nullable|string|min:6', + 'confirm_password' => 'nullable|required_with:password|same:password', + 'role_id' => 'required|integer|exists:roles,id', + 'status' => 'nullable|boolean|in:0,1', + 'view_permission' => 'required|string|in:global,group,individual', + ]); + + $data = request()->all(); + + if (empty($data['password'])) { + $data = Arr::except($data, ['password', 'confirm_password']); + } else { + $data['password'] = bcrypt($data['password']); + } + + $authUser = auth()->guard('user')->user(); + + if ($authUser->id == $id) { + $data['status'] = true; + } + + Event::dispatch('settings.user.update.before', $id); + + $admin = $this->userRepository->update($data, $id); + + $admin->groups()->sync($data['groups'] ?? []); + + Event::dispatch('settings.user.update.after', $admin); + + return new JsonResponse([ + 'data' => $admin, + 'message' => trans('admin::app.settings.users.index.update-success'), + ]); + } + + /** + * Search user results. + */ + public function search(): JsonResource + { + $users = $this->userRepository + ->pushCriteria(app(RequestCriteria::class)) + ->all(); + + return UserResource::collection($users); + } + + /** + * Destroy specified user. + */ + public function destroy(int $id): JsonResponse + { + if ($this->userRepository->count() == 1) { + return new JsonResponse([ + 'message' => trans('admin::app.settings.users.index.last-delete-error'), + ], 400); + } + + try { + Event::dispatch('user.admin.delete.before', $id); + + $this->userRepository->delete($id); + + Event::dispatch('user.admin.delete.after', $id); + + return new JsonResponse([ + 'message' => trans('admin::app.settings.users.index.delete-success'), + ], 200); + } catch (\Exception $e) { + } + + return new JsonResponse([ + 'message' => trans('admin::app.settings.users.index.delete-failed'), + ], 500); + } + + /** + * Mass Update the specified resources. + */ + public function massUpdate(MassUpdateRequest $massDestroyRequest): JsonResponse + { + $count = 0; + + $users = $this->userRepository->findWhereIn('id', $massDestroyRequest->input('indices')); + + foreach ($users as $users) { + if (auth()->guard('user')->user()->id == $users->id) { + continue; + } + + Event::dispatch('settings.user.update.before', $users->id); + + $this->userRepository->update([ + 'status' => $massDestroyRequest->input('value'), + ], $users->id); + + Event::dispatch('settings.user.update.after', $users->id); + + $count++; + } + + if (! $count) { + return response()->json([ + 'message' => trans('admin::app.settings.users.index.mass-update-failed'), + ], 400); + } + + return response()->json([ + 'message' => trans('admin::app.settings.users.index.mass-update-success'), + ]); + } + + /** + * Mass Delete the specified resources. + */ + public function massDestroy(MassDestroyRequest $massDestroyRequest): JsonResponse + { + $count = 0; + + $users = $this->userRepository->findWhereIn('id', $massDestroyRequest->input('indices')); + + foreach ($users as $user) { + if (auth()->guard('user')->user()->id == $user->id) { + continue; + } + + Event::dispatch('settings.user.delete.before', $user->id); + + $this->userRepository->delete($user->id); + + Event::dispatch('settings.user.delete.after', $user->id); + + $count++; + } + + if (! $count) { + return response()->json([ + 'message' => trans('admin::app.settings.users.index.mass-delete-failed'), + ], 400); + } + + return response()->json([ + 'message' => trans('admin::app.settings.users.index.mass-delete-success'), + ]); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/Warehouse/ActivityController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/Warehouse/ActivityController.php new file mode 100644 index 0000000..5f710ba --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/Warehouse/ActivityController.php @@ -0,0 +1,45 @@ +activityRepository + ->leftJoin('warehouse_activities', 'activities.id', '=', 'warehouse_activities.activity_id') + ->where('warehouse_activities.warehouse_id', $id) + ->get(); + + return ActivityResource::collection($this->concatEmail($activities)); + } + + /** + * Store a newly created resource in storage. + */ + public function concatEmail($activities) + { + return $activities->sortByDesc('id')->sortByDesc('created_at'); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/Warehouse/TagController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/Warehouse/TagController.php new file mode 100644 index 0000000..1d13297 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/Warehouse/TagController.php @@ -0,0 +1,61 @@ +warehouseRepository->find($id); + + if (! $warehouse->tags->contains(request()->input('tag_id'))) { + $warehouse->tags()->attach(request()->input('tag_id')); + } + + Event::dispatch('warehouse.tag.create.after', $warehouse); + + return response()->json([ + 'message' => trans('admin::app.warehouse.view.tags.create-success'), + ]); + } + + /** + * Remove the specified resource from storage. + * + * @param int $warehouseId + * @return \Illuminate\Http\Response + */ + public function detach($warehouseId) + { + Event::dispatch('warehouse.tag.delete.before', $warehouseId); + + $warehouse = $this->warehouseRepository->find($warehouseId); + + $warehouse->tags()->detach(request()->input('tag_id')); + + Event::dispatch('warehouse.tag.delete.after', $warehouse); + + return response()->json([ + 'message' => trans('admin::app.leads.view.tags.destroy-success'), + ]); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/Warehouse/WarehouseController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/Warehouse/WarehouseController.php new file mode 100644 index 0000000..ef96bc5 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/Warehouse/WarehouseController.php @@ -0,0 +1,159 @@ +request->add(['entity_type' => 'warehouses']); + } + + /** + * Display a listing of the resource. + */ + public function index(): View|JsonResponse + { + if (request()->ajax()) { + return datagrid(WarehouseDataGrid::class)->process(); + } + + return view('admin::settings.warehouses.index'); + } + + /** + * Search location results + */ + public function search(): JsonResponse + { + $results = $this->warehouseRepository + ->pushCriteria(app(RequestCriteria::class)) + ->all(); + + return response()->json($results); + } + + /** + * Display a listing of the product resource. + */ + public function products(int $id) + { + if (request()->ajax()) { + return datagrid(ProductDataGrid::class)->process(); + } + + $warehouse = $this->warehouseRepository->findOrFail($id); + + return view('admin::settings.warehouses.products', compact('warehouse')); + } + + /** + * Show the form for creating a new resource. + */ + public function create(): View + { + return view('admin::settings.warehouses.create'); + } + + /** + * Store a newly created resource in storage. + */ + public function store(AttributeForm $request): RedirectResponse + { + Event::dispatch('settings.warehouse.create.before'); + + $warehouse = $this->warehouseRepository->create($request->all()); + + Event::dispatch('settings.warehouse.create.after', $warehouse); + + session()->flash('success', trans('admin::app.settings.warehouses.index.create-success')); + + return redirect()->route('admin.settings.warehouses.index'); + } + + /** + * Show the form for viewing the specified resource. + */ + public function view(int $id): View + { + $warehouse = $this->warehouseRepository->findOrFail($id); + + return view('admin::settings.warehouses.view', compact('warehouse')); + } + + /** + * Show the form for editing the specified resource. + * + * @param int $id + * @return \Illuminate\View\View + */ + public function edit($id) + { + $warehouse = $this->warehouseRepository->findOrFail($id); + + return view('admin::settings.warehouses.edit', compact('warehouse')); + } + + /** + * Update the specified resource in storage. + */ + public function update(AttributeForm $request, int $id): RedirectResponse|JsonResponse + { + Event::dispatch('settings.warehouse.update.before', $id); + + $warehouse = $this->warehouseRepository->update($request->all(), $id); + + Event::dispatch('settings.warehouse.update.after', $warehouse); + + if (request()->ajax()) { + return response()->json([ + 'data' => $warehouse, + 'message' => trans('admin::app.settings.warehouses.index.update-success'), + ]); + } + + session()->flash('success', trans('admin::app.settings.warehouses.index.update-success')); + + return redirect()->route('admin.settings.warehouses.index'); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(int $id): JsonResponse + { + $this->warehouseRepository->findOrFail($id); + + try { + Event::dispatch('settings.warehouse.delete.before', $id); + + $this->warehouseRepository->delete($id); + + Event::dispatch('settings.warehouse.delete.after', $id); + + return response()->json([ + 'message' => trans('admin::app.settings.warehouses.index.delete-success'), + ], 200); + } catch (\Exception $exception) { + return response()->json([ + 'message' => trans('admin::app.settings.warehouses.index.delete-success'), + ], 400); + } + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/WebFormController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/WebFormController.php new file mode 100644 index 0000000..44e1aaa --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/WebFormController.php @@ -0,0 +1,159 @@ +ajax()) { + return datagrid(WebFormDataGrid::class)->process(); + } + + return view('admin::settings.web-forms.index'); + } + + /** + * Show the form for creating a new resource. + */ + public function create(): View + { + $tempAttributes = $this->attributeRepository->findWhereIn('entity_type', ['persons', 'leads']); + + $attributes = []; + + foreach ($tempAttributes as $attribute) { + if ( + $attribute->entity_type == 'persons' + && in_array($attribute->code, ['name', 'emails', 'contact_numbers']) + ) { + $attributes['default'][] = $attribute; + } else { + $attributes['other'][] = $attribute; + } + } + + return view('admin::settings.web-forms.create', compact('attributes')); + } + + /** + * Store a newly created email templates in storage. + */ + public function store(): RedirectResponse + { + $this->validate(request(), [ + 'title' => 'required', + 'submit_button_label' => 'required', + 'submit_success_action' => 'required', + 'submit_success_content' => 'required', + ]); + + Event::dispatch('settings.web_forms.create.before'); + + $data = request()->all(); + + $webForm = $this->webFormRepository->create($data); + + Event::dispatch('settings.web_forms.create.after', $webForm); + + session()->flash('success', trans('admin::app.settings.webforms.index.create-success')); + + return redirect()->route('admin.settings.web_forms.index'); + } + + /** + * Show the form for editing the specified email template. + */ + public function edit(int $id): View + { + $webForm = $this->webFormRepository->findOrFail($id); + + $attributes = $this->attributeRepository->findWhere([ + ['entity_type', 'IN', ['persons', 'leads']], + ['id', 'NOTIN', $webForm->attributes()->pluck('attribute_id')->toArray()], + ]); + + return view('admin::settings.web-forms.edit', compact('webForm', 'attributes')); + } + + /** + * Update the specified email template in storage. + */ + public function update(int $id): RedirectResponse + { + $this->validate(request(), [ + 'title' => 'required', + 'submit_button_label' => 'required', + 'submit_success_action' => 'required', + 'submit_success_content' => 'required', + ]); + + Event::dispatch('settings.web_forms.update.before', $id); + + $data = request()->all(); + + $webForm = $this->webFormRepository->update($data, $id); + + Event::dispatch('settings.web_forms.update.after', $webForm); + + session()->flash('success', trans('admin::app.settings.webforms.index.update-success')); + + return redirect()->route('admin.settings.web_forms.index'); + } + + /** + * Remove the specified email template from storage. + */ + public function destroy(int $id): JsonResponse + { + $webForm = $this->webFormRepository->findOrFail($id); + + try { + Event::dispatch('settings.web_forms.delete.before', $id); + + $webForm->delete($id); + + Event::dispatch('settings.web_forms.delete.after', $id); + + return response()->json([ + 'message' => trans('admin::app.settings.webforms.index.delete-success'), + ]); + } catch (\Exception $exception) { + return response()->json([ + 'message' => trans('admin::app.settings.webforms.index.delete-failed'), + ], 400); + } + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/WebhookController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/WebhookController.php new file mode 100644 index 0000000..8806f93 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/WebhookController.php @@ -0,0 +1,97 @@ +ajax()) { + return datagrid(WebhookDataGrid::class)->process(); + } + + return view('admin::settings.webhook.index'); + } + + /** + * Show the form for creating a new resource. + */ + public function create(): View + { + return view('admin::settings.webhook.create'); + } + + /** + * Store the newly created resource in storage. + */ + public function store(WebhookRequest $webhookRequest): RedirectResponse + { + Event::dispatch('settings.webhook.create.before'); + + $webhook = $this->webhookRepository->create($webhookRequest->validated()); + + Event::dispatch('settings.webhook.create.after', $webhook); + + session()->flash('success', trans('admin::app.settings.webhooks.index.create-success')); + + return redirect()->route('admin.settings.webhooks.index'); + } + + /** + * Store the newly created resource in storage. + */ + public function edit(int $id): View + { + $webhook = $this->webhookRepository->findOrFail($id); + + return view('admin::settings.webhook.edit', compact('webhook')); + } + + /** + * Update the specified resource in storage. + */ + public function update(WebhookRequest $webhookRequest, int $id): RedirectResponse + { + Event::dispatch('settings.webhook.update.before', $id); + + $webhook = $this->webhookRepository->update($webhookRequest->validated(), $id); + + Event::dispatch('settings.webhook.update.after', $webhook); + + session()->flash('success', trans('admin::app.settings.webhooks.index.update-success')); + + return redirect()->route('admin.settings.webhooks.index'); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(int $id): JsonResponse + { + $webhook = $this->webhookRepository->findOrFail($id); + + Event::dispatch('settings.webhook.delete.before', $id); + + $webhook?->delete(); + + Event::dispatch('settings.webhook.delete.after', $id); + + return response()->json([ + 'message' => trans('admin::app.settings.webhooks.index.delete-success'), + ]); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/WorkflowController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/WorkflowController.php new file mode 100755 index 0000000..4a64beb --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/WorkflowController.php @@ -0,0 +1,119 @@ +ajax()) { + return datagrid(WorkflowDataGrid::class)->process(); + } + + return view('admin::settings.workflows.index'); + } + + /** + * Show the form for creating a new resource. + */ + public function create(): View + { + return view('admin::settings.workflows.create'); + } + + /** + * Store a newly created workflow in storage. + */ + public function store(): RedirectResponse + { + $this->validate(request(), [ + 'name' => 'required', + ]); + + Event::dispatch('settings.workflow.create.before'); + + $workflow = $this->workflowRepository->create(request()->all()); + + Event::dispatch('settings.workflow.create.after', $workflow); + + session()->flash('success', trans('admin::app.settings.workflows.index.create-success')); + + return redirect()->route('admin.settings.workflows.index'); + } + + /** + * Show the form for editing the specified workflow. + */ + public function edit(int $id): View + { + $workflow = $this->workflowRepository->findOrFail($id); + + return view('admin::settings.workflows.edit', compact('workflow')); + } + + /** + * Update the specified workflow in storage. + */ + public function update(int $id): RedirectResponse + { + $this->validate(request(), [ + 'name' => 'required', + ]); + + Event::dispatch('settings.workflow.update.before', $id); + + $workflow = $this->workflowRepository->update(request()->all(), $id); + + Event::dispatch('settings.workflow.update.after', $workflow); + + session()->flash('success', trans('admin::app.settings.workflows.index.update-success')); + + return redirect()->route('admin.settings.workflows.index'); + } + + /** + * Remove the specified workflow from storage. + */ + public function destroy(int $id): JsonResponse + { + $workflow = $this->workflowRepository->findOrFail($id); + + try { + Event::dispatch('settings.workflow.delete.before', $id); + + $workflow->delete($id); + + Event::dispatch('settings.workflow.delete.after', $id); + + return response()->json([ + 'message' => trans('admin::app.settings.workflows.index.delete-success'), + ], 200); + } catch (\Exception $exception) { + return response()->json([ + 'message' => trans('admin::app.settings.workflows.index.delete-failed'), + ], 400); + } + + return response()->json([ + 'message' => trans('admin::app.settings.workflows.index.delete-failed'), + ], 400); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/TinyMCEController.php b/packages/Webkul/Admin/src/Http/Controllers/TinyMCEController.php new file mode 100644 index 0000000..bb82f57 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/TinyMCEController.php @@ -0,0 +1,62 @@ +storeMedia(); + + if (! empty($media)) { + return response()->json([ + 'location' => $media['file_url'], + ]); + } + + return response()->json([]); + } + + /** + * Store media. + */ + public function storeMedia(): array + { + if (! request()->hasFile('file')) { + return []; + } + + $file = request()->file('file'); + + if (! $file instanceof UploadedFile) { + return []; + } + + $filename = md5($file->getClientOriginalName().time()).'.'.$file->getClientOriginalExtension(); + + $path = $file->storeAs($this->storagePath, $filename); + + $this->sanitizeSVG($path, $file); + + return [ + 'file' => $path, + 'file_name' => $file->getClientOriginalName(), + 'file_url' => Storage::url($path), + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/User/AccountController.php b/packages/Webkul/Admin/src/Http/Controllers/User/AccountController.php new file mode 100755 index 0000000..e882409 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/User/AccountController.php @@ -0,0 +1,96 @@ +guard('user')->user(); + + return view('admin::user.account.edit', compact('user')); + } + + /** + * Update the specified resource in storage. + * + * @return \Illuminate\Http\Response + */ + public function update() + { + $user = auth()->guard('user')->user(); + + $this->validate(request(), [ + 'name' => 'required', + 'email' => 'email|unique:users,email,'.$user->id, + 'password' => 'nullable|min:6|confirmed', + 'current_password' => 'required|min:6', + 'image.*' => 'nullable|mimes:bmp,jpeg,jpg,png,webp', + ]); + + $data = request()->only([ + 'name', + 'email', + 'password', + 'password_confirmation', + 'current_password', + 'image', + ]); + + if (! Hash::check($data['current_password'], $user->password)) { + session()->flash('warning', trans('admin::app.account.edit.invalid-password')); + + return redirect()->back(); + } + + if (isset($data['role_id']) || isset($data['view_permission'])) { + session()->flash('warning', trans('admin::app.user.account.permission-denied')); + + return redirect()->back(); + } + + $isPasswordChanged = false; + + if (! $data['password']) { + unset($data['password']); + } else { + $isPasswordChanged = true; + + $data['password'] = bcrypt($data['password']); + } + + if (request()->hasFile('image')) { + $data['image'] = current(request()->file('image'))->store('admins/'.$user->id); + } else { + if (! isset($data['image'])) { + if (! empty($data['image'])) { + Storage::delete($user->image); + } + + $data['image'] = null; + } else { + $data['image'] = $user->image; + } + } + + $user->update($data); + + if ($isPasswordChanged) { + Event::dispatch('user.account.update-password', $user); + } + + session()->flash('success', trans('admin::app.account.edit.update-success')); + + return back(); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/User/ForgotPasswordController.php b/packages/Webkul/Admin/src/Http/Controllers/User/ForgotPasswordController.php new file mode 100755 index 0000000..70441f0 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/User/ForgotPasswordController.php @@ -0,0 +1,77 @@ +guard('user')->check()) { + return redirect()->route('admin.dashboard.index'); + } else { + if (strpos(url()->previous(), 'user') !== false) { + $intendedUrl = url()->previous(); + } else { + $intendedUrl = route('admin.dashboard.index'); + } + + session()->put('url.intended', $intendedUrl); + + return view('admin::sessions.forgot-password'); + } + } + + /** + * Store a newly created resource in storage. + * + * @return \Illuminate\Http\Response + */ + public function store() + { + try { + $this->validate(request(), [ + 'email' => 'required|email', + ]); + + $response = $this->broker()->sendResetLink(request(['email']), function ($user, $token) { + $user->notify(new UserResetPassword($token)); + }); + + if ($response == Password::RESET_LINK_SENT) { + session()->flash('success', trans('admin::app.users.forget-password.create.reset-link-sent')); + + return back(); + } + + return back() + ->withInput(request(['email'])) + ->withErrors([ + 'email' => trans('admin::app.users.forget-password.create.email-not-exist'), + ]); + } catch (\Exception $exception) { + session()->flash('error', trans($exception->getMessage())); + + return redirect()->back(); + } + } + + /** + * Get the broker to be used during password reset. + * + * @return \Illuminate\Contracts\Auth\PasswordBroker + */ + public function broker() + { + return Password::broker('users'); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/User/ResetPasswordController.php b/packages/Webkul/Admin/src/Http/Controllers/User/ResetPasswordController.php new file mode 100755 index 0000000..5544a86 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/User/ResetPasswordController.php @@ -0,0 +1,97 @@ +with([ + 'token' => $token, + 'email' => request('email'), + ]); + } + + /** + * Store a newly created resource in storage. + * + * @return \Illuminate\Http\Response + */ + public function store() + { + try { + $this->validate(request(), [ + 'token' => 'required', + 'email' => 'required|email', + 'password' => 'required|confirmed|min:6', + ]); + + $response = $this->broker()->reset( + request(['email', 'password', 'password_confirmation', 'token']), function ($admin, $password) { + $this->resetPassword($admin, $password); + } + ); + + if ($response == Password::PASSWORD_RESET) { + return redirect()->route('admin.dashboard.index'); + } + + return back() + ->withInput(request(['email'])) + ->withErrors([ + 'email' => trans($response), + ]); + } catch (\Exception $exception) { + session()->flash('error', trans($exception->getMessage())); + + return redirect()->back(); + } + } + + /** + * Reset the given admin's password. + * + * @param \Illuminate\Contracts\Auth\CanResetPassword $admin + * @param string $password + * @return void + */ + protected function resetPassword($admin, $password) + { + $admin->password = Hash::make($password); + + $admin->setRememberToken(Str::random(60)); + + $admin->save(); + + event(new PasswordReset($admin)); + + auth()->guard('user')->login($admin); + } + + /** + * Get the broker to be used during password reset. + * + * @return \Illuminate\Contracts\Auth\PasswordBroker + */ + public function broker() + { + return Password::broker('users'); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/User/SessionController.php b/packages/Webkul/Admin/src/Http/Controllers/User/SessionController.php new file mode 100755 index 0000000..81771b9 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/User/SessionController.php @@ -0,0 +1,117 @@ +guard('user')->check()) { + return redirect()->route('admin.dashboard.index'); + } + + $previousUrl = url()->previous(); + + $intendedUrl = str_contains($previousUrl, 'admin') + ? $previousUrl + : route('admin.dashboard.index'); + + session()->put('url.intended', $intendedUrl); + + return view('admin::sessions.login'); + } + + /** + * Store a newly created resource in storage. + */ + public function store(): RedirectResponse + { + $this->validate(request(), [ + 'email' => 'required|email', + 'password' => 'required', + ]); + + if (! auth()->guard('user')->attempt(request(['email', 'password']), request('remember'))) { + session()->flash('error', trans('admin::app.users.login-error')); + + return redirect()->back(); + } + + if (auth()->guard('user')->user()->status == 0) { + session()->flash('warning', trans('admin::app.users.activate-warning')); + + auth()->guard('user')->logout(); + + return redirect()->route('admin.session.create'); + } + + $menus = menu()->getItems('admin'); + + $availableNextMenu = $menus?->first(); + + if (! bouncer()->hasPermission('dashboard')) { + if (is_null($availableNextMenu)) { + session()->flash('error', trans('admin::app.users.not-permission')); + + auth()->guard('user')->logout(); + + return redirect()->route('admin.session.create'); + } + + return redirect()->to($availableNextMenu->getUrl()); + } + + $hasAccessToIntendedUrl = $this->canAccessIntendedUrl($menus, redirect()->getIntendedUrl()); + + if ($hasAccessToIntendedUrl) { + return redirect()->intended(route('admin.dashboard.index')); + } + + return redirect()->to($availableNextMenu->getUrl()); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(): RedirectResponse + { + auth()->guard('user')->logout(); + + return redirect()->route('admin.session.create'); + } + + /** + * Find menu item by URL. + */ + protected function canAccessIntendedUrl(Collection $menus, ?string $url): ?MenuItem + { + if (is_null($url)) { + return null; + } + + foreach ($menus as $menu) { + if ($menu->getUrl() === $url) { + return $menu; + } + + if ($menu->haveChildren()) { + $found = $this->canAccessIntendedUrl($menu->getChildren(), $url); + + if ($found) { + return $found; + } + } + } + + return null; + } +} diff --git a/packages/Webkul/Admin/src/Http/Middleware/Bouncer.php b/packages/Webkul/Admin/src/Http/Middleware/Bouncer.php new file mode 100755 index 0000000..a9a7bbc --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Middleware/Bouncer.php @@ -0,0 +1,86 @@ +guard($guard)->check()) { + return redirect()->route('admin.session.create'); + } + + /** + * If user status is changed by admin. Then session should be + * logged out. + */ + if (! (bool) auth()->guard($guard)->user()->status) { + auth()->guard($guard)->logout(); + + session()->flash('error', __('admin::app.errors.401')); + + return redirect()->route('admin.session.create'); + } + + /** + * If somehow the user deleted all permissions, then it should be + * auto logged out and need to contact the administrator again. + */ + if ($this->isPermissionsEmpty()) { + auth()->guard($guard)->logout(); + + session()->flash('error', __('admin::app.errors.401')); + + return redirect()->route('admin.session.create'); + } + + return $next($request); + } + + /** + * Check for user, if they have empty permissions or not except admin. + * + * @return bool + */ + public function isPermissionsEmpty() + { + if (! $role = auth()->guard('user')->user()->role) { + abort(401, 'This action is unauthorized.'); + } + + if ($role->permission_type === 'all') { + return false; + } + + if ($role->permission_type !== 'all' && empty($role->permissions)) { + return true; + } + + $this->checkIfAuthorized(); + + return false; + } + + /** + * Check authorization. + * + * @return null + */ + public function checkIfAuthorized() + { + $roles = acl()->getRoles(); + + if (isset($roles[Route::currentRouteName()])) { + bouncer()->allow($roles[Route::currentRouteName()]); + } + } +} diff --git a/packages/Webkul/Admin/src/Http/Middleware/Locale.php b/packages/Webkul/Admin/src/Http/Middleware/Locale.php new file mode 100644 index 0000000..a4a41a1 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Middleware/Locale.php @@ -0,0 +1,40 @@ +app = $app; + + $this->request = $request; + } + + /** + * Handle an incoming request. + * + * @param \Illuminate\Http\Request $request + * @return mixed + */ + public function handle($request, Closure $next) + { + app()->setLocale( + core()->getConfigData('general.general.locale_settings.locale') + ?: app()->getLocale() + ); + + return $next($request); + } +} diff --git a/packages/Webkul/Admin/src/Http/Requests/AttributeForm.php b/packages/Webkul/Admin/src/Http/Requests/AttributeForm.php new file mode 100644 index 0000000..a321c54 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Requests/AttributeForm.php @@ -0,0 +1,120 @@ +attributeRepository->scopeQuery(function ($query) { + $query = $query->whereIn('code', array_keys(request()->all())) + ->where('entity_type', request('entity_type')); + + if (request()->has('quick_add')) { + $query = $query->where('quick_add', 1); + } + + return $query; + })->get(); + + foreach ($attributes as $attribute) { + $validations = []; + + if ($attribute->type == 'boolean') { + continue; + } elseif ($attribute->type == 'address') { + if (! $attribute->is_required) { + continue; + } + + $validations = [ + $attribute->code.'.address' => 'required', + $attribute->code.'.country' => 'required', + $attribute->code.'.state' => 'required', + $attribute->code.'.city' => 'required', + $attribute->code.'.postcode' => 'required', + ]; + } elseif ($attribute->type == 'email') { + $validations = [ + $attribute->code => [$attribute->is_required ? 'required' : 'nullable'], + $attribute->code.'.*.value' => [$attribute->is_required ? 'required' : 'nullable', 'email'], + $attribute->code.'.*.label' => $attribute->is_required ? 'required' : 'nullable', + ]; + } elseif ($attribute->type == 'phone') { + $validations = [ + $attribute->code => [$attribute->is_required ? 'required' : 'nullable'], + $attribute->code.'.*.value' => [$attribute->is_required ? 'required' : 'nullable'], + $attribute->code.'.*.label' => $attribute->is_required ? 'required' : 'nullable', + ]; + } else { + $validations[$attribute->code] = [$attribute->is_required ? 'required' : 'nullable']; + + if ($attribute->type == 'text' && $attribute->validation) { + array_push($validations[$attribute->code], + $attribute->validation == 'decimal' + ? new Decimal + : $attribute->validation + ); + } + + if ($attribute->type == 'price') { + array_push($validations[$attribute->code], new Decimal); + } + + if ($attribute->type == 'image' && ! request($attribute->code.'.delete')) { + array_push($validations[$attribute->code], 'mimes:bmp,jpeg,jpg,png,webp'); + } + } + + if ($attribute->is_unique) { + array_push($validations[in_array($attribute->type, ['email', 'phone']) + ? $attribute->code.'.*.value' + : $attribute->code + ], function ($field, $value, $fail) use ($attribute) { + if (! $this->attributeValueRepository->isValueUnique($this->id, $attribute->entity_type, $attribute, request($field))) { + $fail('The value has already been taken.'); + } + }); + } + + $this->rules = array_merge($this->rules, $validations); + } + + return $this->rules; + } +} diff --git a/packages/Webkul/Admin/src/Http/Requests/ConfigurationForm.php b/packages/Webkul/Admin/src/Http/Requests/ConfigurationForm.php new file mode 100644 index 0000000..45f7459 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Requests/ConfigurationForm.php @@ -0,0 +1,43 @@ +input('keys', []))->mapWithKeys(function ($item) { + $data = json_decode($item, true); + + return collect($data['fields'])->mapWithKeys(function ($field) use ($data) { + $key = $data['key'].'.'.$field['name']; + + // Check delete key exist in the request + if (! $this->has($key.'.delete')) { + $validation = isset($field['validation']) && $field['validation'] ? $field['validation'] : 'nullable'; + + return [$key => $validation]; + } + + return []; + })->toArray(); + })->toArray(); + } +} diff --git a/packages/Webkul/Admin/src/Http/Requests/LeadForm.php b/packages/Webkul/Admin/src/Http/Requests/LeadForm.php new file mode 100644 index 0000000..52d5ee8 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Requests/LeadForm.php @@ -0,0 +1,158 @@ + $entityType) { + $attributes = $this->attributeRepository->scopeQuery(function ($query) use ($entityType) { + $attributeCodes = $entityType == 'persons' + ? array_keys(request('person') ?? []) + : array_keys(request()->all()); + + $query = $query->whereIn('code', $attributeCodes) + ->where('entity_type', $entityType); + + if (request()->has('quick_add')) { + $query = $query->where('quick_add', 1); + } + + return $query; + })->get(); + + foreach ($attributes as $attribute) { + if ($entityType == 'persons') { + $attribute->code = 'person.'.$attribute->code; + } + + $validations = []; + + if ($attribute->type == 'boolean') { + continue; + } elseif ($attribute->type == 'address') { + if (! $attribute->is_required) { + continue; + } + + $validations = [ + $attribute->code.'.address' => 'required', + $attribute->code.'.country' => 'required', + $attribute->code.'.state' => 'required', + $attribute->code.'.city' => 'required', + $attribute->code.'.postcode' => 'required', + ]; + } elseif ($attribute->type == 'email') { + $validations = [ + $attribute->code => [$attribute->is_required ? 'required' : 'nullable'], + $attribute->code.'.*.value' => [$attribute->is_required ? 'required' : 'nullable', 'email'], + $attribute->code.'.*.label' => $attribute->is_required ? 'required' : 'nullable', + ]; + } elseif ($attribute->type == 'phone') { + $validations = [ + $attribute->code => [$attribute->is_required ? 'required' : 'nullable'], + $attribute->code.'.*.value' => [$attribute->is_required ? 'required' : 'nullable'], + $attribute->code.'.*.label' => $attribute->is_required ? 'required' : 'nullable', + ]; + } else { + $validations[$attribute->code] = [$attribute->is_required ? 'required' : 'nullable']; + + if ($attribute->type == 'text' && $attribute->validation) { + array_push($validations[$attribute->code], + $attribute->validation == 'decimal' + ? new Decimal + : $attribute->validation + ); + } + + if ($attribute->type == 'price') { + array_push($validations[$attribute->code], new Decimal); + } + } + + if ($attribute->is_unique) { + array_push($validations[in_array($attribute->type, ['email', 'phone']) + ? $attribute->code.'.*.value' + : $attribute->code + ], function ($field, $value, $fail) use ($attribute, $entityType) { + if (! $this->attributeValueRepository->isValueUnique( + $entityType == 'persons' ? request('person.id') : $this->id, + $attribute->entity_type, + $attribute, + request($field) + ) + ) { + $fail('The value has already been taken.'); + } + }); + } + + $this->rules = array_merge($this->rules, $validations); + } + } + + $this->rules['expected_close_date'] = [ + 'date_format:Y-m-d', + 'after:'.Carbon::yesterday()->format('Y-m-d'), + ]; + + return [ + ...$this->rules, + 'products' => 'array', + 'products.*.product_id' => 'sometimes|required|exists:products,id', + 'products.*.name' => 'required_with:products.*.product_id', + 'products.*.price' => 'required_with:products.*.product_id', + 'products.*.quantity' => 'required_with:products.*.product_id', + ]; + } + + /** + * Get the validation messages that apply to the request. + */ + public function messages(): array + { + return [ + 'products.*.product_id.exists' => trans('admin::app.leads.selected-product-not-exist'), + 'products.*.name.required_with' => trans('admin::app.leads.product-name-required'), + 'products.*.price.required_with' => trans('admin::app.leads.product-price-required'), + 'products.*.quantity.required_with' => trans('admin::app.leads.product-quantity-required'), + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Requests/MassDestroyRequest.php b/packages/Webkul/Admin/src/Http/Requests/MassDestroyRequest.php new file mode 100644 index 0000000..ea5faa3 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Requests/MassDestroyRequest.php @@ -0,0 +1,31 @@ + ['required', 'array'], + 'indices.*' => ['integer'], + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Requests/MassUpdateRequest.php b/packages/Webkul/Admin/src/Http/Requests/MassUpdateRequest.php new file mode 100644 index 0000000..03c53a7 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Requests/MassUpdateRequest.php @@ -0,0 +1,32 @@ + ['required', 'array'], + 'indices.*' => ['integer'], + 'value' => ['required'], + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Requests/PipelineForm.php b/packages/Webkul/Admin/src/Http/Requests/PipelineForm.php new file mode 100755 index 0000000..42ac9fb --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Requests/PipelineForm.php @@ -0,0 +1,89 @@ +validatorExtensions($validationFactory); + } + + /** + * Determine if the user is authorized to make this request. + * + * @return bool + */ + public function authorize() + { + return true; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + if (request('id')) { + return [ + 'name' => 'required|unique:lead_pipelines,name,'.request('id'), + 'stages.*.name' => 'unique_key', + 'stages.*.code' => 'unique_key', + ]; + } + + return [ + 'name' => 'required|unique:lead_pipelines,name', + 'rotten_days' => 'required', + 'stages.*.name' => 'unique_key', + 'stages.*.code' => 'unique_key', + ]; + } + + /** + * Get the error messages for the defined validation rules. + * + * @return array + */ + public function messages() + { + return [ + 'stages.*.name.unique_key' => __('admin::app.settings.pipelines.duplicate-name'), + ]; + } + + /** + * Place all your validator extensions here. + * + * @return void + */ + public function validatorExtensions(ValidationFactory $validationFactory) + { + $validationFactory->extend( + 'unique_key', + function ($attribute, $value, $parameters) { + $key = last(explode('.', $attribute)); + + $stages = collect(request()->get('stages'))->filter(function ($stage) use ($key, $value) { + return $stage[$key] === $value; + }); + + if ($stages->count() > 1) { + return false; + } + + return true; + } + ); + } +} diff --git a/packages/Webkul/Admin/src/Http/Requests/UserForm.php b/packages/Webkul/Admin/src/Http/Requests/UserForm.php new file mode 100755 index 0000000..e2e9d32 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Requests/UserForm.php @@ -0,0 +1,43 @@ +rules = [ + 'name' => 'required', + 'email' => 'email|unique:users,email', + 'password' => 'nullable', + 'password_confirmation' => 'nullable|required_with:password|same:password', + 'status' => 'sometimes', + 'role_id' => 'required', + ]; + + if ($this->method() == 'PUT') { + $this->rules['email'] = 'email|unique:users,email,'.$this->route('id'); + } + + return $this->rules; + } +} diff --git a/packages/Webkul/Admin/src/Http/Resources/ActivityFileResource.php b/packages/Webkul/Admin/src/Http/Resources/ActivityFileResource.php new file mode 100644 index 0000000..abfdc0d --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Resources/ActivityFileResource.php @@ -0,0 +1,26 @@ + $this->id, + 'name' => $this->name, + 'path' => $this->path, + 'url' => $this->url, + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Resources/ActivityParticipantResource.php b/packages/Webkul/Admin/src/Http/Resources/ActivityParticipantResource.php new file mode 100644 index 0000000..d67dde1 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Resources/ActivityParticipantResource.php @@ -0,0 +1,22 @@ + $this->when($this->user, new UserResource($this->user)), + 'person' => $this->when($this->person, new PersonResource($this->person)), + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Resources/ActivityResource.php b/packages/Webkul/Admin/src/Http/Resources/ActivityResource.php new file mode 100644 index 0000000..932f9fb --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Resources/ActivityResource.php @@ -0,0 +1,35 @@ + $this->id, + 'parent_id' => $this->parent_id ?? null, + 'title' => $this->title, + 'type' => $this->type, + 'comment' => $this->comment, + 'additional' => is_array($this->resource->additional) ? $this->resource->additional : json_decode($this->resource->additional, true), + 'schedule_from' => $this->schedule_from, + 'schedule_to' => $this->schedule_to, + 'is_done' => $this->is_done, + 'user' => new UserResource($this->user), + 'files' => ActivityFileResource::collection($this->files), + 'participants' => ActivityParticipantResource::collection($this->participants), + 'location' => $this->location, + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Resources/EmailAttachmentResource.php b/packages/Webkul/Admin/src/Http/Resources/EmailAttachmentResource.php new file mode 100644 index 0000000..85d73c1 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Resources/EmailAttachmentResource.php @@ -0,0 +1,29 @@ + $this->id, + 'name' => $this->name, + 'path' => $this->path, + 'url' => $this->url, + 'size' => $this->size, + 'content_type' => $this->content_type, + 'content_id' => $this->content_id, + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Resources/EmailResource.php b/packages/Webkul/Admin/src/Http/Resources/EmailResource.php new file mode 100644 index 0000000..2078865 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Resources/EmailResource.php @@ -0,0 +1,43 @@ + $this->id, + 'subject' => $this->subject, + 'source' => $this->source, + 'user_type' => $this->user_type, + 'name' => $this->name, + 'reply' => $this->reply, + 'is_read' => $this->is_read, + 'folders' => $this->folders, + 'from' => $this->from, + 'sender' => $this->sender, + 'reply_to' => $this->reply_to, + 'cc' => $this->cc, + 'bcc' => $this->bcc, + 'unique_id' => $this->unique_id, + 'message_id' => $this->message_id, + 'reference_ids' => $this->reference_ids, + 'person' => new PersonResource($this->person), + 'lead' => new LeadResource($this->lead), + 'parent_id' => $this->parent_id, + 'parent' => new EmailResource($this->parent), + 'attachments' => EmailAttachmentResource::collection($this->attachments), + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Resources/LeadResource.php b/packages/Webkul/Admin/src/Http/Resources/LeadResource.php new file mode 100644 index 0000000..adac3f1 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Resources/LeadResource.php @@ -0,0 +1,37 @@ + $this->id, + 'title' => $this->title, + 'lead_value' => $this->lead_value, + 'formatted_lead_value' => core()->formatBasePrice($this->lead_value), + 'status' => $this->status, + 'expected_close_date' => $this->expected_close_date, + 'rotten_days' => $this->rotten_days, + 'closed_at' => $this->closed_at, + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + 'person' => new PersonResource($this->person), + 'user' => new UserResource($this->user), + 'type' => new TypeResource($this->type), + 'source' => new SourceResource($this->source), + 'pipeline' => new PipelineResource($this->pipeline), + 'stage' => new StageResource($this->stage), + 'tags' => TagResource::collection($this->tags), + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Resources/OrganizationResource.php b/packages/Webkul/Admin/src/Http/Resources/OrganizationResource.php new file mode 100644 index 0000000..301be29 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Resources/OrganizationResource.php @@ -0,0 +1,25 @@ + $this->id, + 'name' => $this->name, + 'address' => $this->address, + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Resources/PersonResource.php b/packages/Webkul/Admin/src/Http/Resources/PersonResource.php new file mode 100644 index 0000000..ba6cc0f --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Resources/PersonResource.php @@ -0,0 +1,27 @@ + $this->id, + 'name' => $this->name, + 'emails' => $this->emails, + 'contact_numbers' => $this->contact_numbers, + 'organization' => new OrganizationResource($this->organization), + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Resources/PipelineResource.php b/packages/Webkul/Admin/src/Http/Resources/PipelineResource.php new file mode 100644 index 0000000..e4b8514 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Resources/PipelineResource.php @@ -0,0 +1,27 @@ + $this->id, + 'name' => $this->name, + 'is_default' => $this->is_default, + 'rotten_days' => $this->rotten_days, + 'stages' => StageResource::collection($this->stages), + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Resources/ProductResource.php b/packages/Webkul/Admin/src/Http/Resources/ProductResource.php new file mode 100644 index 0000000..c7f74a5 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Resources/ProductResource.php @@ -0,0 +1,27 @@ + $this->id, + 'name' => $this->name, + 'description' => $this->description, + 'sku' => $this->sku, + 'price' => $this->price, + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Resources/QuoteResource.php b/packages/Webkul/Admin/src/Http/Resources/QuoteResource.php new file mode 100644 index 0000000..7b4d2bf --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Resources/QuoteResource.php @@ -0,0 +1,33 @@ + $this->id, + 'subject' => $this->subject, + 'description' => $this->description, + 'billing_address' => $this->billing_address, + 'shipping_address' => $this->shipping_address, + 'discount_percent' => $this->discount_percent, + 'discount_amount' => $this->discount_amount, + 'tax_amount' => $this->tax_amount, + 'adjustment_amount' => $this->adjustment_amount, + 'sub_total' => $this->sub_total, + 'grand_total' => $this->grand_total, + 'expired_at' => $this->expired_at, + 'user' => new UserResource($this->user), + 'person' => new PersonResource($this->person), + 'leads' => LeadResource::collection($this->leads), + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Resources/SourceResource.php b/packages/Webkul/Admin/src/Http/Resources/SourceResource.php new file mode 100644 index 0000000..3dc94a7 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Resources/SourceResource.php @@ -0,0 +1,24 @@ + $this->id, + 'name' => $this->name, + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Resources/StageResource.php b/packages/Webkul/Admin/src/Http/Resources/StageResource.php new file mode 100644 index 0000000..e206f1c --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Resources/StageResource.php @@ -0,0 +1,29 @@ + $this->id, + 'code' => $this->code, + 'name' => $this->name, + 'lead_value' => $this->lead_value, + 'formatted_lead_value' => core()->formatBasePrice($this->lead_value), + 'is_user_defined' => $this->is_user_defined, + 'sort_order' => $this->sort_order, + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Resources/TagResource.php b/packages/Webkul/Admin/src/Http/Resources/TagResource.php new file mode 100644 index 0000000..40cd42e --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Resources/TagResource.php @@ -0,0 +1,26 @@ + $this->id, + 'name' => $this->name, + 'color' => $this->color, + 'user' => new UserResource($this->user), + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Resources/TypeResource.php b/packages/Webkul/Admin/src/Http/Resources/TypeResource.php new file mode 100644 index 0000000..5e943ef --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Resources/TypeResource.php @@ -0,0 +1,24 @@ + $this->id, + 'name' => $this->name, + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Resources/UserResource.php b/packages/Webkul/Admin/src/Http/Resources/UserResource.php new file mode 100644 index 0000000..5e29ec9 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Resources/UserResource.php @@ -0,0 +1,26 @@ + $this->id, + 'name' => $this->name, + 'email' => $this->email, + 'image' => $this->image, + 'created_at' => $this->created_at, + 'updated_at' => $this->name, + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/helpers.php b/packages/Webkul/Admin/src/Http/helpers.php new file mode 100755 index 0000000..019e620 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/helpers.php @@ -0,0 +1,8 @@ +make('bouncer'); + } +} diff --git a/packages/Webkul/Admin/src/Listeners/Activity.php b/packages/Webkul/Admin/src/Listeners/Activity.php new file mode 100644 index 0000000..d2ba5ed --- /dev/null +++ b/packages/Webkul/Admin/src/Listeners/Activity.php @@ -0,0 +1,56 @@ +input('lead_id')) { + $lead = $this->leadRepository->find(request()->input('lead_id')); + + if (! $lead->activities->contains($activity->id)) { + $lead->activities()->attach($activity->id); + } + } elseif (request()->input('person_id')) { + $person = $this->personRepository->find(request()->input('person_id')); + + if (! $person->activities->contains($activity->id)) { + $person->activities()->attach($activity->id); + } + } elseif (request()->input('warehouse_id')) { + $warehouse = $this->warehouseRepository->find(request()->input('warehouse_id')); + + if (! $warehouse->activities->contains($activity->id)) { + $warehouse->activities()->attach($activity->id); + } + } elseif (request()->input('product_id')) { + $product = $this->productRepository->find(request()->input('product_id')); + + if (! $product->activities->contains($activity->id)) { + $product->activities()->attach($activity->id); + } + } + } +} diff --git a/packages/Webkul/Admin/src/Listeners/Lead.php b/packages/Webkul/Admin/src/Listeners/Lead.php new file mode 100644 index 0000000..20a40fa --- /dev/null +++ b/packages/Webkul/Admin/src/Listeners/Lead.php @@ -0,0 +1,30 @@ +emailRepository->update([ + 'lead_id' => $lead->id, + ], request('email_id')); + } +} diff --git a/packages/Webkul/Admin/src/Listeners/Person.php b/packages/Webkul/Admin/src/Listeners/Person.php new file mode 100644 index 0000000..b8c4378 --- /dev/null +++ b/packages/Webkul/Admin/src/Listeners/Person.php @@ -0,0 +1,30 @@ +emailRepository->update([ + 'person_id' => $person->id, + ], request('email_id')); + } +} diff --git a/packages/Webkul/Admin/src/Notifications/Common.php b/packages/Webkul/Admin/src/Notifications/Common.php new file mode 100644 index 0000000..ae2ff2a --- /dev/null +++ b/packages/Webkul/Admin/src/Notifications/Common.php @@ -0,0 +1,38 @@ +to($this->data['to']) + ->subject($this->data['subject']) + ->view('admin::emails.common.index', [ + 'body' => $this->data['body'], + ]); + + if (isset($this->data['attachments'])) { + foreach ($this->data['attachments'] as $attachment) { + $message->attachData($attachment['content'], $attachment['name'], [ + 'mime' => $attachment['mime'], + ]); + } + } + + return $message; + } +} diff --git a/packages/Webkul/Admin/src/Notifications/User/Create.php b/packages/Webkul/Admin/src/Notifications/User/Create.php new file mode 100644 index 0000000..9f44ed2 --- /dev/null +++ b/packages/Webkul/Admin/src/Notifications/User/Create.php @@ -0,0 +1,27 @@ +to($this->user->email) + ->subject(trans('admin::app.emails.common.user.create-subject')) + ->view('admin::emails.users.create', [ + 'user_name' => $this->user->name, + ]); + } +} diff --git a/packages/Webkul/Admin/src/Notifications/User/UserResetPassword.php b/packages/Webkul/Admin/src/Notifications/User/UserResetPassword.php new file mode 100755 index 0000000..222d04d --- /dev/null +++ b/packages/Webkul/Admin/src/Notifications/User/UserResetPassword.php @@ -0,0 +1,28 @@ +token); + } + + return (new MailMessage) + ->view('admin::emails.users.forget-password', [ + 'user_name' => $notifiable->name, + 'token' => $this->token, + ]); + } +} diff --git a/packages/Webkul/Admin/src/Notifications/User/UserUpdatePassword.php b/packages/Webkul/Admin/src/Notifications/User/UserUpdatePassword.php new file mode 100644 index 0000000..2e82646 --- /dev/null +++ b/packages/Webkul/Admin/src/Notifications/User/UserUpdatePassword.php @@ -0,0 +1,33 @@ +from(core()->getSenderEmailDetails()['email'], core()->getSenderEmailDetails()['name']) + ->to($this->user->email, $this->user->name) + ->subject(trans('shop::app.mail.update-password.subject')) + ->view('shop::emails.users.update-password', ['user' => $this->user]); + } +} diff --git a/packages/Webkul/Admin/src/Providers/AdminServiceProvider.php b/packages/Webkul/Admin/src/Providers/AdminServiceProvider.php new file mode 100644 index 0000000..d8be1f1 --- /dev/null +++ b/packages/Webkul/Admin/src/Providers/AdminServiceProvider.php @@ -0,0 +1,99 @@ +aliasMiddleware('user', BouncerMiddleware::class); + + $router->aliasMiddleware('admin_locale', Locale::class); + + include __DIR__.'/../Http/helpers.php'; + + Route::middleware(['web', 'admin_locale', 'user']) + ->prefix(config('app.admin_path')) + ->group(__DIR__.'/../Routes/Admin/web.php'); + + Route::middleware(['web', 'admin_locale']) + ->group(__DIR__.'/../Routes/Front/web.php'); + + $this->loadMigrationsFrom(__DIR__.'/../Database/Migrations'); + + $this->loadTranslationsFrom(__DIR__.'/../Resources/lang', 'admin'); + + $this->loadViewsFrom(__DIR__.'/../Resources/views', 'admin'); + + Blade::anonymousComponentPath(__DIR__.'/../Resources/views/components', 'admin'); + + $this->app->bind(ExceptionHandler::class, Handler::class); + + Relation::morphMap([ + 'leads' => \Webkul\Lead\Models\Lead::class, + 'organizations' => \Webkul\Contact\Models\Organization::class, + 'persons' => \Webkul\Contact\Models\Person::class, + 'products' => \Webkul\Product\Models\Product::class, + 'quotes' => \Webkul\Quote\Models\Quote::class, + 'warehouses' => \Webkul\Warehouse\Models\Warehouse::class, + ]); + + $this->app->register(EventServiceProvider::class); + } + + /** + * Register services. + * + * @return void + */ + public function register() + { + $this->registerFacades(); + + $this->registerConfig(); + } + + /** + * Register Bouncer as a singleton. + */ + protected function registerFacades(): void + { + $loader = AliasLoader::getInstance(); + + $loader->alias('Bouncer', \Webkul\Admin\Facades\Bouncer::class); + + $this->app->singleton('bouncer', function () { + return new \Webkul\Admin\Bouncer; + }); + } + + /** + * Register package config. + */ + protected function registerConfig(): void + { + $this->mergeConfigFrom(dirname(__DIR__).'/Config/acl.php', 'acl'); + + $this->mergeConfigFrom(dirname(__DIR__).'/Config/menu.php', 'menu.admin'); + + $this->mergeConfigFrom(dirname(__DIR__).'/Config/core_config.php', 'core_config'); + + $this->mergeConfigFrom(dirname(__DIR__).'/Config/attribute_lookups.php', 'attribute_lookups'); + + $this->mergeConfigFrom(dirname(__DIR__).'/Config/attribute_entity_types.php', 'attribute_entity_types'); + } +} diff --git a/packages/Webkul/Admin/src/Providers/EventServiceProvider.php b/packages/Webkul/Admin/src/Providers/EventServiceProvider.php new file mode 100644 index 0000000..d5410b5 --- /dev/null +++ b/packages/Webkul/Admin/src/Providers/EventServiceProvider.php @@ -0,0 +1,31 @@ + [ + 'Webkul\Admin\Listeners\Person@linkToEmail', + ], + + 'lead.create.after' => [ + 'Webkul\Admin\Listeners\Lead@linkToEmail', + ], + + 'activity.create.after' => [ + 'Webkul\Admin\Listeners\Activity@afterUpdateOrCreate', + ], + + 'activity.update.after' => [ + 'Webkul\Admin\Listeners\Activity@afterUpdateOrCreate', + ], + ]; +} diff --git a/packages/Webkul/Admin/src/Providers/ModuleServiceProvider.php b/packages/Webkul/Admin/src/Providers/ModuleServiceProvider.php new file mode 100644 index 0000000..b9d2e2f --- /dev/null +++ b/packages/Webkul/Admin/src/Providers/ModuleServiceProvider.php @@ -0,0 +1,10 @@ +|string> + */ + public function rules() + { + return [ + 'name' => 'required|string|max:255', + 'entity_type' => 'required|string|max:255', + 'description' => 'nullable|string|max:255', + 'method' => 'required|string|max:255', + 'end_point' => 'required|string|max:255', + 'query_params' => 'nullable', + 'headers' => 'nullable', + 'payload_type' => [ + 'required', + 'string', + 'max:255', + Rule::in(['default', 'x-www-form-urlencoded', 'raw']), + ], + 'raw_payload_type' => [ + 'string', + 'max:255', + Rule::in(['json', 'text']), + ], + 'payload' => 'nullable', + ]; + } +} diff --git a/packages/Webkul/Admin/src/Resources/assets/css/app.css b/packages/Webkul/Admin/src/Resources/assets/css/app.css new file mode 100644 index 0000000..c786851 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/css/app.css @@ -0,0 +1,656 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +/* -------------------------------- new css -------------------------------- */ + +@font-face { + font-family: 'icomoon'; + src: url('../fonts/icomoon.woff?w2trdd') format('woff'); + font-weight: normal; + font-style: normal; + font-display: block; + } + + [class^="icon-"], [class*=" icon-"] { + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: 'icomoon' !important; + speak: never; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } + +@layer components { + .icon-image:before { + content: "\e956"; + } + + .icon-bookmark:before { + content: "\e92c"; + } + + .icon-bookmark-active:before { + content: "\e92d"; + } + + .icon-stats-down:before { + content: "\e94d"; + } + + .icon-error:before { + content: "\e951"; + } + + .icon-info:before { + content: "\e952"; + } + + .icon-success:before { + content: "\e953"; + } + + .icon-warning:before { + content: "\e954"; + } + + .icon-stats-down:before { + content: "\e94d"; + } + + .icon-stats-up:before { + content: "\e94f"; + } + + .icon-attribute:before { + content: "\e947"; + } + + .icon-download:before { + content: "\e948"; + } + + .icon-settings-warehouse:before { + content: "\e94e"; + } + + .icon-move:before { + content: "\e949"; + } + + .icon-organization:before { + content: "\e94a"; + } + + .icon-role:before { + content: "\e94b"; + } + + .icon-user:before { + content: "\e94c"; + } + + .icon-system-generate:before { + content: "\e950"; + } + + .icon-settings-attributes:before { + content: "\e93b"; + } + + .icon-settings-flow:before { + content: "\e93c"; + } + + .icon-settings-group:before { + content: "\e93d"; + } + + .icon-settings-mail:before { + content: "\e93e"; + } + + .icon-settings-pipeline:before { + content: "\e93f"; + } + + .icon-settings-roles:before { + content: "\e940"; + } + + .icon-settings-sources:before { + content: "\e941"; + } + + .icon-settings-tag:before { + content: "\e942"; + } + + .icon-settings-type:before { + content: "\e943"; + } + + .icon-settings-user:before { + content: "\e944"; + } + + .icon-settings-webforms:before { + content: "\e945"; + } + + .icon-settings-webhooks:before { + content: "\e946"; + } + + .icon-attached-file:before { + content: "\e932"; + } + + .icon-forward:before { + content: "\e933"; + } + + .icon-location:before { + content: "\e934"; + } + + .icon-pin:before { + content: "\e935"; + } + + .icon-print:before { + content: "\e936"; + } + + .icon-reply-all:before { + content: "\e937"; + } + + .icon-reply:before { + content: "\e938"; + } + + .icon-rotten:before { + content: "\e939"; + } + + .icon-tag:before { + content: "\e93a"; + } + + .icon-list:before { + content: "\e92e"; + } + + .icon-enter:before { + content: "\e92f"; + } + + .icon-kanban:before { + content: "\e930"; + } + + .icon-tick:before { + content: "\e931"; + } + + .icon-eye-hide:before { + content: "\e929"; + } + + .icon-percentage:before { + content: "\e92a"; + } + + .icon-dollar:before { + content: "\e92b"; + } + + .icon-radio-selected:before { + content: "\e924"; + } + + .icon-radio-normal:before { + content: "\e925"; + } + + .icon-folder:before { + content: "\e926"; + } + + .icon-file:before { + content: "\e927"; + } + + .icon-eye:before { + content: "\e928"; + } + + .icon-notification:before { + content: "\e900"; + } + + .icon-configuration:before { + content: "\e901"; + } + + .icon-note:before { + content: "\e902"; + } + + .icon-edit:before { + content: "\e903"; + } + + .icon-menu:before { + content: "\e955"; + } + + .icon-calendar:before { + content: "\e904"; + } + + .icon-delete:before { + content: "\e905"; + } + + .icon-more:before { + content: "\e906"; + } + + .icon-checkbox-multiple:before { + content: "\e907"; + } + + .icon-checkbox-select:before { + content: "\e908"; + } + + .icon-checkbox-outline:before { + content: "\e909"; + } + + .icon-message:before { + content: "\e90a"; + } + + .icon-video:before { + content: "\e90b"; + } + + .icon-attachment:before { + content: "\e90c"; + } + + .icon-sent:before { + content: "\e90d"; + } + + .icon-call:before { + content: "\e90e"; + } + + .icon-meeting:before { + content: "\e90f"; + } + + .icon-light:before { + content: "\e910"; + } + + .icon-dark:before { + content: "\e911"; + } + + .icon-mail:before { + content: "\e912"; + } + + .icon-leads:before { + content: "\e913"; + } + + .icon-filter:before { + content: "\e914"; + } + + .icon-setting:before { + content: "\e915"; + } + + .icon-product:before { + content: "\e916"; + } + + .icon-contact:before { + content: "\e917"; + } + + .icon-activity:before { + content: "\e918"; + } + + .icon-perosnal:before { + content: "\e919"; + } + + .icon-quote:before { + content: "\e91a"; + } + + .icon-dashboard:before { + content: "\e91b"; + } + + .icon-cross-large:before { + content: "\e91c"; + } + + .icon-left-arrow:before { + content: "\e91d"; + } + + .icon-right-arrow:before { + content: "\e91e"; + } + + .icon-up-arrow:before { + content: "\e91f"; + } + + .icon-down-arrow:before { + content: "\e920"; + } + + .icon-search:before { + content: "\e921"; + } + + .icon-add:before { + content: "\e922"; + } + + .icon-add-2:before { + content: "\e923"; + } + + .label-active { + @apply max-w-max rounded-md bg-emerald-200 px-3 py-1.5 text-xs font-medium text-emerald-900; + } + + .label-inactive { + @apply max-w-max rounded-md bg-red-200 px-3 py-1.5 text-xs font-medium text-red-800; + } + + [dir="ltr"] .sidebar-rounded::after { + @apply content-[''] w-[30px] h-[30px] top-0 right-[-30px] absolute bg-no-repeat pointer-events-none bg-[url("../images/corner-clip.svg")] transition-all; + } + + [dir="rtl"] .sidebar-rounded::before { + @apply content-[''] w-[30px] h-[30px] top-0 left-[-30px] absolute bg-no-repeat pointer-events-none bg-[url("../images/corner-clip.svg")] transition-all rotate-90; + } + + .dark .sidebar-rounded::after { + @apply bg-[url("../images/dark-corner-clip.svg")] + } + + .dark .sidebar-rounded::before { + @apply bg-[url("../images/dark-corner-clip.svg")] + } + + .tox.tox-silver-sink.tox-tinymce-aux { + z-index: 99999; + } + + .stage::after { + content: ''; + position: absolute; + top: 50%; + right: -10px; + width: 24px; + height: 24px; + z-index: 1; + border-radius: 0 0 0 25px; + transform: translateY(-50%) rotate(45deg); + border-right: 4px solid #f3f4f6; + border-top: 4px solid #f3f4f6; + } + + .dark .stage::after { + content: ''; + position: absolute; + top: 50%; + right: -10px; + width: 24px; + height: 24px; + z-index: 1; + border-radius: 0 0 0 25px; + transform: translateY(-50%) rotate(45deg); + border-right: 4px solid #030712; + border-top: 4px solid #030712; + } + + [dir="rtl"] .stage::before { + content: ''; + position: absolute; + top: 50%; + left: -10px; + width: 24px; + height: 24px; + z-index: 1; + border-radius: 0 0 0 25px; + transform: translateY(-50%) rotate(225deg); + border-right: 4px solid #f3f4f6; + border-top: 4px solid #f3f4f6; + } + + [dir="rtl"] .stage::after { + display: none; + } + + .dark\:bg-gray-400:is(.dark *) { + --tw-bg-opacity: 1 !important; + background-color: #1f2937 !important; + border: #111827 solid !important; + color: #e5e7eb !important; + } + + .dark\:bg-gray-800:is(.dark *) { + --tw-bg-opacity: 1; + background-color: rgb(16 24 39); + } + + .shimmer { + animation-duration: 2.2s; + animation-fill-mode: forwards; + animation-iteration-count: infinite; + animation-name: skeleton; + animation-timing-function: linear; + background: linear-gradient( + to right, + #f6f6f6 8%, + #f0f0f0 18%, + #f6f6f6 33% + ); + background-size: 1250px 100%; + } + + .light-shimmer-bg { + background: linear-gradient( + to right, + #fafafa 8%, + #f5f5f5 18%, + #fafafa 33% + ); + background-size: 1250px 100%; + } + + .dark .shimmer { + background: linear-gradient( + to right, + #1f2937 8%, + #1a2232 18%, + #1f2937 33% + ); + } + + .primary-button { + @apply bg-brandColor border border-brandColor cursor-pointer flex focus:opacity-[0.9] font-semibold gap-x-1 hover:opacity-[0.9] items-center place-content-center px-3 py-1.5 rounded-md text-gray-50 transition-all; + } + + .secondary-button { + @apply flex cursor-pointer place-content-center items-center gap-x-1 whitespace-nowrap rounded-md border-2 border-brandColor bg-white px-3 py-1.5 font-semibold text-brandColor transition-all hover:bg-[#eff6ff61] focus:bg-[#eff6ff61] dark:border-gray-400 dark:bg-gray-800 dark:text-white dark:hover:opacity-80; + } + + .transparent-button { + @apply flex cursor-pointer appearance-none place-content-center items-center gap-x-1 whitespace-nowrap rounded-md border-2 border-transparent px-3 py-1.5 font-semibold text-gray-600 transition-all marker:shadow hover:bg-gray-100 focus:bg-gray-100 dark:hover:bg-gray-950 dark:focus:bg-gray-950; + } + + ::-webkit-scrollbar { + width: 12px; + } + + ::-webkit-scrollbar-track { + background: #f1f1f1; + } + + ::-webkit-scrollbar-thumb { + background: #888; + border-radius: 6px; + } + + ::-webkit-scrollbar-thumb:hover { + background: #555; + } + + /* Firefox */ + * { + scrollbar-width: thin; + scrollbar-color: #888 #f1f1f1; + } + + ::selection { + background-color: rgba(0, 68, 242, .2); + } + + body { + @apply bg-gray-100 text-sm text-gray-800; + } + + button:disabled { + @apply cursor-not-allowed opacity-50; + } + + button:disabled:hover { + @apply cursor-not-allowed opacity-50; + } + + .draggable-ghost { + opacity: 0.5; + background: #e0e7ff; + } + + html.dark [class^="icon-"], + html.dark [class*=" icon-"]{ + color: #d1d5db; + } + + p { + @apply text-[14px] !leading-[17px]; + } + + input, + textarea, + select { + @apply outline-none; + } + + .journal-scroll::-webkit-scrollbar { + width: 14px; + cursor: pointer; + display: none; + } + + .journal-scroll::-webkit-scrollbar-track { + background-color: #fff; + cursor: pointer; + border-radius: 12px; + border: 1px solid #e9e9e9; + } + + .journal-scroll::-webkit-scrollbar-thumb { + cursor: pointer; + background-color: #e9e9e9; + border-radius: 12px; + border: 3px solid transparent; + background-clip: content-box; + } + + .custom-select { + -webkit-appearance: none; + -moz-appearance: none; + background: transparent; + background-image: url("data:image/svg+xml;utf8,"); + background-repeat: no-repeat; + background-position-x: calc(100% - 10px); + background-position-y: 50%; + } + + .dark .custom-select{ + background-image: url("data:image/svg+xml;utf8,"); + } + + [dir="rtl"] .custom-select { + background-position-x: calc(100% - (100% - 10px)); + } + + .draggable-ghost { + @apply border border-dashed !border-gray-300; + } + + @keyframes skeleton { + 0% { + @apply bg-[-1250px_0]; + } + + 100% { + @apply bg-[1250px_0]; + } + } + + .required:after { + @apply content-['*']; + } +} + +.tox .tox-toolbar__group:last-child button { + padding: 6px 8px; + background: #eff6ff; + color: #2563EB; +} + +.tox .tox-toolbar__group:last-child button:hover { + background: #dbeafe; +} + +.tox .tox-toolbar__group:last-child button[aria-disabled="true"] { + @apply cursor-not-allowed opacity-50; +} + +.tox .tox-toolbar__group:last-child button { + @apply !bg-transparent; +} + +.tox .tox-toolbar__group:last-child button:hover { + @apply border-0 !bg-[#3389ec] text-white shadow-none; +} + +.tox.tox-silver-sink.tox-tinymce-aux { + z-index: 99999; +} \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/assets/fonts/icomoon.woff b/packages/Webkul/Admin/src/Resources/assets/fonts/icomoon.woff new file mode 100644 index 0000000000000000000000000000000000000000..bedf008609c593ccf2e7c0d4d34c7c9fc4bf2fb2 GIT binary patch literal 37964 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 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/assets/images/dark-corner-clip.svg b/packages/Webkul/Admin/src/Resources/assets/images/dark-corner-clip.svg new file mode 100644 index 0000000..9c36b81 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/dark-corner-clip.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/assets/images/dark-logo.svg b/packages/Webkul/Admin/src/Resources/assets/images/dark-logo.svg new file mode 100644 index 0000000..4b14484 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/dark-logo.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/activities.svg b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/activities.svg new file mode 100644 index 0000000..890d0ea --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/activities.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/calls.svg b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/calls.svg new file mode 100644 index 0000000..6ade01a --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/calls.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/default.svg b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/default.svg new file mode 100644 index 0000000..fa4e8d9 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/default.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/description.svg b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/description.svg new file mode 100644 index 0000000..d367df7 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/description.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/emails.svg b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/emails.svg new file mode 100644 index 0000000..24a893f --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/emails.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/files.svg b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/files.svg new file mode 100644 index 0000000..e75d4fc --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/files.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/lunches.svg b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/lunches.svg new file mode 100644 index 0000000..9eef171 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/lunches.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/meetings.svg b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/meetings.svg new file mode 100644 index 0000000..6aec1c6 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/meetings.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/notes.svg b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/notes.svg new file mode 100644 index 0000000..d27d66c --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/notes.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/organizations.svg b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/organizations.svg new file mode 100644 index 0000000..a41bd86 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/organizations.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/pipedrive.svg b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/pipedrive.svg new file mode 100644 index 0000000..fc9d411 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/pipedrive.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/plans.svg b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/plans.svg new file mode 100644 index 0000000..669e469 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/plans.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/products.svg b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/products.svg new file mode 100644 index 0000000..6c1fab3 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/products.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/quotes.svg b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/quotes.svg new file mode 100644 index 0000000..db5d86d --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/quotes.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/users.svg b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/users.svg new file mode 100644 index 0000000..1a90f23 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/users.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/error.svg b/packages/Webkul/Admin/src/Resources/assets/images/error.svg new file mode 100644 index 0000000..6fe0d2a --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/error.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/favicon.ico b/packages/Webkul/Admin/src/Resources/assets/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a146b4e79c46f4b47bd7a708a14465df665f56a1 GIT binary patch literal 125486 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 literal 0 HcmV?d00001 diff --git a/packages/Webkul/Admin/src/Resources/assets/images/logo.svg b/packages/Webkul/Admin/src/Resources/assets/images/logo.svg new file mode 100644 index 0000000..6acc3ad --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/logo.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/mobile-dark-logo.svg b/packages/Webkul/Admin/src/Resources/assets/images/mobile-dark-logo.svg new file mode 100644 index 0000000..1c24c93 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/mobile-dark-logo.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/mobile-light-logo.svg b/packages/Webkul/Admin/src/Resources/assets/images/mobile-light-logo.svg new file mode 100644 index 0000000..3d0761d --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/mobile-light-logo.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/js/app.js b/packages/Webkul/Admin/src/Resources/assets/js/app.js new file mode 100644 index 0000000..88e5563 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/js/app.js @@ -0,0 +1,134 @@ +/** + * This will track all the images and fonts for publishing. + */ +import.meta.glob(["../images/**", "../fonts/**"]); + +/** + * Main vue bundler. + */ +import { createApp } from "vue/dist/vue.esm-bundler"; + +/** + * Main root application registry. + */ +window.app = createApp({ + data() { + return { + isMenuActive: false, + + hoveringMenu: '', + }; + }, + + created() { + window.addEventListener('click', this.handleFocusOut); + }, + + beforeDestroy() { + window.removeEventListener('click', this.handleFocusOut); + }, + + methods: { + onSubmit() {}, + + onInvalidSubmit({ values, errors, results }) { + setTimeout(() => { + const errorKeys = Object.entries(errors) + .map(([key, value]) => ({ key, value })) + .filter(error => error["value"].length); + + let firstErrorElement = document.querySelector('[name="' + errorKeys[0]["key"] + '"]'); + + firstErrorElement.scrollIntoView({ + behavior: "smooth", + block: "center" + }); + }, 100); + }, + + handleMouseOver(event) { + if (this.isMenuActive) { + return; + } + + const parentElement = event.currentTarget.parentElement; + + if (parentElement.classList.contains('sidebar-collapsed')) { + parentElement.classList.remove('sidebar-collapsed'); + + parentElement.classList.add('sidebar-not-collapsed'); + } + + }, + + handleMouseLeave(event) { + if (this.isMenuActive) { + return; + } + + const parentElement = event.currentTarget.parentElement; + + if (parentElement.classList.contains('sidebar-not-collapsed')) { + parentElement.classList.remove('sidebar-not-collapsed'); + + parentElement.classList.add('sidebar-collapsed'); + } + }, + + handleFocusOut(event) { + const sidebar = this.$refs.sidebar; + + if ( + sidebar && + !sidebar.contains(event.target) + ) { + this.isMenuActive = false; + + const parentElement = sidebar.parentElement; + + if (parentElement.classList.contains('sidebar-not-collapsed')) { + parentElement.classList.remove('sidebar-not-collapsed'); + + parentElement.classList.add('sidebar-collapsed'); + } + } + }, + }, +}); + +/** + * Global plugins registration. + */ +import Admin from "./plugins/admin"; +import Axios from "./plugins/axios"; +import Emitter from "./plugins/emitter"; +import Flatpickr from "./plugins/flatpickr"; +import VeeValidate from "./plugins/vee-validate"; +import CreateElement from "./plugins/createElement"; +import Draggable from "./plugins/draggable"; +import VueCal from "./plugins/vue-cal"; + +[ + Admin, + Axios, + Emitter, + CreateElement, + Draggable, + Flatpickr, + VeeValidate, + VueCal, +].forEach((plugin) => app.use(plugin)); + +/** + * Global directives. + */ +import Debounce from "./directives/debounce"; +import DOMPurify from "./directives/dompurify"; +import ToolTip from "./directives/tooltip"; + +app.directive("debounce", Debounce); +app.directive("safe-html", DOMPurify); +app.directive("tooltip", ToolTip); + +export default app; + diff --git a/packages/Webkul/Admin/src/Resources/assets/js/chart.js b/packages/Webkul/Admin/src/Resources/assets/js/chart.js new file mode 100644 index 0000000..15bf0b8 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/js/chart.js @@ -0,0 +1,20 @@ +/** + * Skipped minification because the original files appears to be already minified. + * Original file: /npm/chart.js@4.4.0/dist/chart.umd.js + * + * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files + */ +/*! + * Chart.js v4.4.0 + * https://www.chartjs.org + * (c) 2023 Chart.js Contributors + * Released under the MIT License + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Chart=e()}(this,(function(){"use strict";var t=Object.freeze({__proto__:null,get Colors(){return Go},get Decimation(){return Qo},get Filler(){return ma},get Legend(){return ya},get SubTitle(){return ka},get Title(){return Ma},get Tooltip(){return Ba}});function e(){}const i=(()=>{let t=0;return()=>t++})();function s(t){return null==t}function n(t){if(Array.isArray&&Array.isArray(t))return!0;const e=Object.prototype.toString.call(t);return"[object"===e.slice(0,7)&&"Array]"===e.slice(-6)}function o(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)}function a(t){return("number"==typeof t||t instanceof Number)&&isFinite(+t)}function r(t,e){return a(t)?t:e}function l(t,e){return void 0===t?e:t}const h=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100:+t/e,c=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100*e:+t;function d(t,e,i){if(t&&"function"==typeof t.call)return t.apply(i,e)}function u(t,e,i,s){let a,r,l;if(n(t))if(r=t.length,s)for(a=r-1;a>=0;a--)e.call(i,t[a],a);else for(a=0;at,x:t=>t.x,y:t=>t.y};function v(t){const e=t.split("."),i=[];let s="";for(const t of e)s+=t,s.endsWith("\\")?s=s.slice(0,-1)+".":(i.push(s),s="");return i}function M(t,e){const i=y[e]||(y[e]=function(t){const e=v(t);return t=>{for(const i of e){if(""===i)break;t=t&&t[i]}return t}}(e));return i(t)}function w(t){return t.charAt(0).toUpperCase()+t.slice(1)}const k=t=>void 0!==t,S=t=>"function"==typeof t,P=(t,e)=>{if(t.size!==e.size)return!1;for(const i of t)if(!e.has(i))return!1;return!0};function D(t){return"mouseup"===t.type||"click"===t.type||"contextmenu"===t.type}const C=Math.PI,O=2*C,A=O+C,T=Number.POSITIVE_INFINITY,L=C/180,E=C/2,R=C/4,I=2*C/3,z=Math.log10,F=Math.sign;function V(t,e,i){return Math.abs(t-e)t-e)).pop(),e}function N(t){return!isNaN(parseFloat(t))&&isFinite(t)}function H(t,e){const i=Math.round(t);return i-e<=t&&i+e>=t}function j(t,e,i){let s,n,o;for(s=0,n=t.length;sl&&h=Math.min(e,i)-s&&t<=Math.max(e,i)+s}function et(t,e,i){i=i||(i=>t[i]1;)s=o+n>>1,i(s)?o=s:n=s;return{lo:o,hi:n}}const it=(t,e,i,s)=>et(t,i,s?s=>{const n=t[s][e];return nt[s][e]et(t,i,(s=>t[s][e]>=i));function nt(t,e,i){let s=0,n=t.length;for(;ss&&t[n-1]>i;)n--;return s>0||n{const i="_onData"+w(e),s=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value(...e){const n=s.apply(this,e);return t._chartjs.listeners.forEach((t=>{"function"==typeof t[i]&&t[i](...e)})),n}})})))}function rt(t,e){const i=t._chartjs;if(!i)return;const s=i.listeners,n=s.indexOf(e);-1!==n&&s.splice(n,1),s.length>0||(ot.forEach((e=>{delete t[e]})),delete t._chartjs)}function lt(t){const e=new Set(t);return e.size===t.length?t:Array.from(e)}const ht="undefined"==typeof window?function(t){return t()}:window.requestAnimationFrame;function ct(t,e){let i=[],s=!1;return function(...n){i=n,s||(s=!0,ht.call(window,(()=>{s=!1,t.apply(e,i)})))}}function dt(t,e){let i;return function(...s){return e?(clearTimeout(i),i=setTimeout(t,e,s)):t.apply(this,s),e}}const ut=t=>"start"===t?"left":"end"===t?"right":"center",ft=(t,e,i)=>"start"===t?e:"end"===t?i:(e+i)/2,gt=(t,e,i,s)=>t===(s?"left":"right")?i:"center"===t?(e+i)/2:e;function pt(t,e,i){const s=e.length;let n=0,o=s;if(t._sorted){const{iScale:a,_parsed:r}=t,l=a.axis,{min:h,max:c,minDefined:d,maxDefined:u}=a.getUserBounds();d&&(n=J(Math.min(it(r,l,h).lo,i?s:it(e,l,a.getPixelForValue(h)).lo),0,s-1)),o=u?J(Math.max(it(r,a.axis,c,!0).hi+1,i?0:it(e,l,a.getPixelForValue(c),!0).hi+1),n,s)-n:s-n}return{start:n,count:o}}function mt(t){const{xScale:e,yScale:i,_scaleRanges:s}=t,n={xmin:e.min,xmax:e.max,ymin:i.min,ymax:i.max};if(!s)return t._scaleRanges=n,!0;const o=s.xmin!==e.min||s.xmax!==e.max||s.ymin!==i.min||s.ymax!==i.max;return Object.assign(s,n),o}class bt{constructor(){this._request=null,this._charts=new Map,this._running=!1,this._lastDate=void 0}_notify(t,e,i,s){const n=e.listeners[s],o=e.duration;n.forEach((s=>s({chart:t,initial:e.initial,numSteps:o,currentStep:Math.min(i-e.start,o)})))}_refresh(){this._request||(this._running=!0,this._request=ht.call(window,(()=>{this._update(),this._request=null,this._running&&this._refresh()})))}_update(t=Date.now()){let e=0;this._charts.forEach(((i,s)=>{if(!i.running||!i.items.length)return;const n=i.items;let o,a=n.length-1,r=!1;for(;a>=0;--a)o=n[a],o._active?(o._total>i.duration&&(i.duration=o._total),o.tick(t),r=!0):(n[a]=n[n.length-1],n.pop());r&&(s.draw(),this._notify(s,i,t,"progress")),n.length||(i.running=!1,this._notify(s,i,t,"complete"),i.initial=!1),e+=n.length})),this._lastDate=t,0===e&&(this._running=!1)}_getAnims(t){const e=this._charts;let i=e.get(t);return i||(i={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,i)),i}listen(t,e,i){this._getAnims(t).listeners[e].push(i)}add(t,e){e&&e.length&&this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){const e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce(((t,e)=>Math.max(t,e._duration)),0),this._refresh())}running(t){if(!this._running)return!1;const e=this._charts.get(t);return!!(e&&e.running&&e.items.length)}stop(t){const e=this._charts.get(t);if(!e||!e.items.length)return;const i=e.items;let s=i.length-1;for(;s>=0;--s)i[s].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}remove(t){return this._charts.delete(t)}}var xt=new bt; +/*! + * @kurkle/color v0.3.2 + * https://github.com/kurkle/color#readme + * (c) 2023 Jukka Kurkela + * Released under the MIT License + */function _t(t){return t+.5|0}const yt=(t,e,i)=>Math.max(Math.min(t,i),e);function vt(t){return yt(_t(2.55*t),0,255)}function Mt(t){return yt(_t(255*t),0,255)}function wt(t){return yt(_t(t/2.55)/100,0,1)}function kt(t){return yt(_t(100*t),0,100)}const St={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},Pt=[..."0123456789ABCDEF"],Dt=t=>Pt[15&t],Ct=t=>Pt[(240&t)>>4]+Pt[15&t],Ot=t=>(240&t)>>4==(15&t);function At(t){var e=(t=>Ot(t.r)&&Ot(t.g)&&Ot(t.b)&&Ot(t.a))(t)?Dt:Ct;return t?"#"+e(t.r)+e(t.g)+e(t.b)+((t,e)=>t<255?e(t):"")(t.a,e):void 0}const Tt=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function Lt(t,e,i){const s=e*Math.min(i,1-i),n=(e,n=(e+t/30)%12)=>i-s*Math.max(Math.min(n-3,9-n,1),-1);return[n(0),n(8),n(4)]}function Et(t,e,i){const s=(s,n=(s+t/60)%6)=>i-i*e*Math.max(Math.min(n,4-n,1),0);return[s(5),s(3),s(1)]}function Rt(t,e,i){const s=Lt(t,1,.5);let n;for(e+i>1&&(n=1/(e+i),e*=n,i*=n),n=0;n<3;n++)s[n]*=1-e-i,s[n]+=e;return s}function It(t){const e=t.r/255,i=t.g/255,s=t.b/255,n=Math.max(e,i,s),o=Math.min(e,i,s),a=(n+o)/2;let r,l,h;return n!==o&&(h=n-o,l=a>.5?h/(2-n-o):h/(n+o),r=function(t,e,i,s,n){return t===n?(e-i)/s+(e>16&255,o>>8&255,255&o]}return t}(),Ht.transparent=[0,0,0,0]);const e=Ht[t.toLowerCase()];return e&&{r:e[0],g:e[1],b:e[2],a:4===e.length?e[3]:255}}const $t=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;const Yt=t=>t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055,Ut=t=>t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4);function Xt(t,e,i){if(t){let s=It(t);s[e]=Math.max(0,Math.min(s[e]+s[e]*i,0===e?360:1)),s=Ft(s),t.r=s[0],t.g=s[1],t.b=s[2]}}function qt(t,e){return t?Object.assign(e||{},t):t}function Kt(t){var e={r:0,g:0,b:0,a:255};return Array.isArray(t)?t.length>=3&&(e={r:t[0],g:t[1],b:t[2],a:255},t.length>3&&(e.a=Mt(t[3]))):(e=qt(t,{r:0,g:0,b:0,a:1})).a=Mt(e.a),e}function Gt(t){return"r"===t.charAt(0)?function(t){const e=$t.exec(t);let i,s,n,o=255;if(e){if(e[7]!==i){const t=+e[7];o=e[8]?vt(t):yt(255*t,0,255)}return i=+e[1],s=+e[3],n=+e[5],i=255&(e[2]?vt(i):yt(i,0,255)),s=255&(e[4]?vt(s):yt(s,0,255)),n=255&(e[6]?vt(n):yt(n,0,255)),{r:i,g:s,b:n,a:o}}}(t):Bt(t)}class Zt{constructor(t){if(t instanceof Zt)return t;const e=typeof t;let i;var s,n,o;"object"===e?i=Kt(t):"string"===e&&(o=(s=t).length,"#"===s[0]&&(4===o||5===o?n={r:255&17*St[s[1]],g:255&17*St[s[2]],b:255&17*St[s[3]],a:5===o?17*St[s[4]]:255}:7!==o&&9!==o||(n={r:St[s[1]]<<4|St[s[2]],g:St[s[3]]<<4|St[s[4]],b:St[s[5]]<<4|St[s[6]],a:9===o?St[s[7]]<<4|St[s[8]]:255})),i=n||jt(t)||Gt(t)),this._rgb=i,this._valid=!!i}get valid(){return this._valid}get rgb(){var t=qt(this._rgb);return t&&(t.a=wt(t.a)),t}set rgb(t){this._rgb=Kt(t)}rgbString(){return this._valid?(t=this._rgb)&&(t.a<255?`rgba(${t.r}, ${t.g}, ${t.b}, ${wt(t.a)})`:`rgb(${t.r}, ${t.g}, ${t.b})`):void 0;var t}hexString(){return this._valid?At(this._rgb):void 0}hslString(){return this._valid?function(t){if(!t)return;const e=It(t),i=e[0],s=kt(e[1]),n=kt(e[2]);return t.a<255?`hsla(${i}, ${s}%, ${n}%, ${wt(t.a)})`:`hsl(${i}, ${s}%, ${n}%)`}(this._rgb):void 0}mix(t,e){if(t){const i=this.rgb,s=t.rgb;let n;const o=e===n?.5:e,a=2*o-1,r=i.a-s.a,l=((a*r==-1?a:(a+r)/(1+a*r))+1)/2;n=1-l,i.r=255&l*i.r+n*s.r+.5,i.g=255&l*i.g+n*s.g+.5,i.b=255&l*i.b+n*s.b+.5,i.a=o*i.a+(1-o)*s.a,this.rgb=i}return this}interpolate(t,e){return t&&(this._rgb=function(t,e,i){const s=Ut(wt(t.r)),n=Ut(wt(t.g)),o=Ut(wt(t.b));return{r:Mt(Yt(s+i*(Ut(wt(e.r))-s))),g:Mt(Yt(n+i*(Ut(wt(e.g))-n))),b:Mt(Yt(o+i*(Ut(wt(e.b))-o))),a:t.a+i*(e.a-t.a)}}(this._rgb,t._rgb,e)),this}clone(){return new Zt(this.rgb)}alpha(t){return this._rgb.a=Mt(t),this}clearer(t){return this._rgb.a*=1-t,this}greyscale(){const t=this._rgb,e=_t(.3*t.r+.59*t.g+.11*t.b);return t.r=t.g=t.b=e,this}opaquer(t){return this._rgb.a*=1+t,this}negate(){const t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}lighten(t){return Xt(this._rgb,2,t),this}darken(t){return Xt(this._rgb,2,-t),this}saturate(t){return Xt(this._rgb,1,t),this}desaturate(t){return Xt(this._rgb,1,-t),this}rotate(t){return function(t,e){var i=It(t);i[0]=Vt(i[0]+e),i=Ft(i),t.r=i[0],t.g=i[1],t.b=i[2]}(this._rgb,t),this}}function Jt(t){if(t&&"object"==typeof t){const e=t.toString();return"[object CanvasPattern]"===e||"[object CanvasGradient]"===e}return!1}function Qt(t){return Jt(t)?t:new Zt(t)}function te(t){return Jt(t)?t:new Zt(t).saturate(.5).darken(.1).hexString()}const ee=["x","y","borderWidth","radius","tension"],ie=["color","borderColor","backgroundColor"];const se=new Map;function ne(t,e,i){return function(t,e){e=e||{};const i=t+JSON.stringify(e);let s=se.get(i);return s||(s=new Intl.NumberFormat(t,e),se.set(i,s)),s}(e,i).format(t)}const oe={values:t=>n(t)?t:""+t,numeric(t,e,i){if(0===t)return"0";const s=this.chart.options.locale;let n,o=t;if(i.length>1){const e=Math.max(Math.abs(i[0].value),Math.abs(i[i.length-1].value));(e<1e-4||e>1e15)&&(n="scientific"),o=function(t,e){let i=e.length>3?e[2].value-e[1].value:e[1].value-e[0].value;Math.abs(i)>=1&&t!==Math.floor(t)&&(i=t-Math.floor(t));return i}(t,i)}const a=z(Math.abs(o)),r=isNaN(a)?1:Math.max(Math.min(-1*Math.floor(a),20),0),l={notation:n,minimumFractionDigits:r,maximumFractionDigits:r};return Object.assign(l,this.options.ticks.format),ne(t,s,l)},logarithmic(t,e,i){if(0===t)return"0";const s=i[e].significand||t/Math.pow(10,Math.floor(z(t)));return[1,2,3,5,10,15].includes(s)||e>.8*i.length?oe.numeric.call(this,t,e,i):""}};var ae={formatters:oe};const re=Object.create(null),le=Object.create(null);function he(t,e){if(!e)return t;const i=e.split(".");for(let e=0,s=i.length;et.chart.platform.getDevicePixelRatio(),this.elements={},this.events=["mousemove","mouseout","click","touchstart","touchmove"],this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:"normal",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(t,e)=>te(e.backgroundColor),this.hoverBorderColor=(t,e)=>te(e.borderColor),this.hoverColor=(t,e)=>te(e.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(t),this.apply(e)}set(t,e){return ce(this,t,e)}get(t){return he(this,t)}describe(t,e){return ce(le,t,e)}override(t,e){return ce(re,t,e)}route(t,e,i,s){const n=he(this,t),a=he(this,i),r="_"+e;Object.defineProperties(n,{[r]:{value:n[e],writable:!0},[e]:{enumerable:!0,get(){const t=this[r],e=a[s];return o(t)?Object.assign({},e,t):l(t,e)},set(t){this[r]=t}}})}apply(t){t.forEach((t=>t(this)))}}var ue=new de({_scriptable:t=>!t.startsWith("on"),_indexable:t=>"events"!==t,hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}},[function(t){t.set("animation",{delay:void 0,duration:1e3,easing:"easeOutQuart",fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),t.describe("animation",{_fallback:!1,_indexable:!1,_scriptable:t=>"onProgress"!==t&&"onComplete"!==t&&"fn"!==t}),t.set("animations",{colors:{type:"color",properties:ie},numbers:{type:"number",properties:ee}}),t.describe("animations",{_fallback:"animation"}),t.set("transitions",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:"transparent"},visible:{type:"boolean",duration:0}}},hide:{animations:{colors:{to:"transparent"},visible:{type:"boolean",easing:"linear",fn:t=>0|t}}}})},function(t){t.set("layout",{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})},function(t){t.set("scale",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:"ticks",clip:!0,grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(t,e)=>e.lineWidth,tickColor:(t,e)=>e.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:"",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:"",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:ae.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}}),t.route("scale.ticks","color","","color"),t.route("scale.grid","color","","borderColor"),t.route("scale.border","color","","borderColor"),t.route("scale.title","color","","color"),t.describe("scale",{_fallback:!1,_scriptable:t=>!t.startsWith("before")&&!t.startsWith("after")&&"callback"!==t&&"parser"!==t,_indexable:t=>"borderDash"!==t&&"tickBorderDash"!==t&&"dash"!==t}),t.describe("scales",{_fallback:"scale"}),t.describe("scale.ticks",{_scriptable:t=>"backdropPadding"!==t&&"callback"!==t,_indexable:t=>"backdropPadding"!==t})}]);function fe(){return"undefined"!=typeof window&&"undefined"!=typeof document}function ge(t){let e=t.parentNode;return e&&"[object ShadowRoot]"===e.toString()&&(e=e.host),e}function pe(t,e,i){let s;return"string"==typeof t?(s=parseInt(t,10),-1!==t.indexOf("%")&&(s=s/100*e.parentNode[i])):s=t,s}const me=t=>t.ownerDocument.defaultView.getComputedStyle(t,null);function be(t,e){return me(t).getPropertyValue(e)}const xe=["top","right","bottom","left"];function _e(t,e,i){const s={};i=i?"-"+i:"";for(let n=0;n<4;n++){const o=xe[n];s[o]=parseFloat(t[e+"-"+o+i])||0}return s.width=s.left+s.right,s.height=s.top+s.bottom,s}const ye=(t,e,i)=>(t>0||e>0)&&(!i||!i.shadowRoot);function ve(t,e){if("native"in t)return t;const{canvas:i,currentDevicePixelRatio:s}=e,n=me(i),o="border-box"===n.boxSizing,a=_e(n,"padding"),r=_e(n,"border","width"),{x:l,y:h,box:c}=function(t,e){const i=t.touches,s=i&&i.length?i[0]:t,{offsetX:n,offsetY:o}=s;let a,r,l=!1;if(ye(n,o,t.target))a=n,r=o;else{const t=e.getBoundingClientRect();a=s.clientX-t.left,r=s.clientY-t.top,l=!0}return{x:a,y:r,box:l}}(t,i),d=a.left+(c&&r.left),u=a.top+(c&&r.top);let{width:f,height:g}=e;return o&&(f-=a.width+r.width,g-=a.height+r.height),{x:Math.round((l-d)/f*i.width/s),y:Math.round((h-u)/g*i.height/s)}}const Me=t=>Math.round(10*t)/10;function we(t,e,i,s){const n=me(t),o=_e(n,"margin"),a=pe(n.maxWidth,t,"clientWidth")||T,r=pe(n.maxHeight,t,"clientHeight")||T,l=function(t,e,i){let s,n;if(void 0===e||void 0===i){const o=ge(t);if(o){const t=o.getBoundingClientRect(),a=me(o),r=_e(a,"border","width"),l=_e(a,"padding");e=t.width-l.width-r.width,i=t.height-l.height-r.height,s=pe(a.maxWidth,o,"clientWidth"),n=pe(a.maxHeight,o,"clientHeight")}else e=t.clientWidth,i=t.clientHeight}return{width:e,height:i,maxWidth:s||T,maxHeight:n||T}}(t,e,i);let{width:h,height:c}=l;if("content-box"===n.boxSizing){const t=_e(n,"border","width"),e=_e(n,"padding");h-=e.width+t.width,c-=e.height+t.height}h=Math.max(0,h-o.width),c=Math.max(0,s?h/s:c-o.height),h=Me(Math.min(h,a,l.maxWidth)),c=Me(Math.min(c,r,l.maxHeight)),h&&!c&&(c=Me(h/2));return(void 0!==e||void 0!==i)&&s&&l.height&&c>l.height&&(c=l.height,h=Me(Math.floor(c*s))),{width:h,height:c}}function ke(t,e,i){const s=e||1,n=Math.floor(t.height*s),o=Math.floor(t.width*s);t.height=Math.floor(t.height),t.width=Math.floor(t.width);const a=t.canvas;return a.style&&(i||!a.style.height&&!a.style.width)&&(a.style.height=`${t.height}px`,a.style.width=`${t.width}px`),(t.currentDevicePixelRatio!==s||a.height!==n||a.width!==o)&&(t.currentDevicePixelRatio=s,a.height=n,a.width=o,t.ctx.setTransform(s,0,0,s,0,0),!0)}const Se=function(){let t=!1;try{const e={get passive(){return t=!0,!1}};window.addEventListener("test",null,e),window.removeEventListener("test",null,e)}catch(t){}return t}();function Pe(t,e){const i=be(t,e),s=i&&i.match(/^(\d+)(\.\d+)?px$/);return s?+s[1]:void 0}function De(t){return!t||s(t.size)||s(t.family)?null:(t.style?t.style+" ":"")+(t.weight?t.weight+" ":"")+t.size+"px "+t.family}function Ce(t,e,i,s,n){let o=e[n];return o||(o=e[n]=t.measureText(n).width,i.push(n)),o>s&&(s=o),s}function Oe(t,e,i,s){let o=(s=s||{}).data=s.data||{},a=s.garbageCollect=s.garbageCollect||[];s.font!==e&&(o=s.data={},a=s.garbageCollect=[],s.font=e),t.save(),t.font=e;let r=0;const l=i.length;let h,c,d,u,f;for(h=0;hi.length){for(h=0;h0&&t.stroke()}}function Re(t,e,i){return i=i||.5,!e||t&&t.x>e.left-i&&t.xe.top-i&&t.y0&&""!==r.strokeColor;let c,d;for(t.save(),t.font=a.string,function(t,e){e.translation&&t.translate(e.translation[0],e.translation[1]),s(e.rotation)||t.rotate(e.rotation),e.color&&(t.fillStyle=e.color),e.textAlign&&(t.textAlign=e.textAlign),e.textBaseline&&(t.textBaseline=e.textBaseline)}(t,r),c=0;ct[0])){const o=i||t;void 0===s&&(s=ti("_fallback",t));const a={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:t,_rootScopes:o,_fallback:s,_getTarget:n,override:i=>je([i,...t],e,o,s)};return new Proxy(a,{deleteProperty:(e,i)=>(delete e[i],delete e._keys,delete t[0][i],!0),get:(i,s)=>qe(i,s,(()=>function(t,e,i,s){let n;for(const o of e)if(n=ti(Ue(o,t),i),void 0!==n)return Xe(t,n)?Je(i,s,t,n):n}(s,e,t,i))),getOwnPropertyDescriptor:(t,e)=>Reflect.getOwnPropertyDescriptor(t._scopes[0],e),getPrototypeOf:()=>Reflect.getPrototypeOf(t[0]),has:(t,e)=>ei(t).includes(e),ownKeys:t=>ei(t),set(t,e,i){const s=t._storage||(t._storage=n());return t[e]=s[e]=i,delete t._keys,!0}})}function $e(t,e,i,s){const a={_cacheable:!1,_proxy:t,_context:e,_subProxy:i,_stack:new Set,_descriptors:Ye(t,s),setContext:e=>$e(t,e,i,s),override:n=>$e(t.override(n),e,i,s)};return new Proxy(a,{deleteProperty:(e,i)=>(delete e[i],delete t[i],!0),get:(t,e,i)=>qe(t,e,(()=>function(t,e,i){const{_proxy:s,_context:a,_subProxy:r,_descriptors:l}=t;let h=s[e];S(h)&&l.isScriptable(e)&&(h=function(t,e,i,s){const{_proxy:n,_context:o,_subProxy:a,_stack:r}=i;if(r.has(t))throw new Error("Recursion detected: "+Array.from(r).join("->")+"->"+t);r.add(t);let l=e(o,a||s);r.delete(t),Xe(t,l)&&(l=Je(n._scopes,n,t,l));return l}(e,h,t,i));n(h)&&h.length&&(h=function(t,e,i,s){const{_proxy:n,_context:a,_subProxy:r,_descriptors:l}=i;if(void 0!==a.index&&s(t))return e[a.index%e.length];if(o(e[0])){const i=e,s=n._scopes.filter((t=>t!==i));e=[];for(const o of i){const i=Je(s,n,t,o);e.push($e(i,a,r&&r[t],l))}}return e}(e,h,t,l.isIndexable));Xe(e,h)&&(h=$e(h,a,r&&r[e],l));return h}(t,e,i))),getOwnPropertyDescriptor:(e,i)=>e._descriptors.allKeys?Reflect.has(t,i)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(t,i),getPrototypeOf:()=>Reflect.getPrototypeOf(t),has:(e,i)=>Reflect.has(t,i),ownKeys:()=>Reflect.ownKeys(t),set:(e,i,s)=>(t[i]=s,delete e[i],!0)})}function Ye(t,e={scriptable:!0,indexable:!0}){const{_scriptable:i=e.scriptable,_indexable:s=e.indexable,_allKeys:n=e.allKeys}=t;return{allKeys:n,scriptable:i,indexable:s,isScriptable:S(i)?i:()=>i,isIndexable:S(s)?s:()=>s}}const Ue=(t,e)=>t?t+w(e):e,Xe=(t,e)=>o(e)&&"adapters"!==t&&(null===Object.getPrototypeOf(e)||e.constructor===Object);function qe(t,e,i){if(Object.prototype.hasOwnProperty.call(t,e))return t[e];const s=i();return t[e]=s,s}function Ke(t,e,i){return S(t)?t(e,i):t}const Ge=(t,e)=>!0===t?e:"string"==typeof t?M(e,t):void 0;function Ze(t,e,i,s,n){for(const o of e){const e=Ge(i,o);if(e){t.add(e);const o=Ke(e._fallback,i,n);if(void 0!==o&&o!==i&&o!==s)return o}else if(!1===e&&void 0!==s&&i!==s)return null}return!1}function Je(t,e,i,s){const a=e._rootScopes,r=Ke(e._fallback,i,s),l=[...t,...a],h=new Set;h.add(s);let c=Qe(h,l,i,r||i,s);return null!==c&&((void 0===r||r===i||(c=Qe(h,l,r,c,s),null!==c))&&je(Array.from(h),[""],a,r,(()=>function(t,e,i){const s=t._getTarget();e in s||(s[e]={});const a=s[e];if(n(a)&&o(i))return i;return a||{}}(e,i,s))))}function Qe(t,e,i,s,n){for(;i;)i=Ze(t,e,i,s,n);return i}function ti(t,e){for(const i of e){if(!i)continue;const e=i[t];if(void 0!==e)return e}}function ei(t){let e=t._keys;return e||(e=t._keys=function(t){const e=new Set;for(const i of t)for(const t of Object.keys(i).filter((t=>!t.startsWith("_"))))e.add(t);return Array.from(e)}(t._scopes)),e}function ii(t,e,i,s){const{iScale:n}=t,{key:o="r"}=this._parsing,a=new Array(s);let r,l,h,c;for(r=0,l=s;re"x"===t?"y":"x";function ai(t,e,i,s){const n=t.skip?e:t,o=e,a=i.skip?e:i,r=q(o,n),l=q(a,o);let h=r/(r+l),c=l/(r+l);h=isNaN(h)?0:h,c=isNaN(c)?0:c;const d=s*h,u=s*c;return{previous:{x:o.x-d*(a.x-n.x),y:o.y-d*(a.y-n.y)},next:{x:o.x+u*(a.x-n.x),y:o.y+u*(a.y-n.y)}}}function ri(t,e="x"){const i=oi(e),s=t.length,n=Array(s).fill(0),o=Array(s);let a,r,l,h=ni(t,0);for(a=0;a!t.skip))),"monotone"===e.cubicInterpolationMode)ri(t,n);else{let i=s?t[t.length-1]:t[0];for(o=0,a=t.length;o0===t||1===t,di=(t,e,i)=>-Math.pow(2,10*(t-=1))*Math.sin((t-e)*O/i),ui=(t,e,i)=>Math.pow(2,-10*t)*Math.sin((t-e)*O/i)+1,fi={linear:t=>t,easeInQuad:t=>t*t,easeOutQuad:t=>-t*(t-2),easeInOutQuad:t=>(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1),easeInCubic:t=>t*t*t,easeOutCubic:t=>(t-=1)*t*t+1,easeInOutCubic:t=>(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2),easeInQuart:t=>t*t*t*t,easeOutQuart:t=>-((t-=1)*t*t*t-1),easeInOutQuart:t=>(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2),easeInQuint:t=>t*t*t*t*t,easeOutQuint:t=>(t-=1)*t*t*t*t+1,easeInOutQuint:t=>(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2),easeInSine:t=>1-Math.cos(t*E),easeOutSine:t=>Math.sin(t*E),easeInOutSine:t=>-.5*(Math.cos(C*t)-1),easeInExpo:t=>0===t?0:Math.pow(2,10*(t-1)),easeOutExpo:t=>1===t?1:1-Math.pow(2,-10*t),easeInOutExpo:t=>ci(t)?t:t<.5?.5*Math.pow(2,10*(2*t-1)):.5*(2-Math.pow(2,-10*(2*t-1))),easeInCirc:t=>t>=1?t:-(Math.sqrt(1-t*t)-1),easeOutCirc:t=>Math.sqrt(1-(t-=1)*t),easeInOutCirc:t=>(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1),easeInElastic:t=>ci(t)?t:di(t,.075,.3),easeOutElastic:t=>ci(t)?t:ui(t,.075,.3),easeInOutElastic(t){const e=.1125;return ci(t)?t:t<.5?.5*di(2*t,e,.45):.5+.5*ui(2*t-1,e,.45)},easeInBack(t){const e=1.70158;return t*t*((e+1)*t-e)},easeOutBack(t){const e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack(t){let e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:t=>1-fi.easeOutBounce(1-t),easeOutBounce(t){const e=7.5625,i=2.75;return t<1/i?e*t*t:t<2/i?e*(t-=1.5/i)*t+.75:t<2.5/i?e*(t-=2.25/i)*t+.9375:e*(t-=2.625/i)*t+.984375},easeInOutBounce:t=>t<.5?.5*fi.easeInBounce(2*t):.5*fi.easeOutBounce(2*t-1)+.5};function gi(t,e,i,s){return{x:t.x+i*(e.x-t.x),y:t.y+i*(e.y-t.y)}}function pi(t,e,i,s){return{x:t.x+i*(e.x-t.x),y:"middle"===s?i<.5?t.y:e.y:"after"===s?i<1?t.y:e.y:i>0?e.y:t.y}}function mi(t,e,i,s){const n={x:t.cp2x,y:t.cp2y},o={x:e.cp1x,y:e.cp1y},a=gi(t,n,i),r=gi(n,o,i),l=gi(o,e,i),h=gi(a,r,i),c=gi(r,l,i);return gi(h,c,i)}const bi=/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/,xi=/^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;function _i(t,e){const i=(""+t).match(bi);if(!i||"normal"===i[1])return 1.2*e;switch(t=+i[2],i[3]){case"px":return t;case"%":t/=100}return e*t}const yi=t=>+t||0;function vi(t,e){const i={},s=o(e),n=s?Object.keys(e):e,a=o(t)?s?i=>l(t[i],t[e[i]]):e=>t[e]:()=>t;for(const t of n)i[t]=yi(a(t));return i}function Mi(t){return vi(t,{top:"y",right:"x",bottom:"y",left:"x"})}function wi(t){return vi(t,["topLeft","topRight","bottomLeft","bottomRight"])}function ki(t){const e=Mi(t);return e.width=e.left+e.right,e.height=e.top+e.bottom,e}function Si(t,e){t=t||{},e=e||ue.font;let i=l(t.size,e.size);"string"==typeof i&&(i=parseInt(i,10));let s=l(t.style,e.style);s&&!(""+s).match(xi)&&(console.warn('Invalid font style specified: "'+s+'"'),s=void 0);const n={family:l(t.family,e.family),lineHeight:_i(l(t.lineHeight,e.lineHeight),i),size:i,style:s,weight:l(t.weight,e.weight),string:""};return n.string=De(n),n}function Pi(t,e,i,s){let o,a,r,l=!0;for(o=0,a=t.length;oi&&0===t?0:t+e;return{min:a(s,-Math.abs(o)),max:a(n,o)}}function Ci(t,e){return Object.assign(Object.create(t),e)}function Oi(t,e,i){return t?function(t,e){return{x:i=>t+t+e-i,setWidth(t){e=t},textAlign:t=>"center"===t?t:"right"===t?"left":"right",xPlus:(t,e)=>t-e,leftForLtr:(t,e)=>t-e}}(e,i):{x:t=>t,setWidth(t){},textAlign:t=>t,xPlus:(t,e)=>t+e,leftForLtr:(t,e)=>t}}function Ai(t,e){let i,s;"ltr"!==e&&"rtl"!==e||(i=t.canvas.style,s=[i.getPropertyValue("direction"),i.getPropertyPriority("direction")],i.setProperty("direction",e,"important"),t.prevTextDirection=s)}function Ti(t,e){void 0!==e&&(delete t.prevTextDirection,t.canvas.style.setProperty("direction",e[0],e[1]))}function Li(t){return"angle"===t?{between:Z,compare:K,normalize:G}:{between:tt,compare:(t,e)=>t-e,normalize:t=>t}}function Ei({start:t,end:e,count:i,loop:s,style:n}){return{start:t%i,end:e%i,loop:s&&(e-t+1)%i==0,style:n}}function Ri(t,e,i){if(!i)return[t];const{property:s,start:n,end:o}=i,a=e.length,{compare:r,between:l,normalize:h}=Li(s),{start:c,end:d,loop:u,style:f}=function(t,e,i){const{property:s,start:n,end:o}=i,{between:a,normalize:r}=Li(s),l=e.length;let h,c,{start:d,end:u,loop:f}=t;if(f){for(d+=l,u+=l,h=0,c=l;hx||l(n,b,p)&&0!==r(n,b),v=()=>!x||0===r(o,p)||l(o,b,p);for(let t=c,i=c;t<=d;++t)m=e[t%a],m.skip||(p=h(m[s]),p!==b&&(x=l(p,n,o),null===_&&y()&&(_=0===r(p,n)?t:i),null!==_&&v()&&(g.push(Ei({start:_,end:t,loop:u,count:a,style:f})),_=null),i=t,b=p));return null!==_&&g.push(Ei({start:_,end:d,loop:u,count:a,style:f})),g}function Ii(t,e){const i=[],s=t.segments;for(let n=0;nn&&t[o%e].skip;)o--;return o%=e,{start:n,end:o}}(i,n,o,s);if(!0===s)return Fi(t,[{start:a,end:r,loop:o}],i,e);return Fi(t,function(t,e,i,s){const n=t.length,o=[];let a,r=e,l=t[e];for(a=e+1;a<=i;++a){const i=t[a%n];i.skip||i.stop?l.skip||(s=!1,o.push({start:e%n,end:(a-1)%n,loop:s}),e=r=i.stop?a:null):(r=a,l.skip&&(e=a)),l=i}return null!==r&&o.push({start:e%n,end:r%n,loop:s}),o}(i,a,r{t[a](e[i],n)&&(o.push({element:t,datasetIndex:s,index:l}),r=r||t.inRange(e.x,e.y,n))})),s&&!r?[]:o}var Xi={evaluateInteractionItems:Hi,modes:{index(t,e,i,s){const n=ve(e,t),o=i.axis||"x",a=i.includeInvisible||!1,r=i.intersect?ji(t,n,o,s,a):Yi(t,n,o,!1,s,a),l=[];return r.length?(t.getSortedVisibleDatasetMetas().forEach((t=>{const e=r[0].index,i=t.data[e];i&&!i.skip&&l.push({element:i,datasetIndex:t.index,index:e})})),l):[]},dataset(t,e,i,s){const n=ve(e,t),o=i.axis||"xy",a=i.includeInvisible||!1;let r=i.intersect?ji(t,n,o,s,a):Yi(t,n,o,!1,s,a);if(r.length>0){const e=r[0].datasetIndex,i=t.getDatasetMeta(e).data;r=[];for(let t=0;tji(t,ve(e,t),i.axis||"xy",s,i.includeInvisible||!1),nearest(t,e,i,s){const n=ve(e,t),o=i.axis||"xy",a=i.includeInvisible||!1;return Yi(t,n,o,i.intersect,s,a)},x:(t,e,i,s)=>Ui(t,ve(e,t),"x",i.intersect,s),y:(t,e,i,s)=>Ui(t,ve(e,t),"y",i.intersect,s)}};const qi=["left","top","right","bottom"];function Ki(t,e){return t.filter((t=>t.pos===e))}function Gi(t,e){return t.filter((t=>-1===qi.indexOf(t.pos)&&t.box.axis===e))}function Zi(t,e){return t.sort(((t,i)=>{const s=e?i:t,n=e?t:i;return s.weight===n.weight?s.index-n.index:s.weight-n.weight}))}function Ji(t,e){const i=function(t){const e={};for(const i of t){const{stack:t,pos:s,stackWeight:n}=i;if(!t||!qi.includes(s))continue;const o=e[t]||(e[t]={count:0,placed:0,weight:0,size:0});o.count++,o.weight+=n}return e}(t),{vBoxMaxWidth:s,hBoxMaxHeight:n}=e;let o,a,r;for(o=0,a=t.length;o{s[t]=Math.max(e[t],i[t])})),s}return s(t?["left","right"]:["top","bottom"])}function ss(t,e,i,s){const n=[];let o,a,r,l,h,c;for(o=0,a=t.length,h=0;ot.box.fullSize)),!0),s=Zi(Ki(e,"left"),!0),n=Zi(Ki(e,"right")),o=Zi(Ki(e,"top"),!0),a=Zi(Ki(e,"bottom")),r=Gi(e,"x"),l=Gi(e,"y");return{fullSize:i,leftAndTop:s.concat(o),rightAndBottom:n.concat(l).concat(a).concat(r),chartArea:Ki(e,"chartArea"),vertical:s.concat(n).concat(l),horizontal:o.concat(a).concat(r)}}(t.boxes),l=r.vertical,h=r.horizontal;u(t.boxes,(t=>{"function"==typeof t.beforeLayout&&t.beforeLayout()}));const c=l.reduce(((t,e)=>e.box.options&&!1===e.box.options.display?t:t+1),0)||1,d=Object.freeze({outerWidth:e,outerHeight:i,padding:n,availableWidth:o,availableHeight:a,vBoxMaxWidth:o/2/c,hBoxMaxHeight:a/2}),f=Object.assign({},n);ts(f,ki(s));const g=Object.assign({maxPadding:f,w:o,h:a,x:n.left,y:n.top},n),p=Ji(l.concat(h),d);ss(r.fullSize,g,d,p),ss(l,g,d,p),ss(h,g,d,p)&&ss(l,g,d,p),function(t){const e=t.maxPadding;function i(i){const s=Math.max(e[i]-t[i],0);return t[i]+=s,s}t.y+=i("top"),t.x+=i("left"),i("right"),i("bottom")}(g),os(r.leftAndTop,g,d,p),g.x+=g.w,g.y+=g.h,os(r.rightAndBottom,g,d,p),t.chartArea={left:g.left,top:g.top,right:g.left+g.w,bottom:g.top+g.h,height:g.h,width:g.w},u(r.chartArea,(e=>{const i=e.box;Object.assign(i,t.chartArea),i.update(g.w,g.h,{left:0,top:0,right:0,bottom:0})}))}};class rs{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,i){}removeEventListener(t,e,i){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,i,s){return e=Math.max(0,e||t.width),i=i||t.height,{width:e,height:Math.max(0,s?Math.floor(e/s):i)}}isAttached(t){return!0}updateConfig(t){}}class ls extends rs{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}updateConfig(t){t.options.animation=!1}}const hs="$chartjs",cs={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},ds=t=>null===t||""===t;const us=!!Se&&{passive:!0};function fs(t,e,i){t.canvas.removeEventListener(e,i,us)}function gs(t,e){for(const i of t)if(i===e||i.contains(e))return!0}function ps(t,e,i){const s=t.canvas,n=new MutationObserver((t=>{let e=!1;for(const i of t)e=e||gs(i.addedNodes,s),e=e&&!gs(i.removedNodes,s);e&&i()}));return n.observe(document,{childList:!0,subtree:!0}),n}function ms(t,e,i){const s=t.canvas,n=new MutationObserver((t=>{let e=!1;for(const i of t)e=e||gs(i.removedNodes,s),e=e&&!gs(i.addedNodes,s);e&&i()}));return n.observe(document,{childList:!0,subtree:!0}),n}const bs=new Map;let xs=0;function _s(){const t=window.devicePixelRatio;t!==xs&&(xs=t,bs.forEach(((e,i)=>{i.currentDevicePixelRatio!==t&&e()})))}function ys(t,e,i){const s=t.canvas,n=s&&ge(s);if(!n)return;const o=ct(((t,e)=>{const s=n.clientWidth;i(t,e),s{const e=t[0],i=e.contentRect.width,s=e.contentRect.height;0===i&&0===s||o(i,s)}));return a.observe(n),function(t,e){bs.size||window.addEventListener("resize",_s),bs.set(t,e)}(t,o),a}function vs(t,e,i){i&&i.disconnect(),"resize"===e&&function(t){bs.delete(t),bs.size||window.removeEventListener("resize",_s)}(t)}function Ms(t,e,i){const s=t.canvas,n=ct((e=>{null!==t.ctx&&i(function(t,e){const i=cs[t.type]||t.type,{x:s,y:n}=ve(t,e);return{type:i,chart:e,native:t,x:void 0!==s?s:null,y:void 0!==n?n:null}}(e,t))}),t);return function(t,e,i){t.addEventListener(e,i,us)}(s,e,n),n}class ws extends rs{acquireContext(t,e){const i=t&&t.getContext&&t.getContext("2d");return i&&i.canvas===t?(function(t,e){const i=t.style,s=t.getAttribute("height"),n=t.getAttribute("width");if(t[hs]={initial:{height:s,width:n,style:{display:i.display,height:i.height,width:i.width}}},i.display=i.display||"block",i.boxSizing=i.boxSizing||"border-box",ds(n)){const e=Pe(t,"width");void 0!==e&&(t.width=e)}if(ds(s))if(""===t.style.height)t.height=t.width/(e||2);else{const e=Pe(t,"height");void 0!==e&&(t.height=e)}}(t,e),i):null}releaseContext(t){const e=t.canvas;if(!e[hs])return!1;const i=e[hs].initial;["height","width"].forEach((t=>{const n=i[t];s(n)?e.removeAttribute(t):e.setAttribute(t,n)}));const n=i.style||{};return Object.keys(n).forEach((t=>{e.style[t]=n[t]})),e.width=e.width,delete e[hs],!0}addEventListener(t,e,i){this.removeEventListener(t,e);const s=t.$proxies||(t.$proxies={}),n={attach:ps,detach:ms,resize:ys}[e]||Ms;s[e]=n(t,e,i)}removeEventListener(t,e){const i=t.$proxies||(t.$proxies={}),s=i[e];if(!s)return;({attach:vs,detach:vs,resize:vs}[e]||fs)(t,e,s),i[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,i,s){return we(t,e,i,s)}isAttached(t){const e=ge(t);return!(!e||!e.isConnected)}}function ks(t){return!fe()||"undefined"!=typeof OffscreenCanvas&&t instanceof OffscreenCanvas?ls:ws}var Ss=Object.freeze({__proto__:null,BasePlatform:rs,BasicPlatform:ls,DomPlatform:ws,_detectPlatform:ks});const Ps="transparent",Ds={boolean:(t,e,i)=>i>.5?e:t,color(t,e,i){const s=Qt(t||Ps),n=s.valid&&Qt(e||Ps);return n&&n.valid?n.mix(s,i).hexString():e},number:(t,e,i)=>t+(e-t)*i};class Cs{constructor(t,e,i,s){const n=e[i];s=Pi([t.to,s,n,t.from]);const o=Pi([t.from,n,s]);this._active=!0,this._fn=t.fn||Ds[t.type||typeof o],this._easing=fi[t.easing]||fi.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=e,this._prop=i,this._from=o,this._to=s,this._promises=void 0}active(){return this._active}update(t,e,i){if(this._active){this._notify(!1);const s=this._target[this._prop],n=i-this._start,o=this._duration-n;this._start=i,this._duration=Math.floor(Math.max(o,t.duration)),this._total+=n,this._loop=!!t.loop,this._to=Pi([t.to,e,s,t.from]),this._from=Pi([t.from,s,e])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){const e=t-this._start,i=this._duration,s=this._prop,n=this._from,o=this._loop,a=this._to;let r;if(this._active=n!==a&&(o||e1?2-r:r,r=this._easing(Math.min(1,Math.max(0,r))),this._target[s]=this._fn(n,a,r))}wait(){const t=this._promises||(this._promises=[]);return new Promise(((e,i)=>{t.push({res:e,rej:i})}))}_notify(t){const e=t?"res":"rej",i=this._promises||[];for(let t=0;t{const a=t[s];if(!o(a))return;const r={};for(const t of e)r[t]=a[t];(n(a.properties)&&a.properties||[s]).forEach((t=>{t!==s&&i.has(t)||i.set(t,r)}))}))}_animateOptions(t,e){const i=e.options,s=function(t,e){if(!e)return;let i=t.options;if(!i)return void(t.options=e);i.$shared&&(t.options=i=Object.assign({},i,{$shared:!1,$animations:{}}));return i}(t,i);if(!s)return[];const n=this._createAnimations(s,i);return i.$shared&&function(t,e){const i=[],s=Object.keys(e);for(let e=0;e{t.options=i}),(()=>{})),n}_createAnimations(t,e){const i=this._properties,s=[],n=t.$animations||(t.$animations={}),o=Object.keys(e),a=Date.now();let r;for(r=o.length-1;r>=0;--r){const l=o[r];if("$"===l.charAt(0))continue;if("options"===l){s.push(...this._animateOptions(t,e));continue}const h=e[l];let c=n[l];const d=i.get(l);if(c){if(d&&c.active()){c.update(d,h,a);continue}c.cancel()}d&&d.duration?(n[l]=c=new Cs(d,t,l,h),s.push(c)):t[l]=h}return s}update(t,e){if(0===this._properties.size)return void Object.assign(t,e);const i=this._createAnimations(t,e);return i.length?(xt.add(this._chart,i),!0):void 0}}function As(t,e){const i=t&&t.options||{},s=i.reverse,n=void 0===i.min?e:0,o=void 0===i.max?e:0;return{start:s?o:n,end:s?n:o}}function Ts(t,e){const i=[],s=t._getSortedDatasetMetas(e);let n,o;for(n=0,o=s.length;n0||!i&&e<0)return n.index}return null}function zs(t,e){const{chart:i,_cachedMeta:s}=t,n=i._stacks||(i._stacks={}),{iScale:o,vScale:a,index:r}=s,l=o.axis,h=a.axis,c=function(t,e,i){return`${t.id}.${e.id}.${i.stack||i.type}`}(o,a,s),d=e.length;let u;for(let t=0;ti[t].axis===e)).shift()}function Vs(t,e){const i=t.controller.index,s=t.vScale&&t.vScale.axis;if(s){e=e||t._parsed;for(const t of e){const e=t._stacks;if(!e||void 0===e[s]||void 0===e[s][i])return;delete e[s][i],void 0!==e[s]._visualValues&&void 0!==e[s]._visualValues[i]&&delete e[s]._visualValues[i]}}}const Bs=t=>"reset"===t||"none"===t,Ws=(t,e)=>e?t:Object.assign({},t);class Ns{static defaults={};static datasetElementType=null;static dataElementType=null;constructor(t,e){this.chart=t,this._ctx=t.ctx,this.index=e,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){const t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=Es(t.vScale,t),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled("filler")&&console.warn("Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options")}updateIndex(t){this.index!==t&&Vs(this._cachedMeta),this.index=t}linkScales(){const t=this.chart,e=this._cachedMeta,i=this.getDataset(),s=(t,e,i,s)=>"x"===t?e:"r"===t?s:i,n=e.xAxisID=l(i.xAxisID,Fs(t,"x")),o=e.yAxisID=l(i.yAxisID,Fs(t,"y")),a=e.rAxisID=l(i.rAxisID,Fs(t,"r")),r=e.indexAxis,h=e.iAxisID=s(r,n,o,a),c=e.vAxisID=s(r,o,n,a);e.xScale=this.getScaleForId(n),e.yScale=this.getScaleForId(o),e.rScale=this.getScaleForId(a),e.iScale=this.getScaleForId(h),e.vScale=this.getScaleForId(c)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){const e=this._cachedMeta;return t===e.iScale?e.vScale:e.iScale}reset(){this._update("reset")}_destroy(){const t=this._cachedMeta;this._data&&rt(this._data,this),t._stacked&&Vs(t)}_dataCheck(){const t=this.getDataset(),e=t.data||(t.data=[]),i=this._data;if(o(e))this._data=function(t){const e=Object.keys(t),i=new Array(e.length);let s,n,o;for(s=0,n=e.length;s0&&i._parsed[t-1];if(!1===this._parsing)i._parsed=s,i._sorted=!0,d=s;else{d=n(s[t])?this.parseArrayData(i,s,t,e):o(s[t])?this.parseObjectData(i,s,t,e):this.parsePrimitiveData(i,s,t,e);const a=()=>null===c[l]||f&&c[l]t&&!e.hidden&&e._stacked&&{keys:Ts(i,!0),values:null})(e,i,this.chart),h={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY},{min:c,max:d}=function(t){const{min:e,max:i,minDefined:s,maxDefined:n}=t.getUserBounds();return{min:s?e:Number.NEGATIVE_INFINITY,max:n?i:Number.POSITIVE_INFINITY}}(r);let u,f;function g(){f=s[u];const e=f[r.axis];return!a(f[t.axis])||c>e||d=0;--u)if(!g()){this.updateRangeFromParsed(h,t,f,l);break}return h}getAllParsedValues(t){const e=this._cachedMeta._parsed,i=[];let s,n,o;for(s=0,n=e.length;s=0&&tthis.getContext(i,s,e)),c);return f.$shared&&(f.$shared=r,n[o]=Object.freeze(Ws(f,r))),f}_resolveAnimations(t,e,i){const s=this.chart,n=this._cachedDataOpts,o=`animation-${e}`,a=n[o];if(a)return a;let r;if(!1!==s.options.animation){const s=this.chart.config,n=s.datasetAnimationScopeKeys(this._type,e),o=s.getOptionScopes(this.getDataset(),n);r=s.createResolver(o,this.getContext(t,i,e))}const l=new Os(s,r&&r.animations);return r&&r._cacheable&&(n[o]=Object.freeze(l)),l}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||Bs(t)||this.chart._animationsDisabled}_getSharedOptions(t,e){const i=this.resolveDataElementOptions(t,e),s=this._sharedOptions,n=this.getSharedOptions(i),o=this.includeOptions(e,n)||n!==s;return this.updateSharedOptions(n,e,i),{sharedOptions:n,includeOptions:o}}updateElement(t,e,i,s){Bs(s)?Object.assign(t,i):this._resolveAnimations(e,s).update(t,i)}updateSharedOptions(t,e,i){t&&!Bs(e)&&this._resolveAnimations(void 0,e).update(t,i)}_setStyle(t,e,i,s){t.active=s;const n=this.getStyle(e,s);this._resolveAnimations(e,i,s).update(t,{options:!s&&this.getSharedOptions(n)||n})}removeHoverStyle(t,e,i){this._setStyle(t,i,"active",!1)}setHoverStyle(t,e,i){this._setStyle(t,i,"active",!0)}_removeDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!1)}_setDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!0)}_resyncElements(t){const e=this._data,i=this._cachedMeta.data;for(const[t,e,i]of this._syncList)this[t](e,i);this._syncList=[];const s=i.length,n=e.length,o=Math.min(n,s);o&&this.parse(0,o),n>s?this._insertElements(s,n-s,t):n{for(t.length+=e,a=t.length-1;a>=o;a--)t[a]=t[a-e]};for(r(n),a=t;a{s[t]=i[t]&&i[t].active()?i[t]._to:this[t]})),s}}function js(t,e){const i=t.options.ticks,n=function(t){const e=t.options.offset,i=t._tickSize(),s=t._length/i+(e?0:1),n=t._maxLength/i;return Math.floor(Math.min(s,n))}(t),o=Math.min(i.maxTicksLimit||n,n),a=i.major.enabled?function(t){const e=[];let i,s;for(i=0,s=t.length;io)return function(t,e,i,s){let n,o=0,a=i[0];for(s=Math.ceil(s),n=0;nn)return e}return Math.max(n,1)}(a,e,o);if(r>0){let t,i;const n=r>1?Math.round((h-l)/(r-1)):null;for($s(e,c,d,s(n)?0:l-n,l),t=0,i=r-1;t"top"===e||"left"===e?t[e]+i:t[e]-i,Us=(t,e)=>Math.min(e||t,t);function Xs(t,e){const i=[],s=t.length/e,n=t.length;let o=0;for(;oa+r)))return h}function Ks(t){return t.drawTicks?t.tickLength:0}function Gs(t,e){if(!t.display)return 0;const i=Si(t.font,e),s=ki(t.padding);return(n(t.text)?t.text.length:1)*i.lineHeight+s.height}function Zs(t,e,i){let s=ut(t);return(i&&"right"!==e||!i&&"right"===e)&&(s=(t=>"left"===t?"right":"right"===t?"left":t)(s)),s}class Js extends Hs{constructor(t){super(),this.id=t.id,this.type=t.type,this.options=void 0,this.ctx=t.ctx,this.chart=t.chart,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this._margins={left:0,right:0,top:0,bottom:0},this.maxWidth=void 0,this.maxHeight=void 0,this.paddingTop=void 0,this.paddingBottom=void 0,this.paddingLeft=void 0,this.paddingRight=void 0,this.axis=void 0,this.labelRotation=void 0,this.min=void 0,this.max=void 0,this._range=void 0,this.ticks=[],this._gridLineItems=null,this._labelItems=null,this._labelSizes=null,this._length=0,this._maxLength=0,this._longestTextCache={},this._startPixel=void 0,this._endPixel=void 0,this._reversePixels=!1,this._userMax=void 0,this._userMin=void 0,this._suggestedMax=void 0,this._suggestedMin=void 0,this._ticksLength=0,this._borderValue=0,this._cache={},this._dataLimitsCached=!1,this.$context=void 0}init(t){this.options=t.setContext(this.getContext()),this.axis=t.axis,this._userMin=this.parse(t.min),this._userMax=this.parse(t.max),this._suggestedMin=this.parse(t.suggestedMin),this._suggestedMax=this.parse(t.suggestedMax)}parse(t,e){return t}getUserBounds(){let{_userMin:t,_userMax:e,_suggestedMin:i,_suggestedMax:s}=this;return t=r(t,Number.POSITIVE_INFINITY),e=r(e,Number.NEGATIVE_INFINITY),i=r(i,Number.POSITIVE_INFINITY),s=r(s,Number.NEGATIVE_INFINITY),{min:r(t,i),max:r(e,s),minDefined:a(t),maxDefined:a(e)}}getMinMax(t){let e,{min:i,max:s,minDefined:n,maxDefined:o}=this.getUserBounds();if(n&&o)return{min:i,max:s};const a=this.getMatchingVisibleMetas();for(let r=0,l=a.length;rs?s:i,s=n&&i>s?i:s,{min:r(i,r(s,i)),max:r(s,r(i,s))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){const t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}getLabelItems(t=this.chart.chartArea){return this._labelItems||(this._labelItems=this._computeLabelItems(t))}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){d(this.options.beforeUpdate,[this])}update(t,e,i){const{beginAtZero:s,grace:n,ticks:o}=this.options,a=o.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this._margins=i=Object.assign({left:0,right:0,top:0,bottom:0},i),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+i.left+i.right:this.height+i.top+i.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=Di(this,n,s),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();const r=a=n||i<=1||!this.isHorizontal())return void(this.labelRotation=s);const h=this._getLabelSizes(),c=h.widest.width,d=h.highest.height,u=J(this.chart.width-c,0,this.maxWidth);o=t.offset?this.maxWidth/i:u/(i-1),c+6>o&&(o=u/(i-(t.offset?.5:1)),a=this.maxHeight-Ks(t.grid)-e.padding-Gs(t.title,this.chart.options.font),r=Math.sqrt(c*c+d*d),l=Y(Math.min(Math.asin(J((h.highest.height+6)/o,-1,1)),Math.asin(J(a/r,-1,1))-Math.asin(J(d/r,-1,1)))),l=Math.max(s,Math.min(n,l))),this.labelRotation=l}afterCalculateLabelRotation(){d(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){d(this.options.beforeFit,[this])}fit(){const t={width:0,height:0},{chart:e,options:{ticks:i,title:s,grid:n}}=this,o=this._isVisible(),a=this.isHorizontal();if(o){const o=Gs(s,e.options.font);if(a?(t.width=this.maxWidth,t.height=Ks(n)+o):(t.height=this.maxHeight,t.width=Ks(n)+o),i.display&&this.ticks.length){const{first:e,last:s,widest:n,highest:o}=this._getLabelSizes(),r=2*i.padding,l=$(this.labelRotation),h=Math.cos(l),c=Math.sin(l);if(a){const e=i.mirror?0:c*n.width+h*o.height;t.height=Math.min(this.maxHeight,t.height+e+r)}else{const e=i.mirror?0:h*n.width+c*o.height;t.width=Math.min(this.maxWidth,t.width+e+r)}this._calculatePadding(e,s,c,h)}}this._handleMargins(),a?(this.width=this._length=e.width-this._margins.left-this._margins.right,this.height=t.height):(this.width=t.width,this.height=this._length=e.height-this._margins.top-this._margins.bottom)}_calculatePadding(t,e,i,s){const{ticks:{align:n,padding:o},position:a}=this.options,r=0!==this.labelRotation,l="top"!==a&&"x"===this.axis;if(this.isHorizontal()){const a=this.getPixelForTick(0)-this.left,h=this.right-this.getPixelForTick(this.ticks.length-1);let c=0,d=0;r?l?(c=s*t.width,d=i*e.height):(c=i*t.height,d=s*e.width):"start"===n?d=e.width:"end"===n?c=t.width:"inner"!==n&&(c=t.width/2,d=e.width/2),this.paddingLeft=Math.max((c-a+o)*this.width/(this.width-a),0),this.paddingRight=Math.max((d-h+o)*this.width/(this.width-h),0)}else{let i=e.height/2,s=t.height/2;"start"===n?(i=0,s=t.height):"end"===n&&(i=e.height,s=0),this.paddingTop=i+o,this.paddingBottom=s+o}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){d(this.options.afterFit,[this])}isHorizontal(){const{axis:t,position:e}=this.options;return"top"===e||"bottom"===e||"x"===t}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){let e,i;for(this.beforeTickToLabelConversion(),this.generateTickLabels(t),e=0,i=t.length;e{const i=t.gc,s=i.length/2;let n;if(s>e){for(n=0;n({width:r[t]||0,height:l[t]||0});return{first:P(0),last:P(e-1),widest:P(k),highest:P(S),widths:r,heights:l}}getLabelForValue(t){return t}getPixelForValue(t,e){return NaN}getValueForPixel(t){}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getPixelForDecimal(t){this._reversePixels&&(t=1-t);const e=this._startPixel+t*this._length;return Q(this._alignToPixels?Ae(this.chart,e,0):e)}getDecimalForPixel(t){const e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){const{min:t,max:e}=this;return t<0&&e<0?e:t>0&&e>0?t:0}getContext(t){const e=this.ticks||[];if(t>=0&&ta*s?a/i:r/s:r*s0}_computeGridLineItems(t){const e=this.axis,i=this.chart,s=this.options,{grid:n,position:a,border:r}=s,h=n.offset,c=this.isHorizontal(),d=this.ticks.length+(h?1:0),u=Ks(n),f=[],g=r.setContext(this.getContext()),p=g.display?g.width:0,m=p/2,b=function(t){return Ae(i,t,p)};let x,_,y,v,M,w,k,S,P,D,C,O;if("top"===a)x=b(this.bottom),w=this.bottom-u,S=x-m,D=b(t.top)+m,O=t.bottom;else if("bottom"===a)x=b(this.top),D=t.top,O=b(t.bottom)-m,w=x+m,S=this.top+u;else if("left"===a)x=b(this.right),M=this.right-u,k=x-m,P=b(t.left)+m,C=t.right;else if("right"===a)x=b(this.left),P=t.left,C=b(t.right)-m,M=x+m,k=this.left+u;else if("x"===e){if("center"===a)x=b((t.top+t.bottom)/2+.5);else if(o(a)){const t=Object.keys(a)[0],e=a[t];x=b(this.chart.scales[t].getPixelForValue(e))}D=t.top,O=t.bottom,w=x+m,S=w+u}else if("y"===e){if("center"===a)x=b((t.left+t.right)/2);else if(o(a)){const t=Object.keys(a)[0],e=a[t];x=b(this.chart.scales[t].getPixelForValue(e))}M=x-m,k=M-u,P=t.left,C=t.right}const A=l(s.ticks.maxTicksLimit,d),T=Math.max(1,Math.ceil(d/A));for(_=0;_e.value===t));if(i>=0){return e.setContext(this.getContext(i)).lineWidth}return 0}drawGrid(t){const e=this.options.grid,i=this.ctx,s=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t));let n,o;const a=(t,e,s)=>{s.width&&s.color&&(i.save(),i.lineWidth=s.width,i.strokeStyle=s.color,i.setLineDash(s.borderDash||[]),i.lineDashOffset=s.borderDashOffset,i.beginPath(),i.moveTo(t.x,t.y),i.lineTo(e.x,e.y),i.stroke(),i.restore())};if(e.display)for(n=0,o=s.length;n{this.drawBackground(),this.drawGrid(t),this.drawTitle()}},{z:s,draw:()=>{this.drawBorder()}},{z:e,draw:t=>{this.drawLabels(t)}}]:[{z:e,draw:t=>{this.draw(t)}}]}getMatchingVisibleMetas(t){const e=this.chart.getSortedVisibleDatasetMetas(),i=this.axis+"AxisID",s=[];let n,o;for(n=0,o=e.length;n{const s=i.split("."),n=s.pop(),o=[t].concat(s).join("."),a=e[i].split("."),r=a.pop(),l=a.join(".");ue.route(o,n,l,r)}))}(e,t.defaultRoutes);t.descriptors&&ue.describe(e,t.descriptors)}(t,o,i),this.override&&ue.override(t.id,t.overrides)),o}get(t){return this.items[t]}unregister(t){const e=this.items,i=t.id,s=this.scope;i in e&&delete e[i],s&&i in ue[s]&&(delete ue[s][i],this.override&&delete re[i])}}class tn{constructor(){this.controllers=new Qs(Ns,"datasets",!0),this.elements=new Qs(Hs,"elements"),this.plugins=new Qs(Object,"plugins"),this.scales=new Qs(Js,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each("register",t)}remove(...t){this._each("unregister",t)}addControllers(...t){this._each("register",t,this.controllers)}addElements(...t){this._each("register",t,this.elements)}addPlugins(...t){this._each("register",t,this.plugins)}addScales(...t){this._each("register",t,this.scales)}getController(t){return this._get(t,this.controllers,"controller")}getElement(t){return this._get(t,this.elements,"element")}getPlugin(t){return this._get(t,this.plugins,"plugin")}getScale(t){return this._get(t,this.scales,"scale")}removeControllers(...t){this._each("unregister",t,this.controllers)}removeElements(...t){this._each("unregister",t,this.elements)}removePlugins(...t){this._each("unregister",t,this.plugins)}removeScales(...t){this._each("unregister",t,this.scales)}_each(t,e,i){[...e].forEach((e=>{const s=i||this._getRegistryForType(e);i||s.isForType(e)||s===this.plugins&&e.id?this._exec(t,s,e):u(e,(e=>{const s=i||this._getRegistryForType(e);this._exec(t,s,e)}))}))}_exec(t,e,i){const s=w(t);d(i["before"+s],[],i),e[t](i),d(i["after"+s],[],i)}_getRegistryForType(t){for(let e=0;et.filter((t=>!e.some((e=>t.plugin.id===e.plugin.id))));this._notify(s(e,i),t,"stop"),this._notify(s(i,e),t,"start")}}function nn(t,e){return e||!1!==t?!0===t?{}:t:null}function on(t,{plugin:e,local:i},s,n){const o=t.pluginScopeKeys(e),a=t.getOptionScopes(s,o);return i&&e.defaults&&a.push(e.defaults),t.createResolver(a,n,[""],{scriptable:!1,indexable:!1,allKeys:!0})}function an(t,e){const i=ue.datasets[t]||{};return((e.datasets||{})[t]||{}).indexAxis||e.indexAxis||i.indexAxis||"x"}function rn(t){if("x"===t||"y"===t||"r"===t)return t}function ln(t,...e){if(rn(t))return t;for(const s of e){const e=s.axis||("top"===(i=s.position)||"bottom"===i?"x":"left"===i||"right"===i?"y":void 0)||t.length>1&&rn(t[0].toLowerCase());if(e)return e}var i;throw new Error(`Cannot determine type of '${t}' axis. Please provide 'axis' or 'position' option.`)}function hn(t,e,i){if(i[e+"AxisID"]===t)return{axis:e}}function cn(t,e){const i=re[t.type]||{scales:{}},s=e.scales||{},n=an(t.type,e),a=Object.create(null);return Object.keys(s).forEach((e=>{const r=s[e];if(!o(r))return console.error(`Invalid scale configuration for scale: ${e}`);if(r._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${e}`);const l=ln(e,r,function(t,e){if(e.data&&e.data.datasets){const i=e.data.datasets.filter((e=>e.xAxisID===t||e.yAxisID===t));if(i.length)return hn(t,"x",i[0])||hn(t,"y",i[0])}return{}}(e,t),ue.scales[r.type]),h=function(t,e){return t===e?"_index_":"_value_"}(l,n),c=i.scales||{};a[e]=x(Object.create(null),[{axis:l},r,c[l],c[h]])})),t.data.datasets.forEach((i=>{const n=i.type||t.type,o=i.indexAxis||an(n,e),r=(re[n]||{}).scales||{};Object.keys(r).forEach((t=>{const e=function(t,e){let i=t;return"_index_"===t?i=e:"_value_"===t&&(i="x"===e?"y":"x"),i}(t,o),n=i[e+"AxisID"]||e;a[n]=a[n]||Object.create(null),x(a[n],[{axis:e},s[n],r[t]])}))})),Object.keys(a).forEach((t=>{const e=a[t];x(e,[ue.scales[e.type],ue.scale])})),a}function dn(t){const e=t.options||(t.options={});e.plugins=l(e.plugins,{}),e.scales=cn(t,e)}function un(t){return(t=t||{}).datasets=t.datasets||[],t.labels=t.labels||[],t}const fn=new Map,gn=new Set;function pn(t,e){let i=fn.get(t);return i||(i=e(),fn.set(t,i),gn.add(i)),i}const mn=(t,e,i)=>{const s=M(e,i);void 0!==s&&t.add(s)};class bn{constructor(t){this._config=function(t){return(t=t||{}).data=un(t.data),dn(t),t}(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=un(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){const t=this._config;this.clearCache(),dn(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return pn(t,(()=>[[`datasets.${t}`,""]]))}datasetAnimationScopeKeys(t,e){return pn(`${t}.transition.${e}`,(()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]]))}datasetElementScopeKeys(t,e){return pn(`${t}-${e}`,(()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]]))}pluginScopeKeys(t){const e=t.id;return pn(`${this.type}-plugin-${e}`,(()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]]))}_cachedScopes(t,e){const i=this._scopeCache;let s=i.get(t);return s&&!e||(s=new Map,i.set(t,s)),s}getOptionScopes(t,e,i){const{options:s,type:n}=this,o=this._cachedScopes(t,i),a=o.get(e);if(a)return a;const r=new Set;e.forEach((e=>{t&&(r.add(t),e.forEach((e=>mn(r,t,e)))),e.forEach((t=>mn(r,s,t))),e.forEach((t=>mn(r,re[n]||{},t))),e.forEach((t=>mn(r,ue,t))),e.forEach((t=>mn(r,le,t)))}));const l=Array.from(r);return 0===l.length&&l.push(Object.create(null)),gn.has(e)&&o.set(e,l),l}chartOptionScopes(){const{options:t,type:e}=this;return[t,re[e]||{},ue.datasets[e]||{},{type:e},ue,le]}resolveNamedOptions(t,e,i,s=[""]){const o={$shared:!0},{resolver:a,subPrefixes:r}=xn(this._resolverCache,t,s);let l=a;if(function(t,e){const{isScriptable:i,isIndexable:s}=Ye(t);for(const o of e){const e=i(o),a=s(o),r=(a||e)&&t[o];if(e&&(S(r)||_n(r))||a&&n(r))return!0}return!1}(a,e)){o.$shared=!1;l=$e(a,i=S(i)?i():i,this.createResolver(t,i,r))}for(const t of e)o[t]=l[t];return o}createResolver(t,e,i=[""],s){const{resolver:n}=xn(this._resolverCache,t,i);return o(e)?$e(n,e,void 0,s):n}}function xn(t,e,i){let s=t.get(e);s||(s=new Map,t.set(e,s));const n=i.join();let o=s.get(n);if(!o){o={resolver:je(e,i),subPrefixes:i.filter((t=>!t.toLowerCase().includes("hover")))},s.set(n,o)}return o}const _n=t=>o(t)&&Object.getOwnPropertyNames(t).reduce(((e,i)=>e||S(t[i])),!1);const yn=["top","bottom","left","right","chartArea"];function vn(t,e){return"top"===t||"bottom"===t||-1===yn.indexOf(t)&&"x"===e}function Mn(t,e){return function(i,s){return i[t]===s[t]?i[e]-s[e]:i[t]-s[t]}}function wn(t){const e=t.chart,i=e.options.animation;e.notifyPlugins("afterRender"),d(i&&i.onComplete,[t],e)}function kn(t){const e=t.chart,i=e.options.animation;d(i&&i.onProgress,[t],e)}function Sn(t){return fe()&&"string"==typeof t?t=document.getElementById(t):t&&t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t}const Pn={},Dn=t=>{const e=Sn(t);return Object.values(Pn).filter((t=>t.canvas===e)).pop()};function Cn(t,e,i){const s=Object.keys(t);for(const n of s){const s=+n;if(s>=e){const o=t[n];delete t[n],(i>0||s>e)&&(t[s+i]=o)}}}function On(t,e,i){return t.options.clip?t[i]:e[i]}class An{static defaults=ue;static instances=Pn;static overrides=re;static registry=en;static version="4.4.0";static getChart=Dn;static register(...t){en.add(...t),Tn()}static unregister(...t){en.remove(...t),Tn()}constructor(t,e){const s=this.config=new bn(e),n=Sn(t),o=Dn(n);if(o)throw new Error("Canvas is already in use. Chart with ID '"+o.id+"' must be destroyed before the canvas with ID '"+o.canvas.id+"' can be reused.");const a=s.createResolver(s.chartOptionScopes(),this.getContext());this.platform=new(s.platform||ks(n)),this.platform.updateConfig(s);const r=this.platform.acquireContext(n,a.aspectRatio),l=r&&r.canvas,h=l&&l.height,c=l&&l.width;this.id=i(),this.ctx=r,this.canvas=l,this.width=c,this.height=h,this._options=a,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new sn,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=dt((t=>this.update(t)),a.resizeDelay||0),this._dataChanges=[],Pn[this.id]=this,r&&l?(xt.listen(this,"complete",wn),xt.listen(this,"progress",kn),this._initialize(),this.attached&&this.update()):console.error("Failed to create chart: can't acquire context from the given item")}get aspectRatio(){const{options:{aspectRatio:t,maintainAspectRatio:e},width:i,height:n,_aspectRatio:o}=this;return s(t)?e&&o?o:n?i/n:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}get registry(){return en}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():ke(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return Te(this.canvas,this.ctx),this}stop(){return xt.stop(this),this}resize(t,e){xt.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){const i=this.options,s=this.canvas,n=i.maintainAspectRatio&&this.aspectRatio,o=this.platform.getMaximumSize(s,t,e,n),a=i.devicePixelRatio||this.platform.getDevicePixelRatio(),r=this.width?"resize":"attach";this.width=o.width,this.height=o.height,this._aspectRatio=this.aspectRatio,ke(this,a,!0)&&(this.notifyPlugins("resize",{size:o}),d(i.onResize,[this,o],this),this.attached&&this._doResize(r)&&this.render())}ensureScalesHaveIDs(){u(this.options.scales||{},((t,e)=>{t.id=e}))}buildOrUpdateScales(){const t=this.options,e=t.scales,i=this.scales,s=Object.keys(i).reduce(((t,e)=>(t[e]=!1,t)),{});let n=[];e&&(n=n.concat(Object.keys(e).map((t=>{const i=e[t],s=ln(t,i),n="r"===s,o="x"===s;return{options:i,dposition:n?"chartArea":o?"bottom":"left",dtype:n?"radialLinear":o?"category":"linear"}})))),u(n,(e=>{const n=e.options,o=n.id,a=ln(o,n),r=l(n.type,e.dtype);void 0!==n.position&&vn(n.position,a)===vn(e.dposition)||(n.position=e.dposition),s[o]=!0;let h=null;if(o in i&&i[o].type===r)h=i[o];else{h=new(en.getScale(r))({id:o,type:r,ctx:this.ctx,chart:this}),i[h.id]=h}h.init(n,t)})),u(s,((t,e)=>{t||delete i[e]})),u(i,(t=>{as.configure(this,t,t.options),as.addBox(this,t)}))}_updateMetasets(){const t=this._metasets,e=this.data.datasets.length,i=t.length;if(t.sort(((t,e)=>t.index-e.index)),i>e){for(let t=e;te.length&&delete this._stacks,t.forEach(((t,i)=>{0===e.filter((e=>e===t._dataset)).length&&this._destroyDatasetMeta(i)}))}buildOrUpdateControllers(){const t=[],e=this.data.datasets;let i,s;for(this._removeUnreferencedMetasets(),i=0,s=e.length;i{this.getDatasetMeta(e).controller.reset()}),this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){const e=this.config;e.update();const i=this._options=e.createResolver(e.chartOptionScopes(),this.getContext()),s=this._animationsDisabled=!i.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),!1===this.notifyPlugins("beforeUpdate",{mode:t,cancelable:!0}))return;const n=this.buildOrUpdateControllers();this.notifyPlugins("beforeElementsUpdate");let o=0;for(let t=0,e=this.data.datasets.length;t{t.reset()})),this._updateDatasets(t),this.notifyPlugins("afterUpdate",{mode:t}),this._layers.sort(Mn("z","_idx"));const{_active:a,_lastEvent:r}=this;r?this._eventHandler(r,!0):a.length&&this._updateHoverStyles(a,a,!0),this.render()}_updateScales(){u(this.scales,(t=>{as.removeBox(this,t)})),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const t=this.options,e=new Set(Object.keys(this._listeners)),i=new Set(t.events);P(e,i)&&!!this._responsiveListeners===t.responsive||(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){const{_hiddenIndices:t}=this,e=this._getUniformDataChanges()||[];for(const{method:i,start:s,count:n}of e){Cn(t,s,"_removeElements"===i?-n:n)}}_getUniformDataChanges(){const t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];const e=this.data.datasets.length,i=e=>new Set(t.filter((t=>t[0]===e)).map(((t,e)=>e+","+t.splice(1).join(",")))),s=i(0);for(let t=1;tt.split(","))).map((t=>({method:t[1],start:+t[2],count:+t[3]})))}_updateLayout(t){if(!1===this.notifyPlugins("beforeLayout",{cancelable:!0}))return;as.update(this,this.width,this.height,t);const e=this.chartArea,i=e.width<=0||e.height<=0;this._layers=[],u(this.boxes,(t=>{i&&"chartArea"===t.position||(t.configure&&t.configure(),this._layers.push(...t._layers()))}),this),this._layers.forEach(((t,e)=>{t._idx=e})),this.notifyPlugins("afterLayout")}_updateDatasets(t){if(!1!==this.notifyPlugins("beforeDatasetsUpdate",{mode:t,cancelable:!0})){for(let t=0,e=this.data.datasets.length;t=0;--e)this._drawDataset(t[e]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){const e=this.ctx,i=t._clip,s=!i.disabled,n=function(t,e){const{xScale:i,yScale:s}=t;return i&&s?{left:On(i,e,"left"),right:On(i,e,"right"),top:On(s,e,"top"),bottom:On(s,e,"bottom")}:e}(t,this.chartArea),o={meta:t,index:t.index,cancelable:!0};!1!==this.notifyPlugins("beforeDatasetDraw",o)&&(s&&Ie(e,{left:!1===i.left?0:n.left-i.left,right:!1===i.right?this.width:n.right+i.right,top:!1===i.top?0:n.top-i.top,bottom:!1===i.bottom?this.height:n.bottom+i.bottom}),t.controller.draw(),s&&ze(e),o.cancelable=!1,this.notifyPlugins("afterDatasetDraw",o))}isPointInArea(t){return Re(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,i,s){const n=Xi.modes[e];return"function"==typeof n?n(this,t,i,s):[]}getDatasetMeta(t){const e=this.data.datasets[t],i=this._metasets;let s=i.filter((t=>t&&t._dataset===e)).pop();return s||(s={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},i.push(s)),s}getContext(){return this.$context||(this.$context=Ci(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){const e=this.data.datasets[t];if(!e)return!1;const i=this.getDatasetMeta(t);return"boolean"==typeof i.hidden?!i.hidden:!e.hidden}setDatasetVisibility(t,e){this.getDatasetMeta(t).hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,i){const s=i?"show":"hide",n=this.getDatasetMeta(t),o=n.controller._resolveAnimations(void 0,s);k(e)?(n.data[e].hidden=!i,this.update()):(this.setDatasetVisibility(t,i),o.update(n,{visible:i}),this.update((e=>e.datasetIndex===t?s:void 0)))}hide(t,e){this._updateVisibility(t,e,!1)}show(t,e){this._updateVisibility(t,e,!0)}_destroyDatasetMeta(t){const e=this._metasets[t];e&&e.controller&&e.controller._destroy(),delete this._metasets[t]}_stop(){let t,e;for(this.stop(),xt.remove(this),t=0,e=this.data.datasets.length;t{e.addEventListener(this,i,s),t[i]=s},s=(t,e,i)=>{t.offsetX=e,t.offsetY=i,this._eventHandler(t)};u(this.options.events,(t=>i(t,s)))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});const t=this._responsiveListeners,e=this.platform,i=(i,s)=>{e.addEventListener(this,i,s),t[i]=s},s=(i,s)=>{t[i]&&(e.removeEventListener(this,i,s),delete t[i])},n=(t,e)=>{this.canvas&&this.resize(t,e)};let o;const a=()=>{s("attach",a),this.attached=!0,this.resize(),i("resize",n),i("detach",o)};o=()=>{this.attached=!1,s("resize",n),this._stop(),this._resize(0,0),i("attach",a)},e.isAttached(this.canvas)?a():o()}unbindEvents(){u(this._listeners,((t,e)=>{this.platform.removeEventListener(this,e,t)})),this._listeners={},u(this._responsiveListeners,((t,e)=>{this.platform.removeEventListener(this,e,t)})),this._responsiveListeners=void 0}updateHoverStyle(t,e,i){const s=i?"set":"remove";let n,o,a,r;for("dataset"===e&&(n=this.getDatasetMeta(t[0].datasetIndex),n.controller["_"+s+"DatasetHoverStyle"]()),a=0,r=t.length;a{const i=this.getDatasetMeta(t);if(!i)throw new Error("No dataset found at index "+t);return{datasetIndex:t,element:i.data[e],index:e}}));!f(i,e)&&(this._active=i,this._lastEvent=null,this._updateHoverStyles(i,e))}notifyPlugins(t,e,i){return this._plugins.notify(this,t,e,i)}isPluginEnabled(t){return 1===this._plugins._cache.filter((e=>e.plugin.id===t)).length}_updateHoverStyles(t,e,i){const s=this.options.hover,n=(t,e)=>t.filter((t=>!e.some((e=>t.datasetIndex===e.datasetIndex&&t.index===e.index)))),o=n(e,t),a=i?t:n(t,e);o.length&&this.updateHoverStyle(o,s.mode,!1),a.length&&s.mode&&this.updateHoverStyle(a,s.mode,!0)}_eventHandler(t,e){const i={event:t,replay:e,cancelable:!0,inChartArea:this.isPointInArea(t)},s=e=>(e.options.events||this.options.events).includes(t.native.type);if(!1===this.notifyPlugins("beforeEvent",i,s))return;const n=this._handleEvent(t,e,i.inChartArea);return i.cancelable=!1,this.notifyPlugins("afterEvent",i,s),(n||i.changed)&&this.render(),this}_handleEvent(t,e,i){const{_active:s=[],options:n}=this,o=e,a=this._getActiveElements(t,s,i,o),r=D(t),l=function(t,e,i,s){return i&&"mouseout"!==t.type?s?e:t:null}(t,this._lastEvent,i,r);i&&(this._lastEvent=null,d(n.onHover,[t,a,this],this),r&&d(n.onClick,[t,a,this],this));const h=!f(a,s);return(h||e)&&(this._active=a,this._updateHoverStyles(a,s,e)),this._lastEvent=l,h}_getActiveElements(t,e,i,s){if("mouseout"===t.type)return[];if(!i)return e;const n=this.options.hover;return this.getElementsAtEventForMode(t,n.mode,n,s)}}function Tn(){return u(An.instances,(t=>t._plugins.invalidate()))}function Ln(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}class En{static override(t){Object.assign(En.prototype,t)}options;constructor(t){this.options=t||{}}init(){}formats(){return Ln()}parse(){return Ln()}format(){return Ln()}add(){return Ln()}diff(){return Ln()}startOf(){return Ln()}endOf(){return Ln()}}var Rn={_date:En};function In(t){const e=t.iScale,i=function(t,e){if(!t._cache.$bar){const i=t.getMatchingVisibleMetas(e);let s=[];for(let e=0,n=i.length;et-e)))}return t._cache.$bar}(e,t.type);let s,n,o,a,r=e._length;const l=()=>{32767!==o&&-32768!==o&&(k(a)&&(r=Math.min(r,Math.abs(o-a)||r)),a=o)};for(s=0,n=i.length;sMath.abs(r)&&(l=r,h=a),e[i.axis]=h,e._custom={barStart:l,barEnd:h,start:n,end:o,min:a,max:r}}(t,e,i,s):e[i.axis]=i.parse(t,s),e}function Fn(t,e,i,s){const n=t.iScale,o=t.vScale,a=n.getLabels(),r=n===o,l=[];let h,c,d,u;for(h=i,c=i+s;ht.x,i="left",s="right"):(e=t.base"spacing"!==t,_indexable:t=>"spacing"!==t&&!t.startsWith("borderDash")&&!t.startsWith("hoverBorderDash")};static overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:i,color:s}}=t.legend.options;return e.labels.map(((e,n)=>{const o=t.getDatasetMeta(0).controller.getStyle(n);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,fontColor:s,lineWidth:o.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(n),index:n}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}}};constructor(t,e){super(t,e),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,e){const i=this.getDataset().data,s=this._cachedMeta;if(!1===this._parsing)s._parsed=i;else{let n,a,r=t=>+i[t];if(o(i[t])){const{key:t="value"}=this._parsing;r=e=>+M(i[e],t)}for(n=t,a=t+e;nZ(t,r,l,!0)?1:Math.max(e,e*i,s,s*i),g=(t,e,s)=>Z(t,r,l,!0)?-1:Math.min(e,e*i,s,s*i),p=f(0,h,d),m=f(E,c,u),b=g(C,h,d),x=g(C+E,c,u);s=(p-b)/2,n=(m-x)/2,o=-(p+b)/2,a=-(m+x)/2}return{ratioX:s,ratioY:n,offsetX:o,offsetY:a}}(u,d,r),b=(i.width-o)/f,x=(i.height-o)/g,_=Math.max(Math.min(b,x)/2,0),y=c(this.options.radius,_),v=(y-Math.max(y*r,0))/this._getVisibleDatasetWeightTotal();this.offsetX=p*y,this.offsetY=m*y,s.total=this.calculateTotal(),this.outerRadius=y-v*this._getRingWeightOffset(this.index),this.innerRadius=Math.max(this.outerRadius-v*l,0),this.updateElements(n,0,n.length,t)}_circumference(t,e){const i=this.options,s=this._cachedMeta,n=this._getCircumference();return e&&i.animation.animateRotate||!this.chart.getDataVisibility(t)||null===s._parsed[t]||s.data[t].hidden?0:this.calculateCircumference(s._parsed[t]*n/O)}updateElements(t,e,i,s){const n="reset"===s,o=this.chart,a=o.chartArea,r=o.options.animation,l=(a.left+a.right)/2,h=(a.top+a.bottom)/2,c=n&&r.animateScale,d=c?0:this.innerRadius,u=c?0:this.outerRadius,{sharedOptions:f,includeOptions:g}=this._getSharedOptions(e,s);let p,m=this._getRotation();for(p=0;p0&&!isNaN(t)?O*(Math.abs(t)/e):0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=ne(e._parsed[t],i.options.locale);return{label:s[t]||"",value:n}}getMaxBorderWidth(t){let e=0;const i=this.chart;let s,n,o,a,r;if(!t)for(s=0,n=i.data.datasets.length;s{const o=t.getDatasetMeta(0).controller.getStyle(n);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,fontColor:s,lineWidth:o.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(n),index:n}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}};constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=ne(e._parsed[t].r,i.options.locale);return{label:s[t]||"",value:n}}parseObjectData(t,e,i,s){return ii.bind(this)(t,e,i,s)}update(t){const e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}getMinMax(){const t=this._cachedMeta,e={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return t.data.forEach(((t,i)=>{const s=this.getParsed(i).r;!isNaN(s)&&this.chart.getDataVisibility(i)&&(se.max&&(e.max=s))})),e}_updateRadius(){const t=this.chart,e=t.chartArea,i=t.options,s=Math.min(e.right-e.left,e.bottom-e.top),n=Math.max(s/2,0),o=(n-Math.max(i.cutoutPercentage?n/100*i.cutoutPercentage:1,0))/t.getVisibleDatasetCount();this.outerRadius=n-o*this.index,this.innerRadius=this.outerRadius-o}updateElements(t,e,i,s){const n="reset"===s,o=this.chart,a=o.options.animation,r=this._cachedMeta.rScale,l=r.xCenter,h=r.yCenter,c=r.getIndexAngle(0)-.5*C;let d,u=c;const f=360/this.countVisibleElements();for(d=0;d{!isNaN(this.getParsed(i).r)&&this.chart.getDataVisibility(i)&&e++})),e}_computeAngle(t,e,i){return this.chart.getDataVisibility(t)?$(this.resolveDataElementOptions(t,e).angle||i):0}}var Yn=Object.freeze({__proto__:null,BarController:class extends Ns{static id="bar";static defaults={datasetElementType:!1,dataElementType:"bar",categoryPercentage:.8,barPercentage:.9,grouped:!0,animations:{numbers:{type:"number",properties:["x","y","base","width","height"]}}};static overrides={scales:{_index_:{type:"category",offset:!0,grid:{offset:!0}},_value_:{type:"linear",beginAtZero:!0}}};parsePrimitiveData(t,e,i,s){return Fn(t,e,i,s)}parseArrayData(t,e,i,s){return Fn(t,e,i,s)}parseObjectData(t,e,i,s){const{iScale:n,vScale:o}=t,{xAxisKey:a="x",yAxisKey:r="y"}=this._parsing,l="x"===n.axis?a:r,h="x"===o.axis?a:r,c=[];let d,u,f,g;for(d=i,u=i+s;dt.controller.options.grouped)),o=i.options.stacked,a=[],r=t=>{const i=t.controller.getParsed(e),n=i&&i[t.vScale.axis];if(s(n)||isNaN(n))return!0};for(const i of n)if((void 0===e||!r(i))&&((!1===o||-1===a.indexOf(i.stack)||void 0===o&&void 0===i.stack)&&a.push(i.stack),i.index===t))break;return a.length||a.push(void 0),a}_getStackCount(t){return this._getStacks(void 0,t).length}_getStackIndex(t,e,i){const s=this._getStacks(t,i),n=void 0!==e?s.indexOf(e):-1;return-1===n?s.length-1:n}_getRuler(){const t=this.options,e=this._cachedMeta,i=e.iScale,s=[];let n,o;for(n=0,o=e.data.length;n=i?1:-1)}(u,e,r)*a,f===r&&(b-=u/2);const t=e.getPixelForDecimal(0),s=e.getPixelForDecimal(1),o=Math.min(t,s),h=Math.max(t,s);b=Math.max(Math.min(b,h),o),d=b+u,i&&!c&&(l._stacks[e.axis]._visualValues[n]=e.getValueForPixel(d)-e.getValueForPixel(b))}if(b===e.getPixelForValue(r)){const t=F(u)*e.getLineWidthForValue(r)/2;b+=t,u-=t}return{size:u,base:b,head:d,center:d+u/2}}_calculateBarIndexPixels(t,e){const i=e.scale,n=this.options,o=n.skipNull,a=l(n.maxBarThickness,1/0);let r,h;if(e.grouped){const i=o?this._getStackCount(t):e.stackCount,l="flex"===n.barThickness?function(t,e,i,s){const n=e.pixels,o=n[t];let a=t>0?n[t-1]:null,r=t=0;--i)e=Math.max(e,t[i].size(this.resolveDataElementOptions(i))/2);return e>0&&e}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart.data.labels||[],{xScale:s,yScale:n}=e,o=this.getParsed(t),a=s.getLabelForValue(o.x),r=n.getLabelForValue(o.y),l=o._custom;return{label:i[t]||"",value:"("+a+", "+r+(l?", "+l:"")+")"}}update(t){const e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,i,s){const n="reset"===s,{iScale:o,vScale:a}=this._cachedMeta,{sharedOptions:r,includeOptions:l}=this._getSharedOptions(e,s),h=o.axis,c=a.axis;for(let d=e;d0&&this.getParsed(e-1);for(let i=0;i<_;++i){const g=t[i],_=b?g:{};if(i=x){_.skip=!0;continue}const v=this.getParsed(i),M=s(v[f]),w=_[u]=a.getPixelForValue(v[u],i),k=_[f]=o||M?r.getBasePixel():r.getPixelForValue(l?this.applyStack(r,v,l):v[f],i);_.skip=isNaN(w)||isNaN(k)||M,_.stop=i>0&&Math.abs(v[u]-y[u])>m,p&&(_.parsed=v,_.raw=h.data[i]),d&&(_.options=c||this.resolveDataElementOptions(i,g.active?"active":n)),b||this.updateElement(g,i,_,n),y=v}}getMaxOverflow(){const t=this._cachedMeta,e=t.dataset,i=e.options&&e.options.borderWidth||0,s=t.data||[];if(!s.length)return i;const n=s[0].size(this.resolveDataElementOptions(0)),o=s[s.length-1].size(this.resolveDataElementOptions(s.length-1));return Math.max(i,n,o)/2}draw(){const t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}},PieController:class extends jn{static id="pie";static defaults={cutout:0,rotation:0,circumference:360,radius:"100%"}},PolarAreaController:$n,RadarController:class extends Ns{static id="radar";static defaults={datasetElementType:"line",dataElementType:"point",indexAxis:"r",showLine:!0,elements:{line:{fill:"start"}}};static overrides={aspectRatio:1,scales:{r:{type:"radialLinear"}}};getLabelAndValue(t){const e=this._cachedMeta.vScale,i=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(i[e.axis])}}parseObjectData(t,e,i,s){return ii.bind(this)(t,e,i,s)}update(t){const e=this._cachedMeta,i=e.dataset,s=e.data||[],n=e.iScale.getLabels();if(i.points=s,"resize"!==t){const e=this.resolveDatasetElementOptions(t);this.options.showLine||(e.borderWidth=0);const o={_loop:!0,_fullLoop:n.length===s.length,options:e};this.updateElement(i,void 0,o,t)}this.updateElements(s,0,s.length,t)}updateElements(t,e,i,s){const n=this._cachedMeta.rScale,o="reset"===s;for(let a=e;a0&&this.getParsed(e-1);for(let c=e;c0&&Math.abs(i[f]-_[f])>b,m&&(p.parsed=i,p.raw=h.data[c]),u&&(p.options=d||this.resolveDataElementOptions(c,e.active?"active":n)),x||this.updateElement(e,c,p,n),_=i}this.updateSharedOptions(d,n,c)}getMaxOverflow(){const t=this._cachedMeta,e=t.data||[];if(!this.options.showLine){let t=0;for(let i=e.length-1;i>=0;--i)t=Math.max(t,e[i].size(this.resolveDataElementOptions(i))/2);return t>0&&t}const i=t.dataset,s=i.options&&i.options.borderWidth||0;if(!e.length)return s;const n=e[0].size(this.resolveDataElementOptions(0)),o=e[e.length-1].size(this.resolveDataElementOptions(e.length-1));return Math.max(s,n,o)/2}}});function Un(t,e,i,s){const n=vi(t.options.borderRadius,["outerStart","outerEnd","innerStart","innerEnd"]);const o=(i-e)/2,a=Math.min(o,s*e/2),r=t=>{const e=(i-Math.min(o,t))*s/2;return J(t,0,Math.min(o,e))};return{outerStart:r(n.outerStart),outerEnd:r(n.outerEnd),innerStart:J(n.innerStart,0,a),innerEnd:J(n.innerEnd,0,a)}}function Xn(t,e,i,s){return{x:i+t*Math.cos(e),y:s+t*Math.sin(e)}}function qn(t,e,i,s,n,o){const{x:a,y:r,startAngle:l,pixelMargin:h,innerRadius:c}=e,d=Math.max(e.outerRadius+s+i-h,0),u=c>0?c+s+i+h:0;let f=0;const g=n-l;if(s){const t=((c>0?c-s:0)+(d>0?d-s:0))/2;f=(g-(0!==t?g*t/(t+s):g))/2}const p=(g-Math.max(.001,g*d-i/C)/d)/2,m=l+p+f,b=n-p-f,{outerStart:x,outerEnd:_,innerStart:y,innerEnd:v}=Un(e,u,d,b-m),M=d-x,w=d-_,k=m+x/M,S=b-_/w,P=u+y,D=u+v,O=m+y/P,A=b-v/D;if(t.beginPath(),o){const e=(k+S)/2;if(t.arc(a,r,d,k,e),t.arc(a,r,d,e,S),_>0){const e=Xn(w,S,a,r);t.arc(e.x,e.y,_,S,b+E)}const i=Xn(D,b,a,r);if(t.lineTo(i.x,i.y),v>0){const e=Xn(D,A,a,r);t.arc(e.x,e.y,v,b+E,A+Math.PI)}const s=(b-v/u+(m+y/u))/2;if(t.arc(a,r,u,b-v/u,s,!0),t.arc(a,r,u,s,m+y/u,!0),y>0){const e=Xn(P,O,a,r);t.arc(e.x,e.y,y,O+Math.PI,m-E)}const n=Xn(M,m,a,r);if(t.lineTo(n.x,n.y),x>0){const e=Xn(M,k,a,r);t.arc(e.x,e.y,x,m-E,k)}}else{t.moveTo(a,r);const e=Math.cos(k)*d+a,i=Math.sin(k)*d+r;t.lineTo(e,i);const s=Math.cos(S)*d+a,n=Math.sin(S)*d+r;t.lineTo(s,n)}t.closePath()}function Kn(t,e,i,s,n){const{fullCircles:o,startAngle:a,circumference:r,options:l}=e,{borderWidth:h,borderJoinStyle:c,borderDash:d,borderDashOffset:u}=l,f="inner"===l.borderAlign;if(!h)return;t.setLineDash(d||[]),t.lineDashOffset=u,f?(t.lineWidth=2*h,t.lineJoin=c||"round"):(t.lineWidth=h,t.lineJoin=c||"bevel");let g=e.endAngle;if(o){qn(t,e,i,s,g,n);for(let e=0;en?(h=n/l,t.arc(o,a,l,i+h,s-h,!0)):t.arc(o,a,n,i+E,s-E),t.closePath(),t.clip()}(t,e,g),o||(qn(t,e,i,s,g,n),t.stroke())}function Gn(t,e,i=e){t.lineCap=l(i.borderCapStyle,e.borderCapStyle),t.setLineDash(l(i.borderDash,e.borderDash)),t.lineDashOffset=l(i.borderDashOffset,e.borderDashOffset),t.lineJoin=l(i.borderJoinStyle,e.borderJoinStyle),t.lineWidth=l(i.borderWidth,e.borderWidth),t.strokeStyle=l(i.borderColor,e.borderColor)}function Zn(t,e,i){t.lineTo(i.x,i.y)}function Jn(t,e,i={}){const s=t.length,{start:n=0,end:o=s-1}=i,{start:a,end:r}=e,l=Math.max(n,a),h=Math.min(o,r),c=nr&&o>r;return{count:s,start:l,loop:e.loop,ilen:h(a+(h?r-t:t))%o,_=()=>{f!==g&&(t.lineTo(m,g),t.lineTo(m,f),t.lineTo(m,p))};for(l&&(d=n[x(0)],t.moveTo(d.x,d.y)),c=0;c<=r;++c){if(d=n[x(c)],d.skip)continue;const e=d.x,i=d.y,s=0|e;s===u?(ig&&(g=i),m=(b*m+e)/++b):(_(),t.lineTo(e,i),u=s,b=0,f=g=i),p=i}_()}function eo(t){const e=t.options,i=e.borderDash&&e.borderDash.length;return!(t._decimated||t._loop||e.tension||"monotone"===e.cubicInterpolationMode||e.stepped||i)?to:Qn}const io="function"==typeof Path2D;function so(t,e,i,s){io&&!e.options.segment?function(t,e,i,s){let n=e._path;n||(n=e._path=new Path2D,e.path(n,i,s)&&n.closePath()),Gn(t,e.options),t.stroke(n)}(t,e,i,s):function(t,e,i,s){const{segments:n,options:o}=e,a=eo(e);for(const r of n)Gn(t,o,r.style),t.beginPath(),a(t,e,r,{start:i,end:i+s-1})&&t.closePath(),t.stroke()}(t,e,i,s)}class no extends Hs{static id="line";static defaults={borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",borderWidth:3,capBezierPoints:!0,cubicInterpolationMode:"default",fill:!1,spanGaps:!1,stepped:!1,tension:0};static defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};static descriptors={_scriptable:!0,_indexable:t=>"borderDash"!==t&&"fill"!==t};constructor(t){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,t&&Object.assign(this,t)}updateControlPoints(t,e){const i=this.options;if((i.tension||"monotone"===i.cubicInterpolationMode)&&!i.stepped&&!this._pointsUpdated){const s=i.spanGaps?this._loop:this._fullLoop;hi(this._points,i,t,s,e),this._pointsUpdated=!0}}set points(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=zi(this,this.options.segment))}first(){const t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){const t=this.segments,e=this.points,i=t.length;return i&&e[t[i-1].end]}interpolate(t,e){const i=this.options,s=t[e],n=this.points,o=Ii(this,{property:e,start:s,end:s});if(!o.length)return;const a=[],r=function(t){return t.stepped?pi:t.tension||"monotone"===t.cubicInterpolationMode?mi:gi}(i);let l,h;for(l=0,h=o.length;l"borderDash"!==t};circumference;endAngle;fullCircles;innerRadius;outerRadius;pixelMargin;startAngle;constructor(t){super(),this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,t&&Object.assign(this,t)}inRange(t,e,i){const s=this.getProps(["x","y"],i),{angle:n,distance:o}=X(s,{x:t,y:e}),{startAngle:a,endAngle:r,innerRadius:h,outerRadius:c,circumference:d}=this.getProps(["startAngle","endAngle","innerRadius","outerRadius","circumference"],i),u=(this.options.spacing+this.options.borderWidth)/2,f=l(d,r-a)>=O||Z(n,a,r),g=tt(o,h+u,c+u);return f&&g}getCenterPoint(t){const{x:e,y:i,startAngle:s,endAngle:n,innerRadius:o,outerRadius:a}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius"],t),{offset:r,spacing:l}=this.options,h=(s+n)/2,c=(o+a+l+r)/2;return{x:e+Math.cos(h)*c,y:i+Math.sin(h)*c}}tooltipPosition(t){return this.getCenterPoint(t)}draw(t){const{options:e,circumference:i}=this,s=(e.offset||0)/4,n=(e.spacing||0)/2,o=e.circular;if(this.pixelMargin="inner"===e.borderAlign?.33:0,this.fullCircles=i>O?Math.floor(i/O):0,0===i||this.innerRadius<0||this.outerRadius<0)return;t.save();const a=(this.startAngle+this.endAngle)/2;t.translate(Math.cos(a)*s,Math.sin(a)*s);const r=s*(1-Math.sin(Math.min(C,i||0)));t.fillStyle=e.backgroundColor,t.strokeStyle=e.borderColor,function(t,e,i,s,n){const{fullCircles:o,startAngle:a,circumference:r}=e;let l=e.endAngle;if(o){qn(t,e,i,s,l,n);for(let e=0;e("string"==typeof e?(i=t.push(e)-1,s.unshift({index:i,label:e})):isNaN(e)&&(i=null),i))(t,e,i,s);return n!==t.lastIndexOf(e)?i:n}function po(t){const e=this.getLabels();return t>=0&&ts=e?s:t,a=t=>n=i?n:t;if(t){const t=F(s),e=F(n);t<0&&e<0?a(0):t>0&&e>0&&o(0)}if(s===n){let e=0===n?1:Math.abs(.05*n);a(n+e),t||o(s-e)}this.min=s,this.max=n}getTickLimit(){const t=this.options.ticks;let e,{maxTicksLimit:i,stepSize:s}=t;return s?(e=Math.ceil(this.max/s)-Math.floor(this.min/s)+1,e>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${s} would result generating up to ${e} ticks. Limiting to 1000.`),e=1e3)):(e=this.computeTickLimit(),i=i||11),i&&(e=Math.min(i,e)),e}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const t=this.options,e=t.ticks;let i=this.getTickLimit();i=Math.max(2,i);const n=function(t,e){const i=[],{bounds:n,step:o,min:a,max:r,precision:l,count:h,maxTicks:c,maxDigits:d,includeBounds:u}=t,f=o||1,g=c-1,{min:p,max:m}=e,b=!s(a),x=!s(r),_=!s(h),y=(m-p)/(d+1);let v,M,w,k,S=B((m-p)/g/f)*f;if(S<1e-14&&!b&&!x)return[{value:p},{value:m}];k=Math.ceil(m/S)-Math.floor(p/S),k>g&&(S=B(k*S/g/f)*f),s(l)||(v=Math.pow(10,l),S=Math.ceil(S*v)/v),"ticks"===n?(M=Math.floor(p/S)*S,w=Math.ceil(m/S)*S):(M=p,w=m),b&&x&&o&&H((r-a)/o,S/1e3)?(k=Math.round(Math.min((r-a)/S,c)),S=(r-a)/k,M=a,w=r):_?(M=b?a:M,w=x?r:w,k=h-1,S=(w-M)/k):(k=(w-M)/S,k=V(k,Math.round(k),S/1e3)?Math.round(k):Math.ceil(k));const P=Math.max(U(S),U(M));v=Math.pow(10,s(l)?P:l),M=Math.round(M*v)/v,w=Math.round(w*v)/v;let D=0;for(b&&(u&&M!==a?(i.push({value:a}),Mr)break;i.push({value:t})}return x&&u&&w!==r?i.length&&V(i[i.length-1].value,r,mo(r,y,t))?i[i.length-1].value=r:i.push({value:r}):x&&w!==r||i.push({value:w}),i}({maxTicks:i,bounds:t.bounds,min:t.min,max:t.max,precision:e.precision,step:e.stepSize,count:e.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:e.minRotation||0,includeBounds:!1!==e.includeBounds},this._range||this);return"ticks"===t.bounds&&j(n,this,"value"),t.reverse?(n.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),n}configure(){const t=this.ticks;let e=this.min,i=this.max;if(super.configure(),this.options.offset&&t.length){const s=(i-e)/Math.max(t.length-1,1)/2;e-=s,i+=s}this._startValue=e,this._endValue=i,this._valueRange=i-e}getLabelForValue(t){return ne(t,this.chart.options.locale,this.options.ticks.format)}}class xo extends bo{static id="linear";static defaults={ticks:{callback:ae.formatters.numeric}};determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=a(t)?t:0,this.max=a(e)?e:1,this.handleTickRangeOptions()}computeTickLimit(){const t=this.isHorizontal(),e=t?this.width:this.height,i=$(this.options.ticks.minRotation),s=(t?Math.sin(i):Math.cos(i))||.001,n=this._resolveTickFontOptions(0);return Math.ceil(e/Math.min(40,n.lineHeight/s))}getPixelForValue(t){return null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getValueForPixel(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}}const _o=t=>Math.floor(z(t)),yo=(t,e)=>Math.pow(10,_o(t)+e);function vo(t){return 1===t/Math.pow(10,_o(t))}function Mo(t,e,i){const s=Math.pow(10,i),n=Math.floor(t/s);return Math.ceil(e/s)-n}function wo(t,{min:e,max:i}){e=r(t.min,e);const s=[],n=_o(e);let o=function(t,e){let i=_o(e-t);for(;Mo(t,e,i)>10;)i++;for(;Mo(t,e,i)<10;)i--;return Math.min(i,_o(t))}(e,i),a=o<0?Math.pow(10,Math.abs(o)):1;const l=Math.pow(10,o),h=n>o?Math.pow(10,n):0,c=Math.round((e-h)*a)/a,d=Math.floor((e-h)/l/10)*l*10;let u=Math.floor((c-d)/Math.pow(10,o)),f=r(t.min,Math.round((h+d+u*Math.pow(10,o))*a)/a);for(;f=10?u=u<15?15:20:u++,u>=20&&(o++,u=2,a=o>=0?1:a),f=Math.round((h+d+u*Math.pow(10,o))*a)/a;const g=r(t.max,f);return s.push({value:g,major:vo(g),significand:u}),s}class ko extends Js{static id="logarithmic";static defaults={ticks:{callback:ae.formatters.logarithmic,major:{enabled:!0}}};constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,e){const i=bo.prototype.parse.apply(this,[t,e]);if(0!==i)return a(i)&&i>0?i:null;this._zero=!0}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=a(t)?Math.max(0,t):null,this.max=a(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!a(this._userMin)&&(this.min=t===yo(this.min,0)?yo(this.min,-1):yo(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let i=this.min,s=this.max;const n=e=>i=t?i:e,o=t=>s=e?s:t;i===s&&(i<=0?(n(1),o(10)):(n(yo(i,-1)),o(yo(s,1)))),i<=0&&n(yo(s,-1)),s<=0&&o(yo(i,1)),this.min=i,this.max=s}buildTicks(){const t=this.options,e=wo({min:this._userMin,max:this._userMax},this);return"ticks"===t.bounds&&j(e,this,"value"),t.reverse?(e.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),e}getLabelForValue(t){return void 0===t?"0":ne(t,this.chart.options.locale,this.options.ticks.format)}configure(){const t=this.min;super.configure(),this._startValue=z(t),this._valueRange=z(this.max)-z(t)}getPixelForValue(t){return void 0!==t&&0!==t||(t=this.min),null===t||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(z(t)-this._startValue)/this._valueRange)}getValueForPixel(t){const e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}}function So(t){const e=t.ticks;if(e.display&&t.display){const t=ki(e.backdropPadding);return l(e.font&&e.font.size,ue.font.size)+t.height}return 0}function Po(t,e,i,s,n){return t===s||t===n?{start:e-i/2,end:e+i/2}:tn?{start:e-i,end:e}:{start:e,end:e+i}}function Do(t){const e={l:t.left+t._padding.left,r:t.right-t._padding.right,t:t.top+t._padding.top,b:t.bottom-t._padding.bottom},i=Object.assign({},e),s=[],o=[],a=t._pointLabels.length,r=t.options.pointLabels,l=r.centerPointLabels?C/a:0;for(let u=0;ue.r&&(r=(s.end-e.r)/o,t.r=Math.max(t.r,e.r+r)),n.starte.b&&(l=(n.end-e.b)/a,t.b=Math.max(t.b,e.b+l))}function Oo(t,e,i){const s=t.drawingArea,{extra:n,additionalAngle:o,padding:a,size:r}=i,l=t.getPointPosition(e,s+n+a,o),h=Math.round(Y(G(l.angle+E))),c=function(t,e,i){90===i||270===i?t-=e/2:(i>270||i<90)&&(t-=e);return t}(l.y,r.h,h),d=function(t){if(0===t||180===t)return"center";if(t<180)return"left";return"right"}(h),u=function(t,e,i){"right"===i?t-=e:"center"===i&&(t-=e/2);return t}(l.x,r.w,d);return{visible:!0,x:l.x,y:c,textAlign:d,left:u,top:c,right:u+r.w,bottom:c+r.h}}function Ao(t,e){if(!e)return!0;const{left:i,top:s,right:n,bottom:o}=t;return!(Re({x:i,y:s},e)||Re({x:i,y:o},e)||Re({x:n,y:s},e)||Re({x:n,y:o},e))}function To(t,e,i){const{left:n,top:o,right:a,bottom:r}=i,{backdropColor:l}=e;if(!s(l)){const i=wi(e.borderRadius),s=ki(e.backdropPadding);t.fillStyle=l;const h=n-s.left,c=o-s.top,d=a-n+s.width,u=r-o+s.height;Object.values(i).some((t=>0!==t))?(t.beginPath(),He(t,{x:h,y:c,w:d,h:u,radius:i}),t.fill()):t.fillRect(h,c,d,u)}}function Lo(t,e,i,s){const{ctx:n}=t;if(i)n.arc(t.xCenter,t.yCenter,e,0,O);else{let i=t.getPointPosition(0,e);n.moveTo(i.x,i.y);for(let o=1;ot,padding:5,centerPointLabels:!1}};static defaultRoutes={"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"};static descriptors={angleLines:{_fallback:"grid"}};constructor(t){super(t),this.xCenter=void 0,this.yCenter=void 0,this.drawingArea=void 0,this._pointLabels=[],this._pointLabelItems=[]}setDimensions(){const t=this._padding=ki(So(this.options)/2),e=this.width=this.maxWidth-t.width,i=this.height=this.maxHeight-t.height;this.xCenter=Math.floor(this.left+e/2+t.left),this.yCenter=Math.floor(this.top+i/2+t.top),this.drawingArea=Math.floor(Math.min(e,i)/2)}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!1);this.min=a(t)&&!isNaN(t)?t:0,this.max=a(e)&&!isNaN(e)?e:0,this.handleTickRangeOptions()}computeTickLimit(){return Math.ceil(this.drawingArea/So(this.options))}generateTickLabels(t){bo.prototype.generateTickLabels.call(this,t),this._pointLabels=this.getLabels().map(((t,e)=>{const i=d(this.options.pointLabels.callback,[t,e],this);return i||0===i?i:""})).filter(((t,e)=>this.chart.getDataVisibility(e)))}fit(){const t=this.options;t.display&&t.pointLabels.display?Do(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,e,i,s){this.xCenter+=Math.floor((t-e)/2),this.yCenter+=Math.floor((i-s)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,e,i,s))}getIndexAngle(t){return G(t*(O/(this._pointLabels.length||1))+$(this.options.startAngle||0))}getDistanceFromCenterForValue(t){if(s(t))return NaN;const e=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*e:(t-this.min)*e}getValueForDistanceFromCenter(t){if(s(t))return NaN;const e=t/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-e:this.min+e}getPointLabelContext(t){const e=this._pointLabels||[];if(t>=0&&t=0;n--){const e=t._pointLabelItems[n];if(!e.visible)continue;const o=s.setContext(t.getPointLabelContext(n));To(i,o,e);const a=Si(o.font),{x:r,y:l,textAlign:h}=e;Ne(i,t._pointLabels[n],r,l+a.lineHeight/2,a,{color:o.color,textAlign:h,textBaseline:"middle"})}}(this,o),s.display&&this.ticks.forEach(((t,e)=>{if(0!==e){r=this.getDistanceFromCenterForValue(t.value);const i=this.getContext(e),a=s.setContext(i),l=n.setContext(i);!function(t,e,i,s,n){const o=t.ctx,a=e.circular,{color:r,lineWidth:l}=e;!a&&!s||!r||!l||i<0||(o.save(),o.strokeStyle=r,o.lineWidth=l,o.setLineDash(n.dash),o.lineDashOffset=n.dashOffset,o.beginPath(),Lo(t,i,a,s),o.closePath(),o.stroke(),o.restore())}(this,a,r,o,l)}})),i.display){for(t.save(),a=o-1;a>=0;a--){const s=i.setContext(this.getPointLabelContext(a)),{color:n,lineWidth:o}=s;o&&n&&(t.lineWidth=o,t.strokeStyle=n,t.setLineDash(s.borderDash),t.lineDashOffset=s.borderDashOffset,r=this.getDistanceFromCenterForValue(e.ticks.reverse?this.min:this.max),l=this.getPointPosition(a,r),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(l.x,l.y),t.stroke())}t.restore()}}drawBorder(){}drawLabels(){const t=this.ctx,e=this.options,i=e.ticks;if(!i.display)return;const s=this.getIndexAngle(0);let n,o;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(s),t.textAlign="center",t.textBaseline="middle",this.ticks.forEach(((s,a)=>{if(0===a&&!e.reverse)return;const r=i.setContext(this.getContext(a)),l=Si(r.font);if(n=this.getDistanceFromCenterForValue(this.ticks[a].value),r.showLabelBackdrop){t.font=l.string,o=t.measureText(s.label).width,t.fillStyle=r.backdropColor;const e=ki(r.backdropPadding);t.fillRect(-o/2-e.left,-n-l.size/2-e.top,o+e.width,l.size+e.height)}Ne(t,s.label,0,-n,l,{color:r.color,strokeColor:r.textStrokeColor,strokeWidth:r.textStrokeWidth})})),t.restore()}drawTitle(){}}const Ro={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},Io=Object.keys(Ro);function zo(t,e){return t-e}function Fo(t,e){if(s(e))return null;const i=t._adapter,{parser:n,round:o,isoWeekday:r}=t._parseOpts;let l=e;return"function"==typeof n&&(l=n(l)),a(l)||(l="string"==typeof n?i.parse(l,n):i.parse(l)),null===l?null:(o&&(l="week"!==o||!N(r)&&!0!==r?i.startOf(l,o):i.startOf(l,"isoWeek",r)),+l)}function Vo(t,e,i,s){const n=Io.length;for(let o=Io.indexOf(t);o=e?i[s]:i[n]]=!0}}else t[e]=!0}function Wo(t,e,i){const s=[],n={},o=e.length;let a,r;for(a=0;a=0&&(e[l].major=!0);return e}(t,s,n,i):s}class No extends Js{static id="time";static defaults={bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{source:"auto",callback:!1,major:{enabled:!1}}};constructor(t){super(t),this._cache={data:[],labels:[],all:[]},this._unit="day",this._majorUnit=void 0,this._offsets={},this._normalized=!1,this._parseOpts=void 0}init(t,e={}){const i=t.time||(t.time={}),s=this._adapter=new Rn._date(t.adapters.date);s.init(e),x(i.displayFormats,s.formats()),this._parseOpts={parser:i.parser,round:i.round,isoWeekday:i.isoWeekday},super.init(t),this._normalized=e.normalized}parse(t,e){return void 0===t?null:Fo(this,t)}beforeLayout(){super.beforeLayout(),this._cache={data:[],labels:[],all:[]}}determineDataLimits(){const t=this.options,e=this._adapter,i=t.time.unit||"day";let{min:s,max:n,minDefined:o,maxDefined:r}=this.getUserBounds();function l(t){o||isNaN(t.min)||(s=Math.min(s,t.min)),r||isNaN(t.max)||(n=Math.max(n,t.max))}o&&r||(l(this._getLabelBounds()),"ticks"===t.bounds&&"labels"===t.ticks.source||l(this.getMinMax(!1))),s=a(s)&&!isNaN(s)?s:+e.startOf(Date.now(),i),n=a(n)&&!isNaN(n)?n:+e.endOf(Date.now(),i)+1,this.min=Math.min(s,n-1),this.max=Math.max(s+1,n)}_getLabelBounds(){const t=this.getLabelTimestamps();let e=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;return t.length&&(e=t[0],i=t[t.length-1]),{min:e,max:i}}buildTicks(){const t=this.options,e=t.time,i=t.ticks,s="labels"===i.source?this.getLabelTimestamps():this._generate();"ticks"===t.bounds&&s.length&&(this.min=this._userMin||s[0],this.max=this._userMax||s[s.length-1]);const n=this.min,o=nt(s,n,this.max);return this._unit=e.unit||(i.autoSkip?Vo(e.minUnit,this.min,this.max,this._getLabelCapacity(n)):function(t,e,i,s,n){for(let o=Io.length-1;o>=Io.indexOf(i);o--){const i=Io[o];if(Ro[i].common&&t._adapter.diff(n,s,i)>=e-1)return i}return Io[i?Io.indexOf(i):0]}(this,o.length,e.minUnit,this.min,this.max)),this._majorUnit=i.major.enabled&&"year"!==this._unit?function(t){for(let e=Io.indexOf(t)+1,i=Io.length;e+t.value)))}initOffsets(t=[]){let e,i,s=0,n=0;this.options.offset&&t.length&&(e=this.getDecimalForValue(t[0]),s=1===t.length?1-e:(this.getDecimalForValue(t[1])-e)/2,i=this.getDecimalForValue(t[t.length-1]),n=1===t.length?i:(i-this.getDecimalForValue(t[t.length-2]))/2);const o=t.length<3?.5:.25;s=J(s,0,o),n=J(n,0,o),this._offsets={start:s,end:n,factor:1/(s+1+n)}}_generate(){const t=this._adapter,e=this.min,i=this.max,s=this.options,n=s.time,o=n.unit||Vo(n.minUnit,e,i,this._getLabelCapacity(e)),a=l(s.ticks.stepSize,1),r="week"===o&&n.isoWeekday,h=N(r)||!0===r,c={};let d,u,f=e;if(h&&(f=+t.startOf(f,"isoWeek",r)),f=+t.startOf(f,h?"day":o),t.diff(i,e,o)>1e5*a)throw new Error(e+" and "+i+" are too far apart with stepSize of "+a+" "+o);const g="data"===s.ticks.source&&this.getDataTimestamps();for(d=f,u=0;d+t))}getLabelForValue(t){const e=this._adapter,i=this.options.time;return i.tooltipFormat?e.format(t,i.tooltipFormat):e.format(t,i.displayFormats.datetime)}format(t,e){const i=this.options.time.displayFormats,s=this._unit,n=e||i[s];return this._adapter.format(t,n)}_tickFormatFunction(t,e,i,s){const n=this.options,o=n.ticks.callback;if(o)return d(o,[t,e,i],this);const a=n.time.displayFormats,r=this._unit,l=this._majorUnit,h=r&&a[r],c=l&&a[l],u=i[e],f=l&&c&&u&&u.major;return this._adapter.format(t,s||(f?c:h))}generateTickLabels(t){let e,i,s;for(e=0,i=t.length;e0?a:1}getDataTimestamps(){let t,e,i=this._cache.data||[];if(i.length)return i;const s=this.getMatchingVisibleMetas();if(this._normalized&&s.length)return this._cache.data=s[0].controller.getAllParsedValues(this);for(t=0,e=s.length;t=t[r].pos&&e<=t[l].pos&&({lo:r,hi:l}=it(t,"pos",e)),({pos:s,time:o}=t[r]),({pos:n,time:a}=t[l])):(e>=t[r].time&&e<=t[l].time&&({lo:r,hi:l}=it(t,"time",e)),({time:s,pos:o}=t[r]),({time:n,pos:a}=t[l]));const h=n-s;return h?o+(a-o)*(e-s)/h:o}var jo=Object.freeze({__proto__:null,CategoryScale:class extends Js{static id="category";static defaults={ticks:{callback:po}};constructor(t){super(t),this._startValue=void 0,this._valueRange=0,this._addedLabels=[]}init(t){const e=this._addedLabels;if(e.length){const t=this.getLabels();for(const{index:i,label:s}of e)t[i]===s&&t.splice(i,1);this._addedLabels=[]}super.init(t)}parse(t,e){if(s(t))return null;const i=this.getLabels();return((t,e)=>null===t?null:J(Math.round(t),0,e))(e=isFinite(e)&&i[e]===t?e:go(i,t,l(e,t),this._addedLabels),i.length-1)}determineDataLimits(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let{min:i,max:s}=this.getMinMax(!0);"ticks"===this.options.bounds&&(t||(i=0),e||(s=this.getLabels().length-1)),this.min=i,this.max=s}buildTicks(){const t=this.min,e=this.max,i=this.options.offset,s=[];let n=this.getLabels();n=0===t&&e===n.length-1?n:n.slice(t,e+1),this._valueRange=Math.max(n.length-(i?0:1),1),this._startValue=this.min-(i?.5:0);for(let i=t;i<=e;i++)s.push({value:i});return s}getLabelForValue(t){return po.call(this,t)}configure(){super.configure(),this.isHorizontal()||(this._reversePixels=!this._reversePixels)}getPixelForValue(t){return"number"!=typeof t&&(t=this.parse(t)),null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getValueForPixel(t){return Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange)}getBasePixel(){return this.bottom}},LinearScale:xo,LogarithmicScale:ko,RadialLinearScale:Eo,TimeScale:No,TimeSeriesScale:class extends No{static id="timeseries";static defaults=No.defaults;constructor(t){super(t),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){const t=this._getTimestampsForTable(),e=this._table=this.buildLookupTable(t);this._minPos=Ho(e,this.min),this._tableRange=Ho(e,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){const{min:e,max:i}=this,s=[],n=[];let o,a,r,l,h;for(o=0,a=t.length;o=e&&l<=i&&s.push(l);if(s.length<2)return[{time:e,pos:0},{time:i,pos:1}];for(o=0,a=s.length;ot-e))}_getTimestampsForTable(){let t=this._cache.all||[];if(t.length)return t;const e=this.getDataTimestamps(),i=this.getLabelTimestamps();return t=e.length&&i.length?this.normalize(e.concat(i)):e.length?e:i,t=this._cache.all=t,t}getDecimalForValue(t){return(Ho(this._table,t)-this._minPos)/this._tableRange}getValueForPixel(t){const e=this._offsets,i=this.getDecimalForPixel(t)/e.factor-e.end;return Ho(this._table,i*this._tableRange+this._minPos,!0)}}});const $o=["rgb(54, 162, 235)","rgb(255, 99, 132)","rgb(255, 159, 64)","rgb(255, 205, 86)","rgb(75, 192, 192)","rgb(153, 102, 255)","rgb(201, 203, 207)"],Yo=$o.map((t=>t.replace("rgb(","rgba(").replace(")",", 0.5)")));function Uo(t){return $o[t%$o.length]}function Xo(t){return Yo[t%Yo.length]}function qo(t){let e=0;return(i,s)=>{const n=t.getDatasetMeta(s).controller;n instanceof jn?e=function(t,e){return t.backgroundColor=t.data.map((()=>Uo(e++))),e}(i,e):n instanceof $n?e=function(t,e){return t.backgroundColor=t.data.map((()=>Xo(e++))),e}(i,e):n&&(e=function(t,e){return t.borderColor=Uo(e),t.backgroundColor=Xo(e),++e}(i,e))}}function Ko(t){let e;for(e in t)if(t[e].borderColor||t[e].backgroundColor)return!0;return!1}var Go={id:"colors",defaults:{enabled:!0,forceOverride:!1},beforeLayout(t,e,i){if(!i.enabled)return;const{data:{datasets:s},options:n}=t.config,{elements:o}=n;if(!i.forceOverride&&(Ko(s)||(a=n)&&(a.borderColor||a.backgroundColor)||o&&Ko(o)))return;var a;const r=qo(t);s.forEach(r)}};function Zo(t){if(t._decimated){const e=t._data;delete t._decimated,delete t._data,Object.defineProperty(t,"data",{configurable:!0,enumerable:!0,writable:!0,value:e})}}function Jo(t){t.data.datasets.forEach((t=>{Zo(t)}))}var Qo={id:"decimation",defaults:{algorithm:"min-max",enabled:!1},beforeElementsUpdate:(t,e,i)=>{if(!i.enabled)return void Jo(t);const n=t.width;t.data.datasets.forEach(((e,o)=>{const{_data:a,indexAxis:r}=e,l=t.getDatasetMeta(o),h=a||e.data;if("y"===Pi([r,t.options.indexAxis]))return;if(!l.controller.supportsDecimation)return;const c=t.scales[l.xAxisID];if("linear"!==c.type&&"time"!==c.type)return;if(t.options.parsing)return;let{start:d,count:u}=function(t,e){const i=e.length;let s,n=0;const{iScale:o}=t,{min:a,max:r,minDefined:l,maxDefined:h}=o.getUserBounds();return l&&(n=J(it(e,o.axis,a).lo,0,i-1)),s=h?J(it(e,o.axis,r).hi+1,n,i)-n:i-n,{start:n,count:s}}(l,h);if(u<=(i.threshold||4*n))return void Zo(e);let f;switch(s(a)&&(e._data=h,delete e.data,Object.defineProperty(e,"data",{configurable:!0,enumerable:!0,get:function(){return this._decimated},set:function(t){this._data=t}})),i.algorithm){case"lttb":f=function(t,e,i,s,n){const o=n.samples||s;if(o>=i)return t.slice(e,e+i);const a=[],r=(i-2)/(o-2);let l=0;const h=e+i-1;let c,d,u,f,g,p=e;for(a[l++]=t[p],c=0;cu&&(u=f,d=t[s],g=s);a[l++]=d,p=g}return a[l++]=t[h],a}(h,d,u,n,i);break;case"min-max":f=function(t,e,i,n){let o,a,r,l,h,c,d,u,f,g,p=0,m=0;const b=[],x=e+i-1,_=t[e].x,y=t[x].x-_;for(o=e;og&&(g=l,d=o),p=(m*p+a.x)/++m;else{const i=o-1;if(!s(c)&&!s(d)){const e=Math.min(c,d),s=Math.max(c,d);e!==u&&e!==i&&b.push({...t[e],x:p}),s!==u&&s!==i&&b.push({...t[s],x:p})}o>0&&i!==u&&b.push(t[i]),b.push(a),h=e,m=0,f=g=l,c=d=u=o}}return b}(h,d,u,n);break;default:throw new Error(`Unsupported decimation algorithm '${i.algorithm}'`)}e._decimated=f}))},destroy(t){Jo(t)}};function ta(t,e,i,s){if(s)return;let n=e[t],o=i[t];return"angle"===t&&(n=G(n),o=G(o)),{property:t,start:n,end:o}}function ea(t,e,i){for(;e>t;e--){const t=i[e];if(!isNaN(t.x)&&!isNaN(t.y))break}return e}function ia(t,e,i,s){return t&&e?s(t[i],e[i]):t?t[i]:e?e[i]:0}function sa(t,e){let i=[],s=!1;return n(t)?(s=!0,i=t):i=function(t,e){const{x:i=null,y:s=null}=t||{},n=e.points,o=[];return e.segments.forEach((({start:t,end:e})=>{e=ea(t,e,n);const a=n[t],r=n[e];null!==s?(o.push({x:a.x,y:s}),o.push({x:r.x,y:s})):null!==i&&(o.push({x:i,y:a.y}),o.push({x:i,y:r.y}))})),o}(t,e),i.length?new no({points:i,options:{tension:0},_loop:s,_fullLoop:s}):null}function na(t){return t&&!1!==t.fill}function oa(t,e,i){let s=t[e].fill;const n=[e];let o;if(!i)return s;for(;!1!==s&&-1===n.indexOf(s);){if(!a(s))return s;if(o=t[s],!o)return!1;if(o.visible)return s;n.push(s),s=o.fill}return!1}function aa(t,e,i){const s=function(t){const e=t.options,i=e.fill;let s=l(i&&i.target,i);void 0===s&&(s=!!e.backgroundColor);if(!1===s||null===s)return!1;if(!0===s)return"origin";return s}(t);if(o(s))return!isNaN(s.value)&&s;let n=parseFloat(s);return a(n)&&Math.floor(n)===n?function(t,e,i,s){"-"!==t&&"+"!==t||(i=e+i);if(i===e||i<0||i>=s)return!1;return i}(s[0],e,n,i):["origin","start","end","stack","shape"].indexOf(s)>=0&&s}function ra(t,e,i){const s=[];for(let n=0;n=0;--e){const i=n[e].$filler;i&&(i.line.updateControlPoints(o,i.axis),s&&i.fill&&da(t.ctx,i,o))}},beforeDatasetsDraw(t,e,i){if("beforeDatasetsDraw"!==i.drawTime)return;const s=t.getSortedVisibleDatasetMetas();for(let e=s.length-1;e>=0;--e){const i=s[e].$filler;na(i)&&da(t.ctx,i,t.chartArea)}},beforeDatasetDraw(t,e,i){const s=e.meta.$filler;na(s)&&"beforeDatasetDraw"===i.drawTime&&da(t.ctx,s,t.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}};const ba=(t,e)=>{let{boxHeight:i=e,boxWidth:s=e}=t;return t.usePointStyle&&(i=Math.min(i,e),s=t.pointStyleWidth||Math.min(s,e)),{boxWidth:s,boxHeight:i,itemHeight:Math.max(e,i)}};class xa extends Hs{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,i){this.maxWidth=t,this.maxHeight=e,this._margins=i,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){const t=this.options.labels||{};let e=d(t.generateLabels,[this.chart],this)||[];t.filter&&(e=e.filter((e=>t.filter(e,this.chart.data)))),t.sort&&(e=e.sort(((e,i)=>t.sort(e,i,this.chart.data)))),this.options.reverse&&e.reverse(),this.legendItems=e}fit(){const{options:t,ctx:e}=this;if(!t.display)return void(this.width=this.height=0);const i=t.labels,s=Si(i.font),n=s.size,o=this._computeTitleHeight(),{boxWidth:a,itemHeight:r}=ba(i,n);let l,h;e.font=s.string,this.isHorizontal()?(l=this.maxWidth,h=this._fitRows(o,n,a,r)+10):(h=this.maxHeight,l=this._fitCols(o,s,a,r)+10),this.width=Math.min(l,t.maxWidth||this.maxWidth),this.height=Math.min(h,t.maxHeight||this.maxHeight)}_fitRows(t,e,i,s){const{ctx:n,maxWidth:o,options:{labels:{padding:a}}}=this,r=this.legendHitBoxes=[],l=this.lineWidths=[0],h=s+a;let c=t;n.textAlign="left",n.textBaseline="middle";let d=-1,u=-h;return this.legendItems.forEach(((t,f)=>{const g=i+e/2+n.measureText(t.text).width;(0===f||l[l.length-1]+g+2*a>o)&&(c+=h,l[l.length-(f>0?0:1)]=0,u+=h,d++),r[f]={left:0,top:u,row:d,width:g,height:s},l[l.length-1]+=g+a})),c}_fitCols(t,e,i,s){const{ctx:n,maxHeight:o,options:{labels:{padding:a}}}=this,r=this.legendHitBoxes=[],l=this.columnSizes=[],h=o-t;let c=a,d=0,u=0,f=0,g=0;return this.legendItems.forEach(((t,o)=>{const{itemWidth:p,itemHeight:m}=function(t,e,i,s,n){const o=function(t,e,i,s){let n=t.text;n&&"string"!=typeof n&&(n=n.reduce(((t,e)=>t.length>e.length?t:e)));return e+i.size/2+s.measureText(n).width}(s,t,e,i),a=function(t,e,i){let s=t;"string"!=typeof e.text&&(s=_a(e,i));return s}(n,s,e.lineHeight);return{itemWidth:o,itemHeight:a}}(i,e,n,t,s);o>0&&u+m+2*a>h&&(c+=d+a,l.push({width:d,height:u}),f+=d+a,g++,d=u=0),r[o]={left:f,top:u,col:g,width:p,height:m},d=Math.max(d,p),u+=m+a})),c+=d,l.push({width:d,height:u}),c}adjustHitBoxes(){if(!this.options.display)return;const t=this._computeTitleHeight(),{legendHitBoxes:e,options:{align:i,labels:{padding:s},rtl:n}}=this,o=Oi(n,this.left,this.width);if(this.isHorizontal()){let n=0,a=ft(i,this.left+s,this.right-this.lineWidths[n]);for(const r of e)n!==r.row&&(n=r.row,a=ft(i,this.left+s,this.right-this.lineWidths[n])),r.top+=this.top+t+s,r.left=o.leftForLtr(o.x(a),r.width),a+=r.width+s}else{let n=0,a=ft(i,this.top+t+s,this.bottom-this.columnSizes[n].height);for(const r of e)r.col!==n&&(n=r.col,a=ft(i,this.top+t+s,this.bottom-this.columnSizes[n].height)),r.top=a,r.left+=this.left+s,r.left=o.leftForLtr(o.x(r.left),r.width),a+=r.height+s}}isHorizontal(){return"top"===this.options.position||"bottom"===this.options.position}draw(){if(this.options.display){const t=this.ctx;Ie(t,this),this._draw(),ze(t)}}_draw(){const{options:t,columnSizes:e,lineWidths:i,ctx:s}=this,{align:n,labels:o}=t,a=ue.color,r=Oi(t.rtl,this.left,this.width),h=Si(o.font),{padding:c}=o,d=h.size,u=d/2;let f;this.drawTitle(),s.textAlign=r.textAlign("left"),s.textBaseline="middle",s.lineWidth=.5,s.font=h.string;const{boxWidth:g,boxHeight:p,itemHeight:m}=ba(o,d),b=this.isHorizontal(),x=this._computeTitleHeight();f=b?{x:ft(n,this.left+c,this.right-i[0]),y:this.top+c+x,line:0}:{x:this.left+c,y:ft(n,this.top+x+c,this.bottom-e[0].height),line:0},Ai(this.ctx,t.textDirection);const _=m+c;this.legendItems.forEach(((y,v)=>{s.strokeStyle=y.fontColor,s.fillStyle=y.fontColor;const M=s.measureText(y.text).width,w=r.textAlign(y.textAlign||(y.textAlign=o.textAlign)),k=g+u+M;let S=f.x,P=f.y;r.setWidth(this.width),b?v>0&&S+k+c>this.right&&(P=f.y+=_,f.line++,S=f.x=ft(n,this.left+c,this.right-i[f.line])):v>0&&P+_>this.bottom&&(S=f.x=S+e[f.line].width+c,f.line++,P=f.y=ft(n,this.top+x+c,this.bottom-e[f.line].height));if(function(t,e,i){if(isNaN(g)||g<=0||isNaN(p)||p<0)return;s.save();const n=l(i.lineWidth,1);if(s.fillStyle=l(i.fillStyle,a),s.lineCap=l(i.lineCap,"butt"),s.lineDashOffset=l(i.lineDashOffset,0),s.lineJoin=l(i.lineJoin,"miter"),s.lineWidth=n,s.strokeStyle=l(i.strokeStyle,a),s.setLineDash(l(i.lineDash,[])),o.usePointStyle){const a={radius:p*Math.SQRT2/2,pointStyle:i.pointStyle,rotation:i.rotation,borderWidth:n},l=r.xPlus(t,g/2);Ee(s,a,l,e+u,o.pointStyleWidth&&g)}else{const o=e+Math.max((d-p)/2,0),a=r.leftForLtr(t,g),l=wi(i.borderRadius);s.beginPath(),Object.values(l).some((t=>0!==t))?He(s,{x:a,y:o,w:g,h:p,radius:l}):s.rect(a,o,g,p),s.fill(),0!==n&&s.stroke()}s.restore()}(r.x(S),P,y),S=gt(w,S+g+u,b?S+k:this.right,t.rtl),function(t,e,i){Ne(s,i.text,t,e+m/2,h,{strikethrough:i.hidden,textAlign:r.textAlign(i.textAlign)})}(r.x(S),P,y),b)f.x+=k+c;else if("string"!=typeof y.text){const t=h.lineHeight;f.y+=_a(y,t)+c}else f.y+=_})),Ti(this.ctx,t.textDirection)}drawTitle(){const t=this.options,e=t.title,i=Si(e.font),s=ki(e.padding);if(!e.display)return;const n=Oi(t.rtl,this.left,this.width),o=this.ctx,a=e.position,r=i.size/2,l=s.top+r;let h,c=this.left,d=this.width;if(this.isHorizontal())d=Math.max(...this.lineWidths),h=this.top+l,c=ft(t.align,c,this.right-d);else{const e=this.columnSizes.reduce(((t,e)=>Math.max(t,e.height)),0);h=l+ft(t.align,this.top,this.bottom-e-t.labels.padding-this._computeTitleHeight())}const u=ft(a,c,c+d);o.textAlign=n.textAlign(ut(a)),o.textBaseline="middle",o.strokeStyle=e.color,o.fillStyle=e.color,o.font=i.string,Ne(o,e.text,u,h,i)}_computeTitleHeight(){const t=this.options.title,e=Si(t.font),i=ki(t.padding);return t.display?e.lineHeight+i.height:0}_getLegendItemAt(t,e){let i,s,n;if(tt(t,this.left,this.right)&&tt(e,this.top,this.bottom))for(n=this.legendHitBoxes,i=0;it.chart.options.color,boxWidth:40,padding:10,generateLabels(t){const e=t.data.datasets,{labels:{usePointStyle:i,pointStyle:s,textAlign:n,color:o,useBorderRadius:a,borderRadius:r}}=t.legend.options;return t._getSortedDatasetMetas().map((t=>{const l=t.controller.getStyle(i?0:void 0),h=ki(l.borderWidth);return{text:e[t.index].label,fillStyle:l.backgroundColor,fontColor:o,hidden:!t.visible,lineCap:l.borderCapStyle,lineDash:l.borderDash,lineDashOffset:l.borderDashOffset,lineJoin:l.borderJoinStyle,lineWidth:(h.width+h.height)/4,strokeStyle:l.borderColor,pointStyle:s||l.pointStyle,rotation:l.rotation,textAlign:n||l.textAlign,borderRadius:a&&(r||l.borderRadius),datasetIndex:t.index}}),this)}},title:{color:t=>t.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:t=>!t.startsWith("on"),labels:{_scriptable:t=>!["generateLabels","filter","sort"].includes(t)}}};class va extends Hs{constructor(t){super(),this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e){const i=this.options;if(this.left=0,this.top=0,!i.display)return void(this.width=this.height=this.right=this.bottom=0);this.width=this.right=t,this.height=this.bottom=e;const s=n(i.text)?i.text.length:1;this._padding=ki(i.padding);const o=s*Si(i.font).lineHeight+this._padding.height;this.isHorizontal()?this.height=o:this.width=o}isHorizontal(){const t=this.options.position;return"top"===t||"bottom"===t}_drawArgs(t){const{top:e,left:i,bottom:s,right:n,options:o}=this,a=o.align;let r,l,h,c=0;return this.isHorizontal()?(l=ft(a,i,n),h=e+t,r=n-i):("left"===o.position?(l=i+t,h=ft(a,s,e),c=-.5*C):(l=n-t,h=ft(a,e,s),c=.5*C),r=s-e),{titleX:l,titleY:h,maxWidth:r,rotation:c}}draw(){const t=this.ctx,e=this.options;if(!e.display)return;const i=Si(e.font),s=i.lineHeight/2+this._padding.top,{titleX:n,titleY:o,maxWidth:a,rotation:r}=this._drawArgs(s);Ne(t,e.text,0,0,i,{color:e.color,maxWidth:a,rotation:r,textAlign:ut(e.align),textBaseline:"middle",translation:[n,o]})}}var Ma={id:"title",_element:va,start(t,e,i){!function(t,e){const i=new va({ctx:t.ctx,options:e,chart:t});as.configure(t,i,e),as.addBox(t,i),t.titleBlock=i}(t,i)},stop(t){const e=t.titleBlock;as.removeBox(t,e),delete t.titleBlock},beforeUpdate(t,e,i){const s=t.titleBlock;as.configure(t,s,i),s.options=i},defaults:{align:"center",display:!1,font:{weight:"bold"},fullSize:!0,padding:10,position:"top",text:"",weight:2e3},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const wa=new WeakMap;var ka={id:"subtitle",start(t,e,i){const s=new va({ctx:t.ctx,options:i,chart:t});as.configure(t,s,i),as.addBox(t,s),wa.set(t,s)},stop(t){as.removeBox(t,wa.get(t)),wa.delete(t)},beforeUpdate(t,e,i){const s=wa.get(t);as.configure(t,s,i),s.options=i},defaults:{align:"center",display:!1,font:{weight:"normal"},fullSize:!0,padding:0,position:"top",text:"",weight:1500},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const Sa={average(t){if(!t.length)return!1;let e,i,s=0,n=0,o=0;for(e=0,i=t.length;e-1?t.split("\n"):t}function Ca(t,e){const{element:i,datasetIndex:s,index:n}=e,o=t.getDatasetMeta(s).controller,{label:a,value:r}=o.getLabelAndValue(n);return{chart:t,label:a,parsed:o.getParsed(n),raw:t.data.datasets[s].data[n],formattedValue:r,dataset:o.getDataset(),dataIndex:n,datasetIndex:s,element:i}}function Oa(t,e){const i=t.chart.ctx,{body:s,footer:n,title:o}=t,{boxWidth:a,boxHeight:r}=e,l=Si(e.bodyFont),h=Si(e.titleFont),c=Si(e.footerFont),d=o.length,f=n.length,g=s.length,p=ki(e.padding);let m=p.height,b=0,x=s.reduce(((t,e)=>t+e.before.length+e.lines.length+e.after.length),0);if(x+=t.beforeBody.length+t.afterBody.length,d&&(m+=d*h.lineHeight+(d-1)*e.titleSpacing+e.titleMarginBottom),x){m+=g*(e.displayColors?Math.max(r,l.lineHeight):l.lineHeight)+(x-g)*l.lineHeight+(x-1)*e.bodySpacing}f&&(m+=e.footerMarginTop+f*c.lineHeight+(f-1)*e.footerSpacing);let _=0;const y=function(t){b=Math.max(b,i.measureText(t).width+_)};return i.save(),i.font=h.string,u(t.title,y),i.font=l.string,u(t.beforeBody.concat(t.afterBody),y),_=e.displayColors?a+2+e.boxPadding:0,u(s,(t=>{u(t.before,y),u(t.lines,y),u(t.after,y)})),_=0,i.font=c.string,u(t.footer,y),i.restore(),b+=p.width,{width:b,height:m}}function Aa(t,e,i,s){const{x:n,width:o}=i,{width:a,chartArea:{left:r,right:l}}=t;let h="center";return"center"===s?h=n<=(r+l)/2?"left":"right":n<=o/2?h="left":n>=a-o/2&&(h="right"),function(t,e,i,s){const{x:n,width:o}=s,a=i.caretSize+i.caretPadding;return"left"===t&&n+o+a>e.width||"right"===t&&n-o-a<0||void 0}(h,t,e,i)&&(h="center"),h}function Ta(t,e,i){const s=i.yAlign||e.yAlign||function(t,e){const{y:i,height:s}=e;return it.height-s/2?"bottom":"center"}(t,i);return{xAlign:i.xAlign||e.xAlign||Aa(t,e,i,s),yAlign:s}}function La(t,e,i,s){const{caretSize:n,caretPadding:o,cornerRadius:a}=t,{xAlign:r,yAlign:l}=i,h=n+o,{topLeft:c,topRight:d,bottomLeft:u,bottomRight:f}=wi(a);let g=function(t,e){let{x:i,width:s}=t;return"right"===e?i-=s:"center"===e&&(i-=s/2),i}(e,r);const p=function(t,e,i){let{y:s,height:n}=t;return"top"===e?s+=i:s-="bottom"===e?n+i:n/2,s}(e,l,h);return"center"===l?"left"===r?g+=h:"right"===r&&(g-=h):"left"===r?g-=Math.max(c,u)+n:"right"===r&&(g+=Math.max(d,f)+n),{x:J(g,0,s.width-e.width),y:J(p,0,s.height-e.height)}}function Ea(t,e,i){const s=ki(i.padding);return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-s.right:t.x+s.left}function Ra(t){return Pa([],Da(t))}function Ia(t,e){const i=e&&e.dataset&&e.dataset.tooltip&&e.dataset.tooltip.callbacks;return i?t.override(i):t}const za={beforeTitle:e,title(t){if(t.length>0){const e=t[0],i=e.chart.data.labels,s=i?i.length:0;if(this&&this.options&&"dataset"===this.options.mode)return e.dataset.label||"";if(e.label)return e.label;if(s>0&&e.dataIndex{const e={before:[],lines:[],after:[]},n=Ia(i,t);Pa(e.before,Da(Fa(n,"beforeLabel",this,t))),Pa(e.lines,Fa(n,"label",this,t)),Pa(e.after,Da(Fa(n,"afterLabel",this,t))),s.push(e)})),s}getAfterBody(t,e){return Ra(Fa(e.callbacks,"afterBody",this,t))}getFooter(t,e){const{callbacks:i}=e,s=Fa(i,"beforeFooter",this,t),n=Fa(i,"footer",this,t),o=Fa(i,"afterFooter",this,t);let a=[];return a=Pa(a,Da(s)),a=Pa(a,Da(n)),a=Pa(a,Da(o)),a}_createItems(t){const e=this._active,i=this.chart.data,s=[],n=[],o=[];let a,r,l=[];for(a=0,r=e.length;at.filter(e,s,n,i)))),t.itemSort&&(l=l.sort(((e,s)=>t.itemSort(e,s,i)))),u(l,(e=>{const i=Ia(t.callbacks,e);s.push(Fa(i,"labelColor",this,e)),n.push(Fa(i,"labelPointStyle",this,e)),o.push(Fa(i,"labelTextColor",this,e))})),this.labelColors=s,this.labelPointStyles=n,this.labelTextColors=o,this.dataPoints=l,l}update(t,e){const i=this.options.setContext(this.getContext()),s=this._active;let n,o=[];if(s.length){const t=Sa[i.position].call(this,s,this._eventPosition);o=this._createItems(i),this.title=this.getTitle(o,i),this.beforeBody=this.getBeforeBody(o,i),this.body=this.getBody(o,i),this.afterBody=this.getAfterBody(o,i),this.footer=this.getFooter(o,i);const e=this._size=Oa(this,i),a=Object.assign({},t,e),r=Ta(this.chart,i,a),l=La(i,a,r,this.chart);this.xAlign=r.xAlign,this.yAlign=r.yAlign,n={opacity:1,x:l.x,y:l.y,width:e.width,height:e.height,caretX:t.x,caretY:t.y}}else 0!==this.opacity&&(n={opacity:0});this._tooltipItems=o,this.$context=void 0,n&&this._resolveAnimations().update(this,n),t&&i.external&&i.external.call(this,{chart:this.chart,tooltip:this,replay:e})}drawCaret(t,e,i,s){const n=this.getCaretPosition(t,i,s);e.lineTo(n.x1,n.y1),e.lineTo(n.x2,n.y2),e.lineTo(n.x3,n.y3)}getCaretPosition(t,e,i){const{xAlign:s,yAlign:n}=this,{caretSize:o,cornerRadius:a}=i,{topLeft:r,topRight:l,bottomLeft:h,bottomRight:c}=wi(a),{x:d,y:u}=t,{width:f,height:g}=e;let p,m,b,x,_,y;return"center"===n?(_=u+g/2,"left"===s?(p=d,m=p-o,x=_+o,y=_-o):(p=d+f,m=p+o,x=_-o,y=_+o),b=p):(m="left"===s?d+Math.max(r,h)+o:"right"===s?d+f-Math.max(l,c)-o:this.caretX,"top"===n?(x=u,_=x-o,p=m-o,b=m+o):(x=u+g,_=x+o,p=m+o,b=m-o),y=x),{x1:p,x2:m,x3:b,y1:x,y2:_,y3:y}}drawTitle(t,e,i){const s=this.title,n=s.length;let o,a,r;if(n){const l=Oi(i.rtl,this.x,this.width);for(t.x=Ea(this,i.titleAlign,i),e.textAlign=l.textAlign(i.titleAlign),e.textBaseline="middle",o=Si(i.titleFont),a=i.titleSpacing,e.fillStyle=i.titleColor,e.font=o.string,r=0;r0!==t))?(t.beginPath(),t.fillStyle=n.multiKeyBackground,He(t,{x:e,y:g,w:h,h:l,radius:r}),t.fill(),t.stroke(),t.fillStyle=a.backgroundColor,t.beginPath(),He(t,{x:i,y:g+1,w:h-2,h:l-2,radius:r}),t.fill()):(t.fillStyle=n.multiKeyBackground,t.fillRect(e,g,h,l),t.strokeRect(e,g,h,l),t.fillStyle=a.backgroundColor,t.fillRect(i,g+1,h-2,l-2))}t.fillStyle=this.labelTextColors[i]}drawBody(t,e,i){const{body:s}=this,{bodySpacing:n,bodyAlign:o,displayColors:a,boxHeight:r,boxWidth:l,boxPadding:h}=i,c=Si(i.bodyFont);let d=c.lineHeight,f=0;const g=Oi(i.rtl,this.x,this.width),p=function(i){e.fillText(i,g.x(t.x+f),t.y+d/2),t.y+=d+n},m=g.textAlign(o);let b,x,_,y,v,M,w;for(e.textAlign=o,e.textBaseline="middle",e.font=c.string,t.x=Ea(this,m,i),e.fillStyle=i.bodyColor,u(this.beforeBody,p),f=a&&"right"!==m?"center"===o?l/2+h:l+2+h:0,y=0,M=s.length;y0&&e.stroke()}_updateAnimationTarget(t){const e=this.chart,i=this.$animations,s=i&&i.x,n=i&&i.y;if(s||n){const i=Sa[t.position].call(this,this._active,this._eventPosition);if(!i)return;const o=this._size=Oa(this,t),a=Object.assign({},i,this._size),r=Ta(e,t,a),l=La(t,a,r,e);s._to===l.x&&n._to===l.y||(this.xAlign=r.xAlign,this.yAlign=r.yAlign,this.width=o.width,this.height=o.height,this.caretX=i.x,this.caretY=i.y,this._resolveAnimations().update(this,l))}}_willRender(){return!!this.opacity}draw(t){const e=this.options.setContext(this.getContext());let i=this.opacity;if(!i)return;this._updateAnimationTarget(e);const s={width:this.width,height:this.height},n={x:this.x,y:this.y};i=Math.abs(i)<.001?0:i;const o=ki(e.padding),a=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&a&&(t.save(),t.globalAlpha=i,this.drawBackground(n,t,s,e),Ai(t,e.textDirection),n.y+=o.top,this.drawTitle(n,t,e),this.drawBody(n,t,e),this.drawFooter(n,t,e),Ti(t,e.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){const i=this._active,s=t.map((({datasetIndex:t,index:e})=>{const i=this.chart.getDatasetMeta(t);if(!i)throw new Error("Cannot find a dataset at index "+t);return{datasetIndex:t,element:i.data[e],index:e}})),n=!f(i,s),o=this._positionChanged(s,e);(n||o)&&(this._active=s,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,e,i=!0){if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;const s=this.options,n=this._active||[],o=this._getActiveElements(t,n,e,i),a=this._positionChanged(o,t),r=e||!f(o,n)||a;return r&&(this._active=o,(s.enabled||s.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),r}_getActiveElements(t,e,i,s){const n=this.options;if("mouseout"===t.type)return[];if(!s)return e;const o=this.chart.getElementsAtEventForMode(t,n.mode,n,i);return n.reverse&&o.reverse(),o}_positionChanged(t,e){const{caretX:i,caretY:s,options:n}=this,o=Sa[n.position].call(this,t,e);return!1!==o&&(i!==o.x||s!==o.y)}}var Ba={id:"tooltip",_element:Va,positioners:Sa,afterInit(t,e,i){i&&(t.tooltip=new Va({chart:t,options:i}))},beforeUpdate(t,e,i){t.tooltip&&t.tooltip.initialize(i)},reset(t,e,i){t.tooltip&&t.tooltip.initialize(i)},afterDraw(t){const e=t.tooltip;if(e&&e._willRender()){const i={tooltip:e};if(!1===t.notifyPlugins("beforeTooltipDraw",{...i,cancelable:!0}))return;e.draw(t.ctx),t.notifyPlugins("afterTooltipDraw",i)}},afterEvent(t,e){if(t.tooltip){const i=e.replay;t.tooltip.handleEvent(e.event,i,e.inChartArea)&&(e.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(t,e)=>e.bodyFont.size,boxWidth:(t,e)=>e.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:za},defaultRoutes:{bodyFont:"font",footerFont:"font",titleFont:"font"},descriptors:{_scriptable:t=>"filter"!==t&&"itemSort"!==t&&"external"!==t,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]};return An.register(Yn,jo,fo,t),An.helpers={...Wi},An._adapters=Rn,An.Animation=Cs,An.Animations=Os,An.animator=xt,An.controllers=en.controllers.items,An.DatasetController=Ns,An.Element=Hs,An.elements=fo,An.Interaction=Xi,An.layouts=as,An.platforms=Ss,An.Scale=Js,An.Ticks=ae,Object.assign(An,Yn,jo,fo,t,Ss),An.Chart=An,"undefined"!=typeof window&&(window.Chart=An),An})); +//# sourceMappingURL=chart.umd.js.map \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/assets/js/directives/debounce.js b/packages/Webkul/Admin/src/Resources/assets/js/directives/debounce.js new file mode 100644 index 0000000..5961581 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/js/directives/debounce.js @@ -0,0 +1,17 @@ +var timeoutID = null; + +export default { + mounted(el, binding) { + let handler = function (e) { + if (binding.value !== binding.oldValue) { + clearTimeout(timeoutID) + + timeoutID = setTimeout(function () { + el.dispatchEvent(new Event('change')) + }, binding.value || 500) + } + }; + + el.addEventListener('input', handler); + } +} \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/assets/js/directives/dompurify.js b/packages/Webkul/Admin/src/Resources/assets/js/directives/dompurify.js new file mode 100644 index 0000000..e990eba --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/js/directives/dompurify.js @@ -0,0 +1,10 @@ +import DOMPurify from 'dompurify'; + +export default { + beforeMount(el, binding) { + el.innerHTML = DOMPurify.sanitize(binding.value); + }, + updated(el, binding) { + el.innerHTML = DOMPurify.sanitize(binding.value); + } +}; diff --git a/packages/Webkul/Admin/src/Resources/assets/js/directives/tooltip.js b/packages/Webkul/Admin/src/Resources/assets/js/directives/tooltip.js new file mode 100644 index 0000000..e6bf232 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/js/directives/tooltip.js @@ -0,0 +1,143 @@ +export default { + mounted(el, binding) { + initTooltip(el, binding); + }, + updated(el, binding) { + initTooltip(el, binding); + } +}; + +const initTooltip = (el, binding) => { + const defaultOptions = { + placement: 'top', + trigger: 'hover', + html: false, + content: '', + delay: { show: 200, hide: 100 } + }; + + const options = { + ...defaultOptions, + ...(typeof binding.value === 'object' ? binding.value : { content: binding.value }) + }; + + let tooltip = document.getElementById(`tooltip-${el.tooltipId}`); + + if (! tooltip) { + el.tooltipId = Math.random().toString(36).substring(2, 9); + tooltip = document.createElement('div'); + tooltip.id = `tooltip-${el.tooltipId}`; + tooltip.className = 'max-w-[250px] break-words rounded-lg bg-gray-800 px-4 py-3 text-sm leading-snug text-white shadow-lg transition-opacity transition-transform duration-200'; + tooltip.style.display = 'none'; + tooltip.style.position = 'absolute'; + tooltip.style.zIndex = '10000'; + + const inner = document.createElement('div'); + inner.className = 'tooltip-inner'; + + const arrow = document.createElement('div'); + arrow.className = 'absolute h-0 w-0 border-solid'; + + tooltip.appendChild(inner); + tooltip.appendChild(arrow); + document.body.appendChild(tooltip); + + if (options.html) { + inner.innerHTML = options.content; + } else { + inner.textContent = options.content; + } + + el._tooltip = tooltip; + + const showTooltip = () => { + tooltip.style.display = 'block'; + + const rect = el.getBoundingClientRect(); + const tooltipRect = tooltip.getBoundingClientRect(); + + let top, left; + + switch (options.placement) { + case 'top': + top = rect.top - tooltipRect.height - 10; + left = rect.left + (rect.width / 2) - (tooltipRect.width / 2); + arrow.style.top = 'auto'; + arrow.style.bottom = '-5px'; + arrow.style.left = '50%'; + arrow.style.transform = 'translateX(-50%)'; + break; + case 'bottom': + top = rect.bottom + 10; + left = rect.left + (rect.width / 2) - (tooltipRect.width / 2); + arrow.style.bottom = 'auto'; + arrow.style.top = '-5px'; + arrow.style.left = '50%'; + arrow.style.transform = 'translateX(-50%) rotate(180deg)'; + break; + case 'left': + top = rect.top + (rect.height / 2) - (tooltipRect.height / 2); + left = rect.left - tooltipRect.width - 10; + arrow.style.top = '50%'; + arrow.style.left = 'auto'; + arrow.style.right = '-5px'; + arrow.style.transform = 'translateY(-50%) rotate(-90deg)'; + break; + case 'right': + top = rect.top + (rect.height / 2) - (tooltipRect.height / 2); + left = rect.right + 10; + arrow.style.top = '50%'; + arrow.style.right = 'auto'; + arrow.style.left = '-5px'; + arrow.style.transform = 'translateY(-50%) rotate(90deg)'; + break; + } + + if (top < 0) { + top = 0; + } + + if (left < 0) { + left = 0; + } + + if (left + tooltipRect.width > window.innerWidth) { + left = window.innerWidth - tooltipRect.width; + } + + tooltip.style.top = `${top + window.scrollY}px`; + tooltip.style.left = `${left + window.scrollX}px`; + }; + + const hideTooltip = () => { + tooltip.style.display = 'none'; + }; + + if (options.trigger === 'hover') { + el.addEventListener('mouseenter', () => { + el._showTimeout = setTimeout(showTooltip, options.delay.show); + }); + + el.addEventListener('mouseleave', () => { + clearTimeout(el._showTimeout); + el._hideTimeout = setTimeout(hideTooltip, options.delay.hide); + }); + } else if (options.trigger === 'click') { + el.addEventListener('click', showTooltip); + + document.addEventListener('click', (e) => { + if (e.target !== el && !el.contains(e.target)) { + hideTooltip(); + } + }); + } + } else { + const inner = tooltip.querySelector('.tooltip-inner'); + + if (options.html) { + inner.innerHTML = options.content; + } else { + inner.textContent = options.content; + } + } +} diff --git a/packages/Webkul/Admin/src/Resources/assets/js/plugins/admin.js b/packages/Webkul/Admin/src/Resources/assets/js/plugins/admin.js new file mode 100644 index 0000000..6d1aa23 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/js/plugins/admin.js @@ -0,0 +1,148 @@ +export default { + install(app) { + app.config.globalProperties.$admin = { + /** + * Generates a formatted price. + * + * @param {number} price - The price value to be formatted. + * @returns {string} - The formatted price string. + */ + formatPrice: (price) => { + let locale = document.querySelector( + 'meta[http-equiv="content-language"]' + ).content; + + locale = locale.replace(/([a-z]{2})_([A-Z]{2})/g, "$1-$2"); + + const currency = JSON.parse( + document.querySelector('meta[name="currency"]').content + ); + + const symbol = + currency.symbol !== "" ? currency.symbol : currency.code; + + if (!currency.currency_position) { + return new Intl.NumberFormat(locale, { + style: "currency", + currency: currency.code, + }).format(price); + } + + const formatter = new Intl.NumberFormat(locale, { + style: "currency", + currency: currency.code, + minimumFractionDigits: currency.decimal ?? 2, + }); + + const formattedCurrency = formatter + .formatToParts(price) + .map((part) => { + switch (part.type) { + case "currency": + return ""; + + case "group": + return currency.group_separator === "" + ? part.value + : currency.group_separator; + + case "decimal": + return currency.decimal_separator === "" + ? part.value + : currency.decimal_separator; + + default: + return part.value; + } + }) + .join(""); + + switch (currency.currency_position) { + case "left": + return symbol + formattedCurrency; + + case "left_with_space": + return symbol + " " + formattedCurrency; + + case "right": + return formattedCurrency + symbol; + + case "right_with_space": + return formattedCurrency + " " + symbol; + + default: + return formattedCurrency; + } + }, + + /** + * Generates a formatted date based on specified timezone. + * + * @param {string} dateString - The date value to be formatted. + * @param {string} format - The format to be used for formatting the date. + * @param {string} timezone - The timezone to use (e.g., 'America/New_York'). + * @returns {string} - The formatted date string. + */ + formatDate: (dateString, format, timezone) => { + const date = new Date(dateString); + + const options = { timeZone: timezone }; + + const formatter = new Intl.DateTimeFormat("en-US", { + ...options, + hour12: false, + year: "numeric", + month: "numeric", + day: "numeric", + hour: "numeric", + minute: "numeric", + second: "numeric", + }); + + const parts = formatter.formatToParts(date); + const dateParts = {}; + + parts.forEach((part) => { + if (part.type !== "literal") { + dateParts[part.type] = part.value; + } + }); + + const tzDay = parseInt(dateParts.day, 10); + const tzMonth = parseInt(dateParts.month, 10); + const tzYear = parseInt(dateParts.year, 10); + const tzHour = parseInt(dateParts.hour, 10); + const tzMinute = parseInt(dateParts.minute, 10); + + const formatters = { + d: tzDay, + DD: tzDay.toString().padStart(2, "0"), + M: tzMonth, + MM: tzMonth.toString().padStart(2, "0"), + MMM: new Date(tzYear, tzMonth - 1, 1).toLocaleString( + "en-US", + { month: "short" } + ), + MMMM: new Date(tzYear, tzMonth - 1, 1).toLocaleString( + "en-US", + { month: "long" } + ), + yy: tzYear.toString().slice(-2), + yyyy: tzYear, + H: tzHour, + HH: tzHour.toString().padStart(2, "0"), + h: tzHour % 12 || 12, + hh: (tzHour % 12 || 12).toString().padStart(2, "0"), + m: tzMinute, + mm: tzMinute.toString().padStart(2, "0"), + A: tzHour < 12 ? "AM" : "PM", + }; + + return format.replace( + /\b(?:d|DD|M|MM|MMM|MMMM|yy|yyyy|H|HH|h|hh|m|mm|A)\b/g, + (match) => formatters[match] + ); + }, + }; + }, +}; diff --git a/packages/Webkul/Admin/src/Resources/assets/js/plugins/axios.js b/packages/Webkul/Admin/src/Resources/assets/js/plugins/axios.js new file mode 100644 index 0000000..d96e755 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/js/plugins/axios.js @@ -0,0 +1,14 @@ +/** + * We'll load the axios HTTP library which allows us to easily issue requests + * to our Laravel back-end. This library automatically handles sending the + * CSRF token as a header based on the value of the "XSRF" token cookie. + */ +import axios from "axios"; +window.axios = axios; +window.axios.defaults.headers.common["X-Requested-With"] = "XMLHttpRequest"; + +export default { + install(app) { + app.config.globalProperties.$axios = axios; + }, +}; diff --git a/packages/Webkul/Admin/src/Resources/assets/js/plugins/createElement.js b/packages/Webkul/Admin/src/Resources/assets/js/plugins/createElement.js new file mode 100644 index 0000000..714c11e --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/js/plugins/createElement.js @@ -0,0 +1,15 @@ +import { h, resolveComponent } from "vue/dist/vue.esm-bundler"; + +export default { + install(app) { + /** + * Create the virtual dom element + */ + app.config.globalProperties.$h = h; + + /** + * Resolve the component which is globally registered + */ + app.config.globalProperties.$resolveComponent = resolveComponent; + }, +}; diff --git a/packages/Webkul/Admin/src/Resources/assets/js/plugins/draggable.js b/packages/Webkul/Admin/src/Resources/assets/js/plugins/draggable.js new file mode 100644 index 0000000..a8fc1fa --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/js/plugins/draggable.js @@ -0,0 +1,10 @@ +import Draggable from 'vuedraggable'; + +export default { + install: (app) => { + /** + * Global component registration; + */ + app.component("draggable", Draggable); + }, +}; diff --git a/packages/Webkul/Admin/src/Resources/assets/js/plugins/emitter.js b/packages/Webkul/Admin/src/Resources/assets/js/plugins/emitter.js new file mode 100644 index 0000000..eb6a588 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/js/plugins/emitter.js @@ -0,0 +1,11 @@ +import mitt from "mitt"; + +const emitter = mitt(); + +window.emitter = emitter; + +export default { + install: (app, options) => { + app.config.globalProperties.$emitter = emitter; + }, +}; diff --git a/packages/Webkul/Admin/src/Resources/assets/js/plugins/flatpickr.js b/packages/Webkul/Admin/src/Resources/assets/js/plugins/flatpickr.js new file mode 100644 index 0000000..835ec6d --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/js/plugins/flatpickr.js @@ -0,0 +1,56 @@ +import Flatpickr from "flatpickr"; +import "flatpickr/dist/flatpickr.css"; +import { Spanish } from "flatpickr/dist/l10n/es.js"; +import { Arabic } from "flatpickr/dist/l10n/ar.js"; +import { Persian } from "flatpickr/dist/l10n/fa.js"; +import { Turkish } from "flatpickr/dist/l10n/tr.js"; + +export default { + install: (app) => { + window.Flatpickr = Flatpickr; + + const setLocaleFromLang = () => { + const lang = document.documentElement.lang || "en"; + + const localeMap = { + es: Spanish, + ar: Arabic, + fa: Persian, + tr: Turkish + }; + + const locale = localeMap[lang] || null; + + if (locale) { + window.Flatpickr.localize(locale); + } + }; + + setLocaleFromLang(); + + const changeTheme = (theme) => { + document.getElementById('flatpickr')?.remove(); + + if (theme === 'light') { + return; + } + + const linkElement = document.createElement("link"); + + linkElement.rel = "stylesheet"; + linkElement.type = "text/css"; + linkElement.href = `https://npmcdn.com/flatpickr/dist/themes/${theme}.css`; + linkElement.id = 'flatpickr'; + + document.head.appendChild(linkElement); + }; + + const currentTheme = document.documentElement.classList.contains("dark") + ? "dark" + : "light"; + + changeTheme(currentTheme); + + window.emitter.on("change-theme", (theme) => changeTheme(theme)); + }, +}; diff --git a/packages/Webkul/Admin/src/Resources/assets/js/plugins/vee-validate.js b/packages/Webkul/Admin/src/Resources/assets/js/plugins/vee-validate.js new file mode 100644 index 0000000..018bf05 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/js/plugins/vee-validate.js @@ -0,0 +1,194 @@ +/** + * We are defining all the global rules here and configuring + * all the `vee-validate` settings. + */ +import { configure, defineRule, Field, Form, ErrorMessage } from "vee-validate"; +import { localize, setLocale } from "@vee-validate/i18n"; +import ar from "@vee-validate/i18n/dist/locale/ar.json"; +import bn from "@vee-validate/i18n/dist/locale/bn.json"; +import de from "@vee-validate/i18n/dist/locale/de.json"; +import en from "@vee-validate/i18n/dist/locale/en.json"; +import es from "@vee-validate/i18n/dist/locale/es.json"; +import fa from "@vee-validate/i18n/dist/locale/fa.json"; +import fr from "@vee-validate/i18n/dist/locale/fr.json"; +import he from "@vee-validate/i18n/dist/locale/he.json"; +import hi_IN from "../../locales/hi_IN.json"; +import it from "@vee-validate/i18n/dist/locale/it.json"; +import ja from "@vee-validate/i18n/dist/locale/ja.json"; +import nl from "@vee-validate/i18n/dist/locale/nl.json"; +import pl from "@vee-validate/i18n/dist/locale/pl.json"; +import pt_BR from "@vee-validate/i18n/dist/locale/pt_BR.json"; +import ru from "@vee-validate/i18n/dist/locale/ru.json"; +import sin from "../../locales/sin.json"; +import tr from "@vee-validate/i18n/dist/locale/tr.json"; +import uk from "@vee-validate/i18n/dist/locale/uk.json"; +import zh_CN from "@vee-validate/i18n/dist/locale/zh_CN.json"; +import { all } from '@vee-validate/rules'; + +window.defineRule = defineRule; + +export default { + install: (app) => { + /** + * Global components registration; + */ + app.component("VForm", Form); + app.component("VField", Field); + app.component("VErrorMessage", ErrorMessage); + + window.addEventListener("load", () => setLocale(document.documentElement.attributes.lang.value)); + + /** + * Registration of all global validators. + */ + Object.entries(all).forEach(([name, rule]) => defineRule(name, rule)); + + /** + * This regular expression allows phone numbers with the following conditions: + * - The phone number can start with an optional "+" sign. + * - After the "+" sign, there should be one or more digits. + * + * This validation is sufficient for global-level phone number validation. If + * someone wants to customize it, they can override this rule. + */ + defineRule("phone", (value) => { + if (! value || ! value.length) { + return true; + } + + if (! /^\+?\d+$/.test(value)) { + return false; + } + + return true; + }); + + defineRule("address", (value) => { + if (!value || !value.length) { + return true; + } + + if ( + !/^[a-zA-Z0-9\s.\/*'\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\u0590-\u05FF\u3040-\u309F\u30A0-\u30FF\u0400-\u04FF\u0D80-\u0DFF\u3400-\u4DBF\u2000-\u2A6D\u00C0-\u017F\u0980-\u09FF\u0900-\u097F\u4E00-\u9FFF,\(\)-]{1,60}$/iu.test( + value + ) + ) { + return false; + } + + return true; + }); + + defineRule("postcode", (value) => { + if (! value || ! value.length) { + return true; + } + + if (! /^[a-zA-Z0-9][a-zA-Z0-9\s-]*[a-zA-Z0-9]$/.test(value)) { + return false; + } + + return true; + }); + + defineRule("decimal", (value, { decimals = '*', separator = '.' } = {}) => { + if (value === null || value === undefined || value === '') { + return true; + } + + if (Number(decimals) === 0) { + return /^-?\d*$/.test(value); + } + + const regexPart = decimals === '*' ? '+' : `{1,${decimals}}`; + const regex = new RegExp(`^[-+]?\\d*(\\${separator}\\d${regexPart})?([eE]{1}[-]?\\d+)?$`); + + return regex.test(value); + }); + + defineRule("required_if", (value, { condition = true } = {}) => { + if (condition) { + if (value === null || value === undefined || value === '') { + return false; + } + } + + return true; + }); + + defineRule("", () => true); + + defineRule("date_format", (value) => { + const regex = /^\d{4}-\d{2}-\d{2}$/; + + return regex.test(value); + }); + + defineRule("after", (value) => { + const today = new Date(); + const inputDate = new Date(value); + + today.setHours(0, 0, 0, 0); + inputDate.setHours(0, 0, 0, 0); + + return inputDate >= today; + }); + + configure({ + /** + * Built-in error messages and custom error messages are available. Multiple + * locales can be added in the same way. + */ + generateMessage: localize({ + ar: { + ...ar, + messages: { + ...ar.messages, + phone: "يجب أن يكون هذا {field} رقم هاتف صالحًا", + after: "يجب أن يكون {field} تاريخًا في المستقبل أو اليوم.", + }, + }, + + en: { + ...en, + messages: { + ...en.messages, + phone: "This {field} must be a valid phone number", + after: "The {field} must be a date in the future or today.", + }, + }, + + es: { + ...es, + messages: { + ...es.messages, + phone: "Este {field} debe ser un número de teléfono válido.", + after: "El {field} debe ser una fecha en el futuro o hoy.", + }, + }, + + fa: { + ...fa, + messages: { + ...fa.messages, + phone: "این {field} باید یک شماره تلفن معتبر باشد.", + after: "{field} باید یک تاریخ در آینده یا امروز باشد.", + }, + }, + + tr: { + ...tr, + messages: { + ...tr.messages, + phone: "Bu {field} geçerli bir telefon numarası olmalıdır.", + after: "{field} gelecekte veya bugün olmalıdır.", + }, + }, + }), + + validateOnBlur: true, + validateOnInput: true, + validateOnChange: true, + }); + }, +}; diff --git a/packages/Webkul/Admin/src/Resources/assets/js/plugins/vue-cal.js b/packages/Webkul/Admin/src/Resources/assets/js/plugins/vue-cal.js new file mode 100644 index 0000000..9aa6209 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/js/plugins/vue-cal.js @@ -0,0 +1,16 @@ + +import VueCal from 'vue-cal'; + +import 'vue-cal/dist/vuecal.css'; + +import 'vue-cal/dist/i18n/ar.es.js'; +import 'vue-cal/dist/i18n/en.es.js'; +import 'vue-cal/dist/i18n/es.es.js'; +import 'vue-cal/dist/i18n/fa.es.js'; +import 'vue-cal/dist/i18n/tr.es.js'; +import 'vue-cal/dist/i18n/pt-br.es.js'; +import 'vue-cal/dist/i18n/vi.es.js'; + +export default { + install: (app, options) => app.component('v-vue-cal', VueCal), +}; diff --git a/packages/Webkul/Admin/src/Resources/assets/locales/hi_IN.json b/packages/Webkul/Admin/src/Resources/assets/locales/hi_IN.json new file mode 100644 index 0000000..bb7bb23 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/locales/hi_IN.json @@ -0,0 +1,32 @@ +{ + "code": "hi_IN", + "messages": { + "_default": "यह {field} मान्य नहीं है", + "alpha": "{field} फ़ील्ड में केवल वर्णात्मक अक्षर हो सकते हैं", + "alpha_num": "{field} फ़ील्ड में केवल वर्णात्मक और संख्यात्मक अक्षर हो सकते हैं", + "alpha_dash": "{field} फ़ील्ड में वर्णात्मक और संख्यात्मक अक्षरों के साथ डैश और अंडरस्कोर हो सकते हैं", + "alpha_spaces": "{field} फ़ील्ड में केवल वर्णात्मक अक्षर और अंतर हो सकते हैं", + "between": "{field} फ़ील्ड 0:{min} और 1:{max} के बीच होना चाहिए", + "confirmed": "{field} फ़ील्ड की पुष्टि मेल नहीं खाती", + "digits": "{field} फ़ील्ड संख्यात्मक होनी चाहिए और बिल्कुल 0:{length} अंक होने चाहिए", + "dimensions": "{field} फ़ील्ड 0:{width} पिक्सेल और 1:{height} पिक्सेल होना चाहिए", + "email": "{field} फ़ील्ड में एक मान्य ईमेल होना चाहिए", + "not_one_of": "{field} फ़ील्ड मान्य मूल्य नहीं है", + "ext": "{field} फ़ील्ड में मान्य फ़ाइल नहीं है", + "image": "{field} फ़ील्ड एक छवि होनी चाहिए", + "integer": "{field} फ़ील्ड एक पूर्णांक होना चाहिए", + "length": "{field} फ़ील्ड 0:{length} लंबा होना चाहिए", + "max_value": "{field} फ़ील्ड 0:{max} या उससे कम होना चाहिए", + "max": "{field} फ़ील्ड 0:{length} अक्षरों से अधिक नहीं हो सकता", + "mimes": "{field} फ़ील्ड को मान्य फ़ाइल प्रकार होना चाहिए", + "min_value": "{field} फ़ील्ड 0:{min} या उससे अधिक होना चाहिए", + "min": "{field} फ़ील्ड कम से कम 0:{length} अक्षरों का होना चाहिए", + "numeric": "{field} फ़ील्ड में केवल संख्याएँ हो सकती हैं", + "one_of": "{field} फ़ील्ड मान्य मूल्य नहीं है", + "regex": "{field} फ़ील्ड का प्रारूप अवैध है", + "required_if": "{field} फ़ील्ड आवश्यक है", + "required": "{field} फ़ील्ड आवश्यक है", + "size": "{field} फ़ील्ड का आकार 0:{size}KB से कम होना चाहिए", + "url": "{field} फ़ील्ड में एक मान्य URL नहीं है" + } +} diff --git a/packages/Webkul/Admin/src/Resources/assets/locales/sin.json b/packages/Webkul/Admin/src/Resources/assets/locales/sin.json new file mode 100644 index 0000000..d0f8a85 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/locales/sin.json @@ -0,0 +1,32 @@ +{ + "code": "sin", + "messages": { + "_default": "මේ {field} වල වලංගු නොවේ", + "alpha": "{field} ක්ෂණික සංඛ්‍යාවක් පිළිබඳව සියල්ල සියල්ල සහිතව හැකිය", + "alpha_num": "{field} ක්ෂණික සහ සංඛ්‍යාවක් පිළිබඳව සියල්ල සහිතව හැකිය", + "alpha_dash": "{field} ක්ෂණික සහ සංඛ්‍යාවක් සමග දැහැ හෝ පරිදි ලොව සහිතව හැකිය", + "alpha_spaces": "{field} ක්ෂණික සංඛ්‍යාවක් සහිතව හැකිය, සහ වීඩියෝ හෝම්හෝ සහිතව හැකිය", + "between": "{field} ක්ෂණික 0:{min} සහ 1:{max} අතර විය යුතුය", + "confirmed": "{field} ක්ෂණික තහවුරු නොගත් බව තහවුරු කර නොයාය", + "digits": "{field} ක්ෂණික සෂ්යෝගයක් හා සියලුමේ විය 0:{length} දිගු විය යුතුය", + "dimensions": "{field} ක්ෂණික 0:{width} පික්සල සහ 1:{height} පික්සල විය යුතුය", + "email": "{field} ක්ෂණික වලංගු ඊමේල් එක හෝ යුක්ත විය යුතුය", + "not_one_of": "{field} ක්ෂණික වලංගු අගය නොවේ", + "ext": "{field} ක්ෂණික වලංගු ගොනුව නොවේ", + "image": "{field} ක්ෂණික වලංගු ඡායාරූපය යුතුය", + "integer": "{field} ක්ෂණික වලංගු නික්මෙර වර්ගයේ යුතුය", + "length": "{field} ක්ෂණික වලංගු 0:{length} හෝමාව යුතුය", + "max_value": "{field} ක්ෂණික 0:{max} හෝමා හෝමා හෝමා යුතුය", + "max": "{field} ක්ෂණික 0:{length} අකුරු වලංගු වී නොයාය", + "mimes": "{field} ක්ෂණික ගොනුවේ වලංගු ගොනු වර්ගය හෝ හෝ හෝ යුතුය", + "min_value": "{field} ක්ෂණික 0:{min} හෝමාව හෝමාව හෝමාව හෝමාව හෝමාව යුතුය", + "min": "{field} ක්ෂණික 0:{length} හෝමාවක් හෝමාවක් හෝමාවක් හෝමාවක් යුතුය", + "numeric": "{field} ක්ෂණික වලංගු සංඛ්‍යාවෙන් වයස්ක්‍ර සංඛ්‍යාවෙන් වයස්ක්‍ර විය ෺", + "one_of": "{field} ක්ෂණික වලංගු අගය නොවේ", + "regex": "{field} ක්ෂණික වලංගු ආකාරය අවලංගුය", + "required_if": "{field} ක්ෂණිකයෙන් හෝයි", + "required": "{field} ක්ෂණිකයෙන් හෝයි", + "size": "{field} ක්ෂණික වලංගු විය හැකි ආකාරය 0:{size}KB හෝ හොයා යුතුයි", + "url": "{field} ක්ෂණික වලංගු වර්ගවල URL නොවේ" + } +} \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/lang/ar/app.php b/packages/Webkul/Admin/src/Resources/lang/ar/app.php new file mode 100644 index 0000000..0ca98e8 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/lang/ar/app.php @@ -0,0 +1,2225 @@ + [ + 'leads' => 'العملاء المحتملون', + 'lead' => 'عميل محتمل', + 'quotes' => 'عروض الأسعار', + 'mail' => 'البريد', + 'inbox' => 'الوارد', + 'draft' => 'المسودات', + 'outbox' => 'الصادر', + 'sent' => 'المرسل', + 'trash' => 'المحذوفات', + 'activities' => 'الأنشطة', + 'webhook' => 'Webhook', + 'contacts' => 'جهات الاتصال', + 'persons' => 'الأشخاص', + 'organizations' => 'المنظمات', + 'products' => 'المنتجات', + 'settings' => 'الإعدادات', + 'groups' => 'المجموعات', + 'roles' => 'الأدوار', + 'users' => 'المستخدمون', + 'user' => 'المستخدم', + 'automation' => 'الأتمتة', + 'attributes' => 'السمات', + 'pipelines' => 'قنوات البيع', + 'sources' => 'المصادر', + 'types' => 'الأنواع', + 'email-templates' => 'قوالب البريد الإلكتروني', + 'workflows' => 'سير العمل', + 'other-settings' => 'إعدادات أخرى', + 'tags' => 'الوسوم', + 'configuration' => 'التهيئة', + 'create' => 'إنشاء', + 'edit' => 'تعديل', + 'view' => 'عرض', + 'print' => 'طباعة', + 'delete' => 'حذف', + 'export' => 'تصدير', + 'mass-delete' => 'حذف جماعي', + 'data-transfer' => 'نقل البيانات', + 'imports' => 'الاستيرادات', + 'import' => 'استيراد', + 'event' => 'حدث', + 'campaigns' => 'الحملات', + ], + 'users' => [ + 'activate-warning' => 'حسابك لم يتم تفعيله بعد. يرجى الاتصال بالمسؤول.', + 'login-error' => 'بيانات الاعتماد لا تتطابق مع سجلاتنا.', + 'not-permission' => 'ليس لديك إذن للوصول إلى لوحة الإدارة.', + 'login' => [ + 'email' => 'عنوان البريد الإلكتروني', + 'forget-password-link' => 'نسيت كلمة المرور؟', + 'password' => 'كلمة المرور', + 'submit-btn' => 'تسجيل الدخول', + 'title' => 'تسجيل الدخول', + ], + 'forget-password' => [ + 'create' => [ + 'email' => 'البريد الإلكتروني المسجل', + 'email-not-exist' => 'البريد الإلكتروني غير موجود', + 'page-title' => 'نسيت كلمة المرور', + 'reset-link-sent' => 'تم إرسال رابط إعادة تعيين كلمة المرور', + 'sign-in-link' => 'العودة إلى تسجيل الدخول؟', + 'submit-btn' => 'إعادة تعيين', + 'title' => 'استعادة كلمة المرور', + ], + ], + 'reset-password' => [ + 'back-link-title' => 'العودة إلى تسجيل الدخول؟', + 'confirm-password' => 'تأكيد كلمة المرور', + 'email' => 'البريد الإلكتروني المسجل', + 'password' => 'كلمة المرور', + 'submit-btn' => 'إعادة تعيين كلمة المرور', + 'title' => 'إعادة تعيين كلمة المرور', + ], + ], + 'account' => [ + 'edit' => [ + 'back-btn' => 'رجوع', + 'change-password' => 'تغيير كلمة المرور', + 'confirm-password' => 'تأكيد كلمة المرور', + 'current-password' => 'كلمة المرور الحالية', + 'email' => 'البريد الإلكتروني', + 'general' => 'عام', + 'invalid-password' => 'كلمة المرور الحالية التي أدخلتها غير صحيحة.', + 'name' => 'الاسم', + 'password' => 'كلمة المرور', + 'profile-image' => 'صورة الملف الشخصي', + 'save-btn' => 'حفظ الحساب', + 'title' => 'حسابي', + 'update-success' => 'تم تحديث الحساب بنجاح', + 'upload-image-info' => 'قم بتحميل صورة الملف الشخصي (110px X 110px) بتنسيق PNG أو JPG', + ], + ], + 'components' => [ + 'activities' => [ + 'actions' => [ + 'mail' => [ + 'btn' => 'بريد', + 'title' => 'كتابة بريد', + 'to' => 'إلى', + 'enter-emails' => 'اضغط Enter لإضافة عناوين البريد الإلكتروني', + 'cc' => 'نسخة', + 'bcc' => 'نسخة مخفية', + 'subject' => 'الموضوع', + 'send-btn' => 'إرسال', + 'message' => 'رسالة', + ], + 'file' => [ + 'btn' => 'ملف', + 'title' => 'إضافة ملف', + 'title-control' => 'عنوان', + 'name' => 'اسم', + 'description' => 'وصف', + 'file' => 'ملف', + 'save-btn' => 'حفظ الملف', + ], + 'note' => [ + 'btn' => 'ملاحظة', + 'title' => 'إضافة ملاحظة', + 'comment' => 'تعليق', + 'save-btn' => 'حفظ الملاحظة', + ], + 'activity' => [ + 'btn' => 'نشاط', + 'title' => 'إضافة نشاط', + 'title-control' => 'عنوان', + 'description' => 'وصف', + 'schedule-from' => 'الجدولة من', + 'schedule-to' => 'الجدولة إلى', + 'location' => 'موقع', + 'call' => 'مكالمة', + 'meeting' => 'اجتماع', + 'lunch' => 'غداء', + 'save-btn' => 'حفظ النشاط', + 'participants' => [ + 'title' => 'المشاركون', + 'placeholder' => 'اكتب للبحث عن المشاركين', + 'users' => 'المستخدمون', + 'persons' => 'الأشخاص', + 'no-results' => 'لم يتم العثور على نتائج...', + ], + ], + ], + 'index' => [ + 'all' => 'الكل', + 'bcc' => 'نسخة مخفية', + 'by-user' => 'بواسطة :user', + 'calls' => 'المكالمات', + 'cc' => 'نسخة', + 'change-log' => 'سجلات التغيير', + 'delete' => 'حذف', + 'edit' => 'تعديل', + 'emails' => 'البريد الإلكتروني', + 'empty' => 'فارغ', + 'files' => 'الملفات', + 'from' => 'من', + 'location' => 'موقع', + 'lunches' => 'الغداء', + 'mark-as-done' => 'وضع علامة تم', + 'meetings' => 'الاجتماعات', + 'notes' => 'الملاحظات', + 'participants' => 'المشاركون', + 'planned' => 'مخطط له', + 'quotes' => 'الاقتباسات', + 'scheduled-on' => 'مجدول في', + 'system' => 'النظام', + 'to' => 'إلى', + 'unlink' => 'إلغاء الارتباط', + 'view' => 'عرض', + 'empty-placeholders' => [ + 'all' => [ + 'title' => 'لم يتم العثور على أي أنشطة', + 'description' => 'لم يتم العثور على أي أنشطة لهذا العنصر. يمكنك إضافة الأنشطة من خلال النقر على زر "النشاط" في اللوحة الجانبية اليسرى.', + ], + 'planned' => [ + 'title' => 'لم يتم العثور على أنشطة مخططة', + 'description' => 'لم يتم العثور على أنشطة مخططة لهذا العنصر. يمكنك إضافة أنشطة مخططة من خلال النقر على زر "النشاط" في اللوحة الجانبية اليسرى.', + ], + 'notes' => [ + 'title' => 'لم يتم العثور على ملاحظات', + 'description' => 'لم يتم العثور على ملاحظات لهذا العنصر. يمكنك إضافة الملاحظات من خلال النقر على زر "الملاحظة" في اللوحة الجانبية اليسرى.', + ], + 'calls' => [ + 'title' => 'لم يتم العثور على مكالمات', + 'description' => 'لم يتم العثور على مكالمات لهذا العنصر. يمكنك إضافة المكالمات من خلال النقر على زر "النشاط" في اللوحة الجانبية اليسرى واختيار نوع المكالمة.', + ], + 'meetings' => [ + 'title' => 'لم يتم العثور على اجتماعات', + 'description' => 'لم يتم العثور على اجتماعات لهذا العنصر. يمكنك إضافة الاجتماعات من خلال النقر على زر "النشاط" في اللوحة الجانبية اليسرى واختيار نوع الاجتماع.', + ], + 'lunches' => [ + 'title' => 'لم يتم العثور على غداءات', + 'description' => 'لم يتم العثور على غداءات لهذا العنصر. يمكنك إضافة الغداءات من خلال النقر على زر "النشاط" في اللوحة الجانبية اليسرى واختيار نوع الغداء.', + ], + 'files' => [ + 'title' => 'لم يتم العثور على ملفات', + 'description' => 'لم يتم العثور على ملفات لهذا العنصر. يمكنك إضافة الملفات من خلال النقر على زر "الملف" في اللوحة الجانبية اليسرى.', + ], + 'emails' => [ + 'title' => 'لم يتم العثور على رسائل بريد إلكتروني', + 'description' => 'لم يتم العثور على رسائل بريد إلكتروني لهذا العنصر. يمكنك إضافة الرسائل من خلال النقر على زر "البريد" في اللوحة الجانبية اليسرى.', + ], + 'system' => [ + 'title' => 'لم يتم العثور على سجلات التغيير', + 'description' => 'لم يتم العثور على سجلات التغيير لهذا العنصر.', + ], + ], + ], + ], + 'media' => [ + 'images' => [ + 'add-image-btn' => 'إضافة صورة', + 'ai-add-image-btn' => 'الذكاء الاصطناعي السحري', + 'allowed-types' => 'png, jpeg, jpg', + 'not-allowed-error' => 'فقط ملفات الصور (.jpeg, .jpg, .png) مسموح بها.', + 'placeholders' => [ + 'front' => 'الأمام', + 'next' => 'التالي', + 'size' => 'الحجم', + 'use-cases' => 'حالات الاستخدام', + 'zoom' => 'تكبير', + ], + ], + 'videos' => [ + 'add-video-btn' => 'إضافة فيديو', + 'allowed-types' => 'mp4, webm, mkv', + 'not-allowed-error' => 'فقط ملفات الفيديو (.mp4, .mov, .ogg) مسموح بها.', + ], + ], + 'datagrid' => [ + 'index' => [ + 'no-records-selected' => 'لم يتم اختيار أي سجلات.', + 'must-select-a-mass-action-option' => 'يجب أن تختار خيارًا للإجراء الجماعي.', + 'must-select-a-mass-action' => 'يجب أن تختار إجراءً جماعيًا.', + ], + 'toolbar' => [ + 'length-of' => ':length من', + 'of' => 'من', + 'per-page' => 'لكل صفحة', + 'results' => ':total نتائج', + 'delete' => 'حذف', + 'selected' => ':total عناصر مختارة', + 'mass-actions' => [ + 'submit' => 'إرسال', + 'select-option' => 'اختر خيارًا', + 'select-action' => 'اختر إجراءً', + ], + 'filter' => [ + 'apply-filters-btn' => 'تطبيق الفلاتر', + 'back-btn' => 'رجوع', + 'create-new-filter' => 'إنشاء فلتر جديد', + 'custom-filters' => 'فلاتر مخصصة', + 'delete-error' => 'حدث خطأ أثناء حذف الفلتر، يرجى المحاولة مرة أخرى.', + 'delete-success' => 'تم حذف الفلتر بنجاح.', + 'empty-description' => 'لا توجد فلاتر محددة للحفظ. يرجى اختيار الفلاتر للحفظ.', + 'empty-title' => 'أضف فلاتر للحفظ', + 'name' => 'الاسم', + 'quick-filters' => 'الفلاتر السريعة', + 'save-btn' => 'حفظ', + 'save-filter' => 'حفظ الفلتر', + 'saved-success' => 'تم حفظ الفلتر بنجاح.', + 'selected-filters' => 'الفلاتر المحددة', + 'title' => 'فلتر', + 'update' => 'تحديث', + 'update-filter' => 'تحديث الفلتر', + 'updated-success' => 'تم تحديث الفلتر بنجاح.', + ], + 'search' => [ + 'title' => 'بحث', + ], + ], + 'filters' => [ + 'select' => 'اختر', + 'title' => 'فلاتر', + 'dropdown' => [ + 'searchable' => [ + 'at-least-two-chars' => 'اكتب حرفين على الأقل...', + 'no-results' => 'لم يتم العثور على نتائج...', + ], + ], + 'custom-filters' => [ + 'clear-all' => 'مسح الكل', + 'title' => 'فلاتر مخصصة', + ], + 'boolean-options' => [ + 'false' => 'خاطئ', + 'true' => 'صحيح', + ], + 'date-options' => [ + 'last-month' => 'الشهر الماضي', + 'last-six-months' => 'آخر 6 أشهر', + 'last-three-months' => 'آخر 3 أشهر', + 'this-month' => 'هذا الشهر', + 'this-week' => 'هذا الأسبوع', + 'this-year' => 'هذا العام', + 'today' => 'اليوم', + 'yesterday' => 'الأمس', + ], + ], + 'table' => [ + 'actions' => 'الإجراءات', + 'no-records-available' => 'لا توجد سجلات متاحة.', + ], + ], + 'modal' => [ + 'confirm' => [ + 'agree-btn' => 'موافق', + 'disagree-btn' => 'غير موافق', + 'message' => 'هل أنت متأكد أنك تريد تنفيذ هذا الإجراء؟', + 'title' => 'هل أنت متأكد؟', + ], + ], + 'tags' => [ + 'index' => [ + 'title' => 'الوسوم', + 'added-tags' => 'الوسوم المضافة', + 'save-btn' => 'حفظ الوسم', + 'placeholder' => 'اكتب للبحث عن الوسوم', + 'add-tag' => 'إضافة ":term"...', + 'aquarelle-red' => 'أحمر مائي', + 'crushed-cashew' => 'كاجو مطحون', + 'beeswax' => 'شمع العسل', + 'lemon-chiffon' => 'شيفون الليمون', + 'snow-flurry' => 'زوبعة ثلجية', + 'honeydew' => 'شمام', + ], + ], + 'layouts' => [ + 'powered-by' => [ + 'description' => 'Powered by :krayin, an open-source project by :webkul.', + ], + 'header' => [ + 'mega-search' => [ + 'title' => 'البحث الشامل', + 'tabs' => [ + 'leads' => 'العملاء المحتملين', + 'quotes' => 'عروض الأسعار', + 'persons' => 'الأشخاص', + 'products' => 'المنتجات', + ], + 'explore-all-products' => 'استكشاف جميع المنتجات', + 'explore-all-leads' => 'استكشاف جميع العملاء المحتملين', + 'explore-all-contacts' => 'استكشاف جميع جهات الاتصال', + 'explore-all-quotes' => 'استكشاف جميع عروض الأسعار', + 'explore-all-matching-products' => 'استكشاف جميع المنتجات المطابقة لـ ":query" (:count)', + 'explore-all-matching-leads' => 'استكشاف جميع العملاء المحتملين المطابقين لـ ":query" (:count)', + 'explore-all-matching-contacts' => 'استكشاف جميع جهات الاتصال المطابقة لـ ":query" (:count)', + 'explore-all-matching-quotes' => 'استكشاف جميع عروض الأسعار المطابقة لـ ":query" (:count)', + ], + ], + ], + 'attributes' => [ + 'edit' => [ + 'delete' => 'حذف', + ], + 'lookup' => [ + 'click-to-add' => 'انقر للإضافة', + 'search' => 'بحث...', + 'no-result-found' => 'لم يتم العثور على نتائج', + ], + ], + 'lookup' => [ + 'click-to-add' => 'انقر للإضافة', + 'no-results' => 'لم يتم العثور على نتائج', + 'add-as-new' => 'إضافة كجديد', + 'search' => 'بحث...', + ], + 'flash-group' => [ + 'success' => 'نجاح', + 'error' => 'خطأ', + 'warning' => 'تحذير', + 'info' => 'معلومات', + ], + 'tiny-mce' => [ + 'http-error' => 'خطأ في HTTP', + 'invalid-json' => 'استجابة JSON غير صالحة من الخادم.', + 'upload-failed' => 'فشل تحميل الملف. يرجى المحاولة مرة أخرى.', + ], + ], + 'quotes' => [ + 'index' => [ + 'title' => 'عروض الأسعار', + 'create-btn' => 'إنشاء عرض سعر', + 'create-success' => 'تم إنشاء عرض السعر بنجاح.', + 'update-success' => 'تم تحديث عرض السعر بنجاح.', + 'delete-success' => 'تم حذف عرض السعر بنجاح.', + 'delete-failed' => 'لا يمكن حذف عرض السعر.', + 'datagrid' => [ + 'subject' => 'الموضوع', + 'sales-person' => 'مندوب المبيعات', + 'expired-at' => 'تاريخ الانتهاء', + 'created-at' => 'تاريخ الإنشاء', + 'person' => 'الشخص', + 'subtotal' => 'المجموع الفرعي', + 'discount' => 'الخصم', + 'tax' => 'الضريبة', + 'adjustment' => 'التعديل', + 'grand-total' => 'المجموع الكلي', + 'edit' => 'تعديل', + 'delete' => 'حذف', + 'print' => 'طباعة', + ], + 'pdf' => [ + 'adjustment' => 'التعديل', + 'amount' => 'المبلغ', + 'billing-address' => 'عنوان الفوترة', + 'date' => 'التاريخ', + 'discount' => 'الخصم', + 'expired-at' => 'تاريخ الانتهاء', + 'grand-total' => 'المجموع الكلي', + 'person' => 'Person', + 'price' => 'السعر', + 'product-name' => 'اسم المنتج', + 'quantity' => 'الكمية', + 'quote-id' => 'رقم عرض السعر', + 'sales-person' => 'مندوب المبيعات', + 'shipping-address' => 'عنوان الشحن', + 'sku' => 'رمز المنتج', + 'sub-total' => 'المجموع الفرعي', + 'subject' => 'Subject', + 'tax' => 'الضريبة', + 'title' => 'عرض السعر', + ], + ], + 'create' => [ + 'title' => 'إنشاء عرض سعر', + 'save-btn' => 'حفظ عرض السعر', + 'quote-info' => 'معلومات عرض السعر', + 'quote-info-info' => 'أدخل المعلومات الأساسية لعرض السعر.', + 'address-info' => 'معلومات العنوان', + 'address-info-info' => 'معلومات عن العنوان المتعلق بعرض السعر.', + 'quote-items' => 'بنود عرض السعر', + 'search-products' => 'البحث عن المنتجات', + 'link-to-lead' => 'ربط بالعميل المحتمل', + 'quote-item-info' => 'أضف طلب المنتج لهذا العرض.', + 'quote-name' => 'اسم عرض السعر', + 'quantity' => 'الكمية', + 'price' => 'السعر', + 'discount' => 'الخصم', + 'tax' => 'الضريبة', + 'total' => 'المجموع', + 'amount' => 'المبلغ', + 'add-item' => '+ إضافة بند', + 'sub-total' => 'المجموع الفرعي (:symbol)', + 'total-discount' => 'الخصم (:symbol)', + 'total-tax' => 'الضريبة (:symbol)', + 'total-adjustment' => 'التعديل (:symbol)', + 'grand-total' => 'المجموع الكلي (:symbol)', + 'discount-amount' => 'مبلغ الخصم', + 'tax-amount' => 'مبلغ الضريبة', + 'adjustment-amount' => 'مبلغ التعديل', + 'product-name' => 'اسم المنتج', + 'action' => 'الإجراء', + ], + 'edit' => [ + 'title' => 'تعديل عرض السعر', + 'save-btn' => 'حفظ عرض السعر', + 'quote-info' => 'معلومات عرض السعر', + 'quote-info-info' => 'أدخل المعلومات الأساسية لعرض السعر.', + 'address-info' => 'معلومات العنوان', + 'address-info-info' => 'معلومات عن العنوان المتعلق بعرض السعر.', + 'quote-items' => 'بنود عرض السعر', + 'link-to-lead' => 'ربط بالعميل المحتمل', + 'quote-item-info' => 'أضف طلب المنتج لهذا العرض.', + 'quote-name' => 'اسم عرض السعر', + 'quantity' => 'الكمية', + 'price' => 'السعر', + 'search-products' => 'البحث عن المنتجات', + 'discount' => 'الخصم', + 'tax' => 'الضريبة', + 'total' => 'المجموع', + 'amount' => 'المبلغ', + 'add-item' => '+ إضافة بند', + 'sub-total' => 'المجموع الفرعي (:symbol)', + 'total-discount' => 'الخصم (:symbol)', + 'total-tax' => 'الضريبة (:symbol)', + 'total-adjustment' => 'التعديل (:symbol)', + 'grand-total' => 'المجموع الكلي (:symbol)', + 'discount-amount' => 'مبلغ الخصم', + 'tax-amount' => 'مبلغ الضريبة', + 'adjustment-amount' => 'مبلغ التعديل', + 'product-name' => 'اسم المنتج', + 'action' => 'الإجراء', + ], + ], + 'contacts' => [ + 'persons' => [ + 'index' => [ + 'title' => 'الأشخاص', + 'create-btn' => 'إنشاء شخص', + 'create-success' => 'تم إنشاء الشخص بنجاح.', + 'update-success' => 'تم تحديث الشخص بنجاح.', + 'all-delete-success' => 'تم حذف جميع الأشخاص المحددين بنجاح.', + 'partial-delete-warning' => 'تم حذف بعض الأشخاص بنجاح. لم يتم حذف الآخرين لأنهم مرتبطون بعملاء محتملين.', + 'none-delete-warning' => 'لم يتم حذف أي من الأشخاص المحددين لأنهم مرتبطون بعملاء محتملين.', + 'no-selection' => 'لم يتم تحديد أي أشخاص للحذف.', + 'delete-failed' => 'فشل في حذف الأشخاص المحددين.', + 'datagrid' => [ + 'contact-numbers' => 'أرقام الاتصال', + 'delete' => 'حذف', + 'edit' => 'تعديل', + 'emails' => 'البريد الإلكتروني', + 'id' => 'المعرف', + 'view' => 'عرض', + 'name' => 'الاسم', + 'organization-name' => 'اسم المؤسسة', + ], + ], + 'view' => [ + 'title' => ':name', + 'about-person' => 'عن الشخص', + 'about-organization' => 'حول المؤسسة', + 'activities' => [ + 'index' => [ + 'all' => 'الكل', + 'calls' => 'المكالمات', + 'meetings' => 'الاجتماعات', + 'lunches' => 'الغداء', + 'files' => 'الملفات', + 'quotes' => 'عروض الأسعار', + 'notes' => 'الملاحظات', + 'emails' => 'رسائل البريد الإلكتروني', + 'by-user' => 'بواسطة :user', + 'scheduled-on' => 'مجدول في', + 'location' => 'الموقع', + 'participants' => 'المشاركون', + 'mark-as-done' => 'وضع علامة كمنتهي', + 'delete' => 'حذف', + 'edit' => 'تعديل', + ], + 'actions' => [ + 'mail' => [ + 'btn' => 'بريد', + 'title' => 'إنشاء بريد', + 'to' => 'إلى', + 'cc' => 'نسخة', + 'bcc' => 'نسخة مخفية', + 'subject' => 'الموضوع', + 'send-btn' => 'إرسال', + 'message' => 'الرسالة', + ], + 'file' => [ + 'btn' => 'ملف', + 'title' => 'إضافة ملف', + 'title-control' => 'العنوان', + 'name' => 'اسم الملف', + 'description' => 'الوصف', + 'file' => 'الملف', + 'save-btn' => 'حفظ الملف', + ], + 'note' => [ + 'btn' => 'ملاحظة', + 'title' => 'إضافة ملاحظة', + 'comment' => 'التعليق', + 'save-btn' => 'حفظ الملاحظة', + ], + 'activity' => [ + 'btn' => 'نشاط', + 'title' => 'إضافة نشاط', + 'title-control' => 'العنوان', + 'description' => 'الوصف', + 'schedule-from' => 'مجدول من', + 'schedule-to' => 'مجدول إلى', + 'location' => 'الموقع', + 'call' => 'مكالمة', + 'meeting' => 'اجتماع', + 'lunch' => 'غداء', + 'save-btn' => 'حفظ النشاط', + ], + ], + ], + 'tags' => [ + 'create-success' => 'تم إنشاء الوسم بنجاح.', + 'destroy-success' => 'تم حذف الوسم بنجاح.', + ], + ], + 'create' => [ + 'title' => 'إنشاء شخص', + 'save-btn' => 'حفظ الشخص', + ], + 'edit' => [ + 'title' => 'تعديل الشخص', + 'save-btn' => 'حفظ الشخص', + ], + ], + 'organizations' => [ + 'index' => [ + 'title' => 'المؤسسات', + 'create-btn' => 'إنشاء مؤسسة', + 'create-success' => 'تم إنشاء المؤسسة بنجاح.', + 'update-success' => 'تم تحديث المؤسسة بنجاح.', + 'delete-success' => 'تم حذف المؤسسة بنجاح.', + 'delete-failed' => 'لا يمكن حذف المؤسسة.', + 'datagrid' => [ + 'delete' => 'حذف', + 'edit' => 'تعديل', + 'id' => 'المعرف', + 'name' => 'الاسم', + 'persons-count' => 'عدد الأشخاص', + ], + ], + 'create' => [ + 'title' => 'إنشاء مؤسسة', + 'save-btn' => 'حفظ المؤسسة', + ], + 'edit' => [ + 'title' => 'تعديل المؤسسة', + 'save-btn' => 'حفظ المؤسسة', + ], + ], + ], + 'products' => [ + 'index' => [ + 'title' => 'المنتجات', + 'create-btn' => 'إنشاء منتج', + 'create-success' => 'تم إنشاء المنتج بنجاح.', + 'update-success' => 'تم تحديث المنتج بنجاح.', + 'delete-success' => 'تم حذف المنتج بنجاح.', + 'delete-failed' => 'لا يمكن حذف المنتج.', + 'datagrid' => [ + 'allocated' => 'مخصص', + 'delete' => 'حذف', + 'edit' => 'تعديل', + 'id' => 'المعرف', + 'in-stock' => 'في المخزون', + 'name' => 'الاسم', + 'on-hand' => 'متوفر', + 'tag-name' => 'اسم الوسم', + 'price' => 'السعر', + 'sku' => 'رمز المنتج', + 'view' => 'عرض', + ], + ], + 'create' => [ + 'save-btn' => 'حفظ المنتجات', + 'title' => 'إنشاء منتجات', + 'general' => 'عام', + 'price' => 'السعر', + ], + 'edit' => [ + 'title' => 'تعديل المنتجات', + 'save-btn' => 'حفظ المنتجات', + 'general' => 'عام', + 'price' => 'السعر', + ], + 'view' => [ + 'sku' => 'رمز المنتج', + 'all' => 'الكل', + 'notes' => 'الملاحظات', + 'files' => 'الملفات', + 'inventories' => 'المخزون', + 'change-logs' => 'سجلات التغيير', + 'attributes' => [ + 'about-product' => 'عن المنتج', + ], + 'inventory' => [ + 'source' => 'المصدر', + 'in-stock' => 'في المخزون', + 'allocated' => 'مخصص', + 'on-hand' => 'متوفر', + 'actions' => 'الإجراءات', + 'assign' => 'تعيين', + 'add-source' => 'إضافة مصدر', + 'location' => 'الموقع', + 'add-more' => 'إضافة المزيد', + 'save' => 'حفظ', + ], + ], + ], + 'settings' => [ + 'title' => 'الإعدادات', + 'groups' => [ + 'index' => [ + 'create-btn' => 'إنشاء مجموعة', + 'title' => 'المجموعات', + 'create-success' => 'تم إنشاء المجموعة بنجاح.', + 'update-success' => 'تم تحديث المجموعة بنجاح.', + 'destroy-success' => 'تم حذف المجموعة بنجاح.', + 'delete-failed' => 'لا يمكن حذف المجموعة.', + 'delete-failed-associated-users' => 'لا يمكن حذف المجموعة لأنها مستخدمة من قبل المستخدمين.', + 'datagrid' => [ + 'delete' => 'حذف', + 'description' => 'الوصف', + 'edit' => 'تعديل', + 'id' => 'المعرف', + 'name' => 'الاسم', + ], + 'edit' => [ + 'title' => 'تعديل المجموعة', + ], + 'create' => [ + 'name' => 'الاسم', + 'title' => 'إنشاء مجموعة', + 'description' => 'الوصف', + 'save-btn' => 'حفظ المجموعة', + ], + ], + ], + 'roles' => [ + 'index' => [ + 'being-used' => 'لا يمكن حذف الدور، حيث أنه قيد الاستخدام في مستخدم الإدارة.', + 'create-btn' => 'إنشاء الأدوار', + 'create-success' => 'تم إنشاء الدور بنجاح.', + 'current-role-delete-error' => 'لا يمكن حذف الدور المخصص للمستخدم الحالي.', + 'delete-failed' => 'لا يمكن حذف الدور.', + 'delete-success' => 'تم حذف الدور بنجاح.', + 'last-delete-error' => 'مطلوب دور واحد على الأقل.', + 'settings' => 'الإعدادات', + 'title' => 'الأدوار', + 'update-success' => 'تم تحديث الدور بنجاح.', + 'user-define-error' => 'لا يمكن حذف دور النظام.', + 'datagrid' => [ + 'all' => 'الكل', + 'custom' => 'مخصص', + 'delete' => 'حذف', + 'description' => 'الوصف', + 'edit' => 'تعديل', + 'id' => 'المعرف', + 'name' => 'الاسم', + 'permission-type' => 'نوع الإذن', + ], + ], + 'create' => [ + 'access-control' => 'التحكم في الوصول', + 'all' => 'الكل', + 'back-btn' => 'رجوع', + 'custom' => 'مخصص', + 'description' => 'الوصف', + 'general' => 'عام', + 'name' => 'الاسم', + 'permissions' => 'الأذونات', + 'save-btn' => 'حفظ الدور', + 'title' => 'إنشاء دور', + ], + 'edit' => [ + 'access-control' => 'التحكم في الوصول', + 'all' => 'الكل', + 'back-btn' => 'رجوع', + 'custom' => 'مخصص', + 'description' => 'الوصف', + 'general' => 'عام', + 'name' => 'الاسم', + 'permissions' => 'الأذونات', + 'save-btn' => 'حفظ الدور', + 'title' => 'تعديل الدور', + ], + ], + 'types' => [ + 'index' => [ + 'create-btn' => 'إنشاء نوع', + 'create-success' => 'تم إنشاء النوع بنجاح.', + 'delete-failed' => 'لا يمكن حذف النوع.', + 'delete-success' => 'تم حذف النوع بنجاح.', + 'title' => 'الأنواع', + 'update-success' => 'تم تحديث النوع بنجاح.', + 'datagrid' => [ + 'delete' => 'حذف', + 'description' => 'الوصف', + 'edit' => 'تعديل', + 'id' => 'المعرف', + 'name' => 'الاسم', + ], + 'create' => [ + 'name' => 'الاسم', + 'save-btn' => 'حفظ النوع', + 'title' => 'إنشاء نوع', + ], + 'edit' => [ + 'title' => 'تعديل النوع', + ], + ], + ], + 'sources' => [ + 'index' => [ + 'title' => 'المصادر', + 'create-btn' => 'إنشاء مصدر', + 'create-success' => 'تم إنشاء المصدر بنجاح.', + 'delete-failed' => 'لا يمكن حذف المصدر.', + 'delete-success' => 'تم حذف المصدر بنجاح.', + 'update-success' => 'تم تحديث المصدر بنجاح.', + 'delete-failed-associated-leads' => 'لا يمكن حذف المصدر لأنه مرتبط بعملاء محتملين موجودين. يرجى فصل أو تحديث هؤلاء العملاء قبل الحذف.', + 'datagrid' => [ + 'delete' => 'حذف', + 'edit' => 'تعديل', + 'id' => 'المعرف', + 'name' => 'الاسم', + ], + 'create' => [ + 'name' => 'اسم', + 'save-btn' => 'حفظ المصدر', + 'title' => 'إنشاء مصدر', + ], + 'edit' => [ + 'title' => 'تعديل المصدر', + ], + ], + ], + 'workflows' => [ + 'index' => [ + 'title' => 'سير العمل', + 'create-btn' => 'إنشاء سير عمل', + 'create-success' => 'تم إنشاء سير العمل بنجاح.', + 'update-success' => 'تم تحديث سير العمل بنجاح.', + 'delete-success' => 'تم حذف سير العمل بنجاح.', + 'delete-failed' => 'لا يمكن حذف سير العمل.', + 'datagrid' => [ + 'delete' => 'حذف', + 'description' => 'الوصف', + 'edit' => 'تعديل', + 'id' => 'المعرف', + 'name' => 'الاسم', + ], + ], + 'helpers' => [ + 'update-related-leads' => 'تحديث العملاء المحتملين ذوي الصلة', + 'send-email-to-sales-owner' => 'إرسال بريد إلكتروني إلى مسؤول المبيعات', + 'send-email-to-participants' => 'إرسال بريد إلكتروني إلى المشاركين', + 'add-webhook' => 'إضافة Webhook', + 'update-lead' => 'تحديث العميل المحتمل', + 'update-person' => 'تحديث الشخص', + 'send-email-to-person' => 'إرسال بريد إلكتروني إلى الشخص', + 'add-tag' => 'إضافة علامة', + 'add-note-as-activity' => 'إضافة ملاحظة كنشاط', + 'update-quote' => 'تحديث العرض', + ], + 'create' => [ + 'title' => 'إنشاء سير عمل', + 'event' => 'الحدث', + 'back-btn' => 'رجوع', + 'save-btn' => 'حفظ سير العمل', + 'name' => 'الاسم', + 'basic-details' => 'التفاصيل الأساسية', + 'description' => 'الوصف', + 'actions' => 'الإجراءات', + 'basic-details-info' => 'ضع المعلومات الأساسية لسير العمل.', + 'event-info' => 'يقوم الحدث بتشغيل والتحقق من الشروط وتنفيذ الإجراءات المحددة مسبقًا.', + 'conditions' => 'الشروط', + 'conditions-info' => 'الشروط هي قواعد تتحقق من السيناريوهات، ويتم تشغيلها في مناسبات محددة.', + 'actions-info' => 'الإجراء لا يقلل فقط من عبء العمل ولكنه يجعل أتمتة CRM أسهل بكثير', + 'value' => 'القيمة', + 'condition-type' => 'نوع الشرط', + 'all-condition-are-true' => 'جميع الشروط صحيحة', + 'any-condition-are-true' => 'أي شرط صحيح', + 'add-condition' => 'إضافة شرط', + 'add-action' => 'إضافة إجراء', + 'yes' => 'نعم', + 'no' => 'لا', + 'email' => 'البريد الإلكتروني', + 'is-equal-to' => 'يساوي', + 'is-not-equal-to' => 'لا يساوي', + 'equals-or-greater-than' => 'يساوي أو أكبر من', + 'equals-or-less-than' => 'يساوي أو أقل من', + 'greater-than' => 'أكبر من', + 'less-than' => 'أقل من', + 'type' => 'النوع', + 'contain' => 'يحتوي', + 'contains' => 'يحتوي', + 'does-not-contain' => 'لا يحتوي', + ], + 'edit' => [ + 'title' => 'تعديل سير العمل', + 'event' => 'الحدث', + 'back-btn' => 'رجوع', + 'save-btn' => 'حفظ سير العمل', + 'name' => 'الاسم', + 'basic-details' => 'التفاصيل الأساسية', + 'description' => 'الوصف', + 'actions' => 'الإجراءات', + 'type' => 'النوع', + 'basic-details-info' => 'ضع المعلومات الأساسية لسير العمل.', + 'event-info' => 'يقوم الحدث بتشغيل والتحقق من الشروط وتنفيذ الإجراءات المحددة مسبقًا.', + 'conditions' => 'الشروط', + 'conditions-info' => 'الشروط هي قواعد تتحقق من السيناريوهات، ويتم تشغيلها في مناسبات محددة.', + 'actions-info' => 'الإجراء لا يقلل فقط من عبء العمل ولكنه يجعل أتمتة CRM أسهل بكثير', + 'value' => 'القيمة', + 'condition-type' => 'نوع الشرط', + 'all-condition-are-true' => 'جميع الشروط صحيحة', + 'any-condition-are-true' => 'أي شرط صحيح', + 'add-condition' => 'إضافة شرط', + 'add-action' => 'إضافة إجراء', + 'yes' => 'نعم', + 'no' => 'لا', + 'email' => 'البريد الإلكتروني', + 'is-equal-to' => 'يساوي', + 'is-not-equal-to' => 'لا يساوي', + 'equals-or-greater-than' => 'يساوي أو أكبر من', + 'equals-or-less-than' => 'يساوي أو أقل من', + 'greater-than' => 'أكبر من', + 'less-than' => 'أقل من', + 'contain' => 'يحتوي', + 'contains' => 'يحتوي', + 'does-not-contain' => 'لا يحتوي', + ], + ], + 'webforms' => [ + 'index' => [ + 'title' => 'نماذج الويب', + 'create-btn' => 'إنشاء نموذج ويب', + 'create-success' => 'تم إنشاء نموذج الويب بنجاح.', + 'update-success' => 'تم تحديث نموذج الويب بنجاح.', + 'delete-success' => 'تم حذف نموذج الويب بنجاح.', + 'delete-failed' => 'لا يمكن حذف نموذج الويب.', + 'datagrid' => [ + 'id' => 'المعرف', + 'title' => 'العنوان', + 'edit' => 'تعديل', + 'delete' => 'حذف', + ], + ], + 'create' => [ + 'title' => 'إنشاء استمارة ويب', + 'add-attribute-btn' => 'زر إضافة سمة', + 'attribute-label-color' => 'لون تسمية السمة', + 'attributes' => 'السمات', + 'attributes-info' => 'أضف سمات مخصصة إلى النموذج.', + 'background-color' => 'لون الخلفية', + 'create-lead' => 'إنشاء عميل محتمل', + 'customize-webform' => 'تخصيص نموذج الويب', + 'customize-webform-info' => 'خصص نموذج الويب الخاص بك بألوان العناصر التي تختارها.', + 'description' => 'الوصف', + 'display-custom-message' => 'عرض رسالة مخصصة', + 'form-background-color' => 'لون خلفية النموذج', + 'form-submit-btn-color' => 'لون زر إرسال النموذج', + 'form-submit-button-color' => 'لون زر إرسال النموذج', + 'form-title-color' => 'لون عنوان النموذج', + 'general' => 'عام', + 'leads' => 'العملاء المحتملون', + 'person' => 'شخص', + 'save-btn' => 'حفظ نموذج الويب', + 'submit-button-label' => 'تسمية زر الإرسال', + 'submit-success-action' => 'إجراء نجاح الإرسال', + 'redirect-to-url' => 'إعادة التوجيه إلى الرابط', + 'choose-value' => 'اختر قيمة', + 'select-file' => 'اختر ملف', + 'select-image' => 'اختر صورة', + 'enter-value' => 'أدخل القيمة', + ], + 'edit' => [ + 'add-attribute-btn' => 'زر إضافة سمة', + 'attribute-label-color' => 'لون تسمية السمة', + 'attributes' => 'السمات', + 'attributes-info' => 'أضف سمات مخصصة إلى النموذج.', + 'background-color' => 'لون الخلفية', + 'choose-value' => 'اختر القيمة', + 'code-snippet' => 'مقتطف الكود', + 'copied' => 'تم النسخ', + 'copy' => 'نسخ', + 'create-lead' => 'إنشاء عميل محتمل', + 'customize-webform' => 'تخصيص نموذج الويب', + 'customize-webform-info' => 'خصص نموذج الويب الخاص بك بألوان العناصر التي تختارها.', + 'description' => 'الوصف', + 'display-custom-message' => 'عرض رسالة مخصصة', + 'embed' => 'تضمين', + 'enter-value' => 'أدخل القيمة', + 'form-background-color' => 'لون خلفية النموذج', + 'form-submit-btn-color' => 'لون زر إرسال النموذج', + 'form-submit-button-color' => 'لون زر إرسال النموذج', + 'form-title-color' => 'لون عنوان النموذج', + 'general' => 'عام', + 'leads' => 'العملاء المحتملون', + 'person' => 'شخص', + 'preview' => 'معاينة', + 'public-url' => 'الرابط العام', + 'redirect-to-url' => 'إعادة التوجيه إلى الرابط', + 'save-btn' => 'حفظ نموذج الويب', + 'select-file' => 'اختر ملف', + 'select-image' => 'اختر صورة', + 'submit-button-label' => 'تسمية زر الإرسال', + 'submit-success-action' => 'إجراء نجاح الإرسال', + 'title' => 'تعديل استمارة ويب', + ], + ], + 'email-template' => [ + 'index' => [ + 'create-btn' => 'إنشاء قالب بريد إلكتروني', + 'title' => 'قوالب البريد الإلكتروني', + 'create-success' => 'تم إنشاء قالب البريد الإلكتروني بنجاح.', + 'update-success' => 'تم تحديث قالب البريد الإلكتروني بنجاح.', + 'delete-success' => 'تم حذف قالب البريد الإلكتروني بنجاح.', + 'delete-failed' => 'لا يمكن حذف قالب البريد الإلكتروني.', + 'datagrid' => [ + 'delete' => 'حذف', + 'edit' => 'تعديل', + 'id' => 'المعرف', + 'name' => 'الاسم', + 'subject' => 'الموضوع', + ], + ], + 'create' => [ + 'title' => 'إنشاء قالب بريد إلكتروني', + 'save-btn' => 'حفظ قالب البريد الإلكتروني', + 'email-template' => 'قالب البريد الإلكتروني', + 'subject' => 'الموضوع', + 'content' => 'المحتوى', + 'subject-placeholders' => 'العناصر النائبة للموضوع', + 'general' => 'عام', + 'name' => 'الاسم', + ], + 'edit' => [ + 'title' => 'تعديل قالب البريد الإلكتروني', + 'save-btn' => 'حفظ قالب البريد الإلكتروني', + 'email-template' => 'قالب البريد الإلكتروني', + 'subject' => 'الموضوع', + 'content' => 'المحتوى', + 'subject-placeholders' => 'العناصر النائبة للموضوع', + 'general' => 'عام', + 'name' => 'الاسم', + ], + ], + 'marketing' => [ + 'events' => [ + 'index' => [ + 'create-btn' => 'إنشاء حدث', + 'title' => 'الأحداث', + 'create-success' => 'تم إنشاء الحدث بنجاح.', + 'update-success' => 'تم تحديث الحدث بنجاح.', + 'delete-success' => 'تم حذف الحدث بنجاح.', + 'delete-failed' => 'لا يمكن حذف الحدث.', + 'mass-delete-success' => 'تم حذف الأحداث بنجاح', + 'datagrid' => [ + 'delete' => 'حذف', + 'edit' => 'تحرير', + 'id' => 'المعرف', + 'name' => 'الاسم', + 'description' => 'الوصف', + 'date' => 'التاريخ', + ], + 'create' => [ + 'title' => 'إنشاء حدث', + 'name' => 'الاسم', + 'date' => 'التاريخ', + 'description' => 'الوصف', + 'save-btn' => 'حفظ الحدث', + ], + 'edit' => [ + 'title' => 'تحرير الحدث', + ], + ], + ], + 'campaigns' => [ + 'index' => [ + 'create-btn' => 'إنشاء حملة', + 'title' => 'الحملات', + 'create-success' => 'تم إنشاء الحملة بنجاح.', + 'update-success' => 'تم تحديث الحملة بنجاح.', + 'delete-success' => 'تم حذف الحملة بنجاح.', + 'delete-failed' => 'لا يمكن حذف الحملة.', + 'mass-delete-success' => 'تم حذف الحملات بنجاح.', + 'datagrid' => [ + 'id' => 'المعرف', + 'name' => 'الاسم', + 'subject' => 'الموضوع', + 'status' => 'الحالة', + 'active' => 'نشط', + 'inactive' => 'غير نشط', + 'edit' => 'تحرير', + 'delete' => 'حذف', + ], + 'create' => [ + 'title' => 'إنشاء حملة', + 'name' => 'الاسم', + 'type' => 'النوع', + 'subject' => 'الموضوع', + 'event' => 'الحدث', + 'email-template' => 'نموذج البريد الإلكتروني', + 'status' => 'الحالة', + ], + 'edit' => [ + 'title' => 'تحرير الحملة', + ], + ], + ], + ], + 'tags' => [ + 'index' => [ + 'create-btn' => 'إنشاء وسم', + 'title' => 'الوسوم', + 'create-success' => 'تم إنشاء الوسم بنجاح.', + 'update-success' => 'تم تحديث الوسم بنجاح.', + 'delete-success' => 'تم حذف الوسم بنجاح.', + 'delete-failed' => 'لا يمكن حذف الوسم.', + 'datagrid' => [ + 'delete' => 'حذف', + 'edit' => 'تعديل', + 'id' => 'المعرف', + 'name' => 'الاسم', + 'users' => 'المستخدمون', + 'created-at' => 'تم الإنشاء في', + ], + 'create' => [ + 'name' => 'الاسم', + 'save-btn' => 'حفظ الوسم', + 'title' => 'إنشاء وسم', + 'color' => 'اللون', + ], + 'edit' => [ + 'title' => 'تعديل الوسم', + ], + ], + ], + 'users' => [ + 'index' => [ + 'create-btn' => 'إنشاء مستخدم', + 'create-success' => 'تم إنشاء المستخدم بنجاح.', + 'delete-failed' => 'لا يمكن حذف المستخدم.', + 'delete-success' => 'تم حذف المستخدم بنجاح.', + 'last-delete-error' => 'مطلوب مستخدم واحد على الأقل.', + 'mass-delete-failed' => 'لا يمكن حذف المستخدمين.', + 'mass-delete-success' => 'تم حذف المستخدمين بنجاح.', + 'mass-update-failed' => 'لا يمكن تحديث المستخدمين.', + 'mass-update-success' => 'تم تحديث المستخدمين بنجاح.', + 'title' => 'المستخدمون', + 'update-success' => 'تم تحديث المستخدم بنجاح.', + 'user-define-error' => 'لا يمكن حذف مستخدم النظام.', + 'active' => 'نشط', + 'inactive' => 'غير نشط', + 'datagrid' => [ + 'active' => 'نشط', + 'created-at' => 'تم الإنشاء في', + 'delete' => 'حذف', + 'edit' => 'تعديل', + 'email' => 'البريد الإلكتروني', + 'id' => 'المعرف', + 'inactive' => 'غير نشط', + 'name' => 'الاسم', + 'status' => 'الحالة', + 'update-status' => 'تحديث الحالة', + 'users' => 'المستخدمون', + ], + 'create' => [ + 'confirm-password' => 'تأكيد كلمة المرور', + 'email' => 'البريد الإلكتروني', + 'general' => 'عام', + 'global' => 'عالمي', + 'group' => 'مجموعة', + 'individual' => 'فردي', + 'name' => 'الاسم', + 'password' => 'كلمة المرور', + 'permission' => 'الصلاحية', + 'role' => 'الدور', + 'save-btn' => 'حفظ المستخدم', + 'status' => 'الحالة', + 'title' => 'إنشاء مستخدم', + 'view-permission' => 'عرض الصلاحية', + 'select-at-lest-one-group' => 'Select at least one group', + ], + 'edit' => [ + 'title' => 'تعديل المستخدم', + ], + ], + ], + 'pipelines' => [ + 'index' => [ + 'title' => 'خطوط الأنابيب', + 'create-btn' => 'إنشاء خط أنابيب', + 'create-success' => 'تم إنشاء خط الأنابيب بنجاح.', + 'update-success' => 'تم تحديث خط الأنابيب بنجاح.', + 'default-required' => 'مطلوب وجود خط أنابيب افتراضي واحد على الأقل.', + 'delete-success' => 'تم حذف خط الأنابيب بنجاح.', + 'delete-failed' => 'لا يمكن حذف خط الأنابيب.', + 'default-delete-error' => 'لا يمكن حذف خط الأنابيب الافتراضي.', + 'datagrid' => [ + 'delete' => 'حذف', + 'edit' => 'تعديل', + 'id' => 'المعرف', + 'is-default' => 'افتراضي', + 'name' => 'الاسم', + 'no' => 'لا', + 'rotten-days' => 'أيام التعفن', + 'yes' => 'نعم', + ], + ], + 'create' => [ + 'title' => 'إنشاء خط أنابيب', + 'save-btn' => 'حفظ خط الأنابيب', + 'name' => 'الاسم', + 'rotten-days' => 'أيام التعفن', + 'mark-as-default' => 'تعيين كافتراضي', + 'general' => 'عام', + 'probability' => 'الاحتمالية (%)', + 'new-stage' => 'جديد', + 'won-stage' => 'فاز', + 'lost-stage' => 'خسر', + 'stage-btn' => 'إضافة مرحلة', + 'stages' => 'المراحل', + 'duplicate-name' => 'لا يمكن تكرار حقل "الاسم"', + 'delete-stage' => 'حذف المرحلة', + 'add-new-stages' => 'إضافة مراحل جديدة', + 'add-stage-info' => 'أضف مرحلة جديدة لخط الأنابيب الخاص بك', + 'newly-added' => 'تمت الإضافة حديثًا', + 'stage-delete-success' => 'تم حذف المرحلة بنجاح', + ], + 'edit' => [ + 'title' => 'تعديل خط الأنابيب', + 'save-btn' => 'حفظ خط الأنابيب', + 'name' => 'الاسم', + 'rotten-days' => 'أيام التعفن', + 'mark-as-default' => 'تعيين كافتراضي', + 'general' => 'عام', + 'probability' => 'الاحتمالية (%)', + 'new-stage' => 'جديد', + 'won-stage' => 'فاز', + 'lost-stage' => 'خسر', + 'stage-btn' => 'إضافة مرحلة', + 'stages' => 'المراحل', + 'duplicate-name' => 'لا يمكن تكرار حقل "الاسم"', + 'delete-stage' => 'حذف المرحلة', + 'add-new-stages' => 'إضافة مراحل جديدة', + 'add-stage-info' => 'أضف مرحلة جديدة لخط الأنابيب الخاص بك', + 'stage-delete-success' => 'تم حذف المرحلة بنجاح', + ], + ], + 'webhooks' => [ + 'index' => [ + 'title' => 'الويب هوكس', + 'create-btn' => 'إنشاء ويب هوك', + 'create-success' => 'تم إنشاء الويب هوك بنجاح.', + 'update-success' => 'تم تحديث الويب هوك بنجاح.', + 'delete-success' => 'تم حذف الويب هوك بنجاح.', + 'delete-failed' => 'لا يمكن حذف الويب هوك.', + 'datagrid' => [ + 'id' => 'المعرف', + 'delete' => 'حذف', + 'edit' => 'تعديل', + 'name' => 'الاسم', + 'entity-type' => 'نوع الكيان', + 'end-point' => 'نقطة النهاية', + ], + ], + 'create' => [ + 'title' => 'إنشاء ويب هوك', + 'save-btn' => 'حفظ الويب هوك', + 'info' => 'أدخل تفاصيل الويب هوكس', + 'url-and-parameters' => 'الرابط والمعلمات', + 'method' => 'الطريقة', + 'post' => 'إرسال', + 'put' => 'تحديث', + 'url-endpoint' => 'نقطة نهاية الرابط', + 'parameters' => 'المعلمات', + 'add-new-parameter' => 'إضافة معلمة جديدة', + 'url-preview' => 'معاينة الرابط:', + 'headers' => 'الرؤوس', + 'add-new-header' => 'إضافة رأس جديد', + 'body' => 'الجسم', + 'default' => 'افتراضي', + 'x-www-form-urlencoded' => 'x-www-form-urlencoded', + 'key-and-value' => 'المفتاح والقيمة', + 'add-new-payload' => 'إضافة حمولة جديدة', + 'raw' => 'خام', + 'general' => 'عام', + 'name' => 'الاسم', + 'entity-type' => 'نوع الكيان', + 'insert-placeholder' => 'إدراج العنصر النائب', + 'description' => 'الوصف', + 'json' => 'Json', + 'text' => 'نص', + ], + 'edit' => [ + 'title' => 'تعديل الويب هوك', + 'edit-btn' => 'حفظ الويب هوك', + 'save-btn' => 'حفظ الويب هوك', + 'info' => 'أدخل تفاصيل الويب هوكس', + 'url-and-parameters' => 'الرابط والمعلمات', + 'method' => 'الطريقة', + 'post' => 'إرسال', + 'put' => 'تحديث', + 'url-endpoint' => 'نقطة نهاية الرابط', + 'parameters' => 'المعلمات', + 'add-new-parameter' => 'إضافة معلمة جديدة', + 'url-preview' => 'معاينة الرابط:', + 'headers' => 'الرؤوس', + 'add-new-header' => 'إضافة رأس جديد', + 'body' => 'الجسم', + 'default' => 'افتراضي', + 'x-www-form-urlencoded' => 'x-www-form-urlencoded', + 'key-and-value' => 'المفتاح والقيمة', + 'add-new-payload' => 'إضافة حمولة جديدة', + 'raw' => 'خام', + 'general' => 'عام', + 'name' => 'الاسم', + 'entity-type' => 'نوع الكيان', + 'insert-placeholder' => 'إدراج العنصر النائب', + 'description' => 'الوصف', + 'json' => 'Json', + 'text' => 'نص', + ], + ], + 'warehouses' => [ + 'index' => [ + 'title' => 'المستودعات', + 'create-btn' => 'إنشاء مستودع', + 'create-success' => 'تم إنشاء المستودع بنجاح.', + 'name-exists' => 'اسم المستودع موجود بالفعل.', + 'update-success' => 'تم تحديث المستودع بنجاح.', + 'delete-success' => 'تم حذف المستودع بنجاح.', + 'delete-failed' => 'لا يمكن حذف المستودع.', + 'datagrid' => [ + 'id' => 'المعرف', + 'name' => 'الاسم', + 'contact-name' => 'اسم جهة الاتصال', + 'delete' => 'حذف', + 'edit' => 'تعديل', + 'view' => 'عرض', + 'created-at' => 'تم الإنشاء في', + 'products' => 'المنتجات', + 'contact-emails' => 'البريد الإلكتروني للاتصال', + 'contact-numbers' => 'أرقام الاتصال', + ], + ], + 'create' => [ + 'title' => 'إنشاء مستودع', + 'save-btn' => 'حفظ المستودع', + 'contact-info' => 'معلومات الاتصال', + ], + 'edit' => [ + 'title' => 'تعديل المستودع', + 'save-btn' => 'حفظ المستودع', + 'contact-info' => 'معلومات الاتصال', + ], + 'view' => [ + 'all' => 'الكل', + 'notes' => 'الملاحظات', + 'files' => 'الملفات', + 'location' => 'الموقع', + 'change-logs' => 'سجلات التغيير', + 'locations' => [ + 'action' => 'إجراء', + 'add-location' => 'إضافة موقع', + 'create-success' => 'تم إنشاء الموقع بنجاح.', + 'delete' => 'حذف', + 'delete-failed' => 'لا يمكن حذف الموقع.', + 'delete-success' => 'تم حذف الموقع بنجاح.', + 'name' => 'الاسم', + 'save-btn' => 'حفظ', + ], + 'general-information' => [ + 'title' => 'معلومات عامة', + ], + 'contact-information' => [ + 'title' => 'معلومات الاتصال', + ], + ], + ], + 'attributes' => [ + 'index' => [ + 'title' => 'السمات', + 'create-btn' => 'إنشاء سمة', + 'create-success' => 'تم إنشاء السمة بنجاح.', + 'update-success' => 'تم تحديث السمة بنجاح.', + 'delete-success' => 'تم حذف السمة بنجاح.', + 'delete-failed' => 'لا يمكن حذف السمة.', + 'user-define-error' => 'لا يمكن حذف سمة النظام.', + 'mass-delete-failed' => 'لا يمكن حذف سمات النظام.', + 'datagrid' => [ + 'yes' => 'نعم', + 'no' => 'لا', + 'id' => 'المعرف', + 'code' => 'الرمز', + 'name' => 'الاسم', + 'entity-type' => 'نوع الكيان', + 'type' => 'النوع', + 'is-default' => 'افتراضي', + 'edit' => 'تعديل', + 'delete' => 'حذف', + 'entity-types' => [ + 'leads' => 'العملاء المحتملين', + 'organizations' => 'المنظمات', + 'persons' => 'الأشخاص', + 'products' => 'المنتجات', + 'quotes' => 'عروض الأسعار', + 'warehouses' => 'المستودعات', + ], + 'types' => [ + 'text' => 'نص', + 'textarea' => 'منطقة نصية', + 'price' => 'سعر', + 'boolean' => 'قيمة منطقية', + 'select' => 'قائمة منسدلة', + 'multiselect' => 'اختيار متعدد', + 'checkbox' => 'مربع اختيار', + 'email' => 'بريد إلكتروني', + 'address' => 'عنوان', + 'phone' => 'هاتف', + 'lookup' => 'بحث', + 'datetime' => 'تاريخ ووقت', + 'date' => 'تاريخ', + 'image' => 'صورة', + 'file' => 'ملف', + ], + ], + ], + 'create' => [ + 'title' => 'إنشاء سمة', + 'save-btn' => 'حفظ السمة', + 'code' => 'الرمز', + 'name' => 'الاسم', + 'entity-type' => 'نوع الكيان', + 'type' => 'النوع', + 'validations' => 'التحققات', + 'is-required' => 'مطلوب', + 'input-validation' => 'التحقق من الإدخال', + 'is-unique' => 'فريد', + 'labels' => 'التسميات', + 'general' => 'عام', + 'numeric' => 'رقمي', + 'decimal' => 'عشري', + 'url' => 'رابط', + 'options' => 'الخيارات', + 'option-type' => 'نوع الخيار', + 'lookup-type' => 'نوع البحث', + 'add-option' => 'إضافة خيار', + 'save-option' => 'حفظ الخيار', + 'option-name' => 'اسم الخيار', + 'add-attribute-options' => 'إضافة خيارات السمة', + 'text' => 'نص', + 'textarea' => 'منطقة نص', + 'price' => 'السعر', + 'boolean' => 'منطقي', + 'select' => 'اختيار', + 'multiselect' => 'اختيار متعدد', + 'email' => 'بريد إلكتروني', + 'address' => 'عنوان', + 'phone' => 'هاتف', + 'datetime' => 'تاريخ ووقت', + 'date' => 'تاريخ', + 'image' => 'صورة', + 'file' => 'ملف', + 'lookup' => 'بحث', + 'entity_type' => 'نوع الكيان', + 'checkbox' => 'خانة اختيار', + 'is_required' => 'مطلوب', + 'is_unique' => 'فريد', + 'actions' => 'الإجراءات', + ], + 'edit' => [ + 'actions' => 'الإجراءات', + 'add-attribute-options' => 'إضافة خيارات السمة', + 'add-option' => 'إضافة خيار', + 'address' => 'عنوان', + 'boolean' => 'منطقي', + 'checkbox' => 'خانة اختيار', + 'code' => 'الرمز', + 'date' => 'تاريخ', + 'datetime' => 'تاريخ ووقت', + 'decimal' => 'عشري', + 'email' => 'بريد إلكتروني', + 'entity-type' => 'نوع الكيان', + 'entity_type' => 'نوع الكيان', + 'file' => 'ملف', + 'general' => 'عام', + 'image' => 'صورة', + 'input-validation' => 'التحقق من الإدخال', + 'is-required' => 'مطلوب', + 'is-unique' => 'فريد', + 'is_required' => 'مطلوب', + 'is_unique' => 'فريد', + 'labels' => 'التسميات', + 'lookup' => 'بحث', + 'lookup-type' => 'نوع البحث', + 'multiselect' => 'اختيار متعدد', + 'name' => 'الاسم', + 'numeric' => 'رقمي', + 'option-deleted' => 'Attribute Option is deleted successfully', + 'option-name' => 'اسم الخيار', + 'option-type' => 'نوع الخيار', + 'options' => 'الخيارات', + 'phone' => 'هاتف', + 'price' => 'السعر', + 'save-btn' => 'حفظ السمة', + 'save-option' => 'حفظ الخيار', + 'select' => 'اختيار', + 'text' => 'نص', + 'textarea' => 'منطقة نص', + 'title' => 'تعديل السمة', + 'type' => 'النوع', + 'url' => 'رابط', + 'validations' => 'التحققات', + ], + ], + 'data-transfer' => [ + 'imports' => [ + 'create' => [ + 'action' => 'إجراء', + 'allowed-errors' => 'الأخطاء المسموح بها', + 'back-btn' => 'عودة', + 'create-update' => 'إنشاء/تحديث', + 'delete' => 'حذف', + 'download-sample' => 'تنزيل العينة', + 'field-separator' => 'فاصل الحقول', + 'file' => 'ملف', + 'general' => 'عام', + 'images-directory' => 'مسار دليل الصور', + 'process-in-queue' => 'معالجة في قائمة الانتظار', + 'results' => 'النتائج', + 'save-btn' => 'حفظ الاستيراد', + 'settings' => 'الإعدادات', + 'skip-errors' => 'تخطي الأخطاء', + 'stop-on-errors' => 'التوقف عند الأخطاء', + 'title' => 'إنشاء استيراد', + 'type' => 'النوع', + 'validation-strategy' => 'استراتيجية التحقق', + ], + 'edit' => [ + 'action' => 'إجراء', + 'allowed-errors' => 'الأخطاء المسموح بها', + 'back-btn' => 'عودة', + 'create-update' => 'إنشاء/تحديث', + 'delete' => 'حذف', + 'download-sample' => 'تنزيل العينة', + 'field-separator' => 'فاصل الحقول', + 'file' => 'ملف', + 'general' => 'عام', + 'images-directory' => 'مسار دليل الصور', + 'process-in-queue' => 'معالجة في قائمة الانتظار', + 'results' => 'النتائج', + 'save-btn' => 'حفظ الاستيراد', + 'settings' => 'الإعدادات', + 'skip-errors' => 'تخطي الأخطاء', + 'stop-on-errors' => 'التوقف عند الأخطاء', + 'title' => 'تحرير الاستيراد', + 'type' => 'النوع', + 'validation-strategy' => 'استراتيجية التحقق', + ], + 'index' => [ + 'button-title' => 'إنشاء استيراد', + 'title' => 'الاستيرادات', + 'datagrid' => [ + 'actions' => 'الإجراءات', + 'completed-at' => 'اكتمل في', + 'created' => 'تم الإنشاء', + 'delete' => 'حذف', + 'deleted' => 'تم الحذف', + 'edit' => 'تحرير', + 'error-file' => 'ملف الأخطاء', + 'id' => 'الرقم التعريفي', + 'started-at' => 'بدأ في', + 'state' => 'الحالة', + 'summary' => 'الملخص', + 'type' => 'النوع', + 'updated' => 'تم التحديث', + 'uploaded-file' => 'الملف المرفوع', + ], + ], + 'import' => [ + 'back-btn' => 'عودة', + 'completed-batches' => 'إجمالي الدفعات المكتملة:', + 'download-error-report' => 'تنزيل التقرير الكامل', + 'edit-btn' => 'تحرير', + 'imported-info' => 'تهانينا! تم استيرادك بنجاح.', + 'importing-info' => 'الاستيراد قيد المعالجة', + 'indexing-info' => 'تجميع الموارد (الأسعار، المخزون و Elastic Search) جارٍ', + 'linking-info' => 'ربط الموارد جارٍ', + 'progress' => 'التقدم:', + 'title' => 'استيراد', + 'total-batches' => 'إجمالي الدفعات:', + 'total-created' => 'إجمالي السجلات التي تم إنشاؤها:', + 'total-deleted' => 'إجمالي السجلات المحذوفة:', + 'total-errors' => 'إجمالي الأخطاء:', + 'total-invalid-rows' => 'إجمالي الصفوف غير الصالحة:', + 'total-rows-processed' => 'إجمالي الصفوف المعالجة:', + 'total-updated' => 'إجمالي السجلات التي تم تحديثها:', + 'validate' => 'التحقق', + 'validate-info' => 'انقر على التحقق من البيانات لفحص الاستيراد.', + 'validating-info' => 'بدأت قراءة البيانات والتحقق منها', + 'validation-failed-info' => 'استيرادك غير صالح. يرجى إصلاح الأخطاء التالية والمحاولة مرة أخرى.', + 'validation-success-info' => 'استيرادك صالح. انقر على استيراد لبدء عملية الاستيراد.', + ], + 'create-success' => 'تم إنشاء الاستيراد بنجاح.', + 'delete-failed' => 'فشل حذف الاستيراد بشكل غير متوقع.', + 'delete-success' => 'تم حذف الاستيراد بنجاح.', + 'not-valid' => 'الاستيراد غير صالح', + 'nothing-to-import' => 'لا توجد موارد لاستيرادها.', + 'setup-queue-error' => 'يرجى تغيير برنامج تشغيل قائمة الانتظار إلى "قاعدة البيانات" أو "ريديس" لبدء عملية الاستيراد.', + 'update-success' => 'تم تحديث الاستيراد بنجاح.', + ], + ], + ], + 'activities' => [ + 'index' => [ + 'title' => 'الأنشطة', + 'datagrid' => [ + 'comment' => 'تعليق', + 'created_at' => 'تاريخ الإنشاء', + 'created_by' => 'تم الإنشاء بواسطة', + 'edit' => 'تحرير', + 'id' => 'المعرف', + 'done' => 'تم', + 'not-done' => 'لم يتم', + 'lead' => 'القيادة', + 'mass-delete' => 'حذف جماعي', + 'mass-update' => 'تحديث جماعي', + 'schedule-from' => 'جدولة من', + 'schedule-to' => 'جدولة إلى', + 'schedule_from' => 'جدولة من', + 'schedule_to' => 'جدولة إلى', + 'title' => 'العنوان', + 'is_done' => 'تم', + 'type' => 'النوع', + 'update' => 'تحديث', + 'call' => 'مكالمة', + 'meeting' => 'اجتماع', + 'lunch' => 'غداء', + ], + ], + 'edit' => [ + 'title' => 'تحرير النشاط', + 'back-btn' => 'رجوع', + 'save-btn' => 'حفظ النشاط', + 'type' => 'نوع النشاط', + 'call' => 'مكالمة', + 'meeting' => 'اجتماع', + 'lunch' => 'غداء', + 'schedule_to' => 'جدولة إلى', + 'schedule_from' => 'جدولة من', + 'location' => 'الموقع', + 'comment' => 'تعليق', + 'lead' => 'القيادة', + 'participants' => 'المشاركون', + 'general' => 'عام', + 'persons' => 'الأشخاص', + 'no-result-found' => 'لم يتم العثور على سجلات.', + 'users' => 'المستخدمون', + ], + 'updated' => 'تم تحديث :attribute', + 'created' => 'تم الإنشاء', + 'duration-overlapping' => 'لدى المشاركين اجتماع آخر في هذا الوقت. هل تريد المتابعة؟', + 'create-success' => 'تم إنشاء النشاط بنجاح.', + 'update-success' => 'تم تحديث النشاط بنجاح.', + 'overlapping-error' => 'لدى المشاركين اجتماع آخر في هذا الوقت.', + 'destroy-success' => 'تم حذف النشاط بنجاح.', + 'delete-failed' => 'لا يمكن حذف النشاط.', + 'mass-update-success' => 'تم تحديث الأنشطة بنجاح.', + 'mass-destroy-success' => 'تم حذف الأنشطة بنجاح.', + 'mass-delete-failed' => 'لا يمكن حذف الأنشطة.', + ], + 'mail' => [ + 'index' => [ + 'compose' => 'إنشاء', + 'draft' => 'مسودة', + 'inbox' => 'الوارد', + 'outbox' => 'الصادر', + 'sent' => 'تم الإرسال', + 'trash' => 'المهملات', + 'compose-mail-btn' => 'إنشاء بريد', + 'btn' => 'البريد', + 'mail' => [ + 'title' => 'إنشاء بريد', + 'to' => 'إلى', + 'enter-emails' => 'اضغط على Enter لإضافة البريد الإلكتروني', + 'cc' => 'نسخة إلى', + 'bcc' => 'نسخة مخفية إلى', + 'subject' => 'الموضوع', + 'send-btn' => 'إرسال', + 'message' => 'الرسالة', + 'draft' => 'مسودة', + ], + 'datagrid' => [ + 'id' => 'المعرف', + 'from' => 'من', + 'to' => 'إلى', + 'subject' => 'الموضوع', + 'tags' => 'العلامات', + 'content' => 'المحتوى', + 'attachments' => 'المرفقات', + 'date' => 'التاريخ', + 'move-to-inbox' => 'نقل إلى البريد الوارد', + 'move-to-trash' => 'تم النقل إلى سلة المهملات', + 'edit' => 'تعديل', + 'view' => 'عرض', + 'delete' => 'حذف', + ], + ], + 'create-success' => 'تم إرسال البريد الإلكتروني بنجاح.', + 'update-success' => 'تم تحديث البريد الإلكتروني بنجاح.', + 'mass-update-success' => 'تم تحديث البريد الإلكتروني بنجاح.', + 'delete-success' => 'تم حذف البريد الإلكتروني بنجاح.', + 'delete-failed' => 'لا يمكن حذف البريد الإلكتروني.', + 'view' => [ + 'title' => 'الرسائل', + 'subject' => ':الموضوع', + 'link-mail' => 'ربط البريد', + 'to' => 'إلى', + 'cc' => 'نسخة إلى', + 'bcc' => 'نسخة مخفية إلى', + 'reply' => 'رد', + 'reply-all' => 'رد على الجميع', + 'forward' => 'إعادة توجيه', + 'delete' => 'حذف', + 'enter-mails' => 'أدخل معرف البريد الإلكتروني', + 'rotten-days' => 'العميل المحتمل مهمل لمدة :days يومًا', + 'search-an-existing-lead' => 'البحث عن عميل محتمل موجود', + 'search-an-existing-contact' => 'البحث عن جهة اتصال موجودة', + 'message' => 'الرسالة', + 'add-attachments' => 'إضافة مرفقات', + 'discard' => 'تجاهل', + 'send' => 'إرسال', + 'no-result-found' => 'لم يتم العثور على نتائج', + 'add-new-contact' => 'إضافة جهة اتصال جديدة', + 'description' => 'الوصف', + 'search' => 'بحث...', + 'add-new-lead' => 'إضافة عميل محتمل جديد', + 'create-new-contact' => 'إنشاء جهة اتصال جديدة', + 'save-contact' => 'حفظ جهة الاتصال', + 'create-lead' => 'إنشاء عميل محتمل', + 'linked-contact' => 'جهة الاتصال المرتبطة', + 'link-to-contact' => 'ربط بجهة اتصال', + 'link-to-lead' => 'ربط بالعميل المحتمل', + 'linked-lead' => 'العميل المحتمل المرتبط', + 'lead-details' => 'تفاصيل العميل المحتمل', + 'contact-person' => 'الشخص المسؤول', + 'product' => 'المنتج', + 'tags' => [ + 'create-success' => 'تم إنشاء العلامة بنجاح.', + 'destroy-success' => 'تم حذف العلامة بنجاح.', + ], + ], + ], + 'common' => [ + 'custom-attributes' => [ + 'add-more' => 'أضف المزيد', + 'address' => 'العنوان', + 'city' => 'المدينة', + 'contact' => 'أرقام الاتصال', + 'country' => 'الدولة', + 'email' => 'البريد الإلكتروني', + 'home' => 'المنزل', + 'postcode' => 'الرمز البريدي', + 'save' => 'حفظ', + 'select' => 'اختر', + 'select-country' => 'اختر الدولة', + 'select-state' => 'اختر الولاية', + 'state' => 'الولاية', + 'update-contact-title' => 'تحديث أرقام الاتصال', + 'update-emails-title' => 'تحديث عناوين البريد الإلكتروني', + 'work' => 'العمل', + ], + ], + 'leads' => [ + 'create-success' => 'تم إنشاء العميل المحتمل بنجاح.', + 'update-success' => 'تم تحديث العميل المحتمل بنجاح.', + 'update-failed' => 'Leads can not be deleted.', + 'destroy-success' => 'تم حذف العميل المحتمل بنجاح.', + 'destroy-failed' => 'لا يمكن حذف العميل المحتمل.', + 'file' => [ + 'data-not-found' => 'البيانات غير موجودة.', + 'empty-content' => 'محتوى PDF فارغ أو لم يتم استخراجه.', + 'failed-extract' => 'فشل في استخراج النص من الملف.', + 'insufficient-info' => 'بسبب نقص البيانات، لا يمكننا معالجة طلبك في الوقت الحالي.', + 'invalid-base64' => 'تنسيق base64 غير صالح.', + 'invalid-format' => 'تنسيق JSON غير صالح.', + 'invalid-response' => 'تنسيق استجابة الذكاء الاصطناعي غير صالح.', + 'missing-api-key' => 'مفتاح API أو تكوين النموذج مفقود.', + 'not-found' => 'الملف غير موجود.', + 'recursive-call' => 'تم الكشف عن استدعاء متكرر.', + 'text-generation-failed' => 'فشل استخراج النص. قد يكون الملف فارغًا أو غير قابل للقراءة.', + ], + 'index' => [ + 'title' => 'العملاء المحتملون', + 'create-btn' => 'إنشاء عميل محتمل', + 'datagrid' => [ + 'id' => 'ID', + 'sales-person' => 'مندوب المبيعات', + 'subject' => 'الموضوع', + 'source' => 'المصدر', + 'lead-value' => 'قيمة العميل المحتمل', + 'lead-type' => 'نوع العميل المحتمل', + 'tag-name' => 'اسم العلامة', + 'contact-person' => 'شخص الاتصال', + 'stage' => 'المرحلة', + 'rotten-lead' => 'عميل محتمل متعفن', + 'date-to' => 'تاريخ إلى', + 'created-at' => 'تم الإنشاء في', + 'no' => 'لا', + 'yes' => 'نعم', + 'delete' => 'حذف', + 'mass-delete' => 'حذف جماعي', + 'mass-update' => 'تحديث جماعي', + ], + 'kanban' => [ + 'rotten-days' => 'العميل الفاسد منذ :days أيام', + 'empty-list' => 'قائمة العملاء الخاصة بك فارغة', + 'empty-list-description' => 'قم بإنشاء عميل لتنظيم أهدافك.', + 'create-lead-btn' => 'إنشاء عميل', + 'columns' => [ + 'contact-person' => 'شخص الاتصال', + 'id' => 'ID', + 'lead-type' => 'نوع العميل المحتمل', + 'lead-value' => 'قيمة العميل المحتمل', + 'sales-person' => 'مندوب المبيعات', + 'source' => 'المصدر', + 'title' => 'العنوان', + 'tags' => 'العلامات', + 'expected-close-date' => 'تاريخ الإغلاق المتوقع', + 'created-at' => 'تم الإنشاء في', + ], + 'toolbar' => [ + 'search' => [ + 'title' => 'البحث حسب العنوان', + ], + 'filters' => [ + 'apply-filters' => 'تطبيق الفلاتر', + 'clear-all' => 'مسح الكل', + 'filter' => 'تصفية', + 'filters' => 'الفلاتر', + 'from' => 'من', + 'select' => 'اختر', + 'to' => 'إلى', + ], + ], + ], + 'view-switcher' => [ + 'all-pipelines' => 'كل المسارات', + 'create-new-pipeline' => 'إنشاء مسار جديد', + ], + 'upload' => [ + 'create-lead' => 'إنشاء عميل محتمل باستخدام الذكاء الاصطناعي', + 'file' => 'رفع ملف', + 'file-info' => 'يتم قبول الملفات بتنسيق pdf, bmp, jpg, jpeg, png فقط.', + 'file-required' => 'يرجى اختيار ملف صالح واحد على الأقل للمتابعة.', + 'save-btn' => 'حفظ', + 'upload-file' => 'رفع الملف', + ], + ], + 'create' => [ + 'title' => 'إنشاء عميل محتمل', + 'save-btn' => 'حفظ', + 'details' => 'التفاصيل', + 'details-info' => 'ضع المعلومات الأساسية للعميل المحتمل', + 'contact-person' => 'شخص الاتصال', + 'contact-info' => 'معلومات عن شخص الاتصال', + 'products' => 'المنتجات', + 'products-info' => 'معلومات عن المنتجات', + ], + 'edit' => [ + 'title' => 'تعديل العميل المحتمل', + 'save-btn' => 'حفظ', + 'details' => 'التفاصيل', + 'details-info' => 'ضع المعلومات الأساسية للعميل المحتمل', + 'contact-person' => 'شخص الاتصال', + 'contact-info' => 'معلومات عن شخص الاتصال', + 'products' => 'المنتجات', + 'products-info' => 'معلومات عن المنتجات', + ], + 'common' => [ + 'contact' => [ + 'name' => 'الاسم', + 'email' => 'البريد الإلكتروني', + 'contact-number' => 'رقم الاتصال', + 'organization' => 'المنظمة', + ], + 'products' => [ + 'product-name' => 'اسم المنتج', + 'quantity' => 'الكمية', + 'price' => 'السعر', + 'amount' => 'المبلغ', + 'action' => 'الإجراء', + 'add-more' => 'أضف المزيد', + 'total' => 'الإجمالي', + ], + ], + 'view' => [ + 'title' => 'الفرصة: :title', + 'rotten-days' => ':days أيام', + 'tabs' => [ + 'description' => 'الوصف', + 'products' => 'المنتجات', + 'quotes' => 'الاقتباسات', + ], + 'attributes' => [ + 'title' => 'حول الفرصة', + ], + 'quotes' => [ + 'subject' => 'الموضوع', + 'expired-at' => 'تنتهي في', + 'sub-total' => 'المجموع الفرعي', + 'discount' => 'الخصم', + 'tax' => 'الضريبة', + 'adjustment' => 'التعديل', + 'grand-total' => 'المجموع الكلي', + 'delete' => 'حذف', + 'edit' => 'تعديل', + 'download' => 'تحميل', + 'destroy-success' => 'تم حذف العرض بنجاح.', + 'empty-title' => 'لا توجد عروض', + 'empty-info' => 'لم يتم العثور على عروض لهذه الفرصة', + 'add-btn' => 'إضافة عرض', + ], + 'products' => [ + 'product-name' => 'اسم المنتج', + 'quantity' => 'الكمية', + 'price' => 'السعر', + 'amount' => 'المبلغ', + 'action' => 'الإجراء', + 'add-more' => 'إضافة المزيد', + 'total' => 'الإجمالي', + 'empty-title' => 'لا توجد منتجات', + 'empty-info' => 'لم يتم العثور على منتجات لهذه الفرصة', + 'add-product' => 'إضافة منتج', + ], + 'persons' => [ + 'title' => 'حول الأشخاص', + 'job-title' => ':job_title في :organization', + ], + 'stages' => [ + 'won-lost' => 'ربحت/خسرت', + 'won' => 'ربحت', + 'lost' => 'خسرت', + 'need-more-info' => 'تحتاج إلى مزيد من التفاصيل', + 'closed-at' => 'أغلقت في', + 'won-value' => 'قيمة الربح', + 'lost-reason' => 'سبب الخسارة', + 'save-btn' => 'حفظ', + ], + 'tags' => [ + 'create-success' => 'تم إنشاء العلامة بنجاح.', + 'destroy-success' => 'تم حذف العلامة بنجاح.', + ], + ], + ], + 'configuration' => [ + 'index' => [ + 'back' => 'رجوع', + 'delete' => 'حذف', + 'save-btn' => 'حفظ التكوين', + 'save-success' => 'تم حفظ التكوين بنجاح.', + 'search' => 'بحث', + 'select-country' => 'اختر الدولة', + 'select-state' => 'اختر الولاية', + 'title' => 'التكوين', + 'general' => [ + 'title' => 'عام', + 'info' => 'تكوين عام', + 'general' => [ + 'title' => 'عام', + 'info' => 'قم بتحديث إعداداتك العامة هنا.', + 'locale-settings' => [ + 'title' => 'إعدادات اللغة', + 'title-info' => 'تعريف اللغة المستخدمة في واجهة المستخدم، مثل العربية (ar)، الإنجليزية (en)، الإسبانية (es)، الفارسية (fa) والتركية (tr).', + ], + 'admin-logo' => [ + 'logo-image' => 'صورة الشعار', + 'title' => 'شعار الإدارة', + 'title-info' => 'تكوين صورة الشعار للوحة الإدارة الخاصة بك.', + ], + ], + 'settings' => [ + 'title' => 'Settings', + 'info' => 'Update your settings here.', + 'footer' => [ + 'info' => 'We can configure the powered by section here.', + 'powered-by' => 'Powered by text editor', + 'title' => 'Powered by Section Configurations', + ], + 'menu' => [ + 'activities' => 'Activities', + 'configuration' => 'Configuration', + 'contacts' => 'Contacts', + 'dashboard' => 'Dashboard', + 'draft' => 'Draft', + 'inbox' => 'Inbox', + 'info' => 'We can configure the menu items name here.', + 'leads' => 'Leads', + 'mail' => 'Mail', + 'organizations' => 'Organizations', + 'outbox' => 'Outbox', + 'persons' => 'Persons', + 'products' => 'Products', + 'quotes' => 'Quotes', + 'sent' => 'Sent', + 'settings' => 'Settings', + 'title' => 'Menu Item Configurations', + 'trash' => 'Trash', + ], + 'menu-color' => [ + 'brand-color' => 'Brand Color', + 'info' => 'We can change the menu items colors here.', + 'title' => 'Menu Item Color Configurations', + ], + ], + ], + 'email' => [ + 'title' => 'إعدادات البريد الإلكتروني', + 'info' => 'تكوين البريد الإلكتروني للتطبيق.', + 'imap' => [ + 'title' => 'إعدادات IMAP', + 'info' => 'تكوين البريد الإلكتروني IMAP لتلقي الرسائل.', + 'account' => [ + 'title' => 'حساب IMAP', + 'title-info' => 'قم بتكوين إعدادات حساب IMAP هنا.', + 'host' => 'المضيف', + 'port' => 'المنفذ', + 'encryption' => 'نوع التشفير', + 'validate-cert' => 'التحقق من شهادة SSL', + 'username' => 'اسم مستخدم IMAP', + 'password' => 'كلمة مرور IMAP', + ], + ], + ], + 'magic-ai' => [ + 'title' => 'الذكاء الاصطناعي السحري', + 'info' => 'تكوين الذكاء الاصطناعي السحري للتطبيق.', + 'settings' => [ + 'api-key' => 'مفتاح API', + 'api-key-info' => 'تذكر استخدام مفتاح API من OpenRouter لكل نموذج. إنها خطوة بسيطة لتعزيز الأمان والأداء.', + 'enable' => 'تمكين', + 'info' => 'عزز تجربتك مع الذكاء الاصطناعي السحري باستخدام مفتاح API من OpenRouter. قم بدمجه الآن لتجربة ذكاء اصطناعي سلسة ومخصصة لك! قم بتخصيص الإعدادات بسهولة وتحكم في رحلتك مع الذكاء الاصطناعي.', + 'other' => 'نموذج آخر', + 'other-model' => 'بالنسبة للنماذج الأخرى، استخدم معرف النموذج من OpenRouter.', + 'doc-generation' => 'توليد DOC', + 'doc-generation-info' => 'قم بتمكين ميزة توليد DOC لاستخراج البيانات تلقائيًا من ملفات DOC وتحويلها إلى تنسيق نصي. عزز إنتاجيتك وكفاءتك من خلال تفعيل هذه الميزة لتبسيط سير عملك.', + 'title' => 'الإعدادات العامة', + 'models' => [ + 'deepseek-r1' => 'Deepseek R1 Distill-llama-8b', + 'gemini-2-0-flash-001' => 'Gemini 2.0 flash-001', + 'gpt-4o' => 'GPT-4.0', + 'gpt-4o-mini' => 'GPT-4.0 mini', + 'grok-2-1212' => 'Grok 2.12', + 'llama-3-2-3b-instruct' => 'Llama 3.2 3b Instruct', + 'title' => 'النماذج', + ], + ], + ], + ], + ], + 'dashboard' => [ + 'index' => [ + 'title' => 'لوحة القيادة', + 'revenue' => [ + 'lost-revenue' => 'الإيرادات المفقودة', + 'won-revenue' => 'الإيرادات المكتسبة', + ], + 'over-all' => [ + 'average-lead-value' => 'متوسط قيمة العملاء المحتملين', + 'total-leads' => 'إجمالي العملاء المحتملين', + 'average-leads-per-day' => 'متوسط العملاء المحتملين في اليوم', + 'total-quotations' => 'إجمالي العروض', + 'total-persons' => 'إجمالي الأشخاص', + 'total-organizations' => 'إجمالي المؤسسات', + ], + 'total-leads' => [ + 'title' => 'العملاء المحتملين', + 'total' => 'إجمالي العملاء المحتملين', + 'won' => 'العملاء المحتملين المكتسبين', + 'lost' => 'العملاء المحتملين المفقودين', + ], + 'revenue-by-sources' => [ + 'title' => 'الإيرادات حسب المصادر', + 'empty-title' => 'لا توجد بيانات متاحة', + 'empty-info' => 'لا توجد بيانات متاحة للفترة المختارة', + ], + 'revenue-by-types' => [ + 'title' => 'الإيرادات حسب الأنواع', + 'empty-title' => 'لا توجد بيانات متاحة', + 'empty-info' => 'لا توجد بيانات متاحة للفترة المختارة', + ], + 'top-selling-products' => [ + 'title' => 'أفضل المنتجات مبيعاً', + 'empty-title' => 'لم يتم العثور على منتجات', + 'empty-info' => 'لا توجد منتجات متاحة للفترة المختارة', + ], + 'top-persons' => [ + 'title' => 'أفضل الأشخاص', + 'empty-title' => 'لم يتم العثور على أشخاص', + 'empty-info' => 'لا توجد أشخاص متاحة للفترة المختارة', + ], + 'open-leads-by-states' => [ + 'title' => 'العملاء المحتملين المفتوحين حسب المراحل', + 'empty-title' => 'لا توجد بيانات متاحة', + 'empty-info' => 'لا توجد بيانات متاحة للفترة المختارة', + ], + ], + ], + 'layouts' => [ + 'app-version' => 'الإصدار: :version', + 'dashboard' => 'لوحة القيادة', + 'leads' => 'العملاء المحتملين', + 'quotes' => 'العروض', + 'quote' => 'عرض', + 'mail' => [ + 'title' => 'البريد', + 'compose' => 'إنشاء رسالة', + 'inbox' => 'البريد الوارد', + 'draft' => 'المسودات', + 'outbox' => 'الصادر', + 'sent' => 'المرسل', + 'trash' => 'سلة المهملات', + 'setting' => 'الإعدادات', + ], + 'activities' => 'الأنشطة', + 'contacts' => 'جهات الاتصال', + 'persons' => 'الأشخاص', + 'person' => 'شخص', + 'organizations' => 'المؤسسات', + 'organization' => 'مؤسسة', + 'products' => 'المنتجات', + 'product' => 'منتج', + 'settings' => 'الإعدادات', + 'user' => 'المستخدم', + 'user-info' => 'إدارة جميع مستخدميك وصلاحياتهم في نظام CRM، وما يُسمح لهم بفعله.', + 'groups' => 'المجموعات', + 'groups-info' => 'إضافة أو تعديل أو حذف المجموعات من نظام CRM', + 'roles' => 'الأدوار', + 'role' => 'دور', + 'roles-info' => 'إضافة أو تعديل أو حذف الأدوار من نظام CRM', + 'users' => 'المستخدمين', + 'users-info' => 'إضافة أو تعديل أو حذف المستخدمين من نظام CRM', + 'lead' => 'عميل محتمل', + 'lead-info' => 'إدارة جميع إعدادات العملاء المحتملين الخاصة بك في نظام CRM', + 'pipelines' => 'الأنابيب', + 'pipelines-info' => 'إضافة أو تعديل أو حذف الأنابيب من نظام CRM', + 'sources' => 'المصادر', + 'sources-info' => 'إضافة أو تعديل أو حذف المصادر من نظام CRM', + 'types' => 'الأنواع', + 'types-info' => 'إضافة أو تعديل أو حذف الأنواع من نظام CRM', + 'automation' => 'الأتمتة', + 'automation-info' => 'إدارة جميع إعدادات الأتمتة الخاصة بك في نظام CRM', + 'attributes' => 'الخصائص', + 'attribute' => 'خاصية', + 'attributes-info' => 'إضافة أو تعديل أو حذف الخصائص من نظام CRM', + 'email-templates' => 'قوالب البريد الإلكتروني', + 'email' => 'البريد الإلكتروني', + 'email-templates-info' => 'إضافة أو تعديل أو حذف قوالب البريد الإلكتروني من نظام CRM', + 'events' => 'الفعاليات', + 'events-info' => 'إضافة، تعديل أو حذف الفعاليات من إدارة العلاقات', + 'campaigns' => 'الحملات', + 'campaigns-info' => 'إضافة، تعديل أو حذف الحملات من إدارة العلاقات', + 'workflows' => 'سير العمل', + 'workflows-info' => 'إضافة أو تعديل أو حذف سير العمل من نظام CRM', + 'webhooks' => 'الويب هوك', + 'webhooks-info' => 'إضافة، تحرير أو حذف الويب هوك من CRM', + 'other-settings' => 'إعدادات أخرى', + 'other-settings-info' => 'إدارة جميع إعداداتك الإضافية في نظام CRM', + 'tags' => 'العلامات', + 'tags-info' => 'إضافة أو تعديل أو حذف العلامات من نظام CRM', + 'my-account' => 'حسابي', + 'sign-out' => 'تسجيل الخروج', + 'back' => 'رجوع', + 'name' => 'الاسم', + 'configuration' => 'الإعدادات', + 'howdy' => 'مرحبا!', + 'warehouses' => 'المستودعات', + 'warehouse' => 'مستودع', + 'warehouses-info' => 'إضافة أو تعديل أو حذف المستودعات من نظام CRM', + 'data_transfer' => 'نقل البيانات', + 'data_transfer_info' => 'إدارة إعدادات نقل البيانات المتعلقة بالأشخاص والمنتجات والعملاء المحتملين في إدارة علاقات العملاء (CRM)', + ], + 'user' => [ + 'account' => [ + 'name' => 'الاسم', + 'email' => 'البريد الإلكتروني', + 'password' => 'كلمة المرور', + 'my_account' => 'حسابي', + 'update_details' => 'تحديث التفاصيل', + 'current_password' => 'كلمة المرور الحالية', + 'confirm_password' => 'تأكيد كلمة المرور', + 'password-match' => 'كلمة المرور الحالية لا تطابق.', + 'account-save' => 'تم حفظ تغييرات الحساب بنجاح.', + 'permission-denied' => 'تم رفض الإذن', + 'remove-image' => 'إزالة الصورة', + 'upload_image_pix' => 'تحميل صورة الملف الشخصي (100 بكسل × 100 بكسل)', + 'upload_image_format' => 'بصيغة PNG أو JPG', + 'image_upload_message' => 'فقط الصور (.jpeg، .jpg، .png، ..) مسموح بها.', + ], + ], + 'emails' => [ + 'common' => [ + 'dear' => 'عزيزي :name', + 'cheers' => 'مع أطيب التحيات،
    فريق :app_name', + 'user' => [ + 'dear' => 'عزيزي :username', + 'create-subject' => 'تم إضافتك كعضو.', + 'create-body' => 'تهانينا! أنت الآن عضو في فريقنا.', + 'forget-password' => [ + 'subject' => 'إعادة تعيين كلمة مرور العميل', + 'dear' => 'عزيزي :username', + 'reset-password' => 'إعادة تعيين كلمة المرور', + 'info' => 'تتلقى هذا البريد الإلكتروني لأننا تلقينا طلب إعادة تعيين كلمة المرور لحسابك', + 'final-summary' => 'إذا لم تكن قد طلبت إعادة تعيين كلمة المرور، فلا يلزم اتخاذ أي إجراء إضافي', + 'thanks' => 'شكراً!', + ], + ], + ], + ], + 'validations' => [ + 'message' => [ + 'decimal' => ':attribute يجب أن يكون رقمًا عشريًا.', + ], + ], + 'errors' => [ + 'dashboard' => 'لوحة التحكم', + 'go-back' => 'العودة', + 'support' => 'إذا استمرت المشكلة، تواصل معنا على
    :email للحصول على المساعدة.', + '404' => [ + 'description' => 'عذرًا! الصفحة التي تبحث عنها في إجازة. يبدو أننا لم نجد ما كنت تبحث عنه.', + 'title' => '404 الصفحة غير موجودة', + ], + '401' => [ + 'description' => 'عذرًا! يبدو أنك غير مصرح لك بالوصول إلى هذه الصفحة. يبدو أنك تفتقد الأوراق اللازمة.', + 'title' => '401 غير مصرح', + ], + '403' => [ + 'description' => 'عذرًا! هذه الصفحة محظورة. يبدو أنك لا تملك الأذونات اللازمة لعرض هذا المحتوى.', + 'title' => '403 ممنوع الدخول', + ], + '500' => [ + 'description' => 'عذرًا! حدث خطأ ما. يبدو أننا نواجه مشكلة في تحميل الصفحة التي تبحث عنها.', + 'title' => '500 خطأ داخلي في الخادم', + ], + '503' => [ + 'description' => 'عذرًا! يبدو أننا متوقفون مؤقتًا للصيانة. يرجى العودة لاحقًا.', + 'title' => '503 الخدمة غير متوفرة', + ], + ], + 'export' => [ + 'csv' => 'CSV', + 'download' => 'تحميل', + 'export' => 'تصدير', + 'no-records' => 'لا توجد سجلات للتصدير', + 'xls' => 'XLS', + 'xlsx' => 'XLSX', + ], +]; diff --git a/packages/Webkul/Admin/src/Resources/lang/en/app.php b/packages/Webkul/Admin/src/Resources/lang/en/app.php new file mode 100644 index 0000000..288fea6 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/lang/en/app.php @@ -0,0 +1,2440 @@ + [ + 'leads' => 'Leads', + 'lead' => 'Lead', + 'quotes' => 'Quotes', + 'mail' => 'Mail', + 'inbox' => 'Inbox', + 'draft' => 'Draft', + 'outbox' => 'Outbox', + 'sent' => 'Sent', + 'trash' => 'Trash', + 'activities' => 'Activities', + 'webhook' => 'Webhook', + 'contacts' => 'Contacts', + 'persons' => 'Persons', + 'organizations' => 'Organizations', + 'products' => 'Products', + 'settings' => 'Settings', + 'groups' => 'Groups', + 'roles' => 'Roles', + 'users' => 'Users', + 'user' => 'User', + 'automation' => 'Automation', + 'attributes' => 'Attributes', + 'pipelines' => 'Pipelines', + 'sources' => 'Sources', + 'types' => 'Types', + 'email-templates' => 'Email Templates', + 'workflows' => 'Workflows', + 'other-settings' => 'Other Settings', + 'tags' => 'Tags', + 'configuration' => 'Configuration', + 'create' => 'Create', + 'edit' => 'Edit', + 'view' => 'View', + 'print' => 'Print', + 'delete' => 'Delete', + 'export' => 'Export', + 'mass-delete' => 'Mass Delete', + 'data-transfer' => 'Data Transfer', + 'imports' => 'Imports', + 'import' => 'Import', + 'event' => 'Event', + 'campaigns' => 'Campaigns', + ], + + 'users' => [ + 'activate-warning' => 'Your account is not activated yet. Please contact the administrator.', + 'login-error' => 'The credentials do not match our records.', + 'not-permission' => 'You do not have permission to access the admin panel.', + + 'login' => [ + 'email' => 'Email Address', + 'forget-password-link' => 'Forget Password ?', + 'password' => 'Password', + 'submit-btn' => 'Sign In', + 'title' => 'Sign In', + ], + + 'forget-password' => [ + 'create' => [ + 'email' => 'Registered Email', + 'email-not-exist' => 'Email Not Exists', + 'page-title' => 'Forget Password', + 'reset-link-sent' => 'Reset Password link sent', + 'sign-in-link' => 'Back to Sign In ?', + 'submit-btn' => 'Reset', + 'title' => 'Recover Password', + ], + ], + + 'reset-password' => [ + 'back-link-title' => 'Back to Sign In ?', + 'confirm-password' => 'Confirm Password', + 'email' => 'Registered Email', + 'password' => 'Password', + 'submit-btn' => 'Reset Password', + 'title' => 'Reset Password', + ], + ], + + 'account' => [ + 'edit' => [ + 'back-btn' => 'Back', + 'change-password' => 'Change Password', + 'confirm-password' => 'Confirm Password', + 'current-password' => 'Current Password', + 'email' => 'Email', + 'general' => 'General', + 'invalid-password' => 'The current password you entered is incorrect.', + 'name' => 'Name', + 'password' => 'Password', + 'profile-image' => 'Profile Image', + 'save-btn' => 'Save Account', + 'title' => 'My Account', + 'update-success' => 'Account updated successfully', + 'upload-image-info' => 'Upload a Profile Image (110px X 110px) in PNG or JPG Format', + ], + ], + + 'components' => [ + 'activities' => [ + 'actions' => [ + 'mail' => [ + 'btn' => 'Mail', + 'title' => 'Compose Mail', + 'to' => 'To', + 'enter-emails' => 'Press enter to add emails', + 'cc' => 'CC', + 'bcc' => 'BCC', + 'subject' => 'Subject', + 'send-btn' => 'Send', + 'message' => 'Message', + ], + + 'file' => [ + 'btn' => 'File', + 'title' => 'Add File', + 'title-control' => 'Title', + 'name' => 'Name', + 'description' => 'Description', + 'file' => 'File', + 'save-btn' => 'Save File', + ], + + 'note' => [ + 'btn' => 'Note', + 'title' => 'Add Note', + 'comment' => 'Comment', + 'save-btn' => 'Save Note', + ], + + 'activity' => [ + 'btn' => 'Activity', + 'title' => 'Add Activity', + 'title-control' => 'Title', + 'description' => 'Description', + 'schedule-from' => 'Schedule From', + 'schedule-to' => 'Schedule To', + 'location' => 'Location', + 'call' => 'Call', + 'meeting' => 'Meeting', + 'lunch' => 'Lunch', + 'save-btn' => 'Save Activity', + + 'participants' => [ + 'title' => 'Participants', + 'placeholder' => 'Type to search participants', + 'users' => 'Users', + 'persons' => 'Persons', + 'no-results' => 'No result found...', + ], + ], + ], + + 'index' => [ + 'all' => 'All', + 'bcc' => 'Bcc', + 'by-user' => 'By :user', + 'calls' => 'Calls', + 'cc' => 'Cc', + 'change-log' => 'Changelogs', + 'delete' => 'Delete', + 'edit' => 'Edit', + 'emails' => 'Emails', + 'empty' => 'Empty', + 'files' => 'Files', + 'from' => 'From', + 'location' => 'Location', + 'lunches' => 'Lunches', + 'mark-as-done' => 'Mark as Done', + 'meetings' => 'Meetings', + 'notes' => 'Notes', + 'participants' => 'Participants', + 'planned' => 'Planned', + 'quotes' => 'Quotes', + 'scheduled-on' => 'Scheduled on', + 'system' => 'System', + 'to' => 'To', + 'unlink' => 'Unlink', + 'view' => 'View', + + 'empty-placeholders' => [ + 'all' => [ + 'title' => 'No Activities Found', + 'description' => 'No activities found for this. You can add activities by clicking on the Activity button on the left panel.', + ], + + 'planned' => [ + 'title' => 'No Planned Activities Found', + 'description' => 'No planned activities found for this. You can add planned activities by clicking on the Activity button on the left panel.', + ], + + 'notes' => [ + 'title' => 'No Notes Found', + 'description' => 'No notes found for this. You can add notes by clicking on the Note button on the left panel.', + ], + + 'calls' => [ + 'title' => 'No Calls Found', + 'description' => 'No calls found for this. You can add calls by clicking on the Activity button on the left panel and selecting the Call type.', + ], + + 'meetings' => [ + 'title' => 'No Meetings Found', + 'description' => 'No meetings found for this. You can add meetings by clicking on the Activity button on the left panel and selecting the Meeting type.', + ], + + 'lunches' => [ + 'title' => 'No Lunches Found', + 'description' => 'No lunches found for this. You can add lunches by clicking on the Activity button on the left panel and selecting the Lunch type.', + ], + + 'files' => [ + 'title' => 'No Files Found', + 'description' => 'No files found for this. You can add files by clicking on the File button on the left panel.', + ], + + 'emails' => [ + 'title' => 'No Emails Found', + 'description' => 'No emails found for this. You can add emails by clicking on the Mail button on the left panel.', + ], + + 'system' => [ + 'title' => 'No Changelogs Found', + 'description' => 'No changelogs found for this.', + ], + ], + ], + ], + + 'media' => [ + 'images' => [ + 'add-image-btn' => 'Add Image', + 'ai-add-image-btn' => 'Magic AI', + 'allowed-types' => 'png, jpeg, jpg', + 'not-allowed-error' => 'Only images files (.jpeg, .jpg, .png, ..) are allowed.', + + 'placeholders' => [ + 'front' => 'Front', + 'next' => 'Next', + 'size' => 'Size', + 'use-cases' => 'Use Cases', + 'zoom' => 'Zoom', + ], + ], + + 'videos' => [ + 'add-video-btn' => 'Add Video', + 'allowed-types' => 'mp4, webm, mkv', + 'not-allowed-error' => 'Only videos files (.mp4, .mov, .ogg ..) are allowed.', + ], + ], + + 'datagrid' => [ + 'index' => [ + 'no-records-selected' => 'No records have been selected.', + 'must-select-a-mass-action-option' => 'You must select a mass action\'s option.', + 'must-select-a-mass-action' => 'You must select a mass action.', + ], + + 'toolbar' => [ + 'length-of' => ':length of', + 'of' => 'of', + 'per-page' => 'Per Page', + 'results' => ':total Results', + 'delete' => 'Delete', + 'selected' => ':total Items Selected', + + 'mass-actions' => [ + 'submit' => 'Submit', + 'select-option' => 'Select Option', + 'select-action' => 'Select Action', + ], + + 'filter' => [ + 'apply-filters-btn' => 'Apply Filters', + 'back-btn' => 'Back', + 'create-new-filter' => 'Create New Filter', + 'custom-filters' => 'Custom Filters', + 'delete-error' => 'Something went wrong while deleting the filter, please try again.', + 'delete-success' => 'Filter has been deleted successfully.', + 'empty-description' => 'There is no selected filters available to save. Please select filters to save.', + 'empty-title' => 'Add Filters to Save', + 'name' => 'Name', + 'quick-filters' => 'Quick Filters', + 'save-btn' => 'Save', + 'save-filter' => 'Save Filter', + 'saved-success' => 'Filter has been saved successfully.', + 'selected-filters' => 'Selected Filters', + 'title' => 'Filter', + 'update' => 'Update', + 'update-filter' => 'Update Filter', + 'updated-success' => 'Filter has been updated successfully.', + ], + + 'search' => [ + 'title' => 'Search', + ], + ], + + 'filters' => [ + 'select' => 'Select', + 'title' => 'Filters', + + 'dropdown' => [ + 'searchable' => [ + 'at-least-two-chars' => 'Type at least 2 characters...', + 'no-results' => 'No result found...', + ], + ], + + 'custom-filters' => [ + 'clear-all' => 'Clear All', + 'title' => 'Custom Filters', + ], + + 'boolean-options' => [ + 'false' => 'False', + 'true' => 'True', + ], + + 'date-options' => [ + 'last-month' => 'Last Month', + 'last-six-months' => 'Last 6 Months', + 'last-three-months' => 'Last 3 Months', + 'this-month' => 'This Month', + 'this-week' => 'This Week', + 'this-year' => 'This Year', + 'today' => 'Today', + 'yesterday' => 'Yesterday', + ], + ], + + 'table' => [ + 'actions' => 'Actions', + 'no-records-available' => 'No Records Available.', + ], + ], + + 'modal' => [ + 'confirm' => [ + 'agree-btn' => 'Agree', + 'disagree-btn' => 'Disagree', + 'message' => 'Are you sure you want to perform this action?', + 'title' => 'Are you sure?', + ], + ], + + 'tags' => [ + 'index' => [ + 'title' => 'Tags', + 'added-tags' => 'Added Tags', + 'save-btn' => 'Save Tag', + 'placeholder' => 'Type to search tags', + 'add-tag' => 'Add \":term\"...', + 'aquarelle-red' => 'Aquarelle Red', + 'crushed-cashew' => 'Crushed Cashew', + 'beeswax' => 'Beeswax', + 'lemon-chiffon' => 'Lemon Chiffon', + 'snow-flurry' => 'Snow Flurry', + 'honeydew' => 'Honeydew', + ], + ], + + 'layouts' => [ + 'powered-by' => [ + 'description' => 'Powered by :krayin, an open-source project by :webkul.', + ], + + 'header' => [ + 'mega-search' => [ + 'title' => 'Mega Search', + + 'tabs' => [ + 'leads' => 'Leads', + 'quotes' => 'Quotes', + 'persons' => 'Persons', + 'products' => 'Products', + ], + + 'explore-all-products' => 'Explore all Products', + 'explore-all-leads' => 'Explore all Leads', + 'explore-all-contacts' => 'Explore all Contacts', + 'explore-all-quotes' => 'Explore all Quotes', + 'explore-all-matching-products' => 'Explore all products matching ":query" (:count)', + 'explore-all-matching-leads' => 'Explore all leads matching ":query" (:count)', + 'explore-all-matching-contacts' => 'Explore all contacts matching ":query" (:count)', + 'explore-all-matching-quotes' => 'Explore all quotes matching ":query" (:count)', + ], + ], + ], + + 'attributes' => [ + 'edit' => [ + 'delete' => 'Delete', + ], + + 'lookup' => [ + 'click-to-add' => 'Click to add', + 'search' => 'Search', + 'no-result-found' => 'No result found', + 'search' => 'Search...', + ], + ], + + 'lookup' => [ + 'click-to-add' => 'Click to Add', + 'no-results' => 'No Results Found', + 'add-as-new' => 'Add as New', + 'search' => 'Search...', + ], + + 'flash-group' => [ + 'success' => 'Success', + 'error' => 'Error', + 'warning' => 'Warning', + 'info' => 'Info', + ], + + 'tiny-mce' => [ + 'http-error' => 'HTTP Error', + 'invalid-json' => 'Invalid JSON response from the server.', + 'upload-failed' => 'File upload failed. Please try again.', + ], + ], + + 'quotes' => [ + 'index' => [ + 'title' => 'Quotes', + 'create-btn' => 'Create Quote', + 'create-success' => 'Quote created successfully.', + 'update-success' => 'Quote updated successfully.', + 'delete-success' => 'Quote deleted successfully.', + 'delete-failed' => 'Quote can not be deleted.', + + 'datagrid' => [ + 'subject' => 'Subject', + 'sales-person' => 'Sales Person', + 'expired-at' => 'Expired At', + 'created-at' => 'Created At', + 'person' => 'Person', + 'subtotal' => 'Subtotal', + 'discount' => 'Discount', + 'tax' => 'Tax', + 'adjustment' => 'Adjustment', + 'grand-total' => 'Grand Total', + 'edit' => 'Edit', + 'delete' => 'Delete', + 'print' => 'Print', + ], + + 'pdf' => [ + 'adjustment' => 'Adjustment', + 'amount' => 'Amount', + 'billing-address' => 'Billing Address', + 'date' => 'Date', + 'discount' => 'Discount', + 'expired-at' => 'Expired At', + 'grand-total' => 'Grand Total', + 'person' => 'Person', + 'price' => 'Price', + 'product-name' => 'Product Name', + 'quantity' => 'Quantity', + 'quote-id' => 'Quote ID', + 'sales-person' => 'Sales Person', + 'shipping-address' => 'Shipping Address', + 'sku' => 'SKU', + 'sub-total' => 'Sub Total', + 'subject' => 'Subject', + 'tax' => 'Tax', + 'title' => 'Quote', + ], + ], + + 'create' => [ + 'title' => 'Create Quote', + 'save-btn' => 'Save Quote', + 'quote-info' => 'Quote Information', + 'quote-info-info' => 'Put the basic information of the quote.', + 'address-info' => 'Address Information', + 'address-info-info' => 'Information about the address related to quote.', + 'quote-items' => 'Quote Items', + 'search-products' => 'Search Products', + 'link-to-lead' => 'Link to lead', + 'quote-item-info' => 'Add Product Request for this quote.', + 'quote-name' => 'Quote name', + 'quantity' => 'Quantity', + 'price' => 'Price', + 'discount' => 'Discount', + 'tax' => 'Tax', + 'total' => 'Total', + 'amount' => 'Amount', + 'add-item' => '+ Add Item', + 'sub-total' => 'Sub Total (:symbol)', + 'total-discount' => 'Discount (:symbol)', + 'total-tax' => 'Tax (:symbol)', + 'total-adjustment' => 'Adjustment (:symbol)', + 'grand-total' => 'Grand Total (:symbol)', + 'discount-amount' => 'Discount amount', + 'tax-amount' => 'Tax amount', + 'adjustment-amount' => 'Adjustment amount', + 'product-name' => 'Product Name', + 'action' => 'Action', + ], + + 'edit' => [ + 'title' => 'Edit Quote', + 'save-btn' => 'Save Quote', + 'quote-info' => 'Quote Information', + 'quote-info-info' => 'Put the basic information of the quote.', + 'address-info' => 'Address Information', + 'address-info-info' => 'Information about the address related to quote.', + 'quote-items' => 'Quote Items', + 'link-to-lead' => 'Link to lead', + 'quote-item-info' => 'Add Product Request for this quote.', + 'quote-name' => 'Quote name', + 'quantity' => 'Quantity', + 'price' => 'Price', + 'search-products' => 'Search Products', + 'discount' => 'Discount', + 'tax' => 'Tax', + 'total' => 'Total', + 'amount' => 'Amount', + 'add-item' => '+ Add Item', + 'sub-total' => 'Sub Total (:symbol)', + 'total-discount' => 'Discount (:symbol)', + 'total-tax' => 'Tax (:symbol)', + 'total-adjustment' => 'Adjustment (:symbol)', + 'grand-total' => 'Grand Total (:symbol)', + 'discount-amount' => 'Discount amount', + 'tax-amount' => 'Tax amount', + 'adjustment-amount' => 'Adjustment amount', + 'product-name' => 'Product Name', + 'action' => 'Action', + ], + ], + + 'contacts' => [ + 'persons' => [ + 'index' => [ + 'title' => 'Persons', + 'create-btn' => 'Create Person', + 'create-success' => 'Person created successfully.', + 'update-success' => 'Person updated successfully.', + 'all-delete-success' => 'All selected persons were deleted successfully.', + 'partial-delete-warning' => 'Some persons were deleted successfully. Others could not be deleted because they are linked to leads.', + 'none-delete-warning' => 'None of the selected persons could be deleted because they are linked to leads.', + 'no-selection' => 'No persons were selected for deletion.', + 'delete-failed' => 'Failed to delete selected persons.', + + 'datagrid' => [ + 'contact-numbers' => 'Contact Numbers', + 'delete' => 'Delete', + 'edit' => 'Edit', + 'emails' => 'Emails', + 'id' => 'ID', + 'view' => 'View', + 'name' => 'Name', + 'organization-name' => 'Organization Name', + ], + ], + + 'view' => [ + 'title' => ':name', + 'about-person' => 'About Person', + 'about-organization' => 'About Organization', + + 'activities' => [ + 'index' => [ + 'all' => 'All', + 'calls' => 'Calls', + 'meetings' => 'Meetings', + 'lunches' => 'Lunches', + 'files' => 'Files', + 'quotes' => 'Quotes', + 'notes' => 'Notes', + 'emails' => 'Emails', + 'by-user' => 'By :user', + 'scheduled-on' => 'Scheduled on', + 'location' => 'Location', + 'participants' => 'Participants', + 'mark-as-done' => 'Mark as Done', + 'delete' => 'Delete', + 'edit' => 'Edit', + ], + + 'actions' => [ + 'mail' => [ + 'btn' => 'Mail', + 'title' => 'Compose Mail', + 'to' => 'To', + 'cc' => 'CC', + 'bcc' => 'BCC', + 'subject' => 'Subject', + 'send-btn' => 'Send', + 'message' => 'Message', + ], + + 'file' => [ + 'btn' => 'File', + 'title' => 'Add File', + 'title-control' => 'Title', + 'name' => 'File Name', + 'description' => 'Description', + 'file' => 'File', + 'save-btn' => 'Save File', + ], + + 'note' => [ + 'btn' => 'Note', + 'title' => 'Add Note', + 'comment' => 'Comment', + 'save-btn' => 'Save Note', + ], + + 'activity' => [ + 'btn' => 'Activity', + 'title' => 'Add Activity', + 'title-control' => 'Title', + 'description' => 'Description', + 'schedule-from' => 'Schedule From', + 'schedule-to' => 'Schedule To', + 'location' => 'Location', + 'call' => 'Call', + 'meeting' => 'Meeting', + 'lunch' => 'Lunch', + 'save-btn' => 'Save Activity', + ], + ], + ], + + 'tags' => [ + 'create-success' => 'Tag created successfully.', + 'destroy-success' => 'Tag deleted successfully.', + ], + ], + + 'create' => [ + 'title' => 'Create Person', + 'save-btn' => 'Save Person', + ], + + 'edit' => [ + 'title' => 'Edit Person', + 'save-btn' => 'Save Person', + ], + ], + + 'organizations' => [ + 'index' => [ + 'title' => 'Organizations', + 'create-btn' => 'Create Organization', + 'create-success' => 'Organization created successfully.', + 'update-success' => 'Organization updated successfully.', + 'delete-success' => 'Organization deleted successfully.', + 'delete-failed' => 'Organization can not be deleted.', + + 'datagrid' => [ + 'delete' => 'Delete', + 'edit' => 'Edit', + 'id' => 'ID', + 'name' => 'Name', + 'persons-count' => 'Person Count', + ], + ], + + 'create' => [ + 'title' => 'Create Organization', + 'save-btn' => 'Save Organization', + ], + + 'edit' => [ + 'title' => 'Edit Organization', + 'save-btn' => 'Save Organization', + ], + ], + ], + + 'products' => [ + 'index' => [ + 'title' => 'Products', + 'create-btn' => 'Create Product', + 'create-success' => 'Product created successfully.', + 'update-success' => 'Product updated successfully.', + 'delete-success' => 'Product deleted successfully.', + 'delete-failed' => 'Product can not be deleted.', + + 'datagrid' => [ + 'allocated' => 'Allocated', + 'delete' => 'Delete', + 'edit' => 'Edit', + 'id' => 'ID', + 'in-stock' => 'In Stock', + 'name' => 'Name', + 'on-hand' => 'On Hand', + 'tag-name' => 'Tag Name', + 'price' => 'Price', + 'sku' => 'SKU', + 'view' => 'View', + ], + ], + + 'create' => [ + 'save-btn' => 'Save Products', + 'title' => 'Create Products', + 'general' => 'General', + 'price' => 'Price', + ], + + 'edit' => [ + 'title' => 'Edit Products', + 'save-btn' => 'Save Products', + 'general' => 'General', + 'price' => 'Price', + ], + + 'view' => [ + 'sku' => 'SKU', + 'all' => 'All', + 'notes' => 'Notes', + 'files' => 'Files', + 'inventories' => 'Inventory', + 'change-logs' => 'Changelogs', + + 'attributes' => [ + 'about-product' => 'About Product', + ], + + 'inventory' => [ + 'source' => 'Source', + 'in-stock' => 'In Stock', + 'allocated' => 'Allocated', + 'on-hand' => 'On Hand', + 'actions' => 'Actions', + 'assign' => 'Assign', + 'add-source' => 'Add Source', + 'location' => 'Location', + 'add-more' => 'Add More', + 'save' => 'Save', + ], + ], + ], + + 'settings' => [ + 'title' => 'Settings', + + 'groups' => [ + 'index' => [ + 'create-btn' => 'Create Group', + 'title' => 'Groups', + 'create-success' => 'Group created successfully.', + 'update-success' => 'Group updated successfully.', + 'destroy-success' => 'Group deleted successfully.', + 'delete-failed' => 'Group can not be deleted.', + 'delete-failed-associated-users' => 'Group can not be deleted, as this is being used by users.', + + 'datagrid' => [ + 'delete' => 'Delete', + 'description' => 'Description', + 'edit' => 'Edit', + 'id' => 'ID', + 'name' => 'Name', + ], + + 'edit' => [ + 'title' => 'Edit Group', + ], + + 'create' => [ + 'name' => 'Name', + 'title' => 'Create Group', + 'description' => 'Description', + 'save-btn' => 'Save Group', + ], + ], + ], + + 'roles' => [ + 'index' => [ + 'being-used' => 'Role can not be deleted, as this is being used in admin user.', + 'create-btn' => 'Create Roles', + 'create-success' => 'Role created successfully.', + 'current-role-delete-error' => 'Can not delete role assigned to the current user.', + 'delete-failed' => 'Role can not be deleted.', + 'delete-success' => 'Role deleted successfully.', + 'last-delete-error' => 'At least one role is required.', + 'settings' => 'Settings', + 'title' => 'Roles', + 'update-success' => 'Role updated successfully.', + 'user-define-error' => 'Can not delete system role.', + + 'datagrid' => [ + 'all' => 'All', + 'custom' => 'Custom', + 'delete' => 'Delete', + 'description' => 'Description', + 'edit' => 'Edit', + 'id' => 'ID', + 'name' => 'Name', + 'permission-type' => 'Permission Type', + ], + ], + + 'create' => [ + 'access-control' => 'Access Control', + 'all' => 'All', + 'back-btn' => 'Back', + 'custom' => 'Custom', + 'description' => 'Description', + 'general' => 'General', + 'name' => 'Name', + 'permissions' => 'Permissions', + 'save-btn' => 'Save Role', + 'title' => 'Create Role', + ], + + 'edit' => [ + 'access-control' => 'Access Control', + 'all' => 'All', + 'back-btn' => 'Back', + 'custom' => 'Custom', + 'description' => 'Description', + 'general' => 'General', + 'name' => 'Name', + 'permissions' => 'Permissions', + 'save-btn' => 'Save Role', + 'title' => 'Edit Role', + ], + ], + + 'types' => [ + 'index' => [ + 'create-btn' => 'Create Type', + 'create-success' => 'Type created successfully.', + 'delete-failed' => 'Type can not be deleted.', + 'delete-success' => 'Type deleted successfully.', + 'title' => 'Types', + 'update-success' => 'Type updated successfully.', + + 'datagrid' => [ + 'delete' => 'Delete', + 'description' => 'Description', + 'edit' => 'Edit', + 'id' => 'ID', + 'name' => 'Name', + ], + + 'create' => [ + 'name' => 'Name', + 'save-btn' => 'Save Type', + 'title' => 'Create Type', + ], + + 'edit' => [ + 'title' => 'Edit Type', + ], + ], + ], + + 'sources' => [ + 'index' => [ + 'title' => 'Sources', + 'create-btn' => 'Create Source', + 'create-success' => 'Source created successfully.', + 'delete-failed' => 'Source can not be deleted.', + 'delete-success' => 'Source deleted successfully.', + 'update-success' => 'Source updated successfully.', + 'delete-failed-associated-leads' => 'Source cannot be deleted because it is associated with existing leads. Please detach or update those leads before deletion.', + + 'datagrid' => [ + 'delete' => 'Delete', + 'edit' => 'Edit', + 'id' => 'ID', + 'name' => 'Name', + ], + + 'create' => [ + 'name' => 'Name', + 'save-btn' => 'Save Source', + 'title' => 'Create Source', + ], + + 'edit' => [ + 'title' => 'Edit Source', + ], + ], + ], + + 'workflows' => [ + 'index' => [ + 'title' => 'Workflows', + 'create-btn' => 'Create Workflow', + 'create-success' => 'Workflow created successfully.', + 'update-success' => 'Workflow updated successfully.', + 'delete-success' => 'Workflow deleted successfully.', + 'delete-failed' => 'Workflow can not be deleted.', + 'datagrid' => [ + 'delete' => 'Delete', + 'description' => 'Description', + 'edit' => 'Edit', + 'id' => 'ID', + 'name' => 'Name', + ], + ], + + 'helpers' => [ + 'update-related-leads' => 'Update related leads', + 'send-email-to-sales-owner' => 'Send email to sales owner', + 'send-email-to-participants' => 'Send email to participants', + 'add-webhook' => 'Add Webhook', + 'update-lead' => 'Update Lead', + 'update-person' => 'Update Person', + 'send-email-to-person' => 'Send email to person', + 'add-tag' => 'Add Tag', + 'add-note-as-activity' => 'Add Note as Activity', + 'update-quote' => 'Update Quote', + ], + + 'create' => [ + 'title' => 'Create Workflow', + 'event' => 'Event', + 'back-btn' => 'Back', + 'save-btn' => 'Save Workflow', + 'name' => 'Name', + 'basic-details' => 'Basic Details', + 'description' => 'Description', + 'actions' => 'Actions', + 'basic-details-info' => 'Put the basic information of the workflow.', + 'event-info' => 'An event triggers, checks, conditions, and performs predefined actions.', + 'conditions' => 'Conditions', + 'conditions-info' => 'Conditions are rules checking scenarios, triggered on specific occasions.', + 'actions-info' => 'An action not only reduces the workload but also make it quite easier for CRM automation', + 'value' => 'Value', + 'condition-type' => 'Condition Type', + 'all-condition-are-true' => 'All condition are true', + 'any-condition-are-true' => 'Any condition are true', + 'add-condition' => 'Add Condition', + 'add-action' => 'Add Action', + 'yes' => 'Yes', + 'no' => 'No', + 'email' => 'Email', + 'is-equal-to' => 'Is equal to', + 'is-not-equal-to' => 'Is not equal to', + 'equals-or-greater-than' => 'Equals or greater than', + 'equals-or-less-than' => 'Equals or less than', + 'greater-than' => 'Greater than', + 'less-than' => 'Less than', + 'type' => 'Type', + 'contain' => 'Contain', + 'contains' => 'Contains', + 'does-not-contain' => 'Does not contain', + ], + + 'edit' => [ + 'title' => 'Edit Workflow', + 'event' => 'Event', + 'back-btn' => 'Back', + 'save-btn' => 'Save Workflow', + 'name' => 'Name', + 'basic-details' => 'Basic Details', + 'description' => 'Description', + 'actions' => 'Actions', + 'type' => 'Type', + 'basic-details-info' => 'Put the basic information of the workflow.', + 'event-info' => 'An event triggers, checks, conditions, and performs predefined actions.', + 'conditions' => 'Conditions', + 'conditions-info' => 'Conditions are rules checking scenarios, triggered on specific occasions.', + 'actions-info' => 'An action not only reduces the workload but also make it quite easier for CRM automation', + 'value' => 'Value', + 'condition-type' => 'Condition Type', + 'all-condition-are-true' => 'All condition are true', + 'any-condition-are-true' => 'Any condition are true', + 'add-condition' => 'Add Condition', + 'add-action' => 'Add Action', + 'yes' => 'Yes', + 'no' => 'No', + 'email' => 'Email', + 'is-equal-to' => 'Is equal to', + 'is-not-equal-to' => 'Is not equal to', + 'equals-or-greater-than' => 'Equals or greater than', + 'equals-or-less-than' => 'Equals or less than', + 'greater-than' => 'Greater than', + 'less-than' => 'Less than', + 'contain' => 'Contain', + 'contains' => 'Contains', + 'does-not-contain' => 'Does not contain', + ], + ], + + 'webforms' => [ + 'index' => [ + 'title' => 'Webforms', + 'create-btn' => 'Create Webform', + 'create-success' => 'Webform created successfully.', + 'update-success' => 'Webform updated successfully.', + 'delete-success' => 'Webform deleted successfully.', + 'delete-failed' => 'Webform can not be deleted.', + + 'datagrid' => [ + 'id' => 'ID', + 'title' => 'Title', + 'edit' => 'Edit', + 'delete' => 'Delete', + ], + ], + + 'create' => [ + 'title' => 'Create Webform', + 'add-attribute-btn' => 'Add Attribute Button', + 'attribute-label-color' => 'Attribute Label Color', + 'attributes' => 'Attributes', + 'attributes-info' => 'Add custom attributes to the form.', + 'background-color' => 'Background Color', + 'create-lead' => 'Create Lead', + 'customize-webform' => 'Customize Webform', + 'customize-webform-info' => 'Customize your web form with element colors of your choosing.', + 'description' => 'Description', + 'display-custom-message' => 'Display custom message', + 'form-background-color' => 'Form Background Color', + 'form-submit-btn-color' => 'Form Submit Button Color', + 'form-submit-button-color' => 'Form Submit Button Color', + 'form-title-color' => 'Form Title Color', + 'general' => 'General', + 'leads' => 'Leads', + 'person' => 'Person', + 'save-btn' => 'Save Webform', + 'submit-button-label' => 'Submit Button Label', + 'submit-success-action' => 'Submit Success Action', + 'redirect-to-url' => 'Redirect To Url', + 'choose-value' => 'Choose Value', + 'select-file' => 'Select File', + 'select-image' => 'Select Image', + 'enter-value' => 'Enter Value', + ], + + 'edit' => [ + 'add-attribute-btn' => 'Add Attribute Button', + 'attribute-label-color' => 'Attribute Label Color', + 'attributes' => 'Attributes', + 'attributes-info' => 'Add custom attributes to the form.', + 'background-color' => 'Background Color', + 'choose-value' => 'Choose Value', + 'code-snippet' => 'Code Snippet', + 'copied' => 'Copied', + 'copy' => 'Copy', + 'create-lead' => 'Create Lead', + 'customize-webform' => 'Customize Webform', + 'customize-webform-info' => 'Customize your web form with element colors of your choosing.', + 'description' => 'Description', + 'display-custom-message' => 'Display custom message', + 'embed' => 'Embed', + 'enter-value' => 'Enter Value', + 'form-background-color' => 'Form Background Color', + 'form-submit-btn-color' => 'Form Submit Button Color', + 'form-submit-button-color' => 'Form Submit Button Color', + 'form-title-color' => 'Form Title Color', + 'general' => 'General', + 'leads' => 'Leads', + 'person' => 'Person', + 'preview' => 'Preview', + 'public-url' => 'Public URL', + 'redirect-to-url' => 'Redirect To URL', + 'save-btn' => 'Save Webform', + 'select-file' => 'Select File', + 'select-image' => 'Select Image', + 'submit-button-label' => 'Submit Button Label', + 'submit-success-action' => 'Submit Success Action', + 'title' => 'Edit Webform', + ], + ], + + 'email-template' => [ + 'index' => [ + 'create-btn' => 'Create Email Template', + 'title' => 'Email Templates', + 'create-success' => 'Email Template created successfully.', + 'update-success' => 'Email Template updated successfully.', + 'delete-success' => 'Email Template deleted successfully.', + 'delete-failed' => 'Email Template can not be deleted.', + + 'datagrid' => [ + 'delete' => 'Delete', + 'edit' => 'Edit', + 'id' => 'ID', + 'name' => 'Name', + 'subject' => 'Subject', + ], + ], + + 'create' => [ + 'title' => 'Create Email Template', + 'save-btn' => 'Save Email Template', + 'email-template' => 'Email Template', + 'subject' => 'Subject', + 'content' => 'Content', + 'subject-placeholders' => 'Subject Placeholders', + 'general' => 'General', + 'name' => 'Name', + ], + + 'edit' => [ + 'title' => 'Edit Email Template', + 'save-btn' => 'Save Email Template', + 'email-template' => 'Email Template', + 'subject' => 'Subject', + 'content' => 'Content', + 'subject-placeholders' => 'Subject Placeholders', + 'general' => 'General', + 'name' => 'Name', + ], + ], + + 'marketing' => [ + 'events' => [ + 'index' => [ + 'create-btn' => 'Create Event', + 'title' => 'Events', + 'create-success' => 'Event created successfully.', + 'update-success' => 'Event updated successfully.', + 'delete-success' => 'Event deleted successfully.', + 'delete-failed' => 'Event can not be deleted.', + 'mass-delete-success' => 'Events deleted successfully', + + 'datagrid' => [ + 'delete' => 'Delete', + 'edit' => 'Edit', + 'id' => 'ID', + 'name' => 'Name', + 'description' => 'Description', + 'date' => 'Date', + ], + + 'create' => [ + 'title' => 'Create Event', + 'name' => 'Name', + 'date' => 'Date', + 'description' => 'Description', + 'save-btn' => 'Save Event', + ], + + 'edit' => [ + 'title' => 'Edit Event', + ], + ], + ], + + 'campaigns' => [ + 'index' => [ + 'create-btn' => 'Create Campaigns', + 'title' => 'Campaigns', + 'create-success' => 'Campaign created successfully.', + 'update-success' => 'Campaign updated successfully.', + 'delete-success' => 'Campaign deleted successfully.', + 'delete-failed' => 'Campaign can not be deleted.', + 'mass-delete-success' => 'Campaigns deleted successfully.', + + 'datagrid' => [ + 'id' => 'ID', + 'name' => 'Name', + 'subject' => 'Subject', + 'status' => 'Status', + 'active' => 'Active', + 'inactive' => 'Inactive', + 'edit' => 'Edit', + 'delete' => 'Delete', + ], + + 'create' => [ + 'title' => 'Create Campaign', + 'name' => 'Name', + 'type' => 'Type', + 'subject' => 'Subject', + 'event' => 'Event', + 'email-template' => 'Email Template', + 'status' => 'Status', + ], + + 'edit' => [ + 'title' => 'Edit Campaign', + ], + ], + ], + ], + + 'tags' => [ + 'index' => [ + 'create-btn' => 'Create Tag', + 'title' => 'Tags', + 'create-success' => 'Tag created successfully.', + 'update-success' => 'Tag updated successfully.', + 'delete-success' => 'Tag deleted successfully.', + 'delete-failed' => 'Tag can not be deleted.', + + 'datagrid' => [ + 'delete' => 'Delete', + 'edit' => 'Edit', + 'id' => 'ID', + 'name' => 'Name', + 'users' => 'Users', + 'created-at' => 'Created At', + ], + + 'create' => [ + 'name' => 'Name', + 'save-btn' => 'Save Tag', + 'title' => 'Create Tag', + 'color' => 'Color', + ], + + 'edit' => [ + 'title' => 'Edit Tag', + ], + ], + ], + + 'users' => [ + 'index' => [ + 'create-btn' => 'Create User', + 'create-success' => 'User created successfully.', + 'delete-failed' => 'User can not be deleted.', + 'delete-success' => 'User deleted successfully.', + 'last-delete-error' => 'At least one user is required.', + 'mass-delete-failed' => 'Users can not be deleted.', + 'mass-delete-success' => 'Users deleted successfully.', + 'mass-update-failed' => 'Users can not be updated.', + 'mass-update-success' => 'Users updated successfully.', + 'title' => 'Users', + 'update-success' => 'User updated successfully.', + 'user-define-error' => 'Can not delete system user.', + 'active' => 'Active', + 'inactive' => 'Inactive', + + 'datagrid' => [ + 'active' => 'Active', + 'created-at' => 'Created At', + 'delete' => 'Delete', + 'edit' => 'Edit', + 'email' => 'Email', + 'id' => 'ID', + 'inactive' => 'Inactive', + 'name' => 'Name', + 'status' => 'Status', + 'update-status' => 'Update Status', + 'users' => 'Users', + ], + + 'create' => [ + 'confirm-password' => 'Confirm Password', + 'email' => 'Email', + 'general' => 'General', + 'global' => 'Global', + 'group' => 'Group', + 'individual' => 'Individual', + 'name' => 'Name', + 'password' => 'Password', + 'permission' => 'Permission', + 'role' => 'Role', + 'save-btn' => 'Save User', + 'status' => 'Status', + 'title' => 'Create User', + 'view-permission' => 'View Permission', + 'select-at-lest-one-group' => 'Select at least one group', + ], + + 'edit' => [ + 'title' => 'Edit User', + ], + ], + ], + + 'pipelines' => [ + 'index' => [ + 'title' => 'Pipelines', + 'create-btn' => 'Create Pipeline', + 'create-success' => 'Pipeline created successfully.', + 'update-success' => 'Pipeline updated successfully.', + 'default-required' => 'At least one default pipeline is required.', + 'delete-success' => 'Pipeline deleted successfully.', + 'delete-failed' => 'Pipeline can not be deleted.', + 'default-delete-error' => 'Default pipeline can not be deleted.', + + 'datagrid' => [ + 'delete' => 'Delete', + 'edit' => 'Edit', + 'id' => 'ID', + 'is-default' => 'Is Default', + 'name' => 'Name', + 'no' => 'No', + 'rotten-days' => 'Rotten Days', + 'yes' => 'Yes', + ], + ], + + 'create' => [ + 'title' => 'Create Pipeline', + 'save-btn' => 'Save Pipeline', + 'name' => 'Name', + 'rotten-days' => 'Rotten Days', + 'mark-as-default' => 'Mark as Default', + 'general' => 'General', + 'probability' => 'Probability(%)', + 'new-stage' => 'New', + 'won-stage' => 'Won', + 'lost-stage' => 'Lost', + 'stage-btn' => 'Add Stage', + 'stages' => 'Stages', + 'duplicate-name' => 'The "Name" field cannot be duplicate', + 'delete-stage' => 'Delete Stage', + 'add-new-stages' => 'Add New Stages', + 'add-stage-info' => 'Add new stage for your Pipeline', + 'newly-added' => 'Newly Added', + 'stage-delete-success' => 'Stage Deleted Successfully', + ], + + 'edit' => [ + 'title' => 'Edit Pipeline', + 'save-btn' => 'Save Pipeline', + 'name' => 'Name', + 'rotten-days' => 'Rotten Days', + 'mark-as-default' => 'Mark as Default', + 'general' => 'General', + 'probability' => 'Probability(%)', + 'new-stage' => 'New', + 'won-stage' => 'Won', + 'lost-stage' => 'Lost', + 'stage-btn' => 'Add Stage', + 'stages' => 'Stages', + 'duplicate-name' => 'The "Name" field cannot be duplicate', + 'delete-stage' => 'Delete Stage', + 'add-new-stages' => 'Add New Stages', + 'add-stage-info' => 'Add new stage for your Pipeline', + 'stage-delete-success' => 'Stage Deleted Successfully', + ], + ], + + 'webhooks' => [ + 'index' => [ + 'title' => 'Webhooks', + 'create-btn' => 'Create Webhook', + 'create-success' => 'Webhook created successfully.', + 'update-success' => 'Webhook updated successfully.', + 'delete-success' => 'Webhook deleted successfully.', + 'delete-failed' => 'Webhook can not be deleted.', + + 'datagrid' => [ + 'id' => 'ID', + 'delete' => 'Delete', + 'edit' => 'Edit', + 'name' => 'Name', + 'entity-type' => 'Entity Type', + 'end-point' => 'End Point', + ], + ], + + 'create' => [ + 'title' => 'Create Webhook', + 'save-btn' => 'Save Webhook', + 'info' => 'Enter the details of webhooks', + 'url-and-parameters' => 'URL And Parameters', + 'method' => 'Method', + 'post' => 'Post', + 'put' => 'Put', + 'url-endpoint' => 'Url Endpoint', + 'parameters' => 'Parameters', + 'add-new-parameter' => 'Add New Parameter', + 'url-preview' => 'Url Preview:', + 'headers' => 'Headers', + 'add-new-header' => 'Add New Header', + 'body' => 'Body', + 'default' => 'Default', + 'x-www-form-urlencoded' => 'x-www-form-urlencoded', + 'key-and-value' => 'Key and Value', + 'add-new-payload' => 'Add new payload', + 'raw' => 'Raw', + 'general' => 'General', + 'name' => 'Name', + 'entity-type' => 'Entity Type', + 'insert-placeholder' => 'Insert Placeholder', + 'description' => 'Description', + 'json' => 'Json', + 'text' => 'Text', + ], + + 'edit' => [ + 'title' => 'Edit Webhook', + 'edit-btn' => 'Save Webhook', + 'save-btn' => 'Save Webhook', + 'info' => 'Enter the details of webhooks', + 'url-and-parameters' => 'URL And Parameters', + 'method' => 'Method', + 'post' => 'Post', + 'put' => 'Put', + 'url-endpoint' => 'Url Endpoint', + 'parameters' => 'Parameters', + 'add-new-parameter' => 'Add New Parameter', + 'url-preview' => 'Url Preview:', + 'headers' => 'Headers', + 'add-new-header' => 'Add New Header', + 'body' => 'Body', + 'default' => 'Default', + 'x-www-form-urlencoded' => 'x-www-form-urlencoded', + 'key-and-value' => 'Key and Value', + 'add-new-payload' => 'Add new payload', + 'raw' => 'Raw', + 'general' => 'General', + 'name' => 'Name', + 'entity-type' => 'Entity Type', + 'insert-placeholder' => 'Insert Placeholder', + 'description' => 'Description', + 'json' => 'Json', + 'text' => 'Text', + ], + ], + + 'warehouses' => [ + 'index' => [ + 'title' => 'Warehouses', + 'create-btn' => 'Create Warehouse', + 'create-success' => 'Warehouse created successfully.', + 'name-exists' => 'Warehouse name already exists.', + 'update-success' => 'Warehouse updated successfully.', + 'delete-success' => 'Warehouse deleted successfully.', + 'delete-failed' => 'Warehouse can not be deleted.', + + 'datagrid' => [ + 'id' => 'ID', + 'name' => 'Name', + 'contact-name' => 'Contact Name', + 'delete' => 'Delete', + 'edit' => 'Edit', + 'view' => 'View', + 'created-at' => 'Created At', + 'products' => 'Products', + 'contact-emails' => 'Contact Emails', + 'contact-numbers' => 'Contact Numbers', + ], + ], + + 'create' => [ + 'title' => 'Create Warehouse', + 'save-btn' => 'Save Warehouse', + 'contact-info' => 'Contact Information', + ], + + 'edit' => [ + 'title' => 'Edit Warehouse', + 'save-btn' => 'Save Warehouse', + 'contact-info' => 'Contact Information', + ], + + 'view' => [ + 'all' => 'All', + 'notes' => 'Notes', + 'files' => 'Files', + 'location' => 'Location', + 'change-logs' => 'Changelogs', + + 'locations' => [ + 'action' => 'Action', + 'add-location' => 'Add Location', + 'create-success' => 'Location created successfully.', + 'delete' => 'Delete', + 'delete-failed' => 'Location can not be deleted.', + 'delete-success' => 'Location deleted successfully.', + 'name' => 'Name', + 'save-btn' => 'Save', + ], + + 'general-information' => [ + 'title' => 'General Information', + ], + + 'contact-information' => [ + 'title' => 'Contact Information', + ], + ], + ], + + 'attributes' => [ + 'index' => [ + 'title' => 'Attributes', + 'create-btn' => 'Create Attribute', + 'create-success' => 'Attribute created successfully.', + 'update-success' => 'Attribute updated successfully.', + 'delete-success' => 'Attribute deleted successfully.', + 'delete-failed' => 'Attribute can not be deleted.', + 'user-define-error' => 'Can not delete system attribute.', + 'mass-delete-failed' => 'System attributes can not be deleted.', + + 'datagrid' => [ + 'yes' => 'Yes', + 'no' => 'No', + 'id' => 'ID', + 'code' => 'Code', + 'name' => 'Name', + 'entity-type' => 'Entity Type', + 'type' => 'Type', + 'is-default' => 'Is Default', + 'edit' => 'Edit', + 'delete' => 'Delete', + + 'entity-types' => [ + 'leads' => 'Leads', + 'organizations' => 'Organizations', + 'persons' => 'Persons', + 'products' => 'Products', + 'quotes' => 'Quotes', + 'warehouses' => 'Warehouses', + ], + + 'types' => [ + 'text' => 'Text', + 'textarea' => 'Textarea', + 'price' => 'Price', + 'boolean' => 'Boolean', + 'select' => 'Select', + 'multiselect' => 'Multiselect', + 'checkbox' => 'Checkbox', + 'email' => 'Email', + 'address' => 'Address', + 'phone' => 'Phone', + 'lookup' => 'Lookup', + 'datetime' => 'Datetime', + 'date' => 'Date', + 'image' => 'Image', + 'file' => 'File', + ], + ], + ], + + 'create' => [ + 'title' => 'Create Attribute', + 'save-btn' => 'Save Attribute', + 'code' => 'Code', + 'name' => 'Name', + 'entity-type' => 'Entity Type', + 'type' => 'Type', + 'validations' => 'Validations', + 'is-required' => 'Is Required', + 'input-validation' => 'Input Validation', + 'is-unique' => 'Is Unique', + 'labels' => 'Labels', + 'general' => 'General', + 'numeric' => 'Numeric', + 'decimal' => 'Decimal', + 'url' => 'Url', + 'options' => 'Options', + 'option-type' => 'Option Type', + 'lookup-type' => 'Lookup Type', + 'add-option' => 'Add Option', + 'save-option' => 'Save Option', + 'option-name' => 'Option Name', + 'add-attribute-options' => 'Add Attribute Options', + 'text' => 'Text', + 'textarea' => 'Textarea', + 'price' => 'Price', + 'boolean' => 'Boolean', + 'select' => 'Select', + 'multiselect' => 'Multiselect', + 'email' => 'Email', + 'address' => 'Address', + 'phone' => 'Phone', + 'datetime' => 'Datetime', + 'date' => 'Date', + 'image' => 'Image', + 'file' => 'File', + 'lookup' => 'Lookup', + 'entity_type' => 'Entity type', + 'checkbox' => 'Checkbox', + 'is_required' => 'Is Required', + 'is_unique' => 'Is Unique', + 'actions' => 'Actions', + ], + + 'edit' => [ + 'actions' => 'Actions', + 'add-attribute-options' => 'Add Attribute Options', + 'add-option' => 'Add Option', + 'address' => 'Address', + 'boolean' => 'Boolean', + 'checkbox' => 'Checkbox', + 'code' => 'Code', + 'date' => 'Date', + 'datetime' => 'Datetime', + 'decimal' => 'Decimal', + 'email' => 'Email', + 'entity-type' => 'Entity Type', + 'entity_type' => 'Entity type', + 'file' => 'File', + 'general' => 'General', + 'image' => 'Image', + 'input-validation' => 'Input Validation', + 'is-required' => 'Is Required', + 'is-unique' => 'Is Unique', + 'is_required' => 'Is Required', + 'is_unique' => 'Is Unique', + 'labels' => 'Labels', + 'lookup' => 'Lookup', + 'lookup-type' => 'Lookup Type', + 'multiselect' => 'Multiselect', + 'name' => 'Name', + 'numeric' => 'Numeric', + 'option-deleted' => 'Attribute Option is deleted successfully', + 'option-name' => 'Option Name', + 'option-type' => 'Option Type', + 'options' => 'Options', + 'phone' => 'Phone', + 'price' => 'Price', + 'save-btn' => 'Save Attribute', + 'save-option' => 'Save Option', + 'select' => 'Select', + 'text' => 'Text', + 'textarea' => 'Textarea', + 'title' => 'Edit Attribute', + 'type' => 'Type', + 'url' => 'Url', + 'validations' => 'Validations', + ], + ], + + 'data-transfer' => [ + 'imports' => [ + 'create' => [ + 'action' => 'Action', + 'allowed-errors' => 'Allowed Errors', + 'back-btn' => 'Back', + 'create-update' => 'Create/Update', + 'delete' => 'Delete', + 'download-sample' => 'Download Sample', + 'field-separator' => 'Field Separator', + 'file' => 'File', + 'general' => 'General', + 'images-directory' => 'Images Directory Path', + 'process-in-queue' => 'Process In Queue', + 'results' => 'Results', + 'save-btn' => 'Save Import', + 'settings' => 'Settings', + 'skip-errors' => 'Skip Errors', + 'stop-on-errors' => 'Stop on Errors', + 'title' => 'Create Import', + 'type' => 'Type', + 'validation-strategy' => 'Validation Strategy', + ], + + 'edit' => [ + 'action' => 'Action', + 'allowed-errors' => 'Allowed Errors', + 'back-btn' => 'Back', + 'create-update' => 'Create/Update', + 'delete' => 'Delete', + 'download-sample' => 'Download Sample', + 'field-separator' => 'Field Separator', + 'file' => 'File', + 'general' => 'General', + 'images-directory' => 'Images Directory Path', + 'process-in-queue' => 'Process In Queue', + 'results' => 'Results', + 'save-btn' => 'Save Import', + 'settings' => 'Settings', + 'skip-errors' => 'Skip Errors', + 'stop-on-errors' => 'Stop on Errors', + 'title' => 'Edit Import', + 'type' => 'Type', + 'validation-strategy' => 'Validation Strategy', + ], + + 'index' => [ + 'button-title' => 'Create Import', + 'title' => 'Imports', + + 'datagrid' => [ + 'actions' => 'Actions', + 'completed-at' => 'Completed At', + 'created' => 'Created', + 'delete' => 'Delete', + 'deleted' => 'Deleted', + 'edit' => 'Edit', + 'error-file' => 'Error File', + 'id' => 'ID', + 'started-at' => 'Started At', + 'state' => 'State', + 'summary' => 'Summary', + 'type' => 'Type', + 'updated' => 'Updated', + 'uploaded-file' => 'Uploaded File', + ], + ], + + 'import' => [ + 'back-btn' => 'Back', + 'completed-batches' => 'Total Batches Completed:', + 'download-error-report' => 'Download Full Report', + 'edit-btn' => 'Edit', + 'imported-info' => 'Congratulations! Your import was successful.', + 'importing-info' => 'Import In Process', + 'indexing-info' => 'Resources Indexing (Price, Inventory and Elastic Search) In Progress', + 'linking-info' => 'Resources Linking In Progress', + 'progress' => 'Progress:', + 'title' => 'Import', + 'total-batches' => 'Total Batches:', + 'total-created' => 'Total Records Created:', + 'total-deleted' => 'Total Records Deleted:', + 'total-errors' => 'Total Errors:', + 'total-invalid-rows' => 'Total Invalid Rows:', + 'total-rows-processed' => 'Total Rows Processed:', + 'total-updated' => 'Total Records Updated:', + 'validate' => 'Validate', + 'validate-info' => 'Click on Validate Data to check your import.', + 'validating-info' => 'The data started reading and Validating', + 'validation-failed-info' => 'Your import is invalid. Please fix the following errors and try again.', + 'validation-success-info' => 'Your import is valid. Click on Import to start the import process.', + ], + + 'create-success' => 'Import created successfully.', + 'delete-failed' => 'Import deletion failed unexpectedly.', + 'delete-success' => 'Import deleted successfully.', + 'not-valid' => 'Import is invalid', + 'nothing-to-import' => 'There are no resources to import.', + 'setup-queue-error' => 'Please change your queue driver to "database" or "redis" to start the import process.', + 'update-success' => 'Import updated successfully.', + ], + ], + ], + + 'activities' => [ + 'index' => [ + 'title' => 'Activities', + + 'datagrid' => [ + 'comment' => 'Comment', + 'created_at' => 'Created At', + 'created_by' => 'Created By', + 'edit' => 'Edit', + 'id' => 'ID', + 'done' => 'Is Done', + 'not-done' => 'Not Done', + 'lead' => 'Lead', + 'mass-delete' => 'Mass Delete', + 'mass-update' => 'Mass Update', + 'schedule-from' => 'Schedule From', + 'schedule-to' => 'Schedule To', + 'schedule_from' => 'Schedule From', + 'schedule_to' => 'Schedule To', + 'title' => 'Title', + 'is_done' => 'Is Done', + 'type' => 'Type', + 'update' => 'Update', + 'call' => 'Call', + 'meeting' => 'Meeting', + 'lunch' => 'Lunch', + ], + ], + + 'edit' => [ + 'title' => 'Edit Activity', + 'back-btn' => 'Back', + 'save-btn' => 'Save Activity', + 'type' => 'Activity Type', + 'call' => 'Call', + 'meeting' => 'Meeting', + 'lunch' => 'Lunch', + 'schedule_to' => 'Schedule To', + 'schedule_from' => 'Schedule From', + 'location' => 'Location', + 'comment' => 'Comment', + 'lead' => 'Lead', + 'participants' => 'Participants', + 'general' => 'General', + 'persons' => 'Persons', + 'no-result-found' => 'Records not found.', + 'users' => 'Users', + ], + + 'updated' => 'Updated :attribute', + 'created' => 'Created', + 'duration-overlapping' => 'Participants have another meeting at this time. Do you want to continue?', + 'create-success' => 'Activity created successfully.', + 'update-success' => 'Activity updated successfully.', + 'overlapping-error' => 'Participants have another meeting at this time.', + 'destroy-success' => 'Activity deleted successfully.', + 'delete-failed' => 'Activity can not be deleted.', + 'mass-update-success' => 'Activities updated successfully.', + 'mass-destroy-success' => 'Activities deleted successfully.', + 'mass-delete-failed' => 'Activities can not be deleted.', + ], + + 'mail' => [ + 'index' => [ + 'compose' => 'Compose', + 'draft' => 'Draft', + 'inbox' => 'Inbox', + 'outbox' => 'Outbox', + 'sent' => 'Sent', + 'trash' => 'Trash', + 'compose-mail-btn' => 'Compose Mail', + 'btn' => 'Mail', + 'mail' => [ + 'title' => 'Compose Mail', + 'to' => 'To', + 'enter-emails' => 'Press enter to add emails', + 'cc' => 'CC', + 'bcc' => 'BCC', + 'subject' => 'Subject', + 'send-btn' => 'Send', + 'message' => 'Message', + 'draft' => 'Draft', + ], + + 'datagrid' => [ + 'id' => 'ID', + 'from' => 'From', + 'to' => 'To', + 'subject' => 'Subject', + 'tags' => 'Tags', + 'content' => 'Content', + 'attachments' => 'Attachments', + 'date' => 'Date', + 'move-to-inbox' => 'Moved To Inbox', + 'move-to-trash' => 'Moved To Trash', + 'edit' => 'Edit', + 'view' => 'View', + 'delete' => 'Delete', + ], + ], + + 'create-success' => 'Email sent successfully.', + 'update-success' => 'Email updated successfully.', + 'mass-update-success' => 'Emails updated successfully.', + 'delete-success' => 'Email deleted successfully.', + 'delete-failed' => 'Email can not be deleted.', + + 'view' => [ + 'title' => 'Mails', + 'subject' => ':subject', + 'link-mail' => 'Link Mail', + 'to' => 'To', + 'cc' => 'CC', + 'bcc' => 'BCC', + 'reply' => 'Reply', + 'reply-all' => 'Reply All', + 'forward' => 'Forward', + 'delete' => 'Delete', + 'enter-mails' => 'Enter email id', + 'rotten-days' => 'Lead is rotten for :days days', + 'search-an-existing-lead' => 'Search an existing lead', + 'search-an-existing-contact' => 'Search an existing contact', + 'message' => 'Message', + 'add-attachments' => 'Add Attachments', + 'discard' => 'Discard', + 'send' => 'Send', + 'no-result-found' => 'No Results found', + 'add-new-contact' => 'Add New Contact', + 'description' => 'Description', + 'search' => 'Search...', + 'add-new-lead' => 'Add New Lead', + 'create-new-contact' => 'Create New Contact', + 'save-contact' => 'Save Contact', + 'create-lead' => 'Create Lead', + 'linked-contact' => 'Linked Contact', + 'link-to-contact' => 'Link To Contact', + 'link-to-lead' => 'Link To Lead', + 'linked-lead' => 'Linked Lead', + 'lead-details' => 'Lead Details', + 'contact-person' => 'Contact Person', + 'product' => 'Product', + + 'tags' => [ + 'create-success' => 'Tag created successfully.', + 'destroy-success' => 'Tag deleted successfully.', + ], + ], + ], + + 'common' => [ + 'custom-attributes' => [ + 'add-more' => 'Add More', + 'address' => 'Address', + 'city' => 'City', + 'contact' => 'Contact Numbers', + 'country' => 'Country', + 'email' => 'Email', + 'home' => 'Home', + 'postcode' => 'Postcode', + 'save' => 'Save', + 'select' => 'Select', + 'select-country' => 'Select Country', + 'select-state' => 'Select State', + 'state' => 'State', + 'update-contact-title' => 'Update Contact Numbers', + 'update-emails-title' => 'Update Contact Emails', + 'work' => 'Work', + ], + ], + + 'leads' => [ + 'create-success' => 'Lead created successfully.', + 'update-success' => 'Leads updated successfully.', + 'update-failed' => 'Leads can not be deleted.', + 'destroy-success' => 'Lead deleted successfully.', + 'destroy-failed' => 'Lead can not be deleted.', + + 'file' => [ + 'data-not-found' => 'Data not found.', + 'empty-content' => 'PDF content is empty or could not be extracted.', + 'failed-extract' => 'Failed to extract text from file.', + 'insufficient-info' => 'Due to insufficient data, we are unable to process your request at the moment.', + 'invalid-base64' => 'Invalid base64 format.', + 'invalid-format' => 'Invalid JSON format.', + 'invalid-response' => 'Invalid AI response format.', + 'missing-api-key' => 'Missing API key or model configuration.', + 'not-found' => 'File not found.', + 'recursive-call' => 'Recursive call detected.', + 'text-generation-failed' => 'Text extraction failed. The file might be empty or unreadable.', + ], + + 'index' => [ + 'title' => 'Leads', + 'create-btn' => 'Create Lead', + + 'datagrid' => [ + 'id' => 'ID', + 'sales-person' => 'Sales Person', + 'subject' => 'Subject', + 'source' => 'Source', + 'lead-value' => 'Lead Value', + 'lead-type' => 'Lead Type', + 'tag-name' => 'Tag Name', + 'contact-person' => 'Contact Person', + 'stage' => 'Stage', + 'rotten-lead' => 'Rotten Lead', + 'date-to' => 'Date To', + 'created-at' => 'Created At', + 'no' => 'No', + 'yes' => 'Yes', + 'delete' => 'Delete', + 'mass-delete' => 'Mass Delete', + 'mass-update' => 'Mass Update', + ], + + 'kanban' => [ + 'rotten-days' => 'Lead is rotten for :days days', + 'empty-list' => 'Your Leads List is Empty', + 'empty-list-description' => 'Create a lead to organize your goals.', + 'create-lead-btn' => 'Create Lead', + + 'columns' => [ + 'contact-person' => 'Contact Person', + 'id' => 'ID', + 'lead-type' => 'Lead Type', + 'lead-value' => 'Lead Value', + 'sales-person' => 'Sales Person', + 'source' => 'Source', + 'title' => 'Title', + 'tags' => 'Tags', + 'expected-close-date' => 'Expected Close Date', + 'created-at' => 'Created At', + ], + + 'toolbar' => [ + 'search' => [ + 'title' => 'Search by Title', + ], + + 'filters' => [ + 'apply-filters' => 'Apply Filters', + 'clear-all' => 'Clear All', + 'filter' => 'Filter', + 'filters' => 'Filters', + 'from' => 'From', + 'select' => 'Select', + 'to' => 'To', + ], + ], + ], + + 'view-switcher' => [ + 'all-pipelines' => 'All Pipelines', + 'create-new-pipeline' => 'Create New Pipeline', + ], + + 'upload' => [ + 'create-lead' => 'Create Lead Using AI', + 'file' => 'File Upload', + 'file-info' => 'Only pdf,bmp,jpg,jpeg,png format files are accepted.', + 'file-required' => 'Please select at least one valid file to proceed.', + 'save-btn' => 'Save', + 'upload-file' => 'Upload File', + ], + ], + + 'create' => [ + 'title' => 'Create Lead', + 'save-btn' => 'Save', + 'details' => 'Details', + 'details-info' => 'Put The Basic Information of the Lead', + 'contact-person' => 'Contact Person', + 'contact-info' => 'Information About the Contact Person', + 'products' => 'Products', + 'products-info' => 'Information About the Products', + ], + + 'edit' => [ + 'title' => 'Edit Lead', + 'save-btn' => 'Save', + 'details' => 'Details', + 'details-info' => 'Put The Basic Information of the Lead', + 'contact-person' => 'Contact Person', + 'contact-info' => 'Information About the Contact Person', + 'products' => 'Products', + 'products-info' => 'Information About the Products', + ], + + 'common' => [ + 'contact' => [ + 'name' => 'Name', + 'email' => 'Email', + 'contact-number' => 'Contact Number', + 'organization' => 'Organization', + ], + + 'products' => [ + 'product-name' => 'Product Name', + 'quantity' => 'Quantity', + 'price' => 'Price', + 'amount' => 'Amount', + 'action' => 'Action', + 'add-more' => 'Add More', + 'total' => 'Total', + ], + ], + + 'view' => [ + 'title' => 'Lead: :title', + 'rotten-days' => ':days Days', + + 'tabs' => [ + 'description' => 'Description', + 'products' => 'Products', + 'quotes' => 'Quotes', + ], + + 'attributes' => [ + 'title' => 'About Lead', + ], + + 'quotes' => [ + 'subject' => 'Subject', + 'expired-at' => 'Expired At', + 'sub-total' => 'Sub Total', + 'discount' => 'Discount', + 'tax' => 'Tax', + 'adjustment' => 'Adjustment', + 'grand-total' => 'Grand Total', + 'delete' => 'Delete', + 'edit' => 'Edit', + 'download' => 'Download', + 'destroy-success' => 'Quote deleted successfully.', + 'empty-title' => 'No Quotes Found', + 'empty-info' => 'No Quotes Found for this Lead', + 'add-btn' => 'Add Quote', + ], + + 'products' => [ + 'product-name' => 'Product Name', + 'quantity' => 'Quantity', + 'price' => 'Price', + 'amount' => 'Amount', + 'action' => 'Action', + 'add-more' => 'Add More', + 'total' => 'Total', + 'empty-title' => 'No Products Found', + 'empty-info' => 'No Products Found for this Lead', + 'add-product' => 'Add Product', + ], + + 'persons' => [ + 'title' => 'About Persons', + 'job-title' => ':job_title at :organization', + ], + + 'stages' => [ + 'won-lost' => 'Won/Lost', + 'won' => 'Won', + 'lost' => 'Lost', + 'need-more-info' => 'Need More Details', + 'closed-at' => 'Closed At', + 'won-value' => 'Won Value', + 'lost-reason' => 'Lost Reason', + 'save-btn' => 'Save', + ], + + 'tags' => [ + 'create-success' => 'Tag created successfully.', + 'destroy-success' => 'Tag deleted successfully.', + ], + ], + ], + + 'configuration' => [ + 'index' => [ + 'back' => 'Back', + 'delete' => 'Delete', + 'save-btn' => 'Save Configuration', + 'save-success' => 'Configuration Saved Successfully.', + 'search' => 'Search', + 'select-country' => 'Select Country', + 'select-state' => 'Select State', + 'title' => 'Configuration', + + 'general' => [ + 'title' => 'General', + 'info' => 'General Configuration', + + 'general' => [ + 'title' => 'General', + 'info' => 'Update your general settings here.', + 'locale-settings' => [ + 'title' => 'Locale Settings', + 'title-info' => 'Defines the language used in the user interface, such as Arabic (ar), English (en), Spanish (es), Persian(fa) and Turkish (tr).', + ], + + 'admin-logo' => [ + 'logo-image' => 'Logo Image', + 'title' => 'Admin Logo', + 'title-info' => 'Configure logo image for your admin panel.', + ], + ], + + 'settings' => [ + 'title' => 'Settings', + 'info' => 'Update your settings here.', + + 'footer' => [ + 'info' => 'We can configure the powered by section here.', + 'powered-by' => 'Powered by text editor', + 'title' => 'Powered by Section Configurations', + ], + + 'menu' => [ + 'activities' => 'Activities', + 'configuration' => 'Configuration', + 'contacts' => 'Contacts', + 'dashboard' => 'Dashboard', + 'draft' => 'Draft', + 'inbox' => 'Inbox', + 'info' => 'We can configure the menu items name here.', + 'leads' => 'Leads', + 'mail' => 'Mail', + 'organizations' => 'Organizations', + 'outbox' => 'Outbox', + 'persons' => 'Persons', + 'products' => 'Products', + 'quotes' => 'Quotes', + 'sent' => 'Sent', + 'settings' => 'Settings', + 'title' => 'Menu Item Configurations', + 'trash' => 'Trash', + ], + + 'menu-color' => [ + 'brand-color' => 'Brand Color', + 'info' => 'We can change the menu items colors here.', + 'title' => 'Menu Item Color Configurations', + ], + ], + ], + + 'email' => [ + 'title' => 'Email Settings', + 'info' => 'Email configuration for the application.', + + 'imap' => [ + 'title' => 'IMAP Settings', + 'info' => 'IMAP email configuration for receiving emails.', + + 'account' => [ + 'title' => 'IMAP Account', + 'title-info' => 'Configure your IMAP account settings here.', + 'host' => 'Host', + 'port' => 'Port', + 'encryption' => 'Encryption Type', + 'validate-cert' => 'Validate SSL Certificate', + 'username' => 'IMAP Username', + 'password' => 'IMAP Password', + ], + ], + ], + + 'magic-ai' => [ + 'title' => 'Magic AI', + 'info' => 'Magic AI configuration for the application.', + + 'settings' => [ + 'api-key' => 'API Key', + 'api-key-info' => 'Remember to use a OpenRouter API key for each model. It\'s a simple step to enhance security and performance.', + 'enable' => 'Enable', + 'info' => 'Enhance your Magic AI experience with your OpenRouter API Key. Integrate it now for a seamless, personalized AI adventure tailored just for you! Effortlessly customize settings and take control of your AI journey.', + 'other' => 'Other Model', + 'other-model' => 'For other models, use the Model ID from OpenRouter.', + 'doc-generation' => 'DOC Generation', + 'doc-generation-info' => 'Enable the DOC Generation feature to automatically extract data from DOC files and convert them into text format. Enhance your productivity and efficiency by enabling this feature to streamline your workflow.', + 'title' => 'General Settings', + + 'models' => [ + 'deepseek-r1' => 'Deepseek R1 Distill-llama-8b', + 'gemini-2-0-flash-001' => 'Gemini 2.0 flash-001', + 'gpt-4o' => 'GPT-4.0', + 'gpt-4o-mini' => 'GPT-4.0 mini', + 'grok-2-1212' => 'Grok 2.12', + 'llama-3-2-3b-instruct' => 'Llama 3.2 3b Instruct', + 'title' => 'Models', + ], + ], + ], + ], + ], + + 'dashboard' => [ + 'index' => [ + 'title' => 'Dashboard', + + 'revenue' => [ + 'lost-revenue' => 'Lost Revenue', + 'won-revenue' => 'Won Revenue', + ], + + 'over-all' => [ + 'average-lead-value' => 'Average Lead Value', + 'total-leads' => 'Total Leads', + 'average-leads-per-day' => 'Average Leads Per Day', + 'total-quotations' => 'Total Quotations', + 'total-persons' => 'Total Persons', + 'total-organizations' => 'Total Organizations', + ], + + 'total-leads' => [ + 'title' => 'Leads', + 'total' => 'Total Leads', + 'won' => 'Won Leads', + 'lost' => 'Lost Leads', + ], + + 'revenue-by-sources' => [ + 'title' => 'Revenue By Sources', + 'empty-title' => 'No Data Available', + 'empty-info' => 'No data available for selected interval', + ], + + 'revenue-by-types' => [ + 'title' => 'Revenue By Types', + 'empty-title' => 'No Data Available', + 'empty-info' => 'No data available for selected interval', + ], + + 'top-selling-products' => [ + 'title' => 'Top Products', + 'empty-title' => 'No Products Found', + 'empty-info' => 'No products available for selected interval', + ], + + 'top-persons' => [ + 'title' => 'Top Persons', + 'empty-title' => 'No Persons Found', + 'empty-info' => 'No persons available for selected interval', + ], + + 'open-leads-by-states' => [ + 'title' => 'Open Leads By Stages', + 'empty-title' => 'No Data Available', + 'empty-info' => 'No data available for selected interval', + ], + ], + ], + + 'layouts' => [ + 'app-version' => 'Version: :version', + 'dashboard' => 'Dashboard', + 'leads' => 'Leads', + 'quotes' => 'Quotes', + 'quote' => 'Quote', + 'mail' => [ + 'title' => 'Mail', + 'compose' => 'Compose', + 'inbox' => 'Inbox', + 'draft' => 'Draft', + 'outbox' => 'Outbox', + 'sent' => 'Sent', + 'trash' => 'Trash', + 'setting' => 'Setting', + ], + 'activities' => 'Activities', + 'contacts' => 'Contacts', + 'persons' => 'Persons', + 'person' => 'Person', + 'organizations' => 'Organizations', + 'organization' => 'Organization', + 'products' => 'Products', + 'product' => 'Product', + 'settings' => 'Settings', + 'user' => 'User', + 'user-info' => 'Manage all your users and their permissions in the CRM, what they’re allowed to do.', + 'groups' => 'Groups', + 'groups-info' => 'Add, edit or delete groups from CRM', + 'roles' => 'Roles', + 'role' => 'Role', + 'roles-info' => 'Add, edit or delete roles from CRM', + 'users' => 'Users', + 'users-info' => 'Add, edit or delete users from CRM', + 'lead' => 'Lead', + 'lead-info' => 'Manage all your leads related settings in the CRM', + 'pipelines' => 'Pipelines', + 'pipelines-info' => 'Add, edit or delete pipelines from CRM', + 'sources' => 'Sources', + 'sources-info' => 'Add, edit or delete sources from CRM', + 'types' => 'Types', + 'types-info' => 'Add, edit or delete types from CRM', + 'automation' => 'Automation', + 'automation-info' => 'Manage all your automation related settings in the CRM', + 'attributes' => 'Attributes', + 'attribute' => 'Attribute', + 'attributes-info' => 'Add, edit or delete attributes from CRM', + 'email-templates' => 'Email Templates', + 'email' => 'Email', + 'email-templates-info' => 'Add, edit or delete email templates from CRM', + 'events' => 'Events', + 'events-info' => 'Add, edit or delete events from CRM', + 'campaigns' => 'Campaigns', + 'campaigns-info' => 'Add, edit or delete campaigns from CRM', + 'workflows' => 'Workflows', + 'workflows-info' => 'Add, edit or delete workflows from CRM', + 'webhooks' => 'Webhooks', + 'webhooks-info' => 'Add, edit or delete webhooks from CRM', + 'other-settings' => 'Other Settings', + 'other-settings-info' => 'Manage all your extra settings in the CRM', + 'tags' => 'Tags', + 'tags-info' => 'Add, edit or delete tags from CRM', + 'my-account' => 'My Account', + 'sign-out' => 'Sign Out', + 'back' => 'Back', + 'name' => 'Name', + 'configuration' => 'Configuration', + 'activities' => 'Activities', + 'howdy' => 'Howdy!', + 'warehouses' => 'Warehouses', + 'warehouse' => 'Warehouse', + 'warehouses-info' => 'Add, edit or delete warehouses from CRM', + 'data_transfer' => 'Data Transfer', + 'data_transfer_info' => 'Manage persons, products and leads data transfer related settings in the CRM', + ], + + 'user' => [ + 'account' => [ + 'name' => 'Name', + 'email' => 'Email', + 'password' => 'Password', + 'my_account' => 'My account', + 'update_details' => 'Update Details', + 'current_password' => 'Current password', + 'confirm_password' => 'Confirm password', + 'password-match' => 'Current password does not match.', + 'account-save' => 'Account changes saved successfully.', + 'permission-denied' => 'Permission Denied', + 'remove-image' => 'Remove Image', + 'upload_image_pix' => 'Upload a Profile Image (100px x 100px)', + 'upload_image_format' => 'in PNG or JPG Format', + 'image_upload_message' => 'Only images (.jpeg, .jpg, .png, ..) are allowed.', + ], + ], + + 'emails' => [ + 'common' => [ + 'dear' => 'Dear :name', + 'cheers' => 'Cheers,
    Team :app_name', + + 'user' => [ + 'dear' => 'Dear :username', + 'create-subject' => 'You are added as a member.', + 'create-body' => 'Congratulations! You are now a member of our team.', + + 'forget-password' => [ + 'subject' => 'Customer Reset Password', + 'dear' => 'Dear :username', + 'reset-password' => 'Reset Password', + 'info' => 'You are receiving this email because we received a password reset request for your account', + 'final-summary' => 'If you did not request a password reset, no further action is required', + 'thanks' => 'Thanks!', + ], + ], + ], + ], + + 'validations' => [ + 'message' => [ + 'decimal' => 'The :attribute must be a decimal.', + ], + ], + + 'errors' => [ + 'dashboard' => 'Dashboard', + 'go-back' => 'Go Back', + 'support' => 'If the problem persists, reach out to us at :email for assistance.', + + '404' => [ + 'description' => 'Oops! The page you\'re looking for is on vacation. It seems we couldn\'t find what you were searching for.', + 'title' => '404 Page Not Found', + ], + + '401' => [ + 'description' => 'Oops! Looks like you\'re not allowed to access this page. It seems you\'re missing the necessary credentials.', + 'title' => '401 Unauthorized', + ], + + '403' => [ + 'description' => 'Oops! This page is off-limits. It appears you don\'t have the required permissions to view this content.', + 'title' => '403 Forbidden', + ], + + '500' => [ + 'description' => 'Oops! Something went wrong. It seems we\'re having trouble loading the page you\'re looking for.', + 'title' => '500 Internal Server Error', + ], + + '503' => [ + 'description' => 'Oops! Looks like we\'re temporarily down for maintenance. Please check back in a bit.', + 'title' => '503 Service Unavailable', + ], + ], + + 'export' => [ + 'csv' => 'CSV', + 'download' => 'Download', + 'export' => 'Export', + 'no-records' => 'Nothing to export', + 'xls' => 'XLS', + 'xlsx' => 'XLSX', + ], +]; diff --git a/packages/Webkul/Admin/src/Resources/lang/es/app.php b/packages/Webkul/Admin/src/Resources/lang/es/app.php new file mode 100644 index 0000000..4a2ce92 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/lang/es/app.php @@ -0,0 +1,2225 @@ + [ + 'leads' => 'Clientes potenciales', + 'lead' => 'Cliente potencial', + 'quotes' => 'Cotizaciones', + 'mail' => 'Correo', + 'inbox' => 'Bandeja de entrada', + 'draft' => 'Borradores', + 'outbox' => 'Bandeja de salida', + 'sent' => 'Enviados', + 'trash' => 'Papelera', + 'activities' => 'Actividades', + 'webhook' => 'Webhook', + 'contacts' => 'Contactos', + 'persons' => 'Personas', + 'organizations' => 'Organizaciones', + 'products' => 'Productos', + 'settings' => 'Configuraciones', + 'groups' => 'Grupos', + 'roles' => 'Roles', + 'users' => 'Usuarios', + 'user' => 'Usuario', + 'automation' => 'Automatización', + 'attributes' => 'Atributos', + 'pipelines' => 'Canales', + 'sources' => 'Fuentes', + 'types' => 'Tipos', + 'email-templates' => 'Plantillas de correo electrónico', + 'workflows' => 'Flujos de trabajo', + 'other-settings' => 'Otras configuraciones', + 'tags' => 'Etiquetas', + 'configuration' => 'Configuración', + 'create' => 'Crear', + 'edit' => 'Editar', + 'view' => 'Ver', + 'print' => 'Imprimir', + 'delete' => 'Eliminar', + 'export' => 'Exportar', + 'mass-delete' => 'Eliminar en masa', + 'data-transfer' => 'Transferencia de Datos', + 'imports' => 'Importaciones', + 'import' => 'Importar', + 'event' => 'Evento', + 'campaigns' => 'Campañas', + ], + 'users' => [ + 'activate-warning' => 'Tu cuenta aún no está activada. Por favor, contacta al administrador.', + 'login-error' => 'Las credenciales no coinciden con nuestros registros.', + 'not-permission' => 'No tienes permiso para acceder al panel de administración.', + 'login' => [ + 'email' => 'Dirección de correo electrónico', + 'forget-password-link' => '¿Olvidaste tu contraseña?', + 'password' => 'Contraseña', + 'submit-btn' => 'Iniciar sesión', + 'title' => 'Iniciar sesión', + ], + 'forget-password' => [ + 'create' => [ + 'email' => 'Correo electrónico registrado', + 'email-not-exist' => 'El correo electrónico no existe', + 'page-title' => 'Olvidé mi contraseña', + 'reset-link-sent' => 'Enlace para restablecer la contraseña enviado', + 'sign-in-link' => '¿Volver a iniciar sesión?', + 'submit-btn' => 'Restablecer', + 'title' => 'Recuperar contraseña', + ], + ], + 'reset-password' => [ + 'back-link-title' => '¿Volver a iniciar sesión?', + 'confirm-password' => 'Confirmar contraseña', + 'email' => 'Correo electrónico registrado', + 'password' => 'Contraseña', + 'submit-btn' => 'Restablecer contraseña', + 'title' => 'Restablecer contraseña', + ], + ], + 'account' => [ + 'edit' => [ + 'back-btn' => 'Regresar', + 'change-password' => 'Cambiar contraseña', + 'confirm-password' => 'Confirmar contraseña', + 'current-password' => 'Contraseña actual', + 'email' => 'Correo electrónico', + 'general' => 'General', + 'invalid-password' => 'La contraseña actual que ingresaste es incorrecta.', + 'name' => 'Nombre', + 'password' => 'Contraseña', + 'profile-image' => 'Imagen de perfil', + 'save-btn' => 'Guardar cuenta', + 'title' => 'Mi cuenta', + 'update-success' => 'Cuenta actualizada con éxito', + 'upload-image-info' => 'Sube una imagen de perfil (110 px × 110 px) en formato PNG o JPG', + ], + ], + 'components' => [ + 'activities' => [ + 'actions' => [ + 'mail' => [ + 'btn' => 'Correo', + 'title' => 'Redactar correo', + 'to' => 'Para', + 'enter-emails' => 'Presiona Enter para agregar direcciones de correo electrónico', + 'cc' => 'CC', + 'bcc' => 'CCO', + 'subject' => 'Asunto', + 'send-btn' => 'Enviar', + 'message' => 'Mensaje', + ], + 'file' => [ + 'btn' => 'Archivo', + 'title' => 'Agregar archivo', + 'title-control' => 'Título', + 'name' => 'Nombre', + 'description' => 'Descripción', + 'file' => 'Archivo', + 'save-btn' => 'Guardar archivo', + ], + 'note' => [ + 'btn' => 'Nota', + 'title' => 'Agregar nota', + 'comment' => 'Comentario', + 'save-btn' => 'Guardar nota', + ], + 'activity' => [ + 'btn' => 'Actividad', + 'title' => 'Agregar actividad', + 'title-control' => 'Título', + 'description' => 'Descripción', + 'schedule-from' => 'Programar desde', + 'schedule-to' => 'Programar hasta', + 'location' => 'Ubicación', + 'call' => 'Llamada', + 'meeting' => 'Reunión', + 'lunch' => 'Almuerzo', + 'save-btn' => 'Guardar actividad', + 'participants' => [ + 'title' => 'Participantes', + 'placeholder' => 'Escribe para buscar participantes', + 'users' => 'Usuarios', + 'persons' => 'Personas', + 'no-results' => 'No se encontraron resultados...', + ], + ], + ], + 'index' => [ + 'all' => 'Todo', + 'bcc' => 'CCO', + 'by-user' => 'Por :user', + 'calls' => 'Llamadas', + 'cc' => 'CC', + 'change-log' => 'Registros de cambios', + 'delete' => 'Eliminar', + 'edit' => 'Editar', + 'emails' => 'Correos electrónicos', + 'empty' => 'Vacío', + 'files' => 'Archivos', + 'from' => 'De', + 'location' => 'Ubicación', + 'lunches' => 'Almuerzos', + 'mark-as-done' => 'Marcar como hecho', + 'meetings' => 'Reuniones', + 'notes' => 'Notas', + 'participants' => 'Participantes', + 'planned' => 'Planificado', + 'quotes' => 'Cotizaciones', + 'scheduled-on' => 'Programado en', + 'system' => 'Sistema', + 'to' => 'A', + 'unlink' => 'Desvincular', + 'view' => 'Ver', + 'empty-placeholders' => [ + 'all' => [ + 'title' => 'No se encontraron actividades', + 'description' => 'No se encontraron actividades para esto. Puedes agregar actividades haciendo clic en el botón Actividad en el panel izquierdo.', + ], + 'planned' => [ + 'title' => 'No se encontraron actividades planificadas', + 'description' => 'No se encontraron actividades planificadas para esto. Puedes agregarlas haciendo clic en el botón Actividad en el panel izquierdo.', + ], + 'notes' => [ + 'title' => 'No se encontraron notas', + 'description' => 'No se encontraron notas para esto. Puedes agregarlas haciendo clic en el botón Nota en el panel izquierdo.', + ], + 'calls' => [ + 'title' => 'No se encontraron llamadas', + 'description' => 'No se encontraron llamadas para esto. Puedes agregarlas haciendo clic en el botón Actividad en el panel izquierdo y seleccionando el tipo Llamada.', + ], + 'meetings' => [ + 'title' => 'No se encontraron reuniones', + 'description' => 'No se encontraron reuniones para esto. Puedes agregarlas haciendo clic en el botón Actividad en el panel izquierdo y seleccionando el tipo Reunión.', + ], + 'lunches' => [ + 'title' => 'No se encontraron almuerzos', + 'description' => 'No se encontraron almuerzos para esto. Puedes agregarlos haciendo clic en el botón Actividad en el panel izquierdo y seleccionando el tipo Almuerzo.', + ], + 'files' => [ + 'title' => 'No se encontraron archivos', + 'description' => 'No se encontraron archivos para esto. Puedes agregarlos haciendo clic en el botón Archivo en el panel izquierdo.', + ], + 'emails' => [ + 'title' => 'No se encontraron correos electrónicos', + 'description' => 'No se encontraron correos electrónicos para esto. Puedes agregarlos haciendo clic en el botón Correo en el panel izquierdo.', + ], + 'system' => [ + 'title' => 'No se encontraron registros de cambios', + 'description' => 'No se encontraron registros de cambios para esto.', + ], + ], + ], + ], + 'media' => [ + 'images' => [ + 'add-image-btn' => 'Agregar imagen', + 'ai-add-image-btn' => 'Inteligencia artificial mágica', + 'allowed-types' => 'png, jpeg, jpg', + 'not-allowed-error' => 'Solo se aceptan archivos de imagen (.jpeg, .jpg, .png, ..)', + 'placeholders' => [ + 'front' => 'Frontal', + 'next' => 'Siguiente', + 'size' => 'Tamaño', + 'use-cases' => 'Casos de uso', + 'zoom' => 'Acercar', + ], + ], + 'videos' => [ + 'add-video-btn' => 'Agregar video', + 'allowed-types' => 'mp4, webm, mkv', + 'not-allowed-error' => 'Solo se aceptan archivos de video (.mp4, .mov, .ogg ..)', + ], + ], + 'datagrid' => [ + 'index' => [ + 'no-records-selected' => 'No se han seleccionado registros.', + 'must-select-a-mass-action-option' => 'Debes seleccionar una opción de acción en masa.', + 'must-select-a-mass-action' => 'Debes seleccionar una acción en masa.', + ], + 'toolbar' => [ + 'length-of' => ':length de', + 'of' => 'de', + 'per-page' => 'Por Página', + 'results' => ':total Resultados', + 'delete' => 'Eliminar', + 'selected' => ':total Elementos Seleccionados', + 'mass-actions' => [ + 'submit' => 'Enviar', + 'select-option' => 'Seleccionar Opción', + 'select-action' => 'Seleccionar Acción', + ], + 'filter' => [ + 'apply-filters-btn' => 'Aplicar Filtros', + 'back-btn' => 'Regresar', + 'create-new-filter' => 'Crear Nuevo Filtro', + 'custom-filters' => 'Filtros Personalizados', + 'delete-error' => 'Hubo un error al eliminar el filtro, por favor intente de nuevo.', + 'delete-success' => 'Filtro eliminado con éxito.', + 'empty-description' => 'No hay filtros seleccionados disponibles para guardar. Por favor, seleccione filtros para guardar.', + 'empty-title' => 'Agregar Filtros para Guardar', + 'name' => 'Nombre', + 'quick-filters' => 'Filtros Rápidos', + 'save-btn' => 'Guardar', + 'save-filter' => 'Guardar Filtro', + 'saved-success' => 'Filtro guardado con éxito.', + 'selected-filters' => 'Filtros Seleccionados', + 'title' => 'Filtro', + 'update' => 'Actualizar', + 'update-filter' => 'Actualizar Filtro', + 'updated-success' => 'Filtro actualizado con éxito.', + ], + 'search' => [ + 'title' => 'Buscar', + ], + ], + 'filters' => [ + 'select' => 'Seleccionar', + 'title' => 'Filtros', + 'dropdown' => [ + 'searchable' => [ + 'at-least-two-chars' => 'Escribe al menos 2 caracteres...', + 'no-results' => 'No se encontraron resultados...', + ], + ], + 'custom-filters' => [ + 'clear-all' => 'Borrar Todo', + 'title' => 'Filtros Personalizados', + ], + 'boolean-options' => [ + 'false' => 'Falso', + 'true' => 'Verdadero', + ], + 'date-options' => [ + 'last-month' => 'Mes Pasado', + 'last-six-months' => 'Últimos 6 Meses', + 'last-three-months' => 'Últimos 3 Meses', + 'this-month' => 'Este Mes', + 'this-week' => 'Esta Semana', + 'this-year' => 'Este Año', + 'today' => 'Hoy', + 'yesterday' => 'Ayer', + ], + ], + 'table' => [ + 'actions' => 'Acciones', + 'no-records-available' => 'No hay Registros Disponibles.', + ], + ], + 'modal' => [ + 'confirm' => [ + 'agree-btn' => 'Aceptar', + 'disagree-btn' => 'Rechazar', + 'message' => '¿Estás seguro de que quieres realizar esta acción?', + 'title' => '¿Estás seguro?', + ], + ], + 'tags' => [ + 'index' => [ + 'title' => 'Etiquetas', + 'added-tags' => 'Etiquetas Agregadas', + 'save-btn' => 'Guardar Etiqueta', + 'placeholder' => 'Escribe para buscar etiquetas', + 'add-tag' => 'Agregar \\":term\\"...', + 'aquarelle-red' => 'Rojo Aquarelle', + 'crushed-cashew' => 'Anacardo Triturado', + 'beeswax' => 'Cera de Abejas', + 'lemon-chiffon' => 'Chiffon de Limón', + 'snow-flurry' => 'Tormenta de Nieve', + 'honeydew' => 'Melón', + ], + ], + 'layouts' => [ + 'powered-by' => [ + 'description' => 'Desarrollado por :krayin, un proyecto de código abierto de :webkul.', + ], + 'header' => [ + 'mega-search' => [ + 'title' => 'Búsqueda Mega', + 'tabs' => [ + 'leads' => 'Oportunidades', + 'quotes' => 'Cotizaciones', + 'persons' => 'Personas', + 'products' => 'Productos', + ], + 'explore-all-products' => 'Explorar todos los Productos', + 'explore-all-leads' => 'Explorar todas las Oportunidades', + 'explore-all-contacts' => 'Explorar todos los Contactos', + 'explore-all-quotes' => 'Explorar todas las Cotizaciones', + 'explore-all-matching-products' => 'Explorar todos los productos que coinciden con ":query" (:count)', + 'explore-all-matching-leads' => 'Explorar todas las oportunidades que coinciden con ":query" (:count)', + 'explore-all-matching-contacts' => 'Explorar todos los contactos que coinciden con ":query" (:count)', + 'explore-all-matching-quotes' => 'Explorar todas las cotizaciones que coinciden con ":query" (:count)', + ], + ], + ], + 'attributes' => [ + 'edit' => [ + 'delete' => 'Eliminar', + ], + 'lookup' => [ + 'click-to-add' => 'Haz clic para agregar', + 'search' => 'Buscar...', + 'no-result-found' => 'No se encontraron resultados', + ], + ], + 'lookup' => [ + 'click-to-add' => 'Haz clic para agregar', + 'no-results' => 'No se encontraron resultados', + 'add-as-new' => 'Agregar como nuevo', + 'search' => 'Buscar...', + ], + 'flash-group' => [ + 'success' => 'Éxito', + 'error' => 'Error', + 'warning' => 'Advertencia', + 'info' => 'Información', + ], + 'tiny-mce' => [ + 'http-error' => 'Error HTTP', + 'invalid-json' => 'Respuesta JSON no válida del servidor.', + 'upload-failed' => 'Error al subir el archivo. Por favor, inténtelo de nuevo.', + ], + ], + 'quotes' => [ + 'index' => [ + 'title' => 'Cotizaciones', + 'create-btn' => 'Crear Cotización', + 'create-success' => 'Cotización creada con éxito.', + 'update-success' => 'Cotización actualizada con éxito.', + 'delete-success' => 'Cotización eliminada con éxito.', + 'delete-failed' => 'No se puede eliminar la cotización.', + 'datagrid' => [ + 'subject' => 'Asunto', + 'sales-person' => 'Vendedor', + 'expired-at' => 'Vence en', + 'created-at' => 'Creado en', + 'person' => 'Persona', + 'subtotal' => 'Subtotal', + 'discount' => 'Descuento', + 'tax' => 'Impuesto', + 'adjustment' => 'Ajuste', + 'grand-total' => 'Total General', + 'edit' => 'Editar', + 'delete' => 'Eliminar', + 'print' => 'Imprimir', + ], + 'pdf' => [ + 'adjustment' => 'Ajuste', + 'amount' => 'Monto', + 'billing-address' => 'Dirección de Facturación', + 'date' => 'Fecha', + 'discount' => 'Descuento', + 'expired-at' => 'Vence en', + 'grand-total' => 'Total General', + 'person' => 'Persona', + 'price' => 'Precio', + 'product-name' => 'Nombre del Producto', + 'quantity' => 'Cantidad', + 'quote-id' => 'ID de Cotización', + 'sales-person' => 'Vendedor', + 'shipping-address' => 'Dirección de Envío', + 'sku' => 'SKU', + 'sub-total' => 'Subtotal', + 'subject' => 'Asunto', + 'tax' => 'Impuesto', + 'title' => 'Cotización', + ], + ], + 'create' => [ + 'title' => 'Crear Cotización', + 'save-btn' => 'Guardar Cotización', + 'quote-info' => 'Información de la Cotización', + 'quote-info-info' => 'Introduce la información básica de la cotización.', + 'address-info' => 'Información de la Dirección', + 'address-info-info' => 'Información sobre la dirección relacionada con la cotización.', + 'quote-items' => 'Artículos de la Cotización', + 'search-products' => 'Buscar Productos', + 'link-to-lead' => 'Vincular a cliente potencial', + 'quote-item-info' => 'Agregar Solicitud de Producto para esta cotización.', + 'quote-name' => 'Nombre de la Cotización', + 'quantity' => 'Cantidad', + 'price' => 'Precio', + 'discount' => 'Descuento', + 'tax' => 'Impuesto', + 'total' => 'Total', + 'amount' => 'Monto', + 'add-item' => '+ Agregar Artículo', + 'sub-total' => 'Subtotal (:symbol)', + 'total-discount' => 'Descuento (:symbol)', + 'total-tax' => 'Impuesto (:symbol)', + 'total-adjustment' => 'Ajuste (:symbol)', + 'grand-total' => 'Total General (:symbol)', + 'discount-amount' => 'Monto del Descuento', + 'tax-amount' => 'Monto del Impuesto', + 'adjustment-amount' => 'Monto del Ajuste', + 'product-name' => 'Nombre del Producto', + 'action' => 'Acción', + ], + 'edit' => [ + 'title' => 'Editar Cotización', + 'save-btn' => 'Guardar Cotización', + 'quote-info' => 'Información de la Cotización', + 'quote-info-info' => 'Introduce la información básica de la cotización.', + 'address-info' => 'Información de la Dirección', + 'address-info-info' => 'Información sobre la dirección relacionada con la cotización.', + 'quote-items' => 'Artículos de la Cotización', + 'link-to-lead' => 'Vincular a cliente potencial', + 'quote-item-info' => 'Agregar Solicitud de Producto para esta cotización.', + 'quote-name' => 'Nombre de la Cotización', + 'quantity' => 'Cantidad', + 'price' => 'Precio', + 'search-products' => 'Buscar Productos', + 'discount' => 'Descuento', + 'tax' => 'Impuesto', + 'total' => 'Total', + 'amount' => 'Monto', + 'add-item' => '+ Agregar Artículo', + 'sub-total' => 'Subtotal (:symbol)', + 'total-discount' => 'Descuento (:symbol)', + 'total-tax' => 'Impuesto (:symbol)', + 'total-adjustment' => 'Ajuste (:symbol)', + 'grand-total' => 'Total General (:symbol)', + 'discount-amount' => 'Monto del Descuento', + 'tax-amount' => 'Monto del Impuesto', + 'adjustment-amount' => 'Monto del Ajuste', + 'product-name' => 'Nombre del Producto', + 'action' => 'Acción', + ], + ], + 'contacts' => [ + 'persons' => [ + 'index' => [ + 'title' => 'Personas', + 'create-btn' => 'Crear Persona', + 'create-success' => 'Persona creada con éxito.', + 'update-success' => 'Persona actualizada con éxito.', + 'all-delete-success' => 'Todas las personas seleccionadas fueron eliminadas exitosamente.', + 'partial-delete-warning' => 'Algunas personas fueron eliminadas con éxito. Otras no se pudieron eliminar porque están vinculadas a clientes potenciales.', + 'none-delete-warning' => 'Ninguna de las personas seleccionadas pudo ser eliminada porque están vinculadas a clientes potenciales.', + 'no-selection' => 'No se seleccionaron personas para eliminar.', + 'delete-failed' => 'No se pudieron eliminar las personas seleccionadas.', + 'datagrid' => [ + 'contact-numbers' => 'Números de Contacto', + 'delete' => 'Eliminar', + 'edit' => 'Editar', + 'emails' => 'Correos Electrónicos', + 'id' => 'ID', + 'view' => 'Ver', + 'name' => 'Nombre', + 'organization-name' => 'Nombre de la Organización', + ], + ], + 'view' => [ + 'title' => ':name', + 'about-person' => 'Sobre la Persona', + 'about-organization' => 'Acerca de la organización', + 'activities' => [ + 'index' => [ + 'all' => 'Todos', + 'calls' => 'Llamadas', + 'meetings' => 'Reuniones', + 'lunches' => 'Almuerzos', + 'files' => 'Archivos', + 'quotes' => 'Cotizaciones', + 'notes' => 'Notas', + 'emails' => 'Correos Electrónicos', + 'by-user' => 'Por :user', + 'scheduled-on' => 'Programado para', + 'location' => 'Ubicación', + 'participants' => 'Participantes', + 'mark-as-done' => 'Marcar como Hecho', + 'delete' => 'Eliminar', + 'edit' => 'Editar', + ], + 'actions' => [ + 'mail' => [ + 'btn' => 'Correo', + 'title' => 'Redactar Correo', + 'to' => 'Para', + 'cc' => 'CC', + 'bcc' => 'CCO', + 'subject' => 'Asunto', + 'send-btn' => 'Enviar', + 'message' => 'Mensaje', + ], + 'file' => [ + 'btn' => 'Archivo', + 'title' => 'Agregar Archivo', + 'title-control' => 'Título', + 'name' => 'Nombre del Archivo', + 'description' => 'Descripción', + 'file' => 'Archivo', + 'save-btn' => 'Guardar Archivo', + ], + 'note' => [ + 'btn' => 'Nota', + 'title' => 'Agregar Nota', + 'comment' => 'Comentario', + 'save-btn' => 'Guardar Nota', + ], + 'activity' => [ + 'btn' => 'Actividad', + 'title' => 'Agregar Actividad', + 'title-control' => 'Título', + 'description' => 'Descripción', + 'schedule-from' => 'Programar Desde', + 'schedule-to' => 'Programar Hasta', + 'location' => 'Ubicación', + 'call' => 'Llamada', + 'meeting' => 'Reunión', + 'lunch' => 'Almuerzo', + 'save-btn' => 'Guardar Actividad', + ], + ], + ], + 'tags' => [ + 'create-success' => 'Etiqueta creada con éxito.', + 'destroy-success' => 'Etiqueta eliminada con éxito.', + ], + ], + 'create' => [ + 'title' => 'Crear Persona', + 'save-btn' => 'Guardar Persona', + ], + 'edit' => [ + 'title' => 'Editar Persona', + 'save-btn' => 'Guardar Persona', + ], + ], + 'organizations' => [ + 'index' => [ + 'title' => 'Organizaciones', + 'create-btn' => 'Crear Organización', + 'create-success' => 'Organización creada con éxito.', + 'update-success' => 'Organización actualizada con éxito.', + 'delete-success' => 'Organización eliminada con éxito.', + 'delete-failed' => 'No se puede eliminar la organización.', + 'datagrid' => [ + 'delete' => 'Eliminar', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nombre', + 'persons-count' => 'Número de Personas', + ], + ], + 'create' => [ + 'title' => 'Crear Organización', + 'save-btn' => 'Guardar Organización', + ], + 'edit' => [ + 'title' => 'Editar Organización', + 'save-btn' => 'Guardar Organización', + ], + ], + ], + 'products' => [ + 'index' => [ + 'title' => 'Productos', + 'create-btn' => 'Crear Producto', + 'create-success' => 'Producto creado con éxito.', + 'update-success' => 'Producto actualizado con éxito.', + 'delete-success' => 'Producto eliminado con éxito.', + 'delete-failed' => 'No se puede eliminar el producto.', + 'datagrid' => [ + 'allocated' => 'Asignado', + 'delete' => 'Eliminar', + 'edit' => 'Editar', + 'id' => 'ID', + 'in-stock' => 'En Stock', + 'name' => 'Nombre', + 'on-hand' => 'Disponible', + 'tag-name' => 'Nombre de etiqueta', + 'price' => 'Precio', + 'sku' => 'SKU', + 'view' => 'Ver', + ], + ], + 'create' => [ + 'save-btn' => 'Guardar Productos', + 'title' => 'Crear Productos', + 'general' => 'General', + 'price' => 'Precio', + ], + 'edit' => [ + 'title' => 'Editar Productos', + 'save-btn' => 'Guardar Productos', + 'general' => 'General', + 'price' => 'Precio', + ], + 'view' => [ + 'sku' => 'SKU', + 'all' => 'Todos', + 'notes' => 'Notas', + 'files' => 'Archivos', + 'inventories' => 'Inventario', + 'change-logs' => 'Registros de Cambios', + 'attributes' => [ + 'about-product' => 'Sobre el Producto', + ], + 'inventory' => [ + 'source' => 'Fuente', + 'in-stock' => 'En Stock', + 'allocated' => 'Asignado', + 'on-hand' => 'Disponible', + 'actions' => 'Acciones', + 'assign' => 'Asignar', + 'add-source' => 'Agregar Fuente', + 'location' => 'Ubicación', + 'add-more' => 'Agregar Más', + 'save' => 'Guardar', + ], + ], + ], + 'settings' => [ + 'title' => 'Configuraciones', + 'groups' => [ + 'index' => [ + 'create-btn' => 'Crear Grupo', + 'title' => 'Grupos', + 'create-success' => 'Grupo creado con éxito.', + 'update-success' => 'Grupo actualizado con éxito.', + 'destroy-success' => 'Grupo eliminado con éxito.', + 'delete-failed' => 'No se puede eliminar el grupo.', + 'delete-failed-associated-users' => 'No se puede eliminar el grupo, ya que está siendo utilizado por usuarios.', + 'datagrid' => [ + 'delete' => 'Eliminar', + 'description' => 'Descripción', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nombre', + ], + 'edit' => [ + 'title' => 'Editar Grupo', + ], + 'create' => [ + 'name' => 'Nombre', + 'title' => 'Crear Grupo', + 'description' => 'Descripción', + 'save-btn' => 'Guardar Grupo', + ], + ], + ], + 'roles' => [ + 'index' => [ + 'being-used' => 'El rol no se puede eliminar, ya que está siendo utilizado por un usuario administrador.', + 'create-btn' => 'Crear Roles', + 'create-success' => 'Rol creado con éxito.', + 'current-role-delete-error' => 'No se puede eliminar el rol asignado al usuario actual.', + 'delete-failed' => 'No se puede eliminar el rol.', + 'delete-success' => 'Rol eliminado con éxito.', + 'last-delete-error' => 'Se requiere al menos un rol.', + 'settings' => 'Configuraciones', + 'title' => 'Roles', + 'update-success' => 'Rol actualizado con éxito.', + 'user-define-error' => 'No se puede eliminar el rol del sistema.', + 'datagrid' => [ + 'all' => 'Todos', + 'custom' => 'Personalizado', + 'delete' => 'Eliminar', + 'description' => 'Descripción', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nombre', + 'permission-type' => 'Tipo de Permiso', + ], + ], + 'create' => [ + 'access-control' => 'Control de Acceso', + 'all' => 'Todos', + 'back-btn' => 'Volver', + 'custom' => 'Personalizado', + 'description' => 'Descripción', + 'general' => 'General', + 'name' => 'Nombre', + 'permissions' => 'Permisos', + 'save-btn' => 'Guardar Rol', + 'title' => 'Crear Rol', + ], + 'edit' => [ + 'access-control' => 'Control de Acceso', + 'all' => 'Todos', + 'back-btn' => 'Volver', + 'custom' => 'Personalizado', + 'description' => 'Descripción', + 'general' => 'General', + 'name' => 'Nombre', + 'permissions' => 'Permisos', + 'save-btn' => 'Guardar Rol', + 'title' => 'Editar Rol', + ], + ], + 'types' => [ + 'index' => [ + 'create-btn' => 'Crear Tipo', + 'create-success' => 'Tipo creado con éxito.', + 'delete-failed' => 'No se puede eliminar el tipo.', + 'delete-success' => 'Tipo eliminado con éxito.', + 'title' => 'Tipos', + 'update-success' => 'Tipo actualizado con éxito.', + 'datagrid' => [ + 'delete' => 'Eliminar', + 'description' => 'Descripción', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nombre', + ], + 'create' => [ + 'name' => 'Nombre', + 'save-btn' => 'Guardar Tipo', + 'title' => 'Crear Tipo', + ], + 'edit' => [ + 'title' => 'Editar Tipo', + ], + ], + ], + 'sources' => [ + 'index' => [ + 'title' => 'Fuentes', + 'create-btn' => 'Crear Fuente', + 'create-success' => 'Fuente creada con éxito.', + 'delete-failed' => 'No se puede eliminar la fuente.', + 'delete-success' => 'Fuente eliminada con éxito.', + 'update-success' => 'Fuente actualizada con éxito.', + 'delete-failed-associated-leads' => 'No se puede eliminar la fuente porque está asociada a clientes potenciales existentes. Por favor, desvincúlelos o actualícelos antes de eliminar.', + 'datagrid' => [ + 'delete' => 'Eliminar', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nombre', + ], + 'create' => [ + 'name' => 'Nombre', + 'save-btn' => 'Guardar fuente', + 'title' => 'Crear fuente', + ], + 'edit' => [ + 'title' => 'Editar fuente', + ], + ], + ], + 'workflows' => [ + 'index' => [ + 'title' => 'Flujos de Trabajo', + 'create-btn' => 'Crear Flujo de Trabajo', + 'create-success' => 'Flujo de trabajo creado con éxito.', + 'update-success' => 'Flujo de trabajo actualizado con éxito.', + 'delete-success' => 'Flujo de trabajo eliminado con éxito.', + 'delete-failed' => 'No se puede eliminar el flujo de trabajo.', + 'datagrid' => [ + 'delete' => 'Eliminar', + 'description' => 'Descripción', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nombre', + ], + ], + 'helpers' => [ + 'update-related-leads' => 'Actualizar leads relacionados', + 'send-email-to-sales-owner' => 'Enviar correo al propietario de ventas', + 'send-email-to-participants' => 'Enviar correo a los participantes', + 'add-webhook' => 'Agregar Webhook', + 'update-lead' => 'Actualizar Lead', + 'update-person' => 'Actualizar Persona', + 'send-email-to-person' => 'Enviar correo a la persona', + 'add-tag' => 'Agregar Etiqueta', + 'add-note-as-activity' => 'Agregar Nota como Actividad', + 'update-quote' => 'Actualizar cotización', + ], + 'create' => [ + 'title' => 'Crear Flujo de Trabajo', + 'event' => 'Evento', + 'back-btn' => 'Volver', + 'save-btn' => 'Guardar Flujo de Trabajo', + 'name' => 'Nombre', + 'basic-details' => 'Detalles Básicos', + 'description' => 'Descripción', + 'actions' => 'Acciones', + 'basic-details-info' => 'Coloque la información básica del flujo de trabajo.', + 'event-info' => 'Un evento desencadena, verifica, condiciones y realiza acciones predefinidas.', + 'conditions' => 'Condiciones', + 'conditions-info' => 'Las condiciones son reglas que verifican escenarios, desencadenadas en ocasiones específicas.', + 'actions-info' => 'Una acción no solo reduce la carga de trabajo, sino que también facilita la automatización de CRM.', + 'value' => 'Valor', + 'condition-type' => 'Tipo de Condición', + 'all-condition-are-true' => 'Todas las condiciones son verdaderas', + 'any-condition-are-true' => 'Cualquiera de las condiciones es verdadera', + 'add-condition' => 'Agregar Condición', + 'add-action' => 'Agregar Acción', + 'yes' => 'Sí', + 'no' => 'No', + 'email' => 'Correo Electrónico', + 'is-equal-to' => 'Es igual a', + 'is-not-equal-to' => 'No es igual a', + 'equals-or-greater-than' => 'Es igual o mayor que', + 'equals-or-less-than' => 'Es igual o menor que', + 'greater-than' => 'Mayor que', + 'less-than' => 'Menor que', + 'type' => 'Tipo', + 'contain' => 'Contiene', + 'contains' => 'Contiene', + 'does-not-contain' => 'No contiene', + ], + 'edit' => [ + 'title' => 'Editar Flujo de Trabajo', + 'event' => 'Evento', + 'back-btn' => 'Volver', + 'save-btn' => 'Guardar Flujo de Trabajo', + 'name' => 'Nombre', + 'basic-details' => 'Detalles Básicos', + 'description' => 'Descripción', + 'actions' => 'Acciones', + 'type' => 'Tipo', + 'basic-details-info' => 'Coloque la información básica del flujo de trabajo.', + 'event-info' => 'Un evento desencadena, verifica, condiciones y realiza acciones predefinidas.', + 'conditions' => 'Condiciones', + 'conditions-info' => 'Las condiciones son reglas que verifican escenarios, desencadenadas en ocasiones específicas.', + 'actions-info' => 'Una acción no solo reduce la carga de trabajo, sino que también facilita la automatización de CRM.', + 'value' => 'Valor', + 'condition-type' => 'Tipo de Condición', + 'all-condition-are-true' => 'Todas las condiciones son verdaderas', + 'any-condition-are-true' => 'Cualquiera de las condiciones es verdadera', + 'add-condition' => 'Agregar Condición', + 'add-action' => 'Agregar Acción', + 'yes' => 'Sí', + 'no' => 'No', + 'email' => 'Correo Electrónico', + 'is-equal-to' => 'Es igual a', + 'is-not-equal-to' => 'No es igual a', + 'equals-or-greater-than' => 'Es igual o mayor que', + 'equals-or-less-than' => 'Es igual o menor que', + 'greater-than' => 'Mayor que', + 'less-than' => 'Menor que', + 'contain' => 'Contiene', + 'contains' => 'Contiene', + 'does-not-contain' => 'No contiene', + ], + ], + 'webforms' => [ + 'index' => [ + 'title' => 'Webforms', + 'create-btn' => 'Crear Webform', + 'create-success' => 'Webform creado con éxito.', + 'update-success' => 'Webform actualizado con éxito.', + 'delete-success' => 'Webform eliminado con éxito.', + 'delete-failed' => 'No se puede eliminar el Webform.', + 'datagrid' => [ + 'id' => 'ID', + 'title' => 'Título', + 'edit' => 'Editar', + 'delete' => 'Eliminar', + ], + ], + 'create' => [ + 'title' => 'Crear formulario web', + 'add-attribute-btn' => 'Agregar Botón de Atributo', + 'attribute-label-color' => 'Color de Etiqueta del Atributo', + 'attributes' => 'Atributos', + 'attributes-info' => 'Agregue atributos personalizados al formulario.', + 'background-color' => 'Color de Fondo', + 'create-lead' => 'Crear Lead', + 'customize-webform' => 'Personalizar Webform', + 'customize-webform-info' => 'Personalice su formulario web con los colores de los elementos de su elección.', + 'description' => 'Descripción', + 'display-custom-message' => 'Mostrar mensaje personalizado', + 'form-background-color' => 'Color de Fondo del Formulario', + 'form-submit-btn-color' => 'Color del Botón de Enviar del Formulario', + 'form-submit-button-color' => 'Color del Botón de Enviar del Formulario', + 'form-title-color' => 'Color del Título del Formulario', + 'general' => 'General', + 'leads' => 'Leads', + 'person' => 'Persona', + 'save-btn' => 'Guardar Webform', + 'submit-button-label' => 'Etiqueta del Botón de Enviar', + 'submit-success-action' => 'Acción en caso de éxito de envío', + 'redirect-to-url' => 'Redirigir a la URL', + 'choose-value' => 'Elige un valor', + 'select-file' => 'Seleccionar archivo', + 'select-image' => 'Seleccionar imagen', + 'enter-value' => 'Introducir valor', + ], + 'edit' => [ + 'add-attribute-btn' => 'Agregar Botón de Atributo', + 'attribute-label-color' => 'Color de Etiqueta del Atributo', + 'attributes' => 'Atributos', + 'attributes-info' => 'Agregue atributos personalizados al formulario.', + 'background-color' => 'Color de Fondo', + 'choose-value' => 'Elige un valor', + 'code-snippet' => 'Fragmento de Código', + 'copied' => 'Copiado', + 'copy' => 'Copiar', + 'create-lead' => 'Crear Lead', + 'customize-webform' => 'Personalizar Webform', + 'customize-webform-info' => 'Personalice su formulario web con los colores de los elementos de su elección.', + 'description' => 'Descripción', + 'display-custom-message' => 'Mostrar mensaje personalizado', + 'embed' => 'Incrustar', + 'enter-value' => 'Introducir valor', + 'form-background-color' => 'Color de Fondo del Formulario', + 'form-submit-btn-color' => 'Color del Botón de Enviar del Formulario', + 'form-submit-button-color' => 'Color del Botón de Enviar del Formulario', + 'form-title-color' => 'Color del Título del Formulario', + 'general' => 'General', + 'leads' => 'Leads', + 'person' => 'Persona', + 'preview' => 'Vista Previa', + 'public-url' => 'URL Pública', + 'redirect-to-url' => 'Redirigir a la URL', + 'save-btn' => 'Guardar Webform', + 'select-file' => 'Seleccionar archivo', + 'select-image' => 'Seleccionar imagen', + 'submit-button-label' => 'Etiqueta del Botón de Enviar', + 'submit-success-action' => 'Acción en caso de éxito de envío', + 'title' => 'Editar formulario web', + ], + ], + 'email-template' => [ + 'index' => [ + 'create-btn' => 'Crear Plantilla de Correo Electrónico', + 'title' => 'Plantillas de Correo Electrónico', + 'create-success' => 'Plantilla de Correo Electrónico creada exitosamente.', + 'update-success' => 'Plantilla de Correo Electrónico actualizada exitosamente.', + 'delete-success' => 'Plantilla de Correo Electrónico eliminada exitosamente.', + 'delete-failed' => 'No se puede eliminar la Plantilla de Correo Electrónico.', + 'datagrid' => [ + 'delete' => 'Eliminar', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nombre', + 'subject' => 'Asunto', + ], + ], + 'create' => [ + 'title' => 'Crear Plantilla de Correo Electrónico', + 'save-btn' => 'Guardar Plantilla de Correo Electrónico', + 'email-template' => 'Plantilla de Correo Electrónico', + 'subject' => 'Asunto', + 'content' => 'Contenido', + 'subject-placeholders' => 'Marcadores de Posición del Asunto', + 'general' => 'General', + 'name' => 'Nombre', + ], + 'edit' => [ + 'title' => 'Editar Plantilla de Correo Electrónico', + 'save-btn' => 'Guardar Plantilla de Correo Electrónico', + 'email-template' => 'Plantilla de Correo Electrónico', + 'subject' => 'Asunto', + 'content' => 'Contenido', + 'subject-placeholders' => 'Marcadores de Posición del Asunto', + 'general' => 'General', + 'name' => 'Nombre', + ], + ], + 'marketing' => [ + 'events' => [ + 'index' => [ + 'create-btn' => 'Crear Evento', + 'title' => 'Eventos', + 'create-success' => 'Evento creado con éxito.', + 'update-success' => 'Evento actualizado con éxito.', + 'delete-success' => 'Evento eliminado con éxito.', + 'delete-failed' => 'No se puede eliminar el evento.', + 'mass-delete-success' => 'Eventos eliminados con éxito', + 'datagrid' => [ + 'delete' => 'Eliminar', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nombre', + 'description' => 'Descripción', + 'date' => 'Fecha', + ], + 'create' => [ + 'title' => 'Crear Evento', + 'name' => 'Nombre', + 'date' => 'Fecha', + 'description' => 'Descripción', + 'save-btn' => 'Guardar Evento', + ], + 'edit' => [ + 'title' => 'Editar Evento', + ], + ], + ], + 'campaigns' => [ + 'index' => [ + 'create-btn' => 'Crear Campaña', + 'title' => 'Campañas', + 'create-success' => 'Campaña creada con éxito.', + 'update-success' => 'Campaña actualizada con éxito.', + 'delete-success' => 'Campaña eliminada con éxito.', + 'delete-failed' => 'No se puede eliminar la campaña.', + 'mass-delete-success' => 'Campañas eliminadas con éxito.', + 'datagrid' => [ + 'id' => 'ID', + 'name' => 'Nombre', + 'subject' => 'Asunto', + 'status' => 'Estado', + 'active' => 'Activo', + 'inactive' => 'Inactivo', + 'edit' => 'Editar', + 'delete' => 'Eliminar', + ], + 'create' => [ + 'title' => 'Crear Campaña', + 'name' => 'Nombre', + 'type' => 'Tipo', + 'subject' => 'Asunto', + 'event' => 'Evento', + 'email-template' => 'Plantilla de Correo', + 'status' => 'Estado', + ], + 'edit' => [ + 'title' => 'Editar Campaña', + ], + ], + ], + ], + 'tags' => [ + 'index' => [ + 'create-btn' => 'Crear Etiqueta', + 'title' => 'Etiquetas', + 'create-success' => 'Etiqueta creada exitosamente.', + 'update-success' => 'Etiqueta actualizada exitosamente.', + 'delete-success' => 'Etiqueta eliminada exitosamente.', + 'delete-failed' => 'No se puede eliminar la Etiqueta.', + 'datagrid' => [ + 'delete' => 'Eliminar', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nombre', + 'users' => 'Usuarios', + 'created-at' => 'Creado En', + ], + 'create' => [ + 'name' => 'Nombre', + 'save-btn' => 'Guardar Etiqueta', + 'title' => 'Crear Etiqueta', + 'color' => 'Color', + ], + 'edit' => [ + 'title' => 'Editar Etiqueta', + ], + ], + ], + 'users' => [ + 'index' => [ + 'create-btn' => 'Crear Usuario', + 'create-success' => 'Usuario creado exitosamente.', + 'delete-failed' => 'No se puede eliminar el Usuario.', + 'delete-success' => 'Usuario eliminado exitosamente.', + 'last-delete-error' => 'Se requiere al menos un usuario.', + 'mass-delete-failed' => 'No se pueden eliminar los Usuarios.', + 'mass-delete-success' => 'Usuarios eliminados exitosamente.', + 'mass-update-failed' => 'No se pueden actualizar los Usuarios.', + 'mass-update-success' => 'Usuarios actualizados exitosamente.', + 'title' => 'Usuarios', + 'update-success' => 'Usuario actualizado exitosamente.', + 'user-define-error' => 'No se puede eliminar el usuario del sistema.', + 'active' => 'Activo', + 'inactive' => 'Inactivo', + 'datagrid' => [ + 'active' => 'Activo', + 'created-at' => 'Creado En', + 'delete' => 'Eliminar', + 'edit' => 'Editar', + 'email' => 'Correo Electrónico', + 'id' => 'ID', + 'inactive' => 'Inactivo', + 'name' => 'Nombre', + 'status' => 'Estado', + 'update-status' => 'Actualizar Estado', + 'users' => 'Usuarios', + ], + 'create' => [ + 'confirm-password' => 'Confirmar Contraseña', + 'email' => 'Correo Electrónico', + 'general' => 'General', + 'global' => 'Global', + 'group' => 'Grupo', + 'individual' => 'Individual', + 'name' => 'Nombre', + 'password' => 'Contraseña', + 'permission' => 'Permiso', + 'role' => 'Rol', + 'save-btn' => 'Guardar Usuario', + 'status' => 'Estado', + 'title' => 'Crear Usuario', + 'view-permission' => 'Ver Permiso', + 'select-at-lest-one-group' => 'Select at least one group', + ], + 'edit' => [ + 'title' => 'Editar Usuario', + ], + ], + ], + 'pipelines' => [ + 'index' => [ + 'title' => 'Canales', + 'create-btn' => 'Crear Canal', + 'create-success' => 'Canal creado exitosamente.', + 'update-success' => 'Canal actualizado exitosamente.', + 'default-required' => 'Se requiere al menos una canalización predeterminada.', + 'delete-success' => 'Canal eliminado exitosamente.', + 'delete-failed' => 'No se puede eliminar el Canal.', + 'default-delete-error' => 'No se puede eliminar el canal predeterminado.', + 'datagrid' => [ + 'delete' => 'Eliminar', + 'edit' => 'Editar', + 'id' => 'ID', + 'is-default' => 'Es Predeterminado', + 'name' => 'Nombre', + 'no' => 'No', + 'rotten-days' => 'Días de Pudrición', + 'yes' => 'Sí', + ], + ], + 'create' => [ + 'title' => 'Crear Canal', + 'save-btn' => 'Guardar Canal', + 'name' => 'Nombre', + 'rotten-days' => 'Días de Pudrición', + 'mark-as-default' => 'Marcar como Predeterminado', + 'general' => 'General', + 'probability' => 'Probabilidad (%)', + 'new-stage' => 'Nuevo', + 'won-stage' => 'Ganado', + 'lost-stage' => 'Perdido', + 'stage-btn' => 'Añadir Etapa', + 'stages' => 'Etapas', + 'duplicate-name' => 'El campo "Nombre" no puede ser duplicado', + 'delete-stage' => 'Eliminar Etapa', + 'add-new-stages' => 'Añadir Nuevas Etapas', + 'add-stage-info' => 'Añadir nueva etapa para tu Canal', + 'newly-added' => 'Añadido Recientemente', + 'stage-delete-success' => 'Etapa Eliminada Exitosamente', + ], + 'edit' => [ + 'title' => 'Editar Canal', + 'save-btn' => 'Guardar Canal', + 'name' => 'Nombre', + 'rotten-days' => 'Días de Pudrición', + 'mark-as-default' => 'Marcar como Predeterminado', + 'general' => 'General', + 'probability' => 'Probabilidad (%)', + 'new-stage' => 'Nuevo', + 'won-stage' => 'Ganado', + 'lost-stage' => 'Perdido', + 'stage-btn' => 'Añadir Etapa', + 'stages' => 'Etapas', + 'duplicate-name' => 'El campo "Nombre" no puede ser duplicado', + 'delete-stage' => 'Eliminar Etapa', + 'add-new-stages' => 'Añadir Nuevas Etapas', + 'add-stage-info' => 'Añadir nueva etapa para tu Canal', + 'stage-delete-success' => 'Etapa Eliminada Exitosamente', + ], + ], + 'webhooks' => [ + 'index' => [ + 'title' => 'Webhooks', + 'create-btn' => 'Crear Webhook', + 'create-success' => 'Webhook creado exitosamente.', + 'update-success' => 'Webhook actualizado exitosamente.', + 'delete-success' => 'Webhook eliminado exitosamente.', + 'delete-failed' => 'No se puede eliminar el Webhook.', + 'datagrid' => [ + 'id' => 'ID', + 'delete' => 'Eliminar', + 'edit' => 'Editar', + 'name' => 'Nombre', + 'entity-type' => 'Tipo de Entidad', + 'end-point' => 'Punto Final', + ], + ], + 'create' => [ + 'title' => 'Crear Webhook', + 'save-btn' => 'Guardar Webhook', + 'info' => 'Ingrese los detalles del webhook', + 'url-and-parameters' => 'URL Y Parámetros', + 'method' => 'Método', + 'post' => 'Post', + 'put' => 'Put', + 'url-endpoint' => 'Punto Final de URL', + 'parameters' => 'Parámetros', + 'add-new-parameter' => 'Añadir Nuevo Parámetro', + 'url-preview' => 'Vista Previa de URL:', + 'headers' => 'Encabezados', + 'add-new-header' => 'Añadir Nuevo Encabezado', + 'body' => 'Cuerpo', + 'default' => 'Predeterminado', + 'x-www-form-urlencoded' => 'x-www-form-urlencoded', + 'key-and-value' => 'Clave y Valor', + 'add-new-payload' => 'Añadir nueva carga', + 'raw' => 'Crudo', + 'general' => 'General', + 'name' => 'Nombre', + 'entity-type' => 'Tipo de Entidad', + 'insert-placeholder' => 'Insertar Marcador de Posición', + 'description' => 'Descripción', + 'json' => 'Json', + 'text' => 'Texto', + ], + 'edit' => [ + 'title' => 'Editar Webhook', + 'edit-btn' => 'Guardar Webhook', + 'save-btn' => 'Guardar Webhook', + 'info' => 'Ingrese los detalles del webhook', + 'url-and-parameters' => 'URL Y Parámetros', + 'method' => 'Método', + 'post' => 'Post', + 'put' => 'Put', + 'url-endpoint' => 'Punto Final de URL', + 'parameters' => 'Parámetros', + 'add-new-parameter' => 'Añadir Nuevo Parámetro', + 'url-preview' => 'Vista Previa de URL:', + 'headers' => 'Encabezados', + 'add-new-header' => 'Añadir Nuevo Encabezado', + 'body' => 'Cuerpo', + 'default' => 'Predeterminado', + 'x-www-form-urlencoded' => 'x-www-form-urlencoded', + 'key-and-value' => 'Clave y Valor', + 'add-new-payload' => 'Añadir nueva carga', + 'raw' => 'Crudo', + 'general' => 'General', + 'name' => 'Nombre', + 'entity-type' => 'Tipo de Entidad', + 'insert-placeholder' => 'Insertar Marcador de Posición', + 'description' => 'Descripción', + 'json' => 'Json', + 'text' => 'Texto', + ], + ], + 'warehouses' => [ + 'index' => [ + 'title' => 'Almacenes', + 'create-btn' => 'Crear Almacén', + 'create-success' => 'Almacén creado con éxito.', + 'name-exists' => 'El nombre del almacén ya existe.', + 'update-success' => 'Almacén actualizado con éxito.', + 'delete-success' => 'Almacén eliminado con éxito.', + 'delete-failed' => 'No se puede eliminar el almacén.', + 'datagrid' => [ + 'id' => 'ID', + 'name' => 'Nombre', + 'contact-name' => 'Nombre del Contacto', + 'delete' => 'Eliminar', + 'edit' => 'Editar', + 'view' => 'Ver', + 'created-at' => 'Creado En', + 'products' => 'Productos', + 'contact-emails' => 'Correos Electrónicos de Contacto', + 'contact-numbers' => 'Números de Teléfono de Contacto', + ], + ], + 'create' => [ + 'title' => 'Crear Almacén', + 'save-btn' => 'Guardar Almacén', + 'contact-info' => 'Información de Contacto', + ], + 'edit' => [ + 'title' => 'Editar Almacén', + 'save-btn' => 'Guardar Almacén', + 'contact-info' => 'Información de Contacto', + ], + 'view' => [ + 'all' => 'Todos', + 'notes' => 'Notas', + 'files' => 'Archivos', + 'location' => 'Ubicación', + 'change-logs' => 'Registros de Cambios', + 'locations' => [ + 'action' => 'Acción', + 'add-location' => 'Agregar Ubicación', + 'create-success' => 'Ubicación creada con éxito.', + 'delete' => 'Eliminar', + 'delete-failed' => 'No se puede eliminar la ubicación.', + 'delete-success' => 'Ubicación eliminada con éxito.', + 'name' => 'Nombre', + 'save-btn' => 'Guardar', + ], + 'general-information' => [ + 'title' => 'Información General', + ], + 'contact-information' => [ + 'title' => 'Información de Contacto', + ], + ], + ], + 'attributes' => [ + 'index' => [ + 'title' => 'Atributos', + 'create-btn' => 'Crear Atributo', + 'create-success' => 'Atributo creados con éxito.', + 'update-success' => 'Atributo actualizados con éxito.', + 'delete-success' => 'Atributo eliminados con éxito.', + 'delete-failed' => 'No se pueden eliminar los atributo.', + 'user-define-error' => 'No se puede eliminar el atributo del sistema.', + 'mass-delete-failed' => 'No se pueden eliminar los atributos del sistema.', + 'datagrid' => [ + 'yes' => 'Sí', + 'no' => 'No', + 'id' => 'ID', + 'code' => 'Código', + 'name' => 'Nombre', + 'entity-type' => 'Tipo de Entidad', + 'type' => 'Tipo', + 'is-default' => 'Es Predeterminado', + 'edit' => 'Editar', + 'delete' => 'Eliminar', + 'entity-types' => [ + 'leads' => 'Clientes potenciales', + 'organizations' => 'Organizaciones', + 'persons' => 'Personas', + 'products' => 'Productos', + 'quotes' => 'Cotizaciones', + 'warehouses' => 'Almacenes', + ], + 'types' => [ + 'text' => 'Texto', + 'textarea' => 'Área de texto', + 'price' => 'Precio', + 'boolean' => 'Booleano', + 'select' => 'Seleccionar', + 'multiselect' => 'Selección múltiple', + 'checkbox' => 'Casilla de verificación', + 'email' => 'Correo electrónico', + 'address' => 'Dirección', + 'phone' => 'Teléfono', + 'lookup' => 'Búsqueda', + 'datetime' => 'Fecha y hora', + 'date' => 'Fecha', + 'image' => 'Imagen', + 'file' => 'Archivo', + ], + ], + ], + 'create' => [ + 'title' => 'Crear Atributo', + 'save-btn' => 'Guardar Atributo', + 'code' => 'Código', + 'name' => 'Nombre', + 'entity-type' => 'Tipo de Entidad', + 'type' => 'Tipo', + 'validations' => 'Validaciones', + 'is-required' => 'Es Requerido', + 'input-validation' => 'Validación de Entrada', + 'is-unique' => 'Es Único', + 'labels' => 'Etiquetas', + 'general' => 'General', + 'numeric' => 'Numérico', + 'decimal' => 'Decimal', + 'url' => 'Url', + 'options' => 'Opciones', + 'option-type' => 'Tipo de Opción', + 'lookup-type' => 'Tipo de Búsqueda', + 'add-option' => 'Agregar Opción', + 'save-option' => 'Guardar Opción', + 'option-name' => 'Nombre de Opción', + 'add-attribute-options' => 'Agregar Opciones de Atributo', + 'text' => 'Texto', + 'textarea' => 'Área de Texto', + 'price' => 'Precio', + 'boolean' => 'Booleano', + 'select' => 'Seleccionar', + 'multiselect' => 'Selección Múltiple', + 'email' => 'Correo Electrónico', + 'address' => 'Dirección', + 'phone' => 'Teléfono', + 'datetime' => 'Fecha y Hora', + 'date' => 'Fecha', + 'image' => 'Imagen', + 'file' => 'Archivo', + 'lookup' => 'Búsqueda', + 'entity_type' => 'Tipo de Entidad', + 'checkbox' => 'Casilla de Verificación', + 'is_required' => 'Es Requerido', + 'is_unique' => 'Es Único', + 'actions' => 'Acciones', + ], + 'edit' => [ + 'actions' => 'Acciones', + 'add-attribute-options' => 'Agregar Opciones de Atributo', + 'add-option' => 'Agregar Opción', + 'address' => 'Dirección', + 'boolean' => 'Booleano', + 'checkbox' => 'Casilla de Verificación', + 'code' => 'Código', + 'date' => 'Fecha', + 'datetime' => 'Fecha y Hora', + 'decimal' => 'Decimal', + 'email' => 'Correo Electrónico', + 'entity-type' => 'Tipo de Entidad', + 'entity_type' => 'Tipo de Entidad', + 'file' => 'Archivo', + 'general' => 'General', + 'image' => 'Imagen', + 'input-validation' => 'Validación de Entrada', + 'is-required' => 'Es Requerido', + 'is-unique' => 'Es Único', + 'is_required' => 'Es Requerido', + 'is_unique' => 'Es Único', + 'labels' => 'Etiquetas', + 'lookup' => 'Búsqueda', + 'lookup-type' => 'Tipo de Búsqueda', + 'multiselect' => 'Selección Múltiple', + 'name' => 'Nombre', + 'numeric' => 'Numérico', + 'option-deleted' => 'Attribute Option is deleted successfully', + 'option-name' => 'Nombre de Opción', + 'option-type' => 'Tipo de Opción', + 'options' => 'Opciones', + 'phone' => 'Teléfono', + 'price' => 'Precio', + 'save-btn' => 'Guardar Atributo', + 'save-option' => 'Guardar Opción', + 'select' => 'Seleccionar', + 'text' => 'Texto', + 'textarea' => 'Área de Texto', + 'title' => 'Editar Atributo', + 'type' => 'Tipo', + 'url' => 'Url', + 'validations' => 'Validaciones', + ], + ], + 'data-transfer' => [ + 'imports' => [ + 'create' => [ + 'action' => 'Acción', + 'allowed-errors' => 'Errores Permitidos', + 'back-btn' => 'Atrás', + 'create-update' => 'Crear/Actualizar', + 'delete' => 'Eliminar', + 'download-sample' => 'Descargar Muestra', + 'field-separator' => 'Separador de Campos', + 'file' => 'Archivo', + 'general' => 'General', + 'images-directory' => 'Ruta del Directorio de Imágenes', + 'process-in-queue' => 'Procesar en Cola', + 'results' => 'Resultados', + 'save-btn' => 'Guardar Importación', + 'settings' => 'Configuraciones', + 'skip-errors' => 'Omitir Errores', + 'stop-on-errors' => 'Detener en Errores', + 'title' => 'Crear Importación', + 'type' => 'Tipo', + 'validation-strategy' => 'Estrategia de Validación', + ], + 'edit' => [ + 'action' => 'Acción', + 'allowed-errors' => 'Errores Permitidos', + 'back-btn' => 'Atrás', + 'create-update' => 'Crear/Actualizar', + 'delete' => 'Eliminar', + 'download-sample' => 'Descargar Muestra', + 'field-separator' => 'Separador de Campos', + 'file' => 'Archivo', + 'general' => 'General', + 'images-directory' => 'Ruta del Directorio de Imágenes', + 'process-in-queue' => 'Procesar en Cola', + 'results' => 'Resultados', + 'save-btn' => 'Guardar Importación', + 'settings' => 'Configuraciones', + 'skip-errors' => 'Omitir Errores', + 'stop-on-errors' => 'Detener en Errores', + 'title' => 'Editar Importación', + 'type' => 'Tipo', + 'validation-strategy' => 'Estrategia de Validación', + ], + 'index' => [ + 'button-title' => 'Crear Importación', + 'title' => 'Importaciones', + 'datagrid' => [ + 'actions' => 'Acciones', + 'completed-at' => 'Completado en', + 'created' => 'Creado', + 'delete' => 'Eliminar', + 'deleted' => 'Eliminado', + 'edit' => 'Editar', + 'error-file' => 'Archivo de Errores', + 'id' => 'ID', + 'started-at' => 'Iniciado en', + 'state' => 'Estado', + 'summary' => 'Resumen', + 'type' => 'Tipo', + 'updated' => 'Actualizado', + 'uploaded-file' => 'Archivo Subido', + ], + ], + 'import' => [ + 'back-btn' => 'Atrás', + 'completed-batches' => 'Total de Lotes Completados:', + 'download-error-report' => 'Descargar Informe Completo', + 'edit-btn' => 'Editar', + 'imported-info' => '¡Felicidades! Tu importación fue exitosa.', + 'importing-info' => 'Importación en Proceso', + 'indexing-info' => 'Indexación de Recursos (Precios, Inventario y Elastic Search) en Progreso', + 'linking-info' => 'Vinculación de Recursos en Progreso', + 'progress' => 'Progreso:', + 'title' => 'Importación', + 'total-batches' => 'Total de Lotes:', + 'total-created' => 'Total de Registros Creados:', + 'total-deleted' => 'Total de Registros Eliminados:', + 'total-errors' => 'Total de Errores:', + 'total-invalid-rows' => 'Total de Filas Inválidas:', + 'total-rows-processed' => 'Total de Filas Procesadas:', + 'total-updated' => 'Total de Registros Actualizados:', + 'validate' => 'Validar', + 'validate-info' => 'Haz clic en Validar Datos para comprobar tu importación.', + 'validating-info' => 'La lectura y validación de los datos ha comenzado', + 'validation-failed-info' => 'Tu importación no es válida. Por favor, corrige los siguientes errores e intenta de nuevo.', + 'validation-success-info' => 'Tu importación es válida. Haz clic en Importar para iniciar el proceso de importación.', + ], + 'create-success' => 'Importación creada exitosamente.', + 'delete-failed' => 'La eliminación de la importación falló inesperadamente.', + 'delete-success' => 'Importación eliminada exitosamente.', + 'not-valid' => 'La importación no es válida', + 'nothing-to-import' => 'No hay recursos para importar.', + 'setup-queue-error' => 'Por favor, cambia tu controlador de cola a "database" o "redis" para iniciar el proceso de importación.', + 'update-success' => 'Importación actualizada exitosamente.', + ], + ], + ], + 'activities' => [ + 'index' => [ + 'title' => 'Actividades', + 'datagrid' => [ + 'comment' => 'Comentario', + 'created_at' => 'Creado En', + 'created_by' => 'Creado Por', + 'edit' => 'Editar', + 'id' => 'ID', + 'done' => 'Completado', + 'not-done' => 'No Completado', + 'lead' => 'Oportunidad', + 'mass-delete' => 'Eliminación Masiva', + 'mass-update' => 'Actualización Masiva', + 'schedule-from' => 'Programar Desde', + 'schedule-to' => 'Programar Hasta', + 'schedule_from' => 'Programar Desde', + 'schedule_to' => 'Programar Hasta', + 'title' => 'Título', + 'is_done' => 'Completado', + 'type' => 'Tipo', + 'update' => 'Actualizar', + 'call' => 'Llamada', + 'meeting' => 'Reunión', + 'lunch' => 'Almuerzo', + ], + ], + 'edit' => [ + 'title' => 'Editar Actividad', + 'back-btn' => 'Volver', + 'save-btn' => 'Guardar Actividad', + 'type' => 'Tipo de Actividad', + 'call' => 'Llamada', + 'meeting' => 'Reunión', + 'lunch' => 'Almuerzo', + 'schedule_to' => 'Programar Hasta', + 'schedule_from' => 'Programar Desde', + 'location' => 'Ubicación', + 'comment' => 'Comentario', + 'lead' => 'Oportunidad', + 'participants' => 'Participantes', + 'general' => 'General', + 'persons' => 'Personas', + 'no-result-found' => 'No se encontraron registros.', + 'users' => 'Usuarios', + ], + 'updated' => 'Actualizado :attribute', + 'created' => 'Creado', + 'duration-overlapping' => 'Los participantes tienen otra reunión en este momento. ¿Deseas continuar?', + 'create-success' => 'Actividad creada con éxito.', + 'update-success' => 'Actividad actualizada con éxito.', + 'overlapping-error' => 'Los participantes tienen otra reunión en este momento.', + 'destroy-success' => 'Actividad eliminada con éxito.', + 'delete-failed' => 'No se puede eliminar la actividad.', + 'mass-update-success' => 'Actividades actualizadas con éxito.', + 'mass-destroy-success' => 'Actividades eliminadas con éxito.', + 'mass-delete-failed' => 'No se pueden eliminar las actividades.', + ], + 'mail' => [ + 'index' => [ + 'compose' => 'Redactar', + 'draft' => 'Borrador', + 'inbox' => 'Bandeja de entrada', + 'outbox' => 'Bandeja de salida', + 'sent' => 'Enviados', + 'trash' => 'Papelera', + 'compose-mail-btn' => 'Redactar Correo', + 'btn' => 'Correo', + 'mail' => [ + 'title' => 'Redactar Correo', + 'to' => 'Para', + 'enter-emails' => 'Presiona enter para añadir correos', + 'cc' => 'CC', + 'bcc' => 'BCC', + 'subject' => 'Asunto', + 'send-btn' => 'Enviar', + 'message' => 'Mensaje', + 'draft' => 'Borrador', + ], + 'datagrid' => [ + 'id' => 'ID', + 'from' => 'De', + 'to' => 'Para', + 'subject' => 'Asunto', + 'tags' => 'Etiquetas', + 'content' => 'Contenido', + 'attachments' => 'Archivos adjuntos', + 'date' => 'Fecha', + 'move-to-inbox' => 'Mover a la bandeja de entrada', + 'move-to-trash' => 'Movido a la papelera', + 'edit' => 'Editar', + 'view' => 'Ver', + 'delete' => 'Eliminar', + ], + ], + 'create-success' => 'Correo enviado con éxito.', + 'update-success' => 'Correo actualizado con éxito.', + 'mass-update-success' => 'Correos actualizados con éxito.', + 'delete-success' => 'Correo eliminado con éxito.', + 'delete-failed' => 'No se puede eliminar el correo.', + 'view' => [ + 'title' => 'Correos', + 'subject' => ':subject', + 'link-mail' => 'Enlace de Correo', + 'to' => 'Para', + 'cc' => 'CC', + 'bcc' => 'BCC', + 'reply' => 'Responder', + 'reply-all' => 'Responder a Todos', + 'forward' => 'Reenviar', + 'delete' => 'Eliminar', + 'enter-mails' => 'Ingresar id de correo', + 'rotten-days' => 'El lead está en estado crítico por :days días', + 'search-an-existing-lead' => 'Buscar un lead existente', + 'search-an-existing-contact' => 'Buscar un contacto existente', + 'message' => 'Mensaje', + 'add-attachments' => 'Añadir Archivos Adjuntos', + 'discard' => 'Descartar', + 'send' => 'Enviar', + 'no-result-found' => 'No se encontraron resultados', + 'add-new-contact' => 'Añadir Nuevo Contacto', + 'description' => 'Descripción', + 'search' => 'Buscar...', + 'add-new-lead' => 'Añadir Nuevo Lead', + 'create-new-contact' => 'Crear Nuevo Contacto', + 'save-contact' => 'Guardar Contacto', + 'create-lead' => 'Crear Lead', + 'linked-contact' => 'Contacto Vinculado', + 'link-to-contact' => 'Vincular a Contacto', + 'link-to-lead' => 'Vincular a Lead', + 'linked-lead' => 'Lead Vinculado', + 'lead-details' => 'Detalles del Lead', + 'contact-person' => 'Persona de Contacto', + 'product' => 'Producto', + 'tags' => [ + 'create-success' => 'Etiqueta creada con éxito.', + 'destroy-success' => 'Etiqueta eliminada con éxito.', + ], + ], + ], + 'common' => [ + 'custom-attributes' => [ + 'add-more' => 'Añadir Más', + 'address' => 'Dirección', + 'city' => 'Ciudad', + 'contact' => 'Números de Contacto', + 'country' => 'País', + 'email' => 'Correo Electrónico', + 'home' => 'Hogar', + 'postcode' => 'Código Postal', + 'save' => 'Guardar', + 'select' => 'Seleccionar', + 'select-country' => 'Seleccionar País', + 'select-state' => 'Seleccionar Estado', + 'state' => 'Estado', + 'update-contact-title' => 'Actualizar Números de Contacto', + 'update-emails-title' => 'Actualizar Correos Electrónicos de Contacto', + 'work' => 'Trabajo', + ], + ], + 'leads' => [ + 'create-success' => 'Lead creado exitosamente.', + 'update-success' => 'Lead actualizado exitosamente.', + 'update-failed' => 'No se pueden eliminar los clientes potenciales.', + 'destroy-success' => 'Lead eliminado exitosamente.', + 'destroy-failed' => 'No se puede eliminar el lead.', + 'file' => [ + 'data-not-found' => 'Datos no encontrados.', + 'empty-content' => 'El contenido del PDF está vacío o no se pudo extraer.', + 'failed-extract' => 'No se pudo extraer el texto del archivo.', + 'insufficient-info' => 'Debido a datos insuficientes, no podemos procesar su solicitud en este momento.', + 'invalid-base64' => 'Formato base64 inválido.', + 'invalid-format' => 'Formato JSON inválido.', + 'invalid-response' => 'Formato de respuesta de IA inválido.', + 'missing-api-key' => 'Falta la clave API o la configuración del modelo.', + 'not-found' => 'Archivo no encontrado.', + 'recursive-call' => 'Se detectó una llamada recursiva.', + 'text-generation-failed' => 'La extracción de texto falló. El archivo podría estar vacío o ilegible.', + ], + 'index' => [ + 'title' => 'Leads', + 'create-btn' => 'Crear Lead', + 'datagrid' => [ + 'id' => 'ID', + 'sales-person' => 'Persona de Ventas', + 'subject' => 'Asunto', + 'source' => 'Fuente', + 'lead-value' => 'Valor del Lead', + 'lead-type' => 'Tipo de cliente potencial', + 'tag-name' => 'Nombre de la etiqueta', + 'contact-person' => 'Persona de Contacto', + 'stage' => 'Etapa', + 'rotten-lead' => 'Lead Podrido', + 'date-to' => 'Fecha Hasta', + 'created-at' => 'Creado En', + 'no' => 'No', + 'yes' => 'Sí', + 'delete' => 'Eliminar', + 'mass-delete' => 'Eliminar en Masa', + 'mass-update' => 'Actualizar en Masa', + ], + 'kanban' => [ + 'rotten-days' => 'El lead está podrido desde hace :days días', + 'empty-list' => 'Tu lista de leads está vacía', + 'empty-list-description' => 'Crea un lead para organizar tus objetivos.', + 'create-lead-btn' => 'Crear Lead', + 'columns' => [ + 'contact-person' => 'Persona de Contacto', + 'id' => 'ID', + 'lead-type' => 'Tipo de Lead', + 'lead-value' => 'Valor del Lead', + 'sales-person' => 'Persona de Ventas', + 'source' => 'Fuente', + 'title' => 'Título', + 'tags' => 'Etiquetas', + 'expected-close-date' => 'Fecha de Cierre Esperada', + 'created-at' => 'Creado En', + ], + 'toolbar' => [ + 'search' => [ + 'title' => 'Buscar por título', + ], + 'filters' => [ + 'apply-filters' => 'Aplicar Filtros', + 'clear-all' => 'Limpiar Todo', + 'filter' => 'Filtrar', + 'filters' => 'Filtros', + 'from' => 'De', + 'select' => 'Seleccionar', + 'to' => 'A', + ], + ], + ], + 'view-switcher' => [ + 'all-pipelines' => 'Todos los Canales', + 'create-new-pipeline' => 'Crear Nuevo Canal', + ], + 'upload' => [ + 'create-lead' => 'Crear Lead Usando IA', + 'file' => 'Carga de archivo', + 'file-info' => 'Solo se aceptan archivos en formato pdf, bmp, jpg, jpeg, png.', + 'file-required' => 'Por favor, selecciona al menos un archivo válido para continuar.', + 'save-btn' => 'Guardar', + 'upload-file' => 'Subir archivo', + ], + ], + 'create' => [ + 'title' => 'Crear Lead', + 'save-btn' => 'Guardar', + 'details' => 'Detalles', + 'details-info' => 'Introduce la Información Básica del Lead', + 'contact-person' => 'Persona de Contacto', + 'contact-info' => 'Información Sobre la Persona de Contacto', + 'products' => 'Productos', + 'products-info' => 'Información Sobre los Productos', + ], + 'edit' => [ + 'title' => 'Editar Lead', + 'save-btn' => 'Guardar', + 'details' => 'Detalles', + 'details-info' => 'Introduce la Información Básica del Lead', + 'contact-person' => 'Persona de Contacto', + 'contact-info' => 'Información Sobre la Persona de Contacto', + 'products' => 'Productos', + 'products-info' => 'Información Sobre los Productos', + ], + 'common' => [ + 'contact' => [ + 'name' => 'Nombre', + 'email' => 'Correo Electrónico', + 'contact-number' => 'Número de Contacto', + 'organization' => 'Organización', + ], + 'products' => [ + 'product-name' => 'Nombre del Producto', + 'quantity' => 'Cantidad', + 'price' => 'Precio', + 'amount' => 'Monto', + 'action' => 'Acción', + 'add-more' => 'Agregar Más', + 'total' => 'Total', + ], + ], + 'view' => [ + 'title' => 'Lead: :title', + 'rotten-days' => ':days Días', + 'tabs' => [ + 'description' => 'Descripción', + 'products' => 'Productos', + 'quotes' => 'Cotizaciones', + ], + 'attributes' => [ + 'title' => 'Sobre el Lead', + ], + 'quotes' => [ + 'subject' => 'Asunto', + 'expired-at' => 'Expirado En', + 'sub-total' => 'Subtotal', + 'discount' => 'Descuento', + 'tax' => 'Impuesto', + 'adjustment' => 'Ajuste', + 'grand-total' => 'Total General', + 'delete' => 'Eliminar', + 'edit' => 'Editar', + 'download' => 'Descargar', + 'destroy-success' => 'Cotización eliminada exitosamente.', + 'empty-title' => 'No se Encontraron Cotizaciones', + 'empty-info' => 'No se Encontraron Cotizaciones para este Lead', + 'add-btn' => 'Agregar Cotización', + ], + 'products' => [ + 'product-name' => 'Nombre del Producto', + 'quantity' => 'Cantidad', + 'price' => 'Precio', + 'amount' => 'Monto', + 'action' => 'Acción', + 'add-more' => 'Agregar Más', + 'total' => 'Total', + 'empty-title' => 'No se Encontraron Productos', + 'empty-info' => 'No se Encontraron Productos para este Lead', + 'add-product' => 'Agregar Producto', + ], + 'persons' => [ + 'title' => 'Sobre las Personas', + 'job-title' => ':job_title en :organization', + ], + 'stages' => [ + 'won-lost' => 'Ganado/Perdido', + 'won' => 'Ganado', + 'lost' => 'Perdido', + 'need-more-info' => 'Necesita Más Información', + 'closed-at' => 'Cerrado En', + 'won-value' => 'Valor Ganado', + 'lost-reason' => 'Razón de la Pérdida', + 'save-btn' => 'Guardar', + ], + 'tags' => [ + 'create-success' => 'Etiqueta creada con éxito.', + 'destroy-success' => 'Etiqueta eliminada con éxito.', + ], + ], + ], + 'configuration' => [ + 'index' => [ + 'back' => 'Regresar', + 'delete' => 'Eliminar', + 'save-btn' => 'Guardar Configuración', + 'save-success' => 'Configuración Guardada Exitosamente.', + 'search' => 'Buscar', + 'select-country' => 'Seleccionar País', + 'select-state' => 'Seleccionar Estado', + 'title' => 'Configuración', + 'general' => [ + 'title' => 'General', + 'info' => 'Configuración General', + 'general' => [ + 'title' => 'General', + 'info' => 'Actualiza tus configuraciones generales aquí.', + 'locale-settings' => [ + 'title' => 'Configuraciones de Idioma', + 'title-info' => 'Define el idioma utilizado en la interfaz de usuario, como Árabe (ar), Inglés (en), Español (es), Persa (fa) y Turco (tr).', + ], + 'admin-logo' => [ + 'logo-image' => 'Imagen del Logo', + 'title' => 'Logo del Administrador', + 'title-info' => 'Configura la imagen del logo para tu panel de administración.', + ], + ], + 'settings' => [ + 'title' => 'Configuraciones', + 'info' => 'Actualiza tus configuraciones aquí.', + 'footer' => [ + 'info' => 'Podemos configurar la sección de powered by aquí.', + 'powered-by' => 'Editor de texto impulsado por', + 'title' => 'Configuraciones de la Sección Powered by', + ], + 'menu' => [ + 'activities' => 'Actividades', + 'configuration' => 'Configuración', + 'contacts' => 'Contactos', + 'dashboard' => 'Tablero', + 'draft' => 'Borrador', + 'inbox' => 'Bandeja de Entrada', + 'info' => 'Podemos configurar los nombres de los elementos del menú aquí.', + 'leads' => 'Leads', + 'mail' => 'Correo', + 'organizations' => 'Organizaciones', + 'outbox' => 'Bandeja de Salida', + 'persons' => 'Personas', + 'products' => 'Productos', + 'quotes' => 'Cotizaciones', + 'sent' => 'Enviados', + 'settings' => 'Configuraciones', + 'title' => 'Configuraciones de Elementos del Menú', + 'trash' => 'Papelera', + ], + 'menu-color' => [ + 'brand-color' => 'Brand Color', + 'info' => 'Podemos cambiar los colores de los elementos del menú aquí.', + 'title' => 'Configuraciones de Color de Elementos del Menú', + ], + ], + ], + 'email' => [ + 'title' => 'Configuración de Correo Electrónico', + 'info' => 'Configuración de correo electrónico para la aplicación.', + 'imap' => [ + 'title' => 'Configuración IMAP', + 'info' => 'Configuración de correo electrónico IMAP para recibir correos electrónicos.', + 'account' => [ + 'title' => 'Cuenta IMAP', + 'title-info' => 'Configura los ajustes de tu cuenta IMAP aquí.', + 'host' => 'Host', + 'port' => 'Puerto', + 'encryption' => 'Tipo de Cifrado', + 'validate-cert' => 'Validar Certificado SSL', + 'username' => 'Nombre de Usuario IMAP', + 'password' => 'Contraseña IMAP', + ], + ], + ], + 'magic-ai' => [ + 'title' => 'Magic AI', + 'info' => 'Configuración de Magic AI para la aplicación.', + 'settings' => [ + 'api-key' => 'Clave API', + 'api-key-info' => 'Recuerda usar una clave API de OpenRouter para cada modelo. Es un paso simple para mejorar la seguridad y el rendimiento.', + 'enable' => 'Habilitar', + 'info' => 'Mejora tu experiencia con Magic AI con tu clave API de OpenRouter. ¡Intégrala ahora para una aventura de IA personalizada y sin problemas, hecha a tu medida! Personaliza la configuración sin esfuerzo y toma el control de tu viaje de IA.', + 'other' => 'Otro Modelo', + 'other-model' => 'Para otros modelos, usa el ID del Modelo de OpenRouter.', + 'doc-generation' => 'Generación de DOC', + 'doc-generation-info' => 'Habilita la función de generación de DOC para extraer automáticamente datos de archivos DOC y convertirlos a formato de texto. Mejora tu productividad y eficiencia habilitando esta función para agilizar tu flujo de trabajo.', + 'title' => 'Configuraciones Generales', + 'models' => [ + 'deepseek-r1' => 'Deepseek R1 Distill-llama-8b', + 'gemini-2-0-flash-001' => 'Gemini 2.0 flash-001', + 'gpt-4o' => 'GPT-4.0', + 'gpt-4o-mini' => 'GPT-4.0 mini', + 'grok-2-1212' => 'Grok 2.12', + 'llama-3-2-3b-instruct' => 'Llama 3.2 3b Instruct', + 'title' => 'Modelos', + ], + ], + ], + ], + ], + 'dashboard' => [ + 'index' => [ + 'title' => 'Tablero', + 'revenue' => [ + 'lost-revenue' => 'Ingresos Perdidos', + 'won-revenue' => 'Ingresos Ganados', + ], + 'over-all' => [ + 'average-lead-value' => 'Valor Promedio de Lead', + 'total-leads' => 'Total de Leads', + 'average-leads-per-day' => 'Leads Promedio por Día', + 'total-quotations' => 'Total de Cotizaciones', + 'total-persons' => 'Total de Personas', + 'total-organizations' => 'Total de Organizaciones', + ], + 'total-leads' => [ + 'title' => 'Leads', + 'total' => 'Total de Leads', + 'won' => 'Leads Ganados', + 'lost' => 'Leads Perdidos', + ], + 'revenue-by-sources' => [ + 'title' => 'Ingresos por Fuentes', + 'empty-title' => 'No Hay Datos Disponibles', + 'empty-info' => 'No hay datos disponibles para el intervalo seleccionado', + ], + 'revenue-by-types' => [ + 'title' => 'Ingresos por Tipos', + 'empty-title' => 'No Hay Datos Disponibles', + 'empty-info' => 'No hay datos disponibles para el intervalo seleccionado', + ], + 'top-selling-products' => [ + 'title' => 'Productos Más Vendidos', + 'empty-title' => 'No Se Encontraron Productos', + 'empty-info' => 'No hay productos disponibles para el intervalo seleccionado', + ], + 'top-persons' => [ + 'title' => 'Personas Más Destacadas', + 'empty-title' => 'No Se Encontraron Personas', + 'empty-info' => 'No hay personas disponibles para el intervalo seleccionado', + ], + 'open-leads-by-states' => [ + 'title' => 'Leads Abiertos por Etapas', + 'empty-title' => 'No Hay Datos Disponibles', + 'empty-info' => 'No hay datos disponibles para el intervalo seleccionado', + ], + ], + ], + 'layouts' => [ + 'app-version' => 'Versión: :version', + 'dashboard' => 'Tablero', + 'leads' => 'Leads', + 'quotes' => 'Cotizaciones', + 'quote' => 'Cotización', + 'mail' => [ + 'title' => 'Correo', + 'compose' => 'Redactar', + 'inbox' => 'Bandeja de Entrada', + 'draft' => 'Borradores', + 'outbox' => 'Enviados', + 'sent' => 'Enviados', + 'trash' => 'Papelera', + 'setting' => 'Configuración', + ], + 'activities' => 'Actividades', + 'contacts' => 'Contactos', + 'persons' => 'Personas', + 'person' => 'Persona', + 'organizations' => 'Organizaciones', + 'organization' => 'Organización', + 'products' => 'Productos', + 'product' => 'Producto', + 'settings' => 'Configuraciones', + 'user' => 'Usuario', + 'user-info' => 'Administra todos tus usuarios y sus permisos en el CRM, lo que están autorizados a hacer.', + 'groups' => 'Grupos', + 'groups-info' => 'Agregar, editar o eliminar grupos del CRM', + 'roles' => 'Roles', + 'role' => 'Rol', + 'roles-info' => 'Agregar, editar o eliminar roles del CRM', + 'users' => 'Usuarios', + 'users-info' => 'Agregar, editar o eliminar usuarios del CRM', + 'lead' => 'Lead', + 'lead-info' => 'Administra todas las configuraciones relacionadas con los leads en el CRM', + 'pipelines' => 'Pipelines', + 'pipelines-info' => 'Agregar, editar o eliminar pipelines del CRM', + 'sources' => 'Fuentes', + 'sources-info' => 'Agregar, editar o eliminar fuentes del CRM', + 'types' => 'Tipos', + 'types-info' => 'Agregar, editar o eliminar tipos del CRM', + 'automation' => 'Automatización', + 'automation-info' => 'Administra todas las configuraciones relacionadas con la automatización en el CRM', + 'attributes' => 'Atributos', + 'attribute' => 'Atributo', + 'attributes-info' => 'Agregar, editar o eliminar atributos del CRM', + 'email-templates' => 'Plantillas de Correo', + 'email' => 'Correo', + 'email-templates-info' => 'Agregar, editar o eliminar plantillas de correo del CRM', + 'events' => 'Eventos', + 'events-info' => 'Agregar, editar o eliminar eventos del CRM', + 'campaigns' => 'Campañas', + 'campaigns-info' => 'Agregar, editar o eliminar campañas del CRM', + 'workflows' => 'Flujos de Trabajo', + 'workflows-info' => 'Agregar, editar o eliminar flujos de trabajo del CRM', + 'webhooks' => 'Webhooks', + 'webhooks-info' => 'Agregar, editar o eliminar webhooks desde CRM', + 'other-settings' => 'Otras Configuraciones', + 'other-settings-info' => 'Administra todas tus configuraciones adicionales en el CRM', + 'tags' => 'Etiquetas', + 'tags-info' => 'Agregar, editar o eliminar etiquetas del CRM', + 'my-account' => 'Mi Cuenta', + 'sign-out' => 'Cerrar Sesión', + 'back' => 'Volver', + 'name' => 'Nombre', + 'configuration' => 'Configuración', + 'howdy' => '¡Hola!', + 'warehouses' => 'Almacenes', + 'warehouse' => 'Almacén', + 'warehouses-info' => 'Agregar, editar o eliminar almacenes del CRM', + 'data_transfer' => 'Transferencia de Datos', + 'data_transfer_info' => 'Gestionar la configuración relacionada con la transferencia de datos de personas, productos y clientes potenciales en el CRM', + ], + 'user' => [ + 'account' => [ + 'name' => 'Nombre', + 'email' => 'Correo Electrónico', + 'password' => 'Contraseña', + 'my_account' => 'Mi cuenta', + 'update_details' => 'Actualizar Detalles', + 'current_password' => 'Contraseña Actual', + 'confirm_password' => 'Confirmar Contraseña', + 'password-match' => 'La contraseña actual no coincide.', + 'account-save' => 'Cambios en la cuenta guardados exitosamente.', + 'permission-denied' => 'Permiso Denegado', + 'remove-image' => 'Eliminar Imagen', + 'upload_image_pix' => 'Sube una Imagen de Perfil (100px x 100px)', + 'upload_image_format' => 'en formato PNG o JPG', + 'image_upload_message' => 'Solo se permiten imágenes (.jpeg, .jpg, .png, ..).', + ], + ], + 'emails' => [ + 'common' => [ + 'dear' => 'Estimado/a :name', + 'cheers' => 'Saludos,
    Equipo :app_name', + 'user' => [ + 'dear' => 'Estimado/a :username', + 'create-subject' => 'Has sido agregado como miembro.', + 'create-body' => '¡Felicidades! Ahora eres miembro de nuestro equipo.', + 'forget-password' => [ + 'subject' => 'Restablecimiento de Contraseña del Cliente', + 'dear' => 'Estimado/a :username', + 'reset-password' => 'Restablecer Contraseña', + 'info' => 'Estás recibiendo este correo porque recibimos una solicitud de restablecimiento de contraseña para tu cuenta', + 'final-summary' => 'Si no solicitaste el restablecimiento de contraseña, no se requiere ninguna acción adicional', + 'thanks' => '¡Gracias!', + ], + ], + ], + ], + 'validations' => [ + 'message' => [ + 'decimal' => 'El :attribute debe ser un número decimal.', + ], + ], + 'errors' => [ + 'dashboard' => 'Tablero', + 'go-back' => 'Volver', + 'support' => 'Si el problema persiste, contáctanos en :email para obtener ayuda.', + '404' => [ + 'description' => '¡Ups! La página que estás buscando está de vacaciones. Parece que no pudimos encontrar lo que estabas buscando.', + 'title' => '404 Página No Encontrada', + ], + '401' => [ + 'description' => '¡Ups! Parece que no tienes permiso para acceder a esta página. Parece que te faltan las credenciales necesarias.', + 'title' => '401 No Autorizado', + ], + '403' => [ + 'description' => '¡Ups! Esta página está fuera de límites. Parece que no tienes los permisos necesarios para ver este contenido.', + 'title' => '403 Prohibido', + ], + '500' => [ + 'description' => '¡Ups! Algo salió mal. Parece que tenemos problemas para cargar la página que estás buscando.', + 'title' => '500 Error Interno del Servidor', + ], + '503' => [ + 'description' => '¡Ups! Parece que estamos temporalmente fuera de servicio por mantenimiento. Vuelve a intentarlo en un rato.', + 'title' => '503 Servicio No Disponible', + ], + ], + 'export' => [ + 'csv' => 'CSV', + 'download' => 'Descargar', + 'export' => 'Exportar', + 'no-records' => 'No se encontraron registros.', + 'xls' => 'XLS', + 'xlsx' => 'XLSX', + ], +]; diff --git a/packages/Webkul/Admin/src/Resources/lang/fa/app.php b/packages/Webkul/Admin/src/Resources/lang/fa/app.php new file mode 100644 index 0000000..51b15ee --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/lang/fa/app.php @@ -0,0 +1,2225 @@ + [ + 'leads' => 'سرنخ‌ها', + 'lead' => 'سرنخ', + 'quotes' => 'پیشنهادات', + 'mail' => 'ایمیل', + 'inbox' => 'صندوق ورودی', + 'draft' => 'پیش‌نویس', + 'outbox' => 'صندوق خروجی', + 'sent' => 'ارسال شده', + 'trash' => 'زباله‌دان', + 'activities' => 'فعالیت‌ها', + 'webhook' => 'وب‌هوک', + 'contacts' => 'مخاطبین', + 'persons' => 'افراد', + 'organizations' => 'سازمان‌ها', + 'products' => 'محصولات', + 'settings' => 'تنظیمات', + 'groups' => 'گروه‌ها', + 'roles' => 'نقش‌ها', + 'users' => 'کاربران', + 'user' => 'کاربر', + 'automation' => 'اتوماسیون', + 'attributes' => 'ویژگی‌ها', + 'pipelines' => 'لوله‌ها', + 'sources' => 'منابع', + 'types' => 'انواع', + 'email-templates' => 'قالب‌های ایمیل', + 'workflows' => 'جریان‌کار', + 'other-settings' => 'سایر تنظیمات', + 'tags' => 'برچسب‌ها', + 'configuration' => 'پیکربندی', + 'create' => 'ایجاد', + 'edit' => 'ویرایش', + 'view' => 'نمایش', + 'print' => 'چاپ', + 'delete' => 'حذف', + 'export' => 'صادر کردن', + 'mass-delete' => 'حذف انبوه', + 'data-transfer' => 'انتقال داده', + 'imports' => 'واردات', + 'import' => 'وارد کردن', + 'event' => 'رویداد', + 'campaigns' => 'کمپین‌ها', + ], + 'users' => [ + 'activate-warning' => 'حساب شما هنوز فعال نشده است. لطفاً با مدیر سیستم تماس بگیرید.', + 'login-error' => 'اطلاعات وارد شده با سوابق ما مطابقت ندارد.', + 'not-permission' => 'شما اجازه دسترسی به پنل مدیریت را ندارید.', + 'login' => [ + 'email' => 'آدرس ایمیل', + 'forget-password-link' => 'فراموشی رمز عبور؟', + 'password' => 'رمز عبور', + 'submit-btn' => 'ورود', + 'title' => 'ورود', + ], + 'forget-password' => [ + 'create' => [ + 'email' => 'ایمیل ثبت‌شده', + 'email-not-exist' => 'ایمیل وجود ندارد', + 'page-title' => 'فراموشی رمز عبور', + 'reset-link-sent' => 'لینک بازنشانی رمز عبور ارسال شد', + 'sign-in-link' => 'بازگشت به ورود؟', + 'submit-btn' => 'بازنشانی', + 'title' => 'بازیابی رمز عبور', + ], + ], + 'reset-password' => [ + 'back-link-title' => 'بازگشت به ورود؟', + 'confirm-password' => 'تأیید رمز عبور', + 'email' => 'ایمیل ثبت‌شده', + 'password' => 'رمز عبور', + 'submit-btn' => 'بازنشانی رمز عبور', + 'title' => 'بازنشانی رمز عبور', + ], + ], + 'account' => [ + 'edit' => [ + 'back-btn' => 'بازگشت', + 'change-password' => 'تغییر رمز عبور', + 'confirm-password' => 'تایید رمز عبور', + 'current-password' => 'رمز عبور فعلی', + 'email' => 'ایمیل', + 'general' => 'عمومی', + 'invalid-password' => 'رمز عبور فعلی شما نادرست است.', + 'name' => 'نام', + 'password' => 'رمز عبور', + 'profile-image' => 'تصویر پروفایل', + 'save-btn' => 'ذخیره حساب کاربری', + 'title' => 'حساب من', + 'update-success' => 'حساب کاربری با موفقیت به‌روزرسانی شد', + 'upload-image-info' => 'آپلود یک تصویر پروفایل (110px X 110px) در فرمت PNG یا JPG', + ], + ], + 'components' => [ + 'activities' => [ + 'actions' => [ + 'mail' => [ + 'btn' => 'ایمیل', + 'title' => 'نگارش ایمیل', + 'to' => 'به', + 'enter-emails' => 'برای افزودن ایمیل‌ها اینتر را فشار دهید', + 'cc' => 'کپی', + 'bcc' => 'کپی مخفی', + 'subject' => 'موضوع', + 'send-btn' => 'ارسال', + 'message' => 'پیام', + ], + 'file' => [ + 'btn' => 'فایل', + 'title' => 'افزودن فایل', + 'title-control' => 'عنوان', + 'name' => 'نام', + 'description' => 'توضیحات', + 'file' => 'فایل', + 'save-btn' => 'ذخیره فایل', + ], + 'note' => [ + 'btn' => 'یادداشت', + 'title' => 'افزودن یادداشت', + 'comment' => 'نظر', + 'save-btn' => 'ذخیره یادداشت', + ], + 'activity' => [ + 'btn' => 'فعالیت', + 'title' => 'افزودن فعالیت', + 'title-control' => 'عنوان', + 'description' => 'توضیحات', + 'schedule-from' => 'زمان‌بندی از', + 'schedule-to' => 'زمان‌بندی تا', + 'location' => 'محل', + 'call' => 'تماس', + 'meeting' => 'جلسه', + 'lunch' => 'ناهار', + 'save-btn' => 'ذخیره فعالیت', + 'participants' => [ + 'title' => 'شرکت‌کنندگان', + 'placeholder' => 'برای جستجوی شرکت‌کنندگان تایپ کنید', + 'users' => 'کاربران', + 'persons' => 'افراد', + 'no-results' => 'هیچ نتیجه‌ای یافت نشد...', + ], + ], + ], + 'index' => [ + 'all' => 'همه', + 'bcc' => 'کپی مخفی', + 'by-user' => 'توسط :user', + 'calls' => 'تماس‌ها', + 'cc' => 'کپی', + 'change-log' => 'تغییرات', + 'delete' => 'حذف', + 'edit' => 'ویرایش', + 'emails' => 'ایمیل‌ها', + 'empty' => 'خالی', + 'files' => 'فایل‌ها', + 'from' => 'از', + 'location' => 'محل', + 'lunches' => 'ناهارها', + 'mark-as-done' => 'علامت زدن به عنوان انجام شده', + 'meetings' => 'جلسات', + 'notes' => 'یادداشت‌ها', + 'participants' => 'شرکت‌کنندگان', + 'planned' => 'برنامه‌ریزی شده', + 'quotes' => 'نقل قول‌ها', + 'scheduled-on' => 'برنامه‌ریزی شده در', + 'system' => 'سیستم', + 'to' => 'تا', + 'unlink' => 'لغو پیوند', + 'view' => 'مشاهده', + 'empty-placeholders' => [ + 'all' => [ + 'title' => 'هیچ فعالیتی یافت نشد', + 'description' => 'هیچ فعالیتی برای این مورد یافت نشد. می‌توانید با کلیک روی دکمه "فعالیت" در پنل سمت چپ، فعالیت اضافه کنید.', + ], + 'planned' => [ + 'title' => 'هیچ فعالیت برنامه‌ریزی‌شده‌ای یافت نشد', + 'description' => 'هیچ فعالیت برنامه‌ریزی‌شده‌ای برای این مورد یافت نشد. می‌توانید با کلیک روی دکمه "فعالیت" در پنل سمت چپ، فعالیت اضافه کنید.', + ], + 'notes' => [ + 'title' => 'یادداشتی یافت نشد', + 'description' => 'هیچ یادداشتی برای این مورد یافت نشد. می‌توانید با کلیک روی دکمه "یادداشت" در پنل سمت چپ، یادداشت اضافه کنید.', + ], + 'calls' => [ + 'title' => 'تماسی یافت نشد', + 'description' => 'هیچ تماسی برای این مورد یافت نشد. می‌توانید با کلیک روی دکمه "فعالیت" و انتخاب نوع تماس، تماس اضافه کنید.', + ], + 'meetings' => [ + 'title' => 'ملاقاتی یافت نشد', + 'description' => 'هیچ ملاقاتی برای این مورد یافت نشد. می‌توانید با کلیک روی دکمه "فعالیت" و انتخاب نوع جلسه، جلسه اضافه کنید.', + ], + 'lunches' => [ + 'title' => 'ناهاری یافت نشد', + 'description' => 'هیچ ناهاری برای این مورد یافت نشد. می‌توانید با کلیک روی دکمه "فعالیت" و انتخاب نوع ناهار، ناهار اضافه کنید.', + ], + 'files' => [ + 'title' => 'فایلی یافت نشد', + 'description' => 'هیچ فایلی برای این مورد یافت نشد. می‌توانید با کلیک روی دکمه "فایل" در پنل سمت چپ، فایل اضافه کنید.', + ], + 'emails' => [ + 'title' => 'ایمیلی یافت نشد', + 'description' => 'هیچ ایمیلی برای این مورد یافت نشد. می‌توانید با کلیک روی دکمه "ایمیل" در پنل سمت چپ، ایمیل اضافه کنید.', + ], + 'system' => [ + 'title' => 'تغییری ثبت نشده است', + 'description' => 'هیچ گزارش تغییری برای این مورد یافت نشد.', + ], + ], + ], + ], + 'media' => [ + 'images' => [ + 'add-image-btn' => 'افزودن تصویر', + 'ai-add-image-btn' => 'هوش مصنوعی جادویی', + 'allowed-types' => 'png, jpeg, jpg', + 'not-allowed-error' => 'فقط فایل‌های تصویری (.jpeg, .jpg, .png, ..) مجاز هستند.', + 'placeholders' => [ + 'front' => 'جلو', + 'next' => 'بعدی', + 'size' => 'اندازه', + 'use-cases' => 'موارد استفاده', + 'zoom' => 'بزرگنمایی', + ], + ], + 'videos' => [ + 'add-video-btn' => 'افزودن ویدیو', + 'allowed-types' => 'mp4, webm, mkv', + 'not-allowed-error' => 'فقط فایل‌های ویدیویی (.mp4, .mov, .ogg ..) مجاز هستند.', + ], + ], + 'datagrid' => [ + 'index' => [ + 'no-records-selected' => 'هیچ رکوردی انتخاب نشده است.', + 'must-select-a-mass-action-option' => 'باید یک گزینه از اقدامات انبوه را انتخاب کنید.', + 'must-select-a-mass-action' => 'باید یک اقدام انبوه را انتخاب کنید.', + ], + 'toolbar' => [ + 'length-of' => ':length از', + 'of' => 'از', + 'per-page' => 'در هر صفحه', + 'results' => ':total نتایج', + 'delete' => 'حذف', + 'selected' => ':total موارد انتخاب شده', + 'mass-actions' => [ + 'submit' => 'ارسال', + 'select-option' => 'انتخاب گزینه', + 'select-action' => 'انتخاب اقدام', + ], + 'filter' => [ + 'apply-filters-btn' => 'اعمال فیلترها', + 'back-btn' => 'بازگشت', + 'create-new-filter' => 'ایجاد فیلتر جدید', + 'custom-filters' => 'فیلترهای سفارشی', + 'delete-error' => 'خطایی در هنگام حذف فیلتر رخ داد، لطفاً دوباره تلاش کنید.', + 'delete-success' => 'فیلتر با موفقیت حذف شد.', + 'empty-description' => 'هیچ فیلتری برای ذخیره انتخاب نشده است. لطفاً فیلترها را برای ذخیره انتخاب کنید.', + 'empty-title' => 'افزودن فیلترها برای ذخیره', + 'name' => 'نام', + 'quick-filters' => 'فیلترهای سریع', + 'save-btn' => 'ذخیره', + 'save-filter' => 'ذخیره فیلتر', + 'saved-success' => 'فیلتر با موفقیت ذخیره شد.', + 'selected-filters' => 'فیلترهای انتخاب شده', + 'title' => 'فیلتر', + 'update' => 'به‌روزرسانی', + 'update-filter' => 'به‌روزرسانی فیلتر', + 'updated-success' => 'فیلتر با موفقیت به‌روزرسانی شد.', + ], + 'search' => [ + 'title' => 'جستجو', + ], + ], + 'filters' => [ + 'select' => 'انتخاب', + 'title' => 'فیلترها', + 'dropdown' => [ + 'searchable' => [ + 'at-least-two-chars' => 'حداقل ۲ حرف تایپ کنید...', + 'no-results' => 'هیچ نتیجه‌ای یافت نشد...', + ], + ], + 'custom-filters' => [ + 'clear-all' => 'پاک کردن همه', + 'title' => 'فیلترهای سفارشی', + ], + 'boolean-options' => [ + 'false' => 'نادرست', + 'true' => 'درست', + ], + 'date-options' => [ + 'last-month' => 'ماه گذشته', + 'last-six-months' => '۶ ماه گذشته', + 'last-three-months' => '۳ ماه گذشته', + 'this-month' => 'این ماه', + 'this-week' => 'این هفته', + 'this-year' => 'امسال', + 'today' => 'امروز', + 'yesterday' => 'دیروز', + ], + ], + 'table' => [ + 'actions' => 'اقدامات', + 'no-records-available' => 'رکوردی موجود نیست.', + ], + ], + 'modal' => [ + 'confirm' => [ + 'agree-btn' => 'موافقم', + 'disagree-btn' => 'مخالفم', + 'message' => 'آیا مطمئن هستید که می‌خواهید این عمل را انجام دهید؟', + 'title' => 'آیا مطمئن هستید؟', + ], + ], + 'tags' => [ + 'index' => [ + 'title' => 'برچسب‌ها', + 'added-tags' => 'برچسب‌های اضافه شده', + 'save-btn' => 'ذخیره برچسب', + 'placeholder' => 'برای جستجوی برچسب‌ها تایپ کنید', + 'add-tag' => 'اضافه کردن ":term"...', + 'aquarelle-red' => 'قرمز آبرنگی', + 'crushed-cashew' => 'بادام هندی خرد شده', + 'beeswax' => 'موم عسل', + 'lemon-chiffon' => 'لیمویی', + 'snow-flurry' => 'برف سبک', + 'honeydew' => 'شهد عسل', + ], + ], + 'layouts' => [ + 'powered-by' => [ + 'description' => 'توسعه یافته توسط :krayin، یک پروژه متن باز از :webkul.', + ], + 'header' => [ + 'mega-search' => [ + 'title' => 'جستجوی بزرگ', + 'tabs' => [ + 'leads' => 'سرنخ‌ها', + 'quotes' => 'پیشنهادات', + 'persons' => 'افراد', + 'products' => 'محصولات', + ], + 'explore-all-products' => 'کاوش در تمامی محصولات', + 'explore-all-leads' => 'کاوش در تمامی سرنخ‌ها', + 'explore-all-contacts' => 'کاوش در تمامی مخاطبین', + 'explore-all-quotes' => 'کاوش در تمامی پیشنهادات', + 'explore-all-matching-products' => 'کاوش در تمامی محصولات مطابق ":query" (:count)', + 'explore-all-matching-leads' => 'کاوش در تمامی سرنخ‌های مطابق ":query" (:count)', + 'explore-all-matching-contacts' => 'کاوش در تمامی مخاطبین مطابق ":query" (:count)', + 'explore-all-matching-quotes' => 'کاوش در تمامی پیشنهادات مطابق ":query" (:count)', + ], + ], + ], + 'attributes' => [ + 'edit' => [ + 'delete' => 'حذف', + ], + 'lookup' => [ + 'click-to-add' => 'برای اضافه کردن کلیک کنید', + 'search' => 'جستجو...', + 'no-result-found' => 'نتیجه‌ای یافت نشد', + ], + ], + 'lookup' => [ + 'click-to-add' => 'برای اضافه کردن کلیک کنید', + 'no-results' => 'نتیجه‌ای یافت نشد', + 'add-as-new' => 'اضافه کردن به عنوان جدید', + 'search' => 'جستجو...', + ], + 'flash-group' => [ + 'success' => 'موفقیت', + 'error' => 'خطا', + 'warning' => 'هشدار', + 'info' => 'اطلاعات', + ], + 'tiny-mce' => [ + 'http-error' => 'خطای HTTP', + 'invalid-json' => 'پاسخ JSON نامعتبر از سرور.', + 'upload-failed' => 'آپلود فایل ناموفق بود. لطفاً دوباره تلاش کنید.', + ], + ], + 'quotes' => [ + 'index' => [ + 'title' => 'نقل‌قول‌ها', + 'create-btn' => 'ایجاد نقل‌قول', + 'create-success' => 'نقل‌قول با موفقیت ایجاد شد.', + 'update-success' => 'نقل‌قول با موفقیت به‌روزرسانی شد.', + 'delete-success' => 'نقل‌قول با موفقیت حذف شد.', + 'delete-failed' => 'حذف نقل‌قول ممکن نیست.', + 'datagrid' => [ + 'subject' => 'موضوع', + 'sales-person' => 'فروشنده', + 'expired-at' => 'تاریخ انقضا', + 'created-at' => 'تاریخ ایجاد', + 'person' => 'شخص', + 'subtotal' => 'جمع جزء', + 'discount' => 'تخفیف', + 'tax' => 'مالیات', + 'adjustment' => 'تنظیم', + 'grand-total' => 'جمع کل', + 'edit' => 'ویرایش', + 'delete' => 'حذف', + 'print' => 'چاپ', + ], + 'pdf' => [ + 'adjustment' => 'تنظیم', + 'amount' => 'مقدار', + 'billing-address' => 'آدرس صورتحساب', + 'date' => 'تاریخ', + 'discount' => 'تخفیف', + 'expired-at' => 'تاریخ انقضا', + 'grand-total' => 'جمع کل', + 'person' => 'شخص', + 'price' => 'قیمت', + 'product-name' => 'نام محصول', + 'quantity' => 'تعداد', + 'quote-id' => 'شناسه نقل‌قول', + 'sales-person' => 'فروشنده', + 'shipping-address' => 'آدرس ارسال', + 'sku' => 'کد SKU', + 'sub-total' => 'جمع جزء', + 'subject' => 'موضوع', + 'tax' => 'مالیات', + 'title' => 'نقل‌قول', + ], + ], + 'create' => [ + 'title' => 'ایجاد نقل‌قول', + 'save-btn' => 'ذخیره نقل‌قول', + 'quote-info' => 'اطلاعات نقل‌قول', + 'quote-info-info' => 'اطلاعات پایه نقل‌قول را وارد کنید.', + 'address-info' => 'اطلاعات آدرس', + 'address-info-info' => 'اطلاعات مربوط به آدرس مرتبط با نقل‌قول.', + 'quote-items' => 'موارد نقل‌قول', + 'search-products' => 'جستجوی محصولات', + 'link-to-lead' => 'پیوند به سرنخ', + 'quote-item-info' => 'درخواست محصول را برای این نقل‌قول اضافه کنید.', + 'quote-name' => 'نام نقل‌قول', + 'quantity' => 'تعداد', + 'price' => 'قیمت', + 'discount' => 'تخفیف', + 'tax' => 'مالیات', + 'total' => 'مجموع', + 'amount' => 'مقدار', + 'add-item' => '+ افزودن مورد', + 'sub-total' => 'جمع جزء (:symbol)', + 'total-discount' => 'تخفیف (:symbol)', + 'total-tax' => 'مالیات (:symbol)', + 'total-adjustment' => 'تنظیم (:symbol)', + 'grand-total' => 'جمع کل (:symbol)', + 'discount-amount' => 'مقدار تخفیف', + 'tax-amount' => 'مقدار مالیات', + 'adjustment-amount' => 'مقدار تنظیم', + 'product-name' => 'نام محصول', + 'action' => 'عملیات', + ], + 'edit' => [ + 'title' => 'ویرایش نقل‌قول', + 'save-btn' => 'ذخیره نقل‌قول', + 'quote-info' => 'اطلاعات نقل‌قول', + 'quote-info-info' => 'اطلاعات پایه نقل‌قول را وارد کنید.', + 'address-info' => 'اطلاعات آدرس', + 'address-info-info' => 'اطلاعات مربوط به آدرس مرتبط با نقل‌قول.', + 'quote-items' => 'موارد نقل‌قول', + 'link-to-lead' => 'پیوند به سرنخ', + 'quote-item-info' => 'درخواست محصول را برای این نقل‌قول اضافه کنید.', + 'quote-name' => 'نام نقل‌قول', + 'quantity' => 'تعداد', + 'price' => 'قیمت', + 'search-products' => 'جستجوی محصولات', + 'discount' => 'تخفیف', + 'tax' => 'مالیات', + 'total' => 'مجموع', + 'amount' => 'مقدار', + 'add-item' => '+ افزودن مورد', + 'sub-total' => 'جمع جزء (:symbol)', + 'total-discount' => 'تخفیف (:symbol)', + 'total-tax' => 'مالیات (:symbol)', + 'total-adjustment' => 'تنظیم (:symbol)', + 'grand-total' => 'جمع کل (:symbol)', + 'discount-amount' => 'مقدار تخفیف', + 'tax-amount' => 'مقدار مالیات', + 'adjustment-amount' => 'مقدار تنظیم', + 'product-name' => 'نام محصول', + 'action' => 'عملیات', + ], + ], + 'contacts' => [ + 'persons' => [ + 'index' => [ + 'title' => 'اشخاص', + 'create-btn' => 'ایجاد شخص', + 'create-success' => 'شخص با موفقیت ایجاد شد.', + 'update-success' => 'شخص با موفقیت به‌روزرسانی شد.', + 'all-delete-success' => 'همه افراد انتخاب‌شده با موفقیت حذف شدند.', + 'partial-delete-warning' => 'برخی از افراد با موفقیت حذف شدند. بقیه به دلیل مرتبط بودن با سرنخ‌ها حذف نشدند.', + 'none-delete-warning' => 'هیچ‌یک از افراد انتخاب‌شده به دلیل مرتبط بودن با سرنخ‌ها حذف نشدند.', + 'no-selection' => 'هیچ فردی برای حذف انتخاب نشده است.', + 'delete-failed' => 'حذف افراد انتخاب‌شده با شکست مواجه شد.', + 'datagrid' => [ + 'contact-numbers' => 'شماره‌های تماس', + 'delete' => 'حذف', + 'edit' => 'ویرایش', + 'emails' => 'ایمیل‌ها', + 'id' => 'شناسه', + 'view' => 'مشاهده', + 'name' => 'نام', + 'organization-name' => 'نام سازمان', + ], + ], + 'view' => [ + 'title' => ':name', + 'about-person' => 'درباره شخص', + 'about-organization' => 'درباره سازمان', + 'activities' => [ + 'index' => [ + 'all' => 'همه', + 'calls' => 'تماس‌ها', + 'meetings' => 'جلسات', + 'lunches' => 'ناهارها', + 'files' => 'فایل‌ها', + 'quotes' => 'نقل‌قول‌ها', + 'notes' => 'یادداشت‌ها', + 'emails' => 'ایمیل‌ها', + 'by-user' => 'توسط :user', + 'scheduled-on' => 'برنامه‌ریزی شده در', + 'location' => 'مکان', + 'participants' => 'شرکت‌کنندگان', + 'mark-as-done' => 'علامت‌گذاری به‌عنوان انجام شده', + 'delete' => 'حذف', + 'edit' => 'ویرایش', + ], + 'actions' => [ + 'mail' => [ + 'btn' => 'ایمیل', + 'title' => 'ایمیل جدید', + 'to' => 'به', + 'cc' => 'کپی (CC)', + 'bcc' => 'کپی مخفی (BCC)', + 'subject' => 'موضوع', + 'send-btn' => 'ارسال', + 'message' => 'پیام', + ], + 'file' => [ + 'btn' => 'فایل', + 'title' => 'افزودن فایل', + 'title-control' => 'عنوان', + 'name' => 'نام فایل', + 'description' => 'توضیحات', + 'file' => 'فایل', + 'save-btn' => 'ذخیره فایل', + ], + 'note' => [ + 'btn' => 'یادداشت', + 'title' => 'افزودن یادداشت', + 'comment' => 'نظر', + 'save-btn' => 'ذخیره یادداشت', + ], + 'activity' => [ + 'btn' => 'فعالیت', + 'title' => 'افزودن فعالیت', + 'title-control' => 'عنوان', + 'description' => 'توضیحات', + 'schedule-from' => 'برنامه‌ریزی از', + 'schedule-to' => 'برنامه‌ریزی تا', + 'location' => 'مکان', + 'call' => 'تماس', + 'meeting' => 'جلسه', + 'lunch' => 'ناهار', + 'save-btn' => 'ذخیره فعالیت', + ], + ], + ], + 'tags' => [ + 'create-success' => 'برچسب با موفقیت ایجاد شد.', + 'destroy-success' => 'برچسب با موفقیت حذف شد.', + ], + ], + 'create' => [ + 'title' => 'ایجاد شخص', + 'save-btn' => 'ذخیره شخص', + ], + 'edit' => [ + 'title' => 'ویرایش شخص', + 'save-btn' => 'ذخیره شخص', + ], + ], + 'organizations' => [ + 'index' => [ + 'title' => 'سازمان‌ها', + 'create-btn' => 'ایجاد سازمان', + 'create-success' => 'سازمان با موفقیت ایجاد شد.', + 'update-success' => 'سازمان با موفقیت به‌روزرسانی شد.', + 'delete-success' => 'سازمان با موفقیت حذف شد.', + 'delete-failed' => 'سازمان قابل حذف نیست.', + 'datagrid' => [ + 'delete' => 'حذف', + 'edit' => 'ویرایش', + 'id' => 'شناسه', + 'name' => 'نام', + 'persons-count' => 'تعداد اشخاص', + ], + ], + 'create' => [ + 'title' => 'ایجاد سازمان', + 'save-btn' => 'ذخیره سازمان', + ], + 'edit' => [ + 'title' => 'ویرایش سازمان', + 'save-btn' => 'ذخیره سازمان', + ], + ], + ], + 'products' => [ + 'index' => [ + 'title' => 'محصولات', + 'create-btn' => 'ایجاد محصول', + 'create-success' => 'محصول با موفقیت ایجاد شد.', + 'update-success' => 'محصول با موفقیت به‌روزرسانی شد.', + 'delete-success' => 'محصول با موفقیت حذف شد.', + 'delete-failed' => 'محصول قابل حذف نیست.', + 'datagrid' => [ + 'allocated' => 'اختصاص داده شده', + 'delete' => 'حذف', + 'edit' => 'ویرایش', + 'id' => 'شناسه', + 'in-stock' => 'در انبار', + 'name' => 'نام', + 'on-hand' => 'موجودی', + 'tag-name' => 'نام برچسب', + 'price' => 'قیمت', + 'sku' => 'SKU', + 'view' => 'مشاهده', + ], + ], + 'create' => [ + 'save-btn' => 'ذخیره محصولات', + 'title' => 'ایجاد محصولات', + 'general' => 'عمومی', + 'price' => 'قیمت', + ], + 'edit' => [ + 'title' => 'ویرایش محصولات', + 'save-btn' => 'ذخیره محصولات', + 'general' => 'عمومی', + 'price' => 'قیمت', + ], + 'view' => [ + 'sku' => 'SKU', + 'all' => 'همه', + 'notes' => 'یادداشت‌ها', + 'files' => 'فایل‌ها', + 'inventories' => 'موجودی', + 'change-logs' => 'تغییرات', + 'attributes' => [ + 'about-product' => 'درباره محصول', + ], + 'inventory' => [ + 'source' => 'منبع', + 'in-stock' => 'در انبار', + 'allocated' => 'اختصاص داده شده', + 'on-hand' => 'موجودی', + 'actions' => 'عملیات', + 'assign' => 'اختصاص دادن', + 'add-source' => 'افزودن منبع', + 'location' => 'مکان', + 'add-more' => 'افزودن بیشتر', + 'save' => 'ذخیره', + ], + ], + ], + 'settings' => [ + 'title' => 'تنظیمات', + 'groups' => [ + 'index' => [ + 'create-btn' => 'ایجاد گروه', + 'title' => 'گروه‌ها', + 'create-success' => 'گروه با موفقیت ایجاد شد.', + 'update-success' => 'گروه با موفقیت به‌روزرسانی شد.', + 'destroy-success' => 'گروه با موفقیت حذف شد.', + 'delete-failed' => 'امکان حذف گروه وجود ندارد.', + 'delete-failed-associated-users' => 'امکان حذف گروه وجود ندارد زیرا توسط کاربران استفاده می‌شود.', + 'datagrid' => [ + 'delete' => 'حذف', + 'description' => 'توضیحات', + 'edit' => 'ویرایش', + 'id' => 'شناسه', + 'name' => 'نام', + ], + 'edit' => [ + 'title' => 'ویرایش گروه', + ], + 'create' => [ + 'name' => 'نام', + 'title' => 'ایجاد گروه', + 'description' => 'توضیحات', + 'save-btn' => 'ذخیره گروه', + ], + ], + ], + 'roles' => [ + 'index' => [ + 'being-used' => 'نقش قابل حذف نیست، زیرا در کاربر مدیر استفاده می‌شود.', + 'create-btn' => 'ایجاد نقش‌ها', + 'create-success' => 'نقش با موفقیت ایجاد شد.', + 'current-role-delete-error' => 'نقش اختصاص داده شده به کاربر فعلی قابل حذف نیست.', + 'delete-failed' => 'نقش قابل حذف نیست.', + 'delete-success' => 'نقش با موفقیت حذف شد.', + 'last-delete-error' => 'حداقل یک نقش لازم است.', + 'settings' => 'تنظیمات', + 'title' => 'نقش‌ها', + 'update-success' => 'نقش با موفقیت به‌روزرسانی شد.', + 'user-define-error' => 'نقش سیستمی قابل حذف نیست.', + 'datagrid' => [ + 'all' => 'همه', + 'custom' => 'سفارشی', + 'delete' => 'حذف', + 'description' => 'توضیحات', + 'edit' => 'ویرایش', + 'id' => 'شناسه', + 'name' => 'نام', + 'permission-type' => 'نوع مجوز', + ], + ], + 'create' => [ + 'access-control' => 'کنترل دسترسی', + 'all' => 'همه', + 'back-btn' => 'بازگشت', + 'custom' => 'سفارشی', + 'description' => 'توضیحات', + 'general' => 'عمومی', + 'name' => 'نام', + 'permissions' => 'مجوزها', + 'save-btn' => 'ذخیره نقش', + 'title' => 'ایجاد نقش', + ], + 'edit' => [ + 'access-control' => 'کنترل دسترسی', + 'all' => 'همه', + 'back-btn' => 'بازگشت', + 'custom' => 'سفارشی', + 'description' => 'توضیحات', + 'general' => 'عمومی', + 'name' => 'نام', + 'permissions' => 'مجوزها', + 'save-btn' => 'ذخیره نقش', + 'title' => 'ویرایش نقش', + ], + ], + 'types' => [ + 'index' => [ + 'create-btn' => 'ایجاد نوع', + 'create-success' => 'نوع با موفقیت ایجاد شد.', + 'delete-failed' => 'نوع قابل حذف نیست.', + 'delete-success' => 'نوع با موفقیت حذف شد.', + 'title' => 'نوع‌ها', + 'update-success' => 'نوع با موفقیت به‌روزرسانی شد.', + 'datagrid' => [ + 'delete' => 'حذف', + 'description' => 'توضیحات', + 'edit' => 'ویرایش', + 'id' => 'شناسه', + 'name' => 'نام', + ], + 'create' => [ + 'name' => 'نام', + 'save-btn' => 'ذخیره نوع', + 'title' => 'ایجاد نوع', + ], + 'edit' => [ + 'title' => 'ویرایش نوع', + ], + ], + ], + 'sources' => [ + 'index' => [ + 'title' => 'منابع', + 'create-btn' => 'ایجاد منبع', + 'create-success' => 'منبع با موفقیت ایجاد شد.', + 'delete-failed' => 'امکان حذف منبع وجود ندارد.', + 'delete-success' => 'منبع با موفقیت حذف شد.', + 'update-success' => 'منبع با موفقیت به‌روزرسانی شد.', + 'delete-failed-associated-leads' => 'نمی‌توان منبع را حذف کرد زیرا با سرنخ‌های موجود مرتبط است. لطفاً ابتدا آن‌ها را جدا کرده یا به‌روزرسانی کنید.', + 'datagrid' => [ + 'delete' => 'حذف', + 'edit' => 'ویرایش', + 'id' => 'شناسه', + 'name' => 'نام', + ], + 'create' => [ + 'name' => 'نام', + 'save-btn' => 'ذخیره منبع', + 'title' => 'ایجاد منبع', + ], + 'edit' => [ + 'title' => 'ویرایش منبع', + ], + ], + ], + 'workflows' => [ + 'index' => [ + 'title' => 'جریان‌های کاری', + 'create-btn' => 'ایجاد جریان کاری', + 'create-success' => 'جریان کاری با موفقیت ایجاد شد.', + 'update-success' => 'جریان کاری با موفقیت به‌روزرسانی شد.', + 'delete-success' => 'جریان کاری با موفقیت حذف شد.', + 'delete-failed' => 'جریان کاری قابل حذف نیست.', + 'datagrid' => [ + 'delete' => 'حذف', + 'description' => 'توضیحات', + 'edit' => 'ویرایش', + 'id' => 'شناسه', + 'name' => 'نام', + ], + ], + 'helpers' => [ + 'update-related-leads' => 'به‌روزرسانی سرنخ‌های مرتبط', + 'send-email-to-sales-owner' => 'ارسال ایمیل به صاحب فروش', + 'send-email-to-participants' => 'ارسال ایمیل به شرکت‌کنندگان', + 'add-webhook' => 'افزودن وب‌هوک', + 'update-lead' => 'به‌روزرسانی سرنخ', + 'update-person' => 'به‌روزرسانی شخص', + 'send-email-to-person' => 'ارسال ایمیل به شخص', + 'add-tag' => 'افزودن برچسب', + 'add-note-as-activity' => 'افزودن یادداشت به‌عنوان فعالیت', + 'update-quote' => 'به‌روزرسانی نقل‌قول', + ], + 'create' => [ + 'title' => 'ایجاد جریان کاری', + 'event' => 'رویداد', + 'back-btn' => 'بازگشت', + 'save-btn' => 'ذخیره جریان کاری', + 'name' => 'نام', + 'basic-details' => 'جزئیات پایه', + 'description' => 'توضیحات', + 'actions' => 'اقدامات', + 'basic-details-info' => 'اطلاعات پایه جریان کاری را وارد کنید.', + 'event-info' => 'یک رویداد triggers، چک‌ها، شرایط و اقدامات از پیش تعریف شده را انجام می‌دهد.', + 'conditions' => 'شرایط', + 'conditions-info' => 'شرایط قوانینی هستند که سناریوها را بررسی می‌کنند و در مواقع خاص فعال می‌شوند.', + 'actions-info' => 'یک اقدام نه تنها بار کاری را کاهش می‌دهد بلکه فرآیند اتوماسیون CRM را بسیار آسان‌تر می‌کند.', + 'value' => 'مقدار', + 'condition-type' => 'نوع شرط', + 'all-condition-are-true' => 'تمام شرایط صحیح هستند', + 'any-condition-are-true' => 'هر شرطی صحیح است', + 'add-condition' => 'افزودن شرط', + 'add-action' => 'افزودن اقدام', + 'yes' => 'بله', + 'no' => 'خیر', + 'email' => 'ایمیل', + 'is-equal-to' => 'برابر است با', + 'is-not-equal-to' => 'برابر نیست با', + 'equals-or-greater-than' => 'برابر یا بزرگ‌تر از', + 'equals-or-less-than' => 'برابر یا کوچک‌تر از', + 'greater-than' => 'بزرگ‌تر از', + 'less-than' => 'کوچک‌تر از', + 'type' => 'نوع', + 'contain' => 'شامل', + 'contains' => 'شامل می‌شود', + 'does-not-contain' => 'شامل نمی‌شود', + ], + 'edit' => [ + 'title' => 'ویرایش جریان کاری', + 'event' => 'رویداد', + 'back-btn' => 'بازگشت', + 'save-btn' => 'ذخیره جریان کاری', + 'name' => 'نام', + 'basic-details' => 'جزئیات پایه', + 'description' => 'توضیحات', + 'actions' => 'اقدامات', + 'type' => 'نوع', + 'basic-details-info' => 'اطلاعات پایه جریان کاری را وارد کنید.', + 'event-info' => 'یک رویداد triggers، چک‌ها، شرایط و اقدامات از پیش تعریف شده را انجام می‌دهد.', + 'conditions' => 'شرایط', + 'conditions-info' => 'شرایط قوانینی هستند که سناریوها را بررسی می‌کنند و در مواقع خاص فعال می‌شوند.', + 'actions-info' => 'یک اقدام نه تنها بار کاری را کاهش می‌دهد بلکه فرآیند اتوماسیون CRM را بسیار آسان‌تر می‌کند.', + 'value' => 'مقدار', + 'condition-type' => 'نوع شرط', + 'all-condition-are-true' => 'تمام شرایط صحیح هستند', + 'any-condition-are-true' => 'هر شرطی صحیح است', + 'add-condition' => 'افزودن شرط', + 'add-action' => 'افزودن اقدام', + 'yes' => 'بله', + 'no' => 'خیر', + 'email' => 'ایمیل', + 'is-equal-to' => 'برابر است با', + 'is-not-equal-to' => 'برابر نیست با', + 'equals-or-greater-than' => 'برابر یا بزرگ‌تر از', + 'equals-or-less-than' => 'برابر یا کوچک‌تر از', + 'greater-than' => 'بزرگ‌تر از', + 'less-than' => 'کوچک‌تر از', + 'contain' => 'شامل', + 'contains' => 'شامل می‌شود', + 'does-not-contain' => 'شامل نمی‌شود', + ], + ], + 'webforms' => [ + 'index' => [ + 'title' => 'فرم‌های وب', + 'create-btn' => 'ایجاد فرم وب', + 'create-success' => 'فرم وب با موفقیت ایجاد شد.', + 'update-success' => 'فرم وب با موفقیت به‌روزرسانی شد.', + 'delete-success' => 'فرم وب با موفقیت حذف شد.', + 'delete-failed' => 'فرم وب قابل حذف نیست.', + 'datagrid' => [ + 'id' => 'شناسه', + 'title' => 'عنوان', + 'edit' => 'ویرایش', + 'delete' => 'حذف', + ], + ], + 'create' => [ + 'title' => 'ایجاد فرم وب', + 'add-attribute-btn' => 'افزودن دکمه ویژگی', + 'attribute-label-color' => 'رنگ برچسب ویژگی', + 'attributes' => 'ویژگی‌ها', + 'attributes-info' => 'ویژگی‌های سفارشی را به فرم اضافه کنید.', + 'background-color' => 'رنگ پس‌زمینه', + 'create-lead' => 'ایجاد سرب', + 'customize-webform' => 'سفارشی‌سازی فرم وب', + 'customize-webform-info' => 'فرم وب خود را با رنگ‌های انتخابی سفارشی‌سازی کنید.', + 'description' => 'توضیحات', + 'display-custom-message' => 'نمایش پیام سفارشی', + 'form-background-color' => 'رنگ پس‌زمینه فرم', + 'form-submit-btn-color' => 'رنگ دکمه ارسال فرم', + 'form-submit-button-color' => 'رنگ دکمه ارسال فرم', + 'form-title-color' => 'رنگ عنوان فرم', + 'general' => 'عمومی', + 'leads' => 'سرنخ‌ها', + 'person' => 'شخص', + 'save-btn' => 'ذخیره فرم وب', + 'submit-button-label' => 'برچسب دکمه ارسال', + 'submit-success-action' => 'عملکرد موفقیت آمیز ارسال', + 'redirect-to-url' => 'انتقال به آدرس', + 'choose-value' => 'انتخاب مقدار', + 'select-file' => 'انتخاب فایل', + 'select-image' => 'انتخاب تصویر', + 'enter-value' => 'مقدار را وارد کنید', + ], + 'edit' => [ + 'add-attribute-btn' => 'افزودن دکمه ویژگی', + 'attribute-label-color' => 'رنگ برچسب ویژگی', + 'attributes' => 'ویژگی‌ها', + 'attributes-info' => 'ویژگی‌های سفارشی را به فرم اضافه کنید.', + 'background-color' => 'رنگ پس‌زمینه', + 'choose-value' => 'انتخاب مقدار', + 'code-snippet' => 'کد نمونه', + 'copied' => 'کپی شد', + 'copy' => 'کپی', + 'create-lead' => 'ایجاد سرب', + 'customize-webform' => 'سفارشی‌سازی فرم وب', + 'customize-webform-info' => 'فرم وب خود را با رنگ‌های انتخابی سفارشی‌سازی کنید.', + 'description' => 'توضیحات', + 'display-custom-message' => 'نمایش پیام سفارشی', + 'embed' => 'گنجاندن', + 'enter-value' => 'مقدار را وارد کنید', + 'form-background-color' => 'رنگ پس‌زمینه فرم', + 'form-submit-btn-color' => 'رنگ دکمه ارسال فرم', + 'form-submit-button-color' => 'رنگ دکمه ارسال فرم', + 'form-title-color' => 'رنگ عنوان فرم', + 'general' => 'عمومی', + 'leads' => 'سرنخ‌ها', + 'person' => 'شخص', + 'preview' => 'پیش‌نمایش', + 'public-url' => 'آدرس عمومی', + 'redirect-to-url' => 'انتقال به آدرس', + 'save-btn' => 'ذخیره فرم وب', + 'select-file' => 'انتخاب فایل', + 'select-image' => 'انتخاب تصویر', + 'submit-button-label' => 'برچسب دکمه ارسال', + 'submit-success-action' => 'عملکرد موفقیت آمیز ارسال', + 'title' => 'ویرایش فرم وب', + ], + ], + 'email-template' => [ + 'index' => [ + 'create-btn' => 'ایجاد قالب ایمیل', + 'title' => 'قالب‌های ایمیل', + 'create-success' => 'قالب ایمیل با موفقیت ایجاد شد.', + 'update-success' => 'قالب ایمیل با موفقیت به‌روزرسانی شد.', + 'delete-success' => 'قالب ایمیل با موفقیت حذف شد.', + 'delete-failed' => 'قالب ایمیل قابل حذف نیست.', + 'datagrid' => [ + 'delete' => 'حذف', + 'edit' => 'ویرایش', + 'id' => 'شناسه', + 'name' => 'نام', + 'subject' => 'موضوع', + ], + ], + 'create' => [ + 'title' => 'ایجاد قالب ایمیل', + 'save-btn' => 'ذخیره قالب ایمیل', + 'email-template' => 'قالب ایمیل', + 'subject' => 'موضوع', + 'content' => 'محتوا', + 'subject-placeholders' => 'متغیرهای موضوع', + 'general' => 'عمومی', + 'name' => 'نام', + ], + 'edit' => [ + 'title' => 'ویرایش قالب ایمیل', + 'save-btn' => 'ذخیره قالب ایمیل', + 'email-template' => 'قالب ایمیل', + 'subject' => 'موضوع', + 'content' => 'محتوا', + 'subject-placeholders' => 'متغیرهای موضوع', + 'general' => 'عمومی', + 'name' => 'نام', + ], + ], + 'marketing' => [ + 'events' => [ + 'index' => [ + 'create-btn' => 'ایجاد رویداد', + 'title' => 'رویدادها', + 'create-success' => 'رویداد با موفقیت ایجاد شد.', + 'update-success' => 'رویداد با موفقیت به‌روزرسانی شد.', + 'delete-success' => 'رویداد با موفقیت حذف شد.', + 'delete-failed' => 'رویداد قابل حذف نیست.', + 'mass-delete-success' => 'رویدادها با موفقیت حذف شدند', + 'datagrid' => [ + 'delete' => 'حذف', + 'edit' => 'ویرایش', + 'id' => 'شناسه', + 'name' => 'نام', + 'description' => 'توضیحات', + 'date' => 'تاریخ', + ], + 'create' => [ + 'title' => 'ایجاد رویداد', + 'name' => 'نام', + 'date' => 'تاریخ', + 'description' => 'توضیحات', + 'save-btn' => 'ذخیره رویداد', + ], + 'edit' => [ + 'title' => 'ویرایش رویداد', + ], + ], + ], + 'campaigns' => [ + 'index' => [ + 'create-btn' => 'ایجاد کمپین', + 'title' => 'کمپین‌ها', + 'create-success' => 'کمپین با موفقیت ایجاد شد.', + 'update-success' => 'کمپین با موفقیت به‌روزرسانی شد.', + 'delete-success' => 'کمپین با موفقیت حذف شد.', + 'delete-failed' => 'کمپین قابل حذف نیست.', + 'mass-delete-success' => 'کمپین‌ها با موفقیت حذف شدند', + 'datagrid' => [ + 'id' => 'شناسه', + 'name' => 'نام', + 'subject' => 'موضوع', + 'status' => 'وضعیت', + 'active' => 'فعال', + 'inactive' => 'غیرفعال', + 'edit' => 'ویرایش', + 'delete' => 'حذف', + ], + 'create' => [ + 'title' => 'ایجاد کمپین', + 'name' => 'نام', + 'type' => 'نوع', + 'subject' => 'موضوع', + 'event' => 'رویداد', + 'email-template' => 'قالب ایمیل', + 'status' => 'وضعیت', + ], + 'edit' => [ + 'title' => 'ویرایش کمپین', + ], + ], + ], + ], + 'tags' => [ + 'index' => [ + 'create-btn' => 'ایجاد برچسب', + 'title' => 'برچسب‌ها', + 'create-success' => 'برچسب با موفقیت ایجاد شد.', + 'update-success' => 'برچسب با موفقیت به‌روزرسانی شد.', + 'delete-success' => 'برچسب با موفقیت حذف شد.', + 'delete-failed' => 'برچسب قابل حذف نیست.', + 'datagrid' => [ + 'delete' => 'حذف', + 'edit' => 'ویرایش', + 'id' => 'شناسه', + 'name' => 'نام', + 'users' => 'کاربران', + 'created-at' => 'تاریخ ایجاد', + ], + 'create' => [ + 'name' => 'نام', + 'save-btn' => 'ذخیره برچسب', + 'title' => 'ایجاد برچسب', + 'color' => 'رنگ', + ], + 'edit' => [ + 'title' => 'ویرایش برچسب', + ], + ], + ], + 'users' => [ + 'index' => [ + 'create-btn' => 'ایجاد کاربر', + 'create-success' => 'کاربر با موفقیت ایجاد شد.', + 'delete-failed' => 'کاربر قابل حذف نیست.', + 'delete-success' => 'کاربر با موفقیت حذف شد.', + 'last-delete-error' => 'حداقل یک کاربر لازم است.', + 'mass-delete-failed' => 'کاربران قابل حذف نیستند.', + 'mass-delete-success' => 'کاربران با موفقیت حذف شدند.', + 'mass-update-failed' => 'کاربران قابل به‌روزرسانی نیستند.', + 'mass-update-success' => 'کاربران با موفقیت به‌روزرسانی شدند.', + 'title' => 'کاربران', + 'update-success' => 'کاربر با موفقیت به‌روزرسانی شد.', + 'user-define-error' => 'قابل حذف نیست.', + 'active' => 'فعال', + 'inactive' => 'غیرفعال', + 'datagrid' => [ + 'active' => 'فعال', + 'created-at' => 'تاریخ ایجاد', + 'delete' => 'حذف', + 'edit' => 'ویرایش', + 'email' => 'ایمیل', + 'id' => 'شناسه', + 'inactive' => 'غیرفعال', + 'name' => 'نام', + 'status' => 'وضعیت', + 'update-status' => 'به‌روزرسانی وضعیت', + 'users' => 'کاربران', + ], + 'create' => [ + 'confirm-password' => 'تأیید رمز عبور', + 'email' => 'ایمیل', + 'general' => 'عمومی', + 'global' => 'سراسری', + 'group' => 'گروه', + 'individual' => 'فردی', + 'name' => 'نام', + 'password' => 'رمز عبور', + 'permission' => 'مجوز', + 'role' => 'نقش', + 'save-btn' => 'ذخیره کاربر', + 'status' => 'وضعیت', + 'title' => 'ایجاد کاربر', + 'view-permission' => 'مجوز مشاهده', + 'select-at-lest-one-group' => 'Select at least one group', + ], + 'edit' => [ + 'title' => 'ویرایش کاربر', + ], + ], + ], + 'pipelines' => [ + 'index' => [ + 'title' => 'پایپ‌لاین‌ها', + 'create-btn' => 'ایجاد پایپ‌لاین', + 'create-success' => 'پایپ‌لاین با موفقیت ایجاد شد.', + 'update-success' => 'پایپ‌لاین با موفقیت به‌روزرسانی شد.', + 'default-required' => 'حداقل یک پایپ‌لاین پیش‌فرض مورد نیاز است.', + 'delete-success' => 'پایپ‌لاین با موفقیت حذف شد.', + 'delete-failed' => 'پایپ‌لاین قابل حذف نیست.', + 'default-delete-error' => 'پایپ‌لاین پیش‌فرض قابل حذف نیست.', + 'datagrid' => [ + 'delete' => 'حذف', + 'edit' => 'ویرایش', + 'id' => 'شناسه', + 'is-default' => 'پیش‌فرض', + 'name' => 'نام', + 'no' => 'خیر', + 'rotten-days' => 'روزهای فاسد', + 'yes' => 'بله', + ], + ], + 'create' => [ + 'title' => 'ایجاد پایپ‌لاین', + 'save-btn' => 'ذخیره پایپ‌لاین', + 'name' => 'نام', + 'rotten-days' => 'روزهای فاسد', + 'mark-as-default' => 'علامت‌گذاری به‌عنوان پیش‌فرض', + 'general' => 'عمومی', + 'probability' => 'احتمال(%)', + 'new-stage' => 'جدید', + 'won-stage' => 'برنده', + 'lost-stage' => 'بازنده', + 'stage-btn' => 'افزودن مرحله', + 'stages' => 'مراحل', + 'duplicate-name' => 'فیلد "نام" نمی‌تواند تکراری باشد', + 'delete-stage' => 'حذف مرحله', + 'add-new-stages' => 'افزودن مراحل جدید', + 'add-stage-info' => 'مرحله جدیدی برای پایپ‌لاین خود اضافه کنید', + 'newly-added' => 'تازه اضافه شده', + 'stage-delete-success' => 'مرحله با موفقیت حذف شد', + ], + 'edit' => [ + 'title' => 'ویرایش پایپ‌لاین', + 'save-btn' => 'ذخیره پایپ‌لاین', + 'name' => 'نام', + 'rotten-days' => 'روزهای فاسد', + 'mark-as-default' => 'علامت‌گذاری به‌عنوان پیش‌فرض', + 'general' => 'عمومی', + 'probability' => 'احتمال(%)', + 'new-stage' => 'جدید', + 'won-stage' => 'برنده', + 'lost-stage' => 'بازنده', + 'stage-btn' => 'افزودن مرحله', + 'stages' => 'مراحل', + 'duplicate-name' => 'فیلد "نام" نمی‌تواند تکراری باشد', + 'delete-stage' => 'حذف مرحله', + 'add-new-stages' => 'افزودن مراحل جدید', + 'add-stage-info' => 'مرحله جدیدی برای پایپ‌لاین خود اضافه کنید', + 'stage-delete-success' => 'مرحله با موفقیت حذف شد', + ], + ], + 'webhooks' => [ + 'index' => [ + 'title' => 'وب‌هوک‌ها', + 'create-btn' => 'ایجاد وب‌هوک', + 'create-success' => 'وب‌هوک با موفقیت ایجاد شد.', + 'update-success' => 'وب‌هوک با موفقیت به‌روزرسانی شد.', + 'delete-success' => 'وب‌هوک با موفقیت حذف شد.', + 'delete-failed' => 'وب‌هوک قابل حذف نیست.', + 'datagrid' => [ + 'id' => 'شناسه', + 'delete' => 'حذف', + 'edit' => 'ویرایش', + 'name' => 'نام', + 'entity-type' => 'نوع موجودیت', + 'end-point' => 'پایان نقطه', + ], + ], + 'create' => [ + 'title' => 'ایجاد وب‌هوک', + 'save-btn' => 'ذخیره وب‌هوک', + 'info' => 'جزئیات وب‌هوک‌ها را وارد کنید', + 'url-and-parameters' => 'آدرس و پارامترها', + 'method' => 'متد', + 'post' => 'پست', + 'put' => 'پوت', + 'url-endpoint' => 'آدرس پایان', + 'parameters' => 'پارامترها', + 'add-new-parameter' => 'افزودن پارامتر جدید', + 'url-preview' => 'پیش‌نمایش آدرس:', + 'headers' => 'هدینگ‌ها', + 'add-new-header' => 'افزودن هدینگ جدید', + 'body' => 'بدن', + 'default' => 'پیش‌فرض', + 'x-www-form-urlencoded' => 'x-www-form-urlencoded', + 'key-and-value' => 'کلید و مقدار', + 'add-new-payload' => 'اضافه کردن بار جدید', + 'raw' => 'خام', + 'general' => 'عمومی', + 'name' => 'نام', + 'entity-type' => 'نوع موجودیت', + 'insert-placeholder' => 'درج نشانه‌گذاری', + 'description' => 'توضیحات', + 'json' => 'جی‌سان', + 'text' => 'متن', + ], + 'edit' => [ + 'title' => 'ویرایش وب‌هوک', + 'edit-btn' => 'ذخیره وب‌هوک', + 'save-btn' => 'ذخیره وب‌هوک', + 'info' => 'جزئیات وب‌هوک‌ها را وارد کنید', + 'url-and-parameters' => 'آدرس و پارامترها', + 'method' => 'متد', + 'post' => 'پست', + 'put' => 'پوت', + 'url-endpoint' => 'آدرس پایان', + 'parameters' => 'پارامترها', + 'add-new-parameter' => 'افزودن پارامتر جدید', + 'url-preview' => 'پیش‌نمایش آدرس:', + 'headers' => 'هدینگ‌ها', + 'add-new-header' => 'افزودن هدینگ جدید', + 'body' => 'بدن', + 'default' => 'پیش‌فرض', + 'x-www-form-urlencoded' => 'x-www-form-urlencoded', + 'key-and-value' => 'کلید و مقدار', + 'add-new-payload' => 'اضافه کردن بار جدید', + 'raw' => 'خام', + 'general' => 'عمومی', + 'name' => 'نام', + 'entity-type' => 'نوع موجودیت', + 'insert-placeholder' => 'درج نشانه‌گذاری', + 'description' => 'توضیحات', + 'json' => 'جی‌سان', + 'text' => 'متن', + ], + ], + 'warehouses' => [ + 'index' => [ + 'title' => 'انبارها', + 'create-btn' => 'ایجاد انبار', + 'create-success' => 'انبار با موفقیت ایجاد شد.', + 'name-exists' => 'نام انبار قبلاً موجود است.', + 'update-success' => 'انبار با موفقیت به‌روزرسانی شد.', + 'delete-success' => 'انبار با موفقیت حذف شد.', + 'delete-failed' => 'انبار قابل حذف نیست.', + 'datagrid' => [ + 'id' => 'شناسه', + 'name' => 'نام', + 'contact-name' => 'نام تماس', + 'delete' => 'حذف', + 'edit' => 'ویرایش', + 'view' => 'مشاهده', + 'created-at' => 'تاریخ ایجاد', + 'products' => 'محصولات', + 'contact-emails' => 'ایمیل‌های تماس', + 'contact-numbers' => 'شماره‌های تماس', + ], + ], + 'create' => [ + 'title' => 'ایجاد انبار', + 'save-btn' => 'ذخیره انبار', + 'contact-info' => 'اطلاعات تماس', + ], + 'edit' => [ + 'title' => 'ویرایش انبار', + 'save-btn' => 'ذخیره انبار', + 'contact-info' => 'اطلاعات تماس', + ], + 'view' => [ + 'all' => 'همه', + 'notes' => 'یادداشت‌ها', + 'files' => 'فایل‌ها', + 'location' => 'مکان', + 'change-logs' => 'لاگ‌های تغییرات', + 'locations' => [ + 'action' => 'عملیات', + 'add-location' => 'افزودن مکان', + 'create-success' => 'مکان با موفقیت ایجاد شد.', + 'delete' => 'حذف', + 'delete-failed' => 'مکان قابل حذف نیست.', + 'delete-success' => 'مکان با موفقیت حذف شد.', + 'name' => 'نام', + 'save-btn' => 'ذخیره', + ], + 'general-information' => [ + 'title' => 'اطلاعات عمومی', + ], + 'contact-information' => [ + 'title' => 'اطلاعات تماس', + ], + ], + ], + 'attributes' => [ + 'index' => [ + 'title' => 'ویژگی‌ها', + 'create-btn' => 'ایجاد ویژگی', + 'create-success' => 'ویژگی با موفقیت ایجاد شد.', + 'update-success' => 'ویژگی با موفقیت به‌روزرسانی شد.', + 'delete-success' => 'ویژگی با موفقیت حذف شد.', + 'delete-failed' => 'ویژگی قابل حذف نیست.', + 'user-define-error' => 'قادر به حذف ویژگی سیستم نیست.', + 'mass-delete-failed' => 'ویژگی‌های سیستمی قابل حذف نیستند.', + 'datagrid' => [ + 'yes' => 'بله', + 'no' => 'خیر', + 'id' => 'شناسه', + 'code' => 'کد', + 'name' => 'نام', + 'entity-type' => 'نوع موجودیت', + 'type' => 'نوع', + 'is-default' => 'پیش‌فرض است', + 'edit' => 'ویرایش', + 'delete' => 'حذف', + 'entity-types' => [ + 'leads' => 'سرنخ‌ها', + 'organizations' => 'سازمان‌ها', + 'persons' => 'افراد', + 'products' => 'محصولات', + 'quotes' => 'نقل‌قول‌ها', + 'warehouses' => 'انبارها', + ], + 'types' => [ + 'text' => 'متن', + 'textarea' => 'ناحیه متنی', + 'price' => 'قیمت', + 'boolean' => 'بولی', + 'select' => 'انتخاب', + 'multiselect' => 'چند انتخابی', + 'checkbox' => 'چک‌باکس', + 'email' => 'ایمیل', + 'address' => 'آدرس', + 'phone' => 'تلفن', + 'lookup' => 'جستجو', + 'datetime' => 'تاریخ و زمان', + 'date' => 'تاریخ', + 'image' => 'تصویر', + 'file' => 'فایل', + ], + ], + ], + 'create' => [ + 'title' => 'ایجاد ویژگی', + 'save-btn' => 'ذخیره ویژگی', + 'code' => 'کد', + 'name' => 'نام', + 'entity-type' => 'نوع موجودیت', + 'type' => 'نوع', + 'validations' => 'اعتبارسنجی‌ها', + 'is-required' => 'الزامی است', + 'input-validation' => 'اعتبارسنجی ورودی', + 'is-unique' => 'منحصربه‌فرد است', + 'labels' => 'برچسب‌ها', + 'general' => 'عمومی', + 'numeric' => 'عددی', + 'decimal' => 'اعشاری', + 'url' => 'آدرس', + 'options' => 'گزینه‌ها', + 'option-type' => 'نوع گزینه', + 'lookup-type' => 'نوع جستجو', + 'add-option' => 'افزودن گزینه', + 'save-option' => 'ذخیره گزینه', + 'option-name' => 'نام گزینه', + 'add-attribute-options' => 'افزودن گزینه‌های ویژگی', + 'text' => 'متن', + 'textarea' => 'میدان متن', + 'price' => 'قیمت', + 'boolean' => 'بولی', + 'select' => 'انتخاب', + 'multiselect' => 'چند انتخابی', + 'email' => 'ایمیل', + 'address' => 'آدرس', + 'phone' => 'تلفن', + 'datetime' => 'تاریخ و زمان', + 'date' => 'تاریخ', + 'image' => 'تصویر', + 'file' => 'فایل', + 'lookup' => 'جستجو', + 'entity_type' => 'نوع موجودیت', + 'checkbox' => 'چک باکس', + 'is_required' => 'الزامی است', + 'is_unique' => 'منحصربه‌فرد است', + 'actions' => 'عملیات', + ], + 'edit' => [ + 'actions' => 'عملیات', + 'add-attribute-options' => 'افزودن گزینه‌های ویژگی', + 'add-option' => 'افزودن گزینه', + 'address' => 'آدرس', + 'boolean' => 'بولی', + 'checkbox' => 'چک باکس', + 'code' => 'کد', + 'date' => 'تاریخ', + 'datetime' => 'تاریخ و زمان', + 'decimal' => 'اعشاری', + 'email' => 'ایمیل', + 'entity-type' => 'نوع موجودیت', + 'entity_type' => 'نوع موجودیت', + 'file' => 'فایل', + 'general' => 'عمومی', + 'image' => 'تصویر', + 'input-validation' => 'اعتبارسنجی ورودی', + 'is-required' => 'الزامی است', + 'is-unique' => 'منحصربه‌فرد است', + 'is_required' => 'الزامی است', + 'is_unique' => 'منحصربه‌فرد است', + 'labels' => 'برچسب‌ها', + 'lookup' => 'جستجو', + 'lookup-type' => 'نوع جستجو', + 'multiselect' => 'چند انتخابی', + 'name' => 'نام', + 'numeric' => 'عددی', + 'option-deleted' => 'Attribute Option is deleted successfully', + 'option-name' => 'نام گزینه', + 'option-type' => 'نوع گزینه', + 'options' => 'گزینه‌ها', + 'phone' => 'تلفن', + 'price' => 'قیمت', + 'save-btn' => 'ذخیره ویژگی', + 'save-option' => 'ذخیره گزینه', + 'select' => 'انتخاب', + 'text' => 'متن', + 'textarea' => 'میدان متن', + 'title' => 'ویرایش ویژگی', + 'type' => 'نوع', + 'url' => 'آدرس', + 'validations' => 'اعتبارسنجی‌ها', + ], + ], + 'data-transfer' => [ + 'imports' => [ + 'create' => [ + 'action' => 'عملیات', + 'allowed-errors' => 'خطاهای مجاز', + 'back-btn' => 'بازگشت', + 'create-update' => 'ایجاد/به‌روزرسانی', + 'delete' => 'حذف', + 'download-sample' => 'دانلود نمونه', + 'field-separator' => 'جداکننده فیلد', + 'file' => 'فایل', + 'general' => 'عمومی', + 'images-directory' => 'مسیر پوشه تصاویر', + 'process-in-queue' => 'پردازش در صف', + 'results' => 'نتایج', + 'save-btn' => 'ذخیره واردات', + 'settings' => 'تنظیمات', + 'skip-errors' => 'رد کردن خطاها', + 'stop-on-errors' => 'توقف در صورت خطا', + 'title' => 'ایجاد واردات', + 'type' => 'نوع', + 'validation-strategy' => 'استراتژی اعتبارسنجی', + ], + 'edit' => [ + 'action' => 'عملیات', + 'allowed-errors' => 'خطاهای مجاز', + 'back-btn' => 'بازگشت', + 'create-update' => 'ایجاد/به‌روزرسانی', + 'delete' => 'حذف', + 'download-sample' => 'دانلود نمونه', + 'field-separator' => 'جداکننده فیلد', + 'file' => 'فایل', + 'general' => 'عمومی', + 'images-directory' => 'مسیر پوشه تصاویر', + 'process-in-queue' => 'پردازش در صف', + 'results' => 'نتایج', + 'save-btn' => 'ذخیره واردات', + 'settings' => 'تنظیمات', + 'skip-errors' => 'رد کردن خطاها', + 'stop-on-errors' => 'توقف در صورت خطا', + 'title' => 'ویرایش واردات', + 'type' => 'نوع', + 'validation-strategy' => 'استراتژی اعتبارسنجی', + ], + 'index' => [ + 'button-title' => 'ایجاد واردات', + 'title' => 'واردات‌ها', + 'datagrid' => [ + 'actions' => 'عملیات', + 'completed-at' => 'تکمیل شده در', + 'created' => 'ایجاد شده', + 'delete' => 'حذف', + 'deleted' => 'حذف شده', + 'edit' => 'ویرایش', + 'error-file' => 'فایل خطا', + 'id' => 'شناسه', + 'started-at' => 'شروع شده در', + 'state' => 'وضعیت', + 'summary' => 'خلاصه', + 'type' => 'نوع', + 'updated' => 'به‌روزرسانی شده', + 'uploaded-file' => 'فایل آپلود شده', + ], + ], + 'import' => [ + 'back-btn' => 'بازگشت', + 'completed-batches' => 'کل دسته‌های تکمیل شده:', + 'download-error-report' => 'دانلود گزارش کامل', + 'edit-btn' => 'ویرایش', + 'imported-info' => 'تبریک! واردات شما با موفقیت انجام شد.', + 'importing-info' => 'واردات در حال انجام است', + 'indexing-info' => 'ایندکس‌گذاری منابع (قیمت، موجودی و Elastic Search) در حال پیشرفت است', + 'linking-info' => 'پیونددهی منابع در حال انجام است', + 'progress' => 'پیشرفت:', + 'title' => 'واردات', + 'total-batches' => 'کل دسته‌ها:', + 'total-created' => 'کل رکوردهای ایجاد شده:', + 'total-deleted' => 'کل رکوردهای حذف شده:', + 'total-errors' => 'کل خطاها:', + 'total-invalid-rows' => 'کل ردیف‌های نامعتبر:', + 'total-rows-processed' => 'کل ردیف‌های پردازش شده:', + 'total-updated' => 'کل رکوردهای به‌روزرسانی شده:', + 'validate' => 'اعتبارسنجی', + 'validate-info' => 'برای بررسی واردات خود، روی "اعتبارسنجی داده‌ها" کلیک کنید.', + 'validating-info' => 'خواندن و اعتبارسنجی داده‌ها آغاز شده است', + 'validation-failed-info' => 'واردات شما نامعتبر است. لطفاً خطاهای زیر را رفع کرده و دوباره تلاش کنید.', + 'validation-success-info' => 'واردات شما معتبر است. برای شروع فرآیند واردات، روی "واردات" کلیک کنید.', + ], + 'create-success' => 'واردات با موفقیت ایجاد شد.', + 'delete-failed' => 'حذف واردات به طور غیرمنتظره‌ای ناکام ماند.', + 'delete-success' => 'واردات با موفقیت حذف شد.', + 'not-valid' => 'واردات نامعتبر است', + 'nothing-to-import' => 'هیچ منبعی برای واردات وجود ندارد.', + 'setup-queue-error' => 'لطفاً درایور صف خود را به "database" یا "redis" تغییر دهید تا فرآیند واردات شروع شود.', + 'update-success' => 'واردات با موفقیت به‌روزرسانی شد.', + ], + ], + ], + 'activities' => [ + 'index' => [ + 'title' => 'فعالیت‌ها', + 'datagrid' => [ + 'comment' => 'نظر', + 'created_at' => 'تاریخ ایجاد', + 'created_by' => 'ایجاد شده توسط', + 'edit' => 'ویرایش', + 'id' => 'شناسه', + 'done' => 'انجام شده', + 'not-done' => 'انجام نشده', + 'lead' => 'سرنخ', + 'mass-delete' => 'حذف انبوه', + 'mass-update' => 'به‌روزرسانی انبوه', + 'schedule-from' => 'برنامه‌ریزی از', + 'schedule-to' => 'برنامه‌ریزی تا', + 'schedule_from' => 'برنامه‌ریزی از', + 'schedule_to' => 'برنامه‌ریزی تا', + 'title' => 'عنوان', + 'is_done' => 'انجام شده', + 'type' => 'نوع', + 'update' => 'به‌روزرسانی', + 'call' => 'تماس', + 'meeting' => 'جلسه', + 'lunch' => 'ناهار', + ], + ], + 'edit' => [ + 'title' => 'ویرایش فعالیت', + 'back-btn' => 'برگشت', + 'save-btn' => 'ذخیره فعالیت', + 'type' => 'نوع فعالیت', + 'call' => 'تماس', + 'meeting' => 'جلسه', + 'lunch' => 'ناهار', + 'schedule_to' => 'برنامه‌ریزی تا', + 'schedule_from' => 'برنامه‌ریزی از', + 'location' => 'مکان', + 'comment' => 'نظر', + 'lead' => 'سرنخ', + 'participants' => 'شرکت‌کنندگان', + 'general' => 'عمومی', + 'persons' => 'افراد', + 'no-result-found' => 'سوابقی یافت نشد.', + 'users' => 'کاربران', + ], + 'updated' => 'به‌روزرسانی شد :attribute', + 'created' => 'ایجاد شد', + 'duration-overlapping' => 'شرکت‌کنندگان در این زمان جلسه دیگری دارند. آیا می‌خواهید ادامه دهید؟', + 'create-success' => 'فعالیت با موفقیت ایجاد شد.', + 'update-success' => 'فعالیت با موفقیت به‌روزرسانی شد.', + 'overlapping-error' => 'شرکت‌کنندگان در این زمان جلسه دیگری دارند.', + 'destroy-success' => 'فعالیت با موفقیت حذف شد.', + 'delete-failed' => 'امکان حذف فعالیت وجود ندارد.', + 'mass-update-success' => 'فعالیت‌ها با موفقیت به‌روزرسانی شدند.', + 'mass-destroy-success' => 'فعالیت‌ها با موفقیت حذف شدند.', + 'mass-delete-failed' => 'امکان حذف فعالیت‌ها وجود ندارد.', + ], + 'mail' => [ + 'index' => [ + 'compose' => 'نوشتن', + 'draft' => 'پیش‌نویس', + 'inbox' => 'صندوق ورودی', + 'outbox' => 'صندوق خروجی', + 'sent' => 'ارسال شده', + 'trash' => 'سطل زباله', + 'compose-mail-btn' => 'نوشتن ایمیل', + 'btn' => 'ایمیل', + 'mail' => [ + 'title' => 'نوشتن ایمیل', + 'to' => 'به', + 'enter-emails' => 'برای اضافه کردن ایمیل‌ها، کلید Enter را فشار دهید', + 'cc' => 'CC', + 'bcc' => 'BCC', + 'subject' => 'موضوع', + 'send-btn' => 'ارسال', + 'message' => 'پیام', + 'draft' => 'پیش‌نویس', + ], + 'datagrid' => [ + 'id' => 'شناسه', + 'from' => 'از', + 'to' => 'به', + 'subject' => 'موضوع', + 'tags' => 'برچسب‌ها', + 'content' => 'محتوا', + 'attachments' => 'پیوست‌ها', + 'date' => 'تاریخ', + 'move-to-inbox' => 'انتقال به صندوق ورودی', + 'move-to-trash' => 'به سطل زباله منتقل شد', + 'edit' => 'ویرایش', + 'view' => 'نمایش', + 'delete' => 'حذف', + ], + ], + 'create-success' => 'ایمیل با موفقیت ارسال شد.', + 'update-success' => 'ایمیل با موفقیت به‌روزرسانی شد.', + 'mass-update-success' => 'ایمیل‌ها با موفقیت به‌روزرسانی شدند.', + 'delete-success' => 'ایمیل با موفقیت حذف شد.', + 'delete-failed' => 'ایمیل قابل حذف نیست.', + 'view' => [ + 'title' => 'ایمیل‌ها', + 'subject' => ':subject', + 'link-mail' => 'لینک ایمیل', + 'to' => 'به', + 'cc' => 'CC', + 'bcc' => 'BCC', + 'reply' => 'پاسخ', + 'reply-all' => 'پاسخ به همه', + 'forward' => 'فوروارد', + 'delete' => 'حذف', + 'enter-mails' => 'شناسه ایمیل را وارد کنید', + 'rotten-days' => 'سرنخ به مدت :days روز خراب شده است', + 'search-an-existing-lead' => 'جستجوی سرنخ موجود', + 'search-an-existing-contact' => 'جستجوی مخاطب موجود', + 'message' => 'پیام', + 'add-attachments' => 'اضافه کردن پیوست‌ها', + 'discard' => 'لغو', + 'send' => 'ارسال', + 'no-result-found' => 'نتیجه‌ای یافت نشد', + 'add-new-contact' => 'افزودن مخاطب جدید', + 'description' => 'توضیحات', + 'search' => 'جستجو...', + 'add-new-lead' => 'افزودن سرنخ جدید', + 'create-new-contact' => 'ایجاد مخاطب جدید', + 'save-contact' => 'ذخیره مخاطب', + 'create-lead' => 'ایجاد سرنخ', + 'linked-contact' => 'مخاطب مرتبط', + 'link-to-contact' => 'لینک به مخاطب', + 'link-to-lead' => 'لینک به سرنخ', + 'linked-lead' => 'سرنخ مرتبط', + 'lead-details' => 'جزئیات سرنخ', + 'contact-person' => 'شخص تماس', + 'product' => 'محصول', + 'tags' => [ + 'create-success' => 'برچسب با موفقیت ایجاد شد.', + 'destroy-success' => 'برچسب با موفقیت حذف شد.', + ], + ], + ], + 'common' => [ + 'custom-attributes' => [ + 'add-more' => 'افزودن بیشتر', + 'address' => 'آدرس', + 'city' => 'شهر', + 'contact' => 'شماره‌های تماس', + 'country' => 'کشور', + 'email' => 'ایمیل', + 'home' => 'خانه', + 'postcode' => 'کد پستی', + 'save' => 'ذخیره', + 'select' => 'انتخاب', + 'select-country' => 'انتخاب کشور', + 'select-state' => 'انتخاب ایالت', + 'state' => 'ایالت', + 'update-contact-title' => 'به‌روزرسانی شماره‌های تماس', + 'update-emails-title' => 'به‌روزرسانی ایمیل‌های تماس', + 'work' => 'محل کار', + ], + ], + 'leads' => [ + 'create-success' => 'سرنخ با موفقیت ایجاد شد.', + 'update-success' => 'سرنخ با موفقیت به‌روزرسانی شد.', + 'update-failed' => 'سرنخ‌ها قابل حذف نیستند.', + 'destroy-success' => 'سرنخ با موفقیت حذف شد.', + 'destroy-failed' => 'سرنخ قابل حذف نیست.', + 'file' => [ + 'data-not-found' => 'داده‌ای یافت نشد.', + 'empty-content' => 'محتوای PDF خالی است یا نمی‌توان آن را استخراج کرد.', + 'failed-extract' => 'استخراج متن از فایل ناموفق بود.', + 'insufficient-info' => 'به دلیل اطلاعات ناکافی، در حال حاضر نمی‌توانیم درخواست شما را پردازش کنیم.', + 'invalid-base64' => 'فرمت base64 نامعتبر است.', + 'invalid-format' => 'فرمت JSON نامعتبر است.', + 'invalid-response' => 'فرمت پاسخ هوش مصنوعی نامعتبر است.', + 'missing-api-key' => 'کلید API یا پیکربندی مدل مفقود است.', + 'not-found' => 'فایل یافت نشد.', + 'recursive-call' => 'تماس بازگشتی شناسایی شد.', + 'text-generation-failed' => 'استخراج متن ناموفق بود. فایل ممکن است خالی یا غیرقابل خواندن باشد.', + ], + 'index' => [ + 'title' => 'سرنخ‌ها', + 'create-btn' => 'ایجاد سرنخ', + 'datagrid' => [ + 'id' => 'شناسه', + 'sales-person' => 'کارشناس فروش', + 'subject' => 'موضوع', + 'source' => 'منبع', + 'lead-value' => 'ارزش سرنخ', + 'lead-type' => 'نوع سرنخ', + 'tag-name' => 'نام برچسب', + 'contact-person' => 'شخص تماس', + 'stage' => 'مرحله', + 'rotten-lead' => 'سرنخ خراب شده', + 'date-to' => 'تاریخ تا', + 'created-at' => 'تاریخ ایجاد', + 'no' => 'خیر', + 'yes' => 'بله', + 'delete' => 'حذف', + 'mass-delete' => 'حذف گروهی', + 'mass-update' => 'به‌روزرسانی گروهی', + ], + 'kanban' => [ + 'rotten-days' => 'سرنخ برای :days روز خراب شده است', + 'empty-list' => 'لیست سرنخ‌های شما خالی است', + 'empty-list-description' => 'یک سرنخ ایجاد کنید تا اهداف خود را سازماندهی کنید.', + 'create-lead-btn' => 'ایجاد سرنخ', + 'columns' => [ + 'contact-person' => 'شخص تماس', + 'id' => 'شناسه', + 'lead-type' => 'نوع سرنخ', + 'lead-value' => 'ارزش سرنخ', + 'sales-person' => 'کارشناس فروش', + 'source' => 'منبع', + 'title' => 'عنوان', + 'tags' => 'برچسب‌ها', + 'expected-close-date' => 'تاریخ بسته شدن مورد انتظار', + 'created-at' => 'تاریخ ایجاد', + ], + 'toolbar' => [ + 'search' => [ + 'title' => 'جستجو بر اساس عنوان', + ], + 'filters' => [ + 'apply-filters' => 'اعمال فیلترها', + 'clear-all' => 'پاک کردن همه', + 'filter' => 'فیلتر', + 'filters' => 'فیلترها', + 'from' => 'از', + 'select' => 'انتخاب', + 'to' => 'تا', + ], + ], + ], + 'view-switcher' => [ + 'all-pipelines' => 'تمام خطوط تولید', + 'create-new-pipeline' => 'ایجاد خط تولید جدید', + ], + 'upload' => [ + 'create-lead' => 'ایجاد سرنخ با استفاده از هوش مصنوعی', + 'file' => 'آپلود فایل', + 'file-info' => 'فقط فایل‌های با فرمت pdf, bmp, jpg, jpeg, png پذیرفته می‌شوند.', + 'file-required' => 'لطفاً حداقل یک فایل معتبر برای ادامه انتخاب کنید.', + 'save-btn' => 'ذخیره', + 'upload-file' => 'بارگذاری فایل', + ], + ], + 'create' => [ + 'title' => 'ایجاد سرنخ', + 'save-btn' => 'ذخیره', + 'details' => 'جزئیات', + 'details-info' => 'اطلاعات پایه سرنخ را وارد کنید', + 'contact-person' => 'شخص تماس', + 'contact-info' => 'اطلاعات درباره شخص تماس', + 'products' => 'محصولات', + 'products-info' => 'اطلاعات درباره محصولات', + ], + 'edit' => [ + 'title' => 'ویرایش سرنخ', + 'save-btn' => 'ذخیره', + 'details' => 'جزئیات', + 'details-info' => 'اطلاعات پایه سرنخ را وارد کنید', + 'contact-person' => 'شخص تماس', + 'contact-info' => 'اطلاعات درباره شخص تماس', + 'products' => 'محصولات', + 'products-info' => 'اطلاعات درباره محصولات', + ], + 'common' => [ + 'contact' => [ + 'name' => 'نام', + 'email' => 'ایمیل', + 'contact-number' => 'شماره تماس', + 'organization' => 'سازمان', + ], + 'products' => [ + 'product-name' => 'نام محصول', + 'quantity' => 'تعداد', + 'price' => 'قیمت', + 'amount' => 'مقدار', + 'action' => 'عملیات', + 'add-more' => 'افزودن بیشتر', + 'total' => 'جمع', + ], + ], + 'view' => [ + 'title' => 'سرنخ: :title', + 'rotten-days' => ':days روز', + 'tabs' => [ + 'description' => 'توضیحات', + 'products' => 'محصولات', + 'quotes' => 'نقل‌قول‌ها', + ], + 'attributes' => [ + 'title' => 'درباره سرنخ', + ], + 'quotes' => [ + 'subject' => 'موضوع', + 'expired-at' => 'تاریخ انقضا', + 'sub-total' => 'جمع جزئی', + 'discount' => 'تخفیف', + 'tax' => 'مالیات', + 'adjustment' => 'تنظیمات', + 'grand-total' => 'جمع کل', + 'delete' => 'حذف', + 'edit' => 'ویرایش', + 'download' => 'دانلود', + 'destroy-success' => 'پیشنهاد با موفقیت حذف شد.', + 'empty-title' => 'هیچ پیشنهادی یافت نشد', + 'empty-info' => 'هیچ پیشنهادی برای این سرنخ یافت نشد', + 'add-btn' => 'افزودن پیشنهاد', + ], + 'products' => [ + 'product-name' => 'نام محصول', + 'quantity' => 'تعداد', + 'price' => 'قیمت', + 'amount' => 'مقدار', + 'action' => 'عملیات', + 'add-more' => 'افزودن بیشتر', + 'total' => 'جمع', + 'empty-title' => 'هیچ محصولی یافت نشد', + 'empty-info' => 'هیچ محصولی برای این سرنخ یافت نشد', + 'add-product' => 'افزودن محصول', + ], + 'persons' => [ + 'title' => 'درباره افراد', + 'job-title' => ':job_title در :organization', + ], + 'stages' => [ + 'won-lost' => 'برد/باخت', + 'won' => 'برد', + 'lost' => 'باخت', + 'need-more-info' => 'نیاز به اطلاعات بیشتر', + 'closed-at' => 'بسته شده در', + 'won-value' => 'ارزش برد', + 'lost-reason' => 'دلیل باخت', + 'save-btn' => 'ذخیره', + ], + 'tags' => [ + 'create-success' => 'برچسب با موفقیت ایجاد شد.', + 'destroy-success' => 'برچسب با موفقیت حذف شد.', + ], + ], + ], + 'configuration' => [ + 'index' => [ + 'back' => 'بازگشت', + 'delete' => 'حذف', + 'save-btn' => 'ذخیره پیکربندی', + 'save-success' => 'پیکربندی با موفقیت ذخیره شد.', + 'search' => 'جستجو', + 'select-country' => 'انتخاب کشور', + 'select-state' => 'انتخاب ایالت', + 'title' => 'پیکربندی', + 'general' => [ + 'title' => 'عمومی', + 'info' => 'پیکربندی عمومی', + 'general' => [ + 'title' => 'عمومی', + 'info' => 'تنظیمات عمومی خود را اینجا به‌روزرسانی کنید.', + 'locale-settings' => [ + 'title' => 'تنظیمات محلی', + 'title-info' => 'زبان مورد استفاده در رابط کاربری را تعریف می‌کند، مانند عربی (ar)، انگلیسی (en)، اسپانیایی (es)، فارسی (fa) و ترکی (tr).', + ], + 'admin-logo' => [ + 'logo-image' => 'تصویر لوگو', + 'title' => 'لوگوی مدیر', + 'title-info' => 'تصویر لوگو برای پنل مدیریت خود را پیکربندی کنید.', + ], + ], + 'settings' => [ + 'title' => 'تنظیمات', + 'info' => 'تنظیمات خود را اینجا به‌روزرسانی کنید.', + 'footer' => [ + 'info' => 'ما می‌توانیم بخش "توسعه یافته توسط" را اینجا پیکربندی کنیم.', + 'powered-by' => 'توسعه یافته توسط ویرایشگر متن', + 'title' => 'پیکربندی بخش "توسعه یافته توسط"', + ], + 'menu' => [ + 'activities' => 'فعالیت‌ها', + 'configuration' => 'پیکربندی', + 'contacts' => 'مخاطبین', + 'dashboard' => 'داشبورد', + 'draft' => 'پیش‌نویس', + 'inbox' => 'صندوق ورودی', + 'info' => 'ما می‌توانیم نام آیتم‌های منو را اینجا پیکربندی کنیم.', + 'leads' => 'سرنخ‌ها', + 'mail' => 'ایمیل', + 'organizations' => 'سازمان‌ها', + 'outbox' => 'صندوق خروجی', + 'persons' => 'افراد', + 'products' => 'محصولات', + 'quotes' => 'نقل‌قول‌ها', + 'sent' => 'ارسال شده', + 'settings' => 'تنظیمات', + 'title' => 'پیکربندی آیتم‌های منو', + 'trash' => 'زباله‌دان', + ], + 'menu-color' => [ + 'brand-color' => 'Brand Color', + 'info' => 'ما می‌توانیم رنگ آیتم‌های منو را اینجا تغییر دهیم.', + 'title' => 'پیکربندی رنگ آیتم‌های منو', + ], + ], + ], + 'email' => [ + 'title' => 'تنظیمات ایمیل', + 'info' => 'پیکربندی ایمیل برای برنامه.', + 'imap' => [ + 'title' => 'تنظیمات IMAP', + 'info' => 'پیکربندی ایمیل IMAP برای دریافت ایمیل‌ها.', + 'account' => [ + 'title' => 'حساب IMAP', + 'title-info' => 'تنظیمات حساب IMAP خود را اینجا پیکربندی کنید.', + 'host' => 'میزبان', + 'port' => 'پورت', + 'encryption' => 'نوع رمزگذاری', + 'validate-cert' => 'اعتبارسنجی گواهی SSL', + 'username' => 'نام کاربری IMAP', + 'password' => 'رمز عبور IMAP', + ], + ], + ], + 'magic-ai' => [ + 'title' => 'هوش مصنوعی جادویی', + 'info' => 'پیکربندی هوش مصنوعی جادویی برای برنامه.', + 'settings' => [ + 'api-key' => 'کلید API', + 'api-key-info' => 'به یاد داشته باشید که برای هر مدل از کلید API OpenRouter استفاده کنید. این یک گام ساده برای افزایش امنیت و عملکرد است.', + 'enable' => 'فعال کردن', + 'info' => 'تجربه هوش مصنوعی جادویی خود را با کلید API OpenRouter خود بهبود بخشید. اکنون آن را یکپارچه کنید تا یک ماجراجویی هوش مصنوعی شخصی‌سازی شده و بدون درز برای شما فراهم شود! به راحتی تنظیمات را سفارشی کنید و کنترل سفر هوش مصنوعی خود را به دست بگیرید.', + 'other' => 'مدل دیگر', + 'other-model' => 'برای مدل‌های دیگر، از شناسه مدل از OpenRouter استفاده کنید.', + 'doc-generation' => 'تولید DOC', + 'doc-generation-info' => 'ویژگی تولید DOC را فعال کنید تا به‌صورت خودکار داده‌ها را از فایل‌های DOC استخراج و به فرمت متنی تبدیل کند. با فعال‌سازی این ویژگی، بهره‌وری و کارایی خود را افزایش دهید و فرآیند کاری را ساده‌تر کنید.', + 'title' => 'تنظیمات عمومی', + 'models' => [ + 'deepseek-r1' => 'Deepseek R1 Distill-llama-8b', + 'gemini-2-0-flash-001' => 'Gemini 2.0 flash-001', + 'gpt-4o' => 'GPT-4.0', + 'gpt-4o-mini' => 'GPT-4.0 mini', + 'grok-2-1212' => 'Grok 2.12', + 'llama-3-2-3b-instruct' => 'Llama 3.2 3b Instruct', + 'title' => 'مدل‌ها', + ], + ], + ], + ], + ], + 'dashboard' => [ + 'index' => [ + 'title' => 'داشبورد', + 'revenue' => [ + 'lost-revenue' => 'درآمد از دست رفته', + 'won-revenue' => 'درآمد برنده', + ], + 'over-all' => [ + 'average-lead-value' => 'میانگین ارزش لید', + 'total-leads' => 'کل لیدها', + 'average-leads-per-day' => 'میانگین لیدها در روز', + 'total-quotations' => 'کل نقل قول‌ها', + 'total-persons' => 'کل افراد', + 'total-organizations' => 'کل سازمان‌ها', + ], + 'total-leads' => [ + 'title' => 'لیدها', + 'total' => 'کل لیدها', + 'won' => 'لیدهای برنده', + 'lost' => 'لیدهای از دست رفته', + ], + 'revenue-by-sources' => [ + 'title' => 'درآمد بر اساس منابع', + 'empty-title' => 'هیچ داده‌ای موجود نیست', + 'empty-info' => 'داده‌ای برای بازه زمانی انتخاب شده وجود ندارد', + ], + 'revenue-by-types' => [ + 'title' => 'درآمد بر اساس انواع', + 'empty-title' => 'هیچ داده‌ای موجود نیست', + 'empty-info' => 'داده‌ای برای بازه زمانی انتخاب شده وجود ندارد', + ], + 'top-selling-products' => [ + 'title' => 'محصولات برتر', + 'empty-title' => 'هیچ محصولی پیدا نشد', + 'empty-info' => 'محصولی برای بازه زمانی انتخاب شده موجود نیست', + ], + 'top-persons' => [ + 'title' => 'افراد برتر', + 'empty-title' => 'هیچ فردی پیدا نشد', + 'empty-info' => 'فردی برای بازه زمانی انتخاب شده موجود نیست', + ], + 'open-leads-by-states' => [ + 'title' => 'سرنخ‌های باز بر اساس مراحل', + 'empty-title' => 'هیچ داده‌ای موجود نیست', + 'empty-info' => 'داده‌ای برای بازه زمانی انتخاب شده وجود ندارد', + ], + ], + ], + 'layouts' => [ + 'app-version' => 'نسخه: :version', + 'dashboard' => 'داشبورد', + 'leads' => 'لیدها', + 'quotes' => 'نقل قول‌ها', + 'quote' => 'نقل قول', + 'mail' => [ + 'title' => 'ایمیل', + 'compose' => 'تدوین', + 'inbox' => 'صندوق ورودی', + 'draft' => 'پیش‌نویس', + 'outbox' => 'صندوق خروجی', + 'sent' => 'ارسال شده', + 'trash' => 'زباله‌دان', + 'setting' => 'تنظیمات', + ], + 'activities' => 'فعالیت‌ها', + 'contacts' => 'مخاطبین', + 'persons' => 'افراد', + 'person' => 'فرد', + 'organizations' => 'سازمان‌ها', + 'organization' => 'سازمان', + 'products' => 'محصولات', + 'product' => 'محصول', + 'settings' => 'تنظیمات', + 'user' => 'کاربر', + 'user-info' => 'مدیریت همه کاربران و مجوزهای آنها در CRM، آنچه که اجازه دارند انجام دهند.', + 'groups' => 'گروه‌ها', + 'groups-info' => 'اضافه، ویرایش یا حذف گروه‌ها از CRM', + 'roles' => 'نقش‌ها', + 'role' => 'نقش', + 'roles-info' => 'اضافه، ویرایش یا حذف نقش‌ها از CRM', + 'users' => 'کاربران', + 'users-info' => 'اضافه، ویرایش یا حذف کاربران از CRM', + 'lead' => 'لید', + 'lead-info' => 'مدیریت همه تنظیمات مربوط به لیدها در CRM', + 'pipelines' => 'پایپ‌لاین‌ها', + 'pipelines-info' => 'اضافه، ویرایش یا حذف پایپ‌لاین‌ها از CRM', + 'sources' => 'منابع', + 'sources-info' => 'اضافه، ویرایش یا حذف منابع از CRM', + 'types' => 'انواع', + 'types-info' => 'اضافه، ویرایش یا حذف انواع از CRM', + 'automation' => 'اتوماسیون', + 'automation-info' => 'مدیریت همه تنظیمات مربوط به اتوماسیون در CRM', + 'attributes' => 'ویژگی‌ها', + 'attribute' => 'ویژگی', + 'attributes-info' => 'اضافه، ویرایش یا حذف ویژگی‌ها از CRM', + 'email-templates' => 'قالب‌های ایمیل', + 'email' => 'ایمیل', + 'email-templates-info' => 'اضافه، ویرایش یا حذف قالب‌های ایمیل از CRM', + 'events' => 'رویدادها', + 'events-info' => 'افزودن، ویرایش یا حذف رویدادها از CRM', + 'campaigns' => 'کمپین‌ها', + 'campaigns-info' => 'افزودن، ویرایش یا حذف کمپین‌ها از CRM', + 'workflows' => 'فرایندها', + 'workflows-info' => 'اضافه، ویرایش یا حذف فرایندها از CRM', + 'webhooks' => 'وب‌هوک‌ها', + 'webhooks-info' => 'افزودن، ویرایش یا حذف وب‌هوک‌ها از CRM', + 'other-settings' => 'تنظیمات دیگر', + 'other-settings-info' => 'مدیریت همه تنظیمات اضافی در CRM', + 'tags' => 'برچسب‌ها', + 'tags-info' => 'اضافه، ویرایش یا حذف برچسب‌ها از CRM', + 'my-account' => 'حساب من', + 'sign-out' => 'خروج', + 'back' => 'برگشت', + 'name' => 'نام', + 'configuration' => 'پیکربندی', + 'howdy' => 'سلام!', + 'warehouses' => 'انبارها', + 'warehouse' => 'انبار', + 'warehouses-info' => 'اضافه، ویرایش یا حذف انبارها از CRM', + 'data_transfer' => 'انتقال داده', + 'data_transfer_info' => 'مدیریت تنظیمات مربوط به انتقال داده‌های اشخاص، محصولات و سرنخ‌ها در CRM', + ], + 'user' => [ + 'account' => [ + 'name' => 'نام', + 'email' => 'ایمیل', + 'password' => 'رمز عبور', + 'my_account' => 'حساب من', + 'update_details' => 'بروزرسانی جزئیات', + 'current_password' => 'رمز عبور فعلی', + 'confirm_password' => 'تأیید رمز عبور', + 'password-match' => 'رمز عبور فعلی مطابقت ندارد.', + 'account-save' => 'تغییرات حساب با موفقیت ذخیره شد.', + 'permission-denied' => 'دسترسی مجاز نیست', + 'remove-image' => 'حذف تصویر', + 'upload_image_pix' => 'بارگذاری تصویر پروفایل (100px x 100px)', + 'upload_image_format' => 'در فرمت PNG یا JPG', + 'image_upload_message' => 'فقط تصاویر (.jpeg, .jpg, .png, ..) مجاز هستند.', + ], + ], + 'emails' => [ + 'common' => [ + 'dear' => 'عزیز :name', + 'cheers' => 'با احترام،
    تیم :app_name', + 'user' => [ + 'dear' => 'سلام :username', + 'create-subject' => 'شما به عنوان عضو اضافه شدید.', + 'create-body' => 'تبریک می‌گوییم! شما اکنون عضو تیم ما هستید.', + 'forget-password' => [ + 'subject' => 'بازنشانی رمز عبور مشتری', + 'dear' => 'سلام :username', + 'reset-password' => 'بازنشانی رمز عبور', + 'info' => 'شما این ایمیل را دریافت کرده‌اید زیرا ما درخواست بازنشانی رمز عبور برای حساب شما دریافت کرده‌ایم', + 'final-summary' => 'اگر درخواست بازنشانی رمز عبور نکرده‌اید، نیازی به انجام اقدام دیگری نیست', + 'thanks' => 'متشکریم!', + ], + ], + ], + ], + 'validations' => [ + 'message' => [ + 'decimal' => ':attribute باید یک عدد اعشاری باشد.', + ], + ], + 'errors' => [ + 'dashboard' => 'داشبورد', + 'go-back' => 'بازگشت', + 'support' => 'اگر مشکل ادامه داشت، برای کمک با ما از طریق :email تماس بگیرید.', + '404' => [ + 'description' => 'اوه! به نظر می‌رسد صفحه‌ای که دنبال آن بودید، در دسترس نیست. نتوانستیم چیزی که دنبالش بودید را پیدا کنیم.', + 'title' => '404 صفحه پیدا نشد', + ], + '401' => [ + 'description' => 'اوه! به نظر می‌رسد که شما مجاز به دسترسی به این صفحه نیستید. شما مجوزهای لازم را ندارید.', + 'title' => '401 مجاز نیست', + ], + '403' => [ + 'description' => 'اوه! این صفحه ممنوع است. به نظر می‌رسد شما مجوزهای لازم برای مشاهده این محتوا را ندارید.', + 'title' => '403 ممنوع', + ], + '500' => [ + 'description' => 'اوه! مشکلی پیش آمده است. به نظر می‌رسد مشکلی در بارگذاری صفحه مورد نظر شما وجود دارد.', + 'title' => '500 خطای سرور داخلی', + ], + '503' => [ + 'description' => 'اوه! به نظر می‌رسد که به طور موقت برای نگهداری آفلاین هستیم. لطفاً بعداً دوباره بررسی کنید.', + 'title' => '503 سرویس در دسترس نیست', + ], + ], + 'export' => [ + 'csv' => 'CSV', + 'download' => 'دانلود', + 'export' => 'صادر کردن', + 'no-records' => 'هیچ سوابقی برای صادر کردن وجود ندارد.', + 'xls' => 'XLS', + 'xlsx' => 'XLSX', + ], +]; diff --git a/packages/Webkul/Admin/src/Resources/lang/pt_BR/app.php b/packages/Webkul/Admin/src/Resources/lang/pt_BR/app.php new file mode 100644 index 0000000..7c65b31 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/lang/pt_BR/app.php @@ -0,0 +1,2308 @@ + [ + 'leads' => 'Oportunidades', + 'lead' => 'Oportunidade', + 'quotes' => 'Cotações', + 'mail' => 'E-mail', + 'inbox' => 'Caixa de Entrada', + 'draft' => 'Rascunho', + 'outbox' => 'Caixa de Saída', + 'sent' => 'Enviados', + 'trash' => 'Lixeira', + 'activities' => 'Atividades', + 'webhook' => 'Webhook', + 'contacts' => 'Contatos', + 'persons' => 'Pessoas', + 'organizations' => 'Empresas', + 'products' => 'Produtos', + 'settings' => 'Ajustes', + 'groups' => 'Grupos', + 'roles' => 'Funções', + 'users' => 'Usuários', + 'user' => 'Usuário', + 'automation' => 'Automação', + 'attributes' => 'Atributos', + 'pipelines' => 'Funil', + 'sources' => 'Origem', + 'types' => 'Tipos', + 'email-templates' => 'Modelos de E-mail', + 'workflows' => 'Fluxos de Trabalho', + 'other-settings' => 'Outros Ajustes', + 'tags' => 'Tags', + 'configuration' => 'Ajustes', + 'create' => 'Adicionar', + 'edit' => 'Editar', + 'view' => 'Visualizar', + 'print' => 'Imprimir', + 'delete' => 'Excluir', + 'export' => 'Exportar', + 'mass-delete' => 'Exclusão em Massa', + 'data-transfer' => 'Transferência de Dados', + 'imports' => 'Importações', + 'import' => 'Importar', + 'event' => 'Evento', + 'campaigns' => 'Campanhas', + ], + 'users' => [ + 'activate-warning' => 'Sua conta ainda não foi ativada. Por favor, entre em contato com o administrador.', + 'login-error' => 'As credenciais não correspondem aos nossos registros.', + 'not-permission' => 'You do not have permission to access the admin panel.', + 'login' => [ + 'email' => 'Endereço de E-mail', + 'forget-password-link' => 'Esqueceu a Senha?', + 'password' => 'Senha', + 'submit-btn' => 'Acessar', + 'title' => 'Acessar', + ], + 'forget-password' => [ + 'create' => [ + 'email' => 'E-mail Registrado', + 'email-not-exist' => 'E-mail Não Existe', + 'page-title' => 'Esqueceu a Senha', + 'reset-link-sent' => 'Link para redefinir a senha foi enviado', + 'sign-in-link' => 'Voltar para tela de acesso?', + 'submit-btn' => 'Redefinir', + 'title' => 'Recuperar Senha', + ], + ], + 'reset-password' => [ + 'back-link-title' => 'Voltar para tela de acesso?', + 'confirm-password' => 'Confirmar Senha', + 'email' => 'E-mail Registrado', + 'password' => 'Senha', + 'submit-btn' => 'Redefinir Senha', + 'title' => 'Redefinir Senha', + ], + ], + 'account' => [ + 'edit' => [ + 'back-btn' => 'Voltar', + 'change-password' => 'Alterar Senha', + 'confirm-password' => 'Confirmar Senha', + 'current-password' => 'Senha Atual', + 'email' => 'E-mail', + 'general' => 'Geral', + 'invalid-password' => 'A senha atual que você digitou está incorreta.', + 'name' => 'Nome', + 'password' => 'Senha', + 'profile-image' => 'Imagem de Perfil', + 'save-btn' => 'Salvar Conta', + 'title' => 'Minha Conta', + 'update-success' => 'Conta atualizada com sucesso', + 'upload-image-info' => 'Carregue uma imagem de perfil (110px X 110px) no formato PNG ou JPG', + ], + ], + 'components' => [ + 'activities' => [ + 'actions' => [ + 'mail' => [ + 'btn' => 'E-mail', + 'title' => 'Escrever e-mail', + 'to' => 'Para', + 'enter-emails' => 'Pressione Enter para adicionar e-mails', + 'cc' => 'Cópia', + 'bcc' => 'Cópia oculta', + 'subject' => 'Assunto', + 'send-btn' => 'Enviar', + 'message' => 'Mensagem', + ], + 'file' => [ + 'btn' => 'Arquivo', + 'title' => 'Adicionar Arquivo', + 'title-control' => 'Título', + 'name' => 'Nome', + 'description' => 'Descrição', + 'file' => 'Arquivo', + 'save-btn' => 'Salvar Arquivo', + ], + 'note' => [ + 'btn' => 'Nota', + 'title' => 'Adicionar Nota', + 'comment' => 'Comentário', + 'save-btn' => 'Salvar Nota', + ], + 'activity' => [ + 'btn' => 'Atividade', + 'title' => 'Adicionar Atividade', + 'title-control' => 'Título', + 'description' => 'Descrição', + 'schedule-from' => 'Agendar De', + 'schedule-to' => 'Agendar Até', + 'location' => 'Localização', + 'call' => 'Chamada', + 'meeting' => 'Reunião', + 'lunch' => 'Almoço', + 'save-btn' => 'Salvar Atividade', + 'participants' => [ + 'title' => 'Participantes', + 'placeholder' => 'Digite para pesquisar participantes', + 'users' => 'Usuários', + 'persons' => 'Pessoas', + 'no-results' => 'Nenhum resultado encontrado...', + ], + ], + ], + 'index' => [ + 'all' => 'Todos', + 'bcc' => 'Cópia oculta', + 'by-user' => 'Por usuário', + 'calls' => 'Chamadas', + 'cc' => 'Cópia', + 'change-log' => 'Logs de Alterações', + 'delete' => 'Excluir', + 'edit' => 'Editar', + 'emails' => 'E-mails', + 'empty' => 'Vazio', + 'files' => 'Arquivos', + 'from' => 'De', + 'location' => 'Localização', + 'lunches' => 'Almoços', + 'mark-as-done' => 'Marcar como Concluído', + 'meetings' => 'Reuniões', + 'notes' => 'Notas', + 'participants' => 'Participantes', + 'planned' => 'Planejado', + 'quotes' => 'Cotações', + 'scheduled-on' => 'Agendado em', + 'system' => 'Sistema', + 'to' => 'Para', + 'unlink' => 'Desvincular', + 'view' => 'Visualizar', + 'empty-placeholders' => [ + 'all' => [ + 'title' => 'Nenhuma atividade encontrada', + 'description' => 'Nenhuma atividade foi encontrada para este item. Você pode adicionar atividades clicando no botão Atividade no painel à esquerda.', + ], + 'planned' => [ + 'title' => 'Nenhuma atividade planejada encontrada', + 'description' => 'Nenhuma atividade planejada foi encontrada. Adicione uma clicando no botão Atividade no painel à esquerda.', + ], + 'notes' => [ + 'title' => 'Nenhuma nota encontrada', + 'description' => 'Nenhuma nota foi encontrada. Adicione notas clicando no botão Nota no painel à esquerda.', + ], + 'calls' => [ + 'title' => 'Nenhuma chamada encontrada', + 'description' => 'Nenhuma chamada foi encontrada. Adicione chamadas clicando no botão Atividade e selecionando o tipo Chamada.', + ], + 'meetings' => [ + 'title' => 'Nenhuma reunião encontrada', + 'description' => 'Nenhuma reunião foi encontrada. Adicione reuniões clicando no botão Atividade e selecionando o tipo Reunião.', + ], + 'lunches' => [ + 'title' => 'Nenhum almoço encontrado', + 'description' => 'Nenhum almoço foi encontrado. Adicione almoços clicando no botão Atividade e selecionando o tipo Almoço.', + ], + 'files' => [ + 'title' => 'Nenhum arquivo encontrado', + 'description' => 'Nenhum arquivo foi encontrado. Adicione arquivos clicando no botão Arquivo no painel à esquerda.', + ], + 'emails' => [ + 'title' => 'Nenhum e-mail encontrado', + 'description' => 'Nenhum e-mail foi encontrado. Adicione e-mails clicando no botão Correio no painel à esquerda.', + ], + 'system' => [ + 'title' => 'Nenhum registro de alteração encontrado', + 'description' => 'Nenhum registro de alteração foi encontrado.', + ], + ], + ], + ], + 'media' => [ + 'images' => [ + 'add-image-btn' => 'Adicionar Imagem', + 'ai-add-image-btn' => 'Mágica AI', + 'allowed-types' => 'png, jpeg, jpg', + 'not-allowed-error' => 'Apenas arquivos de imagem (.jpeg, .jpg, .png, ..) são permitidos.', + 'placeholders' => [ + 'front' => 'Frente', + 'next' => 'Próximo', + 'size' => 'Tamanho', + 'use-cases' => 'Casos de Uso', + 'zoom' => 'Zoom', + ], + ], + 'videos' => [ + 'add-video-btn' => 'Adicionar Vídeo', + 'allowed-types' => 'mp4, webm, mkv', + 'not-allowed-error' => 'Apenas arquivos de vídeo (.mp4, .mov, .ogg ..) são permitidos.', + ], + ], + 'datagrid' => [ + 'index' => [ + 'no-records-selected' => 'Nenhum registro foi selecionado.', + 'must-select-a-mass-action-option' => 'Você deve selecionar uma opção de ação em massa.', + 'must-select-a-mass-action' => 'Você deve selecionar uma ação em massa.', + ], + 'toolbar' => [ + 'length-of' => 'tamanho de', + 'of' => 'de', + 'per-page' => 'Por Página', + 'results' => 'Resultados', + 'delete' => 'Excluir', + 'selected' => 'Itens Selecionados', + 'mass-actions' => [ + 'submit' => 'Enviar', + 'select-option' => 'Selecionar Opção', + 'select-action' => 'Selecionar Ação', + ], + 'filter' => [ + 'apply-filters-btn' => 'Aplicar Filtros', + 'back-btn' => 'Voltar', + 'create-new-filter' => 'Adicionar novo Filtro', + 'custom-filters' => 'Filtros Personalizados', + 'delete-error' => 'Algo deu errado ao excluir o filtro, por favor tente novamente.', + 'delete-success' => 'Filtro excluído com sucesso.', + 'empty-description' => 'Não há filtros selecionados disponíveis para salvar. Por favor, selecione filtros para salvar.', + 'empty-title' => 'Adicionar Filtros para Salvar', + 'name' => 'Nome', + 'quick-filters' => 'Filtros Rápidos', + 'save-btn' => 'Salvar', + 'save-filter' => 'Salvar Filtro', + 'saved-success' => 'Filtro salvo com sucesso.', + 'selected-filters' => 'Filtros Selecionados', + 'title' => 'Filtro', + 'update' => 'Atualizar', + 'update-filter' => 'Atualizar Filtro', + 'updated-success' => 'Filtro atualizado com sucesso.', + ], + 'search' => [ + 'title' => 'Pesquisar', + ], + ], + 'filters' => [ + 'select' => 'Selecionar', + 'title' => 'Filtros', + 'dropdown' => [ + 'searchable' => [ + 'at-least-two-chars' => 'Digite pelo menos 2 caracteres...', + 'no-results' => 'Nenhum resultado encontrado...', + ], + ], + 'custom-filters' => [ + 'clear-all' => 'Limpar Todos', + 'title' => 'Filtros Personalizados', + ], + 'boolean-options' => [ + 'false' => 'Falso', + 'true' => 'Verdadeiro', + ], + 'date-options' => [ + 'last-month' => 'Último Mês', + 'last-six-months' => 'Últimos 6 Meses', + 'last-three-months' => 'Últimos 3 Meses', + 'this-month' => 'Este Mês', + 'this-week' => 'Esta Semana', + 'this-year' => 'Este Ano', + 'today' => 'Hoje', + 'yesterday' => 'Ontem', + ], + ], + 'table' => [ + 'actions' => 'Ações', + 'no-records-available' => 'Nenhum Registro Disponível.', + ], + ], + 'modal' => [ + 'confirm' => [ + 'agree-btn' => 'Concordar', + 'disagree-btn' => 'Discordar', + 'message' => 'Você tem certeza de que deseja realizar esta ação?', + 'title' => 'Você tem certeza?', + ], + ], + 'tags' => [ + 'index' => [ + 'title' => 'Tags', + 'added-tags' => 'Tags Adicionadas', + 'save-btn' => 'Salvar Tag', + 'placeholder' => 'Digite para procurar tags', + 'add-tag' => 'Adicionar Tag', + 'aquarelle-red' => 'Vermelho', + 'crushed-cashew' => 'Castanho', + 'beeswax' => 'Amarelado', + 'lemon-chiffon' => 'Limão', + 'snow-flurry' => 'Neve', + 'honeydew' => 'Melão', + ], + ], + 'layouts' => [ + 'app-version' => 'Versão: :version', + 'dashboard' => 'Dashboard', + 'leads' => 'Oportunidades', + 'quotes' => 'Cotações', + 'quote' => 'Cotação', + 'mail' => [ + 'title' => 'E-mail', + 'compose' => 'Escrever', + 'inbox' => 'Caixa de Entrada', + 'draft' => 'Rascunhos', + 'outbox' => 'Caixa de Saída', + 'sent' => 'Enviados', + 'trash' => 'Lixeira', + 'setting' => 'Configuração', + ], + 'activities' => 'Atividades', + 'contacts' => 'Contatos', + 'persons' => 'Pessoas', + 'person' => 'Pessoa', + 'organizations' => 'Empresas', + 'organization' => 'Empresa', + 'products' => 'Produtos', + 'product' => 'Produto', + 'settings' => 'Configurações', + 'user' => 'Usuário', + 'user-info' => 'Gerencie todos os seus usuários e suas permissões no CRM, o que eles podem fazer.', + 'groups' => 'Grupos', + 'groups-info' => 'Adicionar, editar ou excluir grupos do CRM', + 'roles' => 'Funções', + 'role' => 'Função', + 'roles-info' => 'Adicionar, editar ou excluir funções do CRM', + 'users' => 'Usuários', + 'users-info' => 'Adicionar, editar ou excluir usuários do CRM', + 'lead' => 'Oportunidade', + 'lead-info' => 'Gerencie todas as configurações relacionadas às suas oportunidades no CRM', + 'pipelines' => 'Funis', + 'pipelines-info' => 'Adicionar, editar ou excluir funis do CRM', + 'sources' => 'Fontes', + 'sources-info' => 'Adicionar, editar ou excluir fontes do CRM', + 'types' => 'Tipos', + 'types-info' => 'Adicionar, editar ou excluir tipos do CRM', + 'automation' => 'Automação', + 'automation-info' => 'Gerencie todas as configurações relacionadas à automação no CRM', + 'attributes' => 'Atributos', + 'attribute' => 'Atributo', + 'attributes-info' => 'Adicionar, editar ou excluir atributos do CRM', + 'email-templates' => 'Modelos de E-mail', + 'email' => 'E-mail', + 'email-templates-info' => 'Adicionar, editar ou excluir modelos de e-mail do CRM', + 'events' => 'Eventos', + 'events-info' => 'Adicionar, editar ou excluir eventos do CRM', + 'campaigns' => 'Campanhas', + 'campaigns-info' => 'Adicionar, editar ou excluir campanhas do CRM', + 'workflows' => 'Fluxos de Trabalho', + 'workflows-info' => 'Adicionar, editar ou excluir fluxos de trabalho do CRM', + 'webhooks' => 'Webhooks', + 'webhooks-info' => 'Adicionar, editar ou excluir webhooks do CRM', + 'other-settings' => 'Outras Configurações', + 'other-settings-info' => 'Gerencie todas as suas configurações extras no CRM', + 'tags' => 'Tags', + 'tags-info' => 'Adicionar, editar ou excluir tags do CRM', + 'my-account' => 'Minha Conta', + 'sign-out' => 'Sair', + 'back' => 'Voltar', + 'name' => 'Nome', + 'configuration' => 'Configuração', + 'activities' => 'Atividades', + 'howdy' => 'Olá!', + 'warehouses' => 'Depósitos', + 'warehouse' => 'Depósito', + 'warehouses-info' => 'Adicionar, editar ou excluir depósitos do CRM', + 'data_transfer' => 'Transferência de Dados', + 'data_transfer_info' => 'Gerencie as configurações relacionadas à transferência de dados de pessoas, produtos e oportunidades no CRM', + + 'powered-by' => [ + 'description' => 'Desenvolvido por :krayin, um projeto de código aberto da :webkul.', + ], + 'header' => [ + 'mega-search' => [ + 'title' => 'Busca rápida', + 'tabs' => [ + 'leads' => 'Oportunidades', + 'quotes' => 'Cotações', + 'persons' => 'Pessoas', + 'products' => 'Produtos', + ], + 'explore-all-products' => 'Explorar todos os Produtos', + 'explore-all-leads' => 'Explorar todos as Oportunidades', + 'explore-all-contacts' => 'Explorar todos os Contatos', + 'explore-all-quotes' => 'Explorar todas as Cotações', + 'explore-all-matching-products' => 'Explorar todos os produtos correspondentes a ":query" (:count)', + 'explore-all-matching-leads' => 'Explorar todos os negócios correspondentes a ":query" (:count)', + 'explore-all-matching-contacts' => 'Explorar todos os contatos correspondentes a ":query" (:count)', + 'explore-all-matching-quotes' => 'Explorar todas as cotações correspondentes a ":query" (:count)', + ], + ], + ], + 'attributes' => [ + 'edit' => [ + 'delete' => 'Excluir', + ], + 'lookup' => [ + 'click-to-add' => 'Clique para adicionar', + 'search' => 'Pesquisar...', + 'no-result-found' => 'Nenhum resultado encontrado', + ], + ], + 'lookup' => [ + 'click-to-add' => 'Clique para Adicionar', + 'no-results' => 'Nenhum Resultado Encontrado', + 'add-as-new' => 'Adicionar como Novo', + 'search' => 'Pesquisar...', + ], + 'flash-group' => [ + 'success' => 'Sucesso', + 'error' => 'Erro', + 'warning' => 'Aviso', + 'info' => 'Informação', + ], + 'tiny-mce' => [ + 'http-error' => 'Erro HTTP', + 'invalid-json' => 'Resposta JSON inválida do servidor.', + 'upload-failed' => 'Falha no upload do arquivo. Por favor, tente novamente.', + ], + ], + 'quotes' => [ + 'index' => [ + 'title' => 'Cotações', + 'create-btn' => 'Adicionar Cotação', + 'create-success' => 'Cotação adicionada com sucesso.', + 'update-success' => 'Cotação atualizada com sucesso.', + 'delete-success' => 'Cotação excluída com sucesso.', + 'delete-failed' => 'Não é possível excluir a cotação.', + 'datagrid' => [ + 'subject' => 'Assunto', + 'sales-person' => 'Vendedor', + 'expired-at' => 'Expirado em', + 'created-at' => 'Criado em', + 'person' => 'Pessoa', + 'subtotal' => 'Subtotal', + 'discount' => 'Desconto', + 'tax' => 'Imposto', + 'adjustment' => 'Ajuste', + 'grand-total' => 'Total Geral', + 'edit' => 'Editar', + 'delete' => 'Excluir', + 'print' => 'Imprimir', + ], + 'pdf' => [ + 'adjustment' => 'Ajuste', + 'amount' => 'Valor', + 'billing-address' => 'Endereço de Cobrança', + 'date' => 'Data', + 'discount' => 'Desconto', + 'expired-at' => 'Expirado em', + 'grand-total' => 'Total Geral', + 'person' => 'Pessoa', + 'price' => 'Preço', + 'product-name' => 'Nome do Produto', + 'quantity' => 'Quantidade', + 'quote-id' => 'ID da Cotação', + 'sales-person' => 'Vendedor', + 'shipping-address' => 'Endereço de Envio', + 'sku' => 'Código', + 'sub-total' => 'Subtotal', + 'subject' => 'Assunto', + 'tax' => 'Imposto', + 'title' => 'Cotação', + ], + ], + 'create' => [ + 'title' => 'Adicionar Cotação', + 'save-btn' => 'Salvar Cotação', + 'quote-info' => 'Informações da Cotação', + 'quote-info-info' => 'Informe as informações básicas da cotação.', + 'address-info' => 'Informações de Endereço', + 'address-info-info' => 'Informações sobre o endereço relacionado à cotação.', + 'quote-items' => 'Itens da Cotação', + 'search-products' => 'Pesquisar Produtos', + 'link-to-lead' => 'Vincular a um negócio', + 'quote-item-info' => 'Adicionar solicitação de produto para esta cotação.', + 'quote-name' => 'Nome da Cotação', + 'quantity' => 'Quantidade', + 'price' => 'Preço', + 'discount' => 'Desconto', + 'tax' => 'Imposto', + 'total' => 'Total', + 'amount' => 'Valor', + 'add-item' => '+ Adicionar Item', + 'sub-total' => 'Subtotal (:symbol)', + 'total-discount' => 'Desconto (:symbol)', + 'total-tax' => 'Imposto (:symbol)', + 'total-adjustment' => 'Ajuste (:symbol)', + 'grand-total' => 'Total Geral (:symbol)', + 'discount-amount' => 'Valor do Desconto', + 'tax-amount' => 'Valor do Imposto', + 'adjustment-amount' => 'Valor do Ajuste', + 'product-name' => 'Nome do Produto', + 'action' => 'Ação', + ], + 'edit' => [ + 'title' => 'Editar Cotação', + 'save-btn' => 'Salvar Cotação', + 'quote-info' => 'Informações da Cotação', + 'quote-info-info' => 'Informe as informações básicas da cotação.', + 'address-info' => 'Informações de Endereço', + 'address-info-info' => 'Informações sobre o endereço relacionado à cotação.', + 'quote-items' => 'Itens da Cotação', + 'link-to-lead' => 'Vincular a um negócio', + 'quote-item-info' => 'Adicionar solicitação de produto para esta cotação.', + 'quote-name' => 'Nome da Cotação', + 'quantity' => 'Quantidade', + 'price' => 'Preço', + 'search-products' => 'Pesquisar Produtos', + 'discount' => 'Desconto', + 'tax' => 'Imposto', + 'total' => 'Total', + 'amount' => 'Valor', + 'add-item' => '+ Adicionar Item', + 'sub-total' => 'Subtotal (:symbol)', + 'total-discount' => 'Desconto (:symbol)', + 'total-tax' => 'Imposto (:symbol)', + 'total-adjustment' => 'Ajuste (:symbol)', + 'grand-total' => 'Total Geral (:symbol)', + 'discount-amount' => 'Valor do Desconto', + 'tax-amount' => 'Valor do Imposto', + 'adjustment-amount' => 'Valor do Ajuste', + 'product-name' => 'Nome do Produto', + 'action' => 'Ação', + ], + ], + 'contacts' => [ + 'persons' => [ + 'index' => [ + 'title' => 'Pessoas', + 'create-btn' => 'Adicionar Pessoa', + 'create-success' => 'Pessoa adicionada com sucesso.', + 'update-success' => 'Pessoa atualizada com sucesso.', + 'all-delete-success' => 'Todas as pessoas selecionadas foram excluídas com sucesso.', + 'partial-delete-warning' => 'Algumas pessoas foram excluídas com sucesso. Outras não puderam ser excluídas porque estão vinculadas a leads.', + 'none-delete-warning' => 'Nenhuma das pessoas selecionadas pôde ser excluída porque estão vinculadas a leads.', + 'no-selection' => 'Nenhuma pessoa foi selecionada para exclusão.', + 'delete-failed' => 'Falha ao excluir as pessoas selecionadas.', + 'datagrid' => [ + 'contact-numbers' => 'Números de Contato', + 'delete' => 'Excluir', + 'edit' => 'Editar', + 'emails' => 'E-mails', + 'id' => 'ID', + 'view' => 'Visualizar', + 'name' => 'Nome', + 'organization-name' => 'Nome da Empresa', + ], + ], + 'view' => [ + 'title' => ':name', + 'about-person' => 'Sobre a Pessoa', + 'about-organization' => 'Sobre a Empresa', + 'activities' => [ + 'index' => [ + 'all' => 'Todos', + 'calls' => 'Chamadas', + 'meetings' => 'Reuniões', + 'lunches' => 'Almoços', + 'files' => 'Arquivos', + 'quotes' => 'Cotações', + 'notes' => 'Notas', + 'emails' => 'E-mails', + 'by-user' => 'Por usuário', + 'scheduled-on' => 'Agendado em', + 'location' => 'Localização', + 'participants' => 'Participantes', + 'mark-as-done' => 'Marcar como Concluído', + 'delete' => 'Excluir', + 'edit' => 'Editar', + ], + 'actions' => [ + 'mail' => [ + 'btn' => 'E-mail', + 'title' => 'Escrever e-mail', + 'to' => 'Para', + 'cc' => 'Cópia', + 'bcc' => 'Cópia oculta', + 'subject' => 'Assunto', + 'send-btn' => 'Enviar', + 'message' => 'Mensagem', + ], + 'file' => [ + 'btn' => 'Arquivo', + 'title' => 'Adicionar Arquivo', + 'title-control' => 'Título', + 'name' => 'Nome do Arquivo', + 'description' => 'Descrição', + 'file' => 'Arquivo', + 'save-btn' => 'Salvar Arquivo', + ], + 'note' => [ + 'btn' => 'Nota', + 'title' => 'Adicionar Nota', + 'comment' => 'Comentário', + 'save-btn' => 'Salvar Nota', + ], + 'activity' => [ + 'btn' => 'Atividade', + 'title' => 'Adicionar Atividade', + 'title-control' => 'Título', + 'description' => 'Descrição', + 'schedule-from' => 'Agendar De', + 'schedule-to' => 'Agendar Até', + 'location' => 'Localização', + 'call' => 'Chamada', + 'meeting' => 'Reunião', + 'lunch' => 'Almoço', + 'save-btn' => 'Salvar Atividade', + ], + ], + ], + 'tags' => [ + 'create-success' => 'Tag criada com sucesso.', + 'destroy-success' => 'Tag excluída com sucesso.', + ], + ], + 'create' => [ + 'title' => 'Adicionar Pessoa', + 'save-btn' => 'Salvar Pessoa', + ], + 'edit' => [ + 'title' => 'Editar Pessoa', + 'save-btn' => 'Salvar Pessoa', + ], + ], + 'organizations' => [ + 'index' => [ + 'title' => 'Empresas', + 'create-btn' => 'Adicionar Empresa', + 'create-success' => 'Empresa adicionada com sucesso.', + 'update-success' => 'Empresa atualizada com sucesso.', + 'delete-success' => 'Empresa excluída com sucesso.', + 'delete-failed' => 'Não foi possível excluir a empresa.', + 'datagrid' => [ + 'delete' => 'Excluir', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nome', + 'persons-count' => 'Quantidade de Pessoas', + ], + ], + 'create' => [ + 'title' => 'Adicionar Empresa', + 'save-btn' => 'Salvar Empresa', + ], + 'edit' => [ + 'title' => 'Editar Empresa', + 'save-btn' => 'Salvar Empresa', + ], + ], + ], + 'products' => [ + 'index' => [ + 'title' => 'Produtos', + 'create-btn' => 'Adicionar Produto', + 'create-success' => 'Produto adicionado com sucesso.', + 'update-success' => 'Produto atualizado com sucesso.', + 'delete-success' => 'Produto excluído com sucesso.', + 'delete-failed' => 'Não foi possível excluir o produto.', + 'datagrid' => [ + 'allocated' => 'Alocado', + 'delete' => 'Excluir', + 'edit' => 'Editar', + 'id' => 'ID', + 'in-stock' => 'Em Estoque', + 'name' => 'Nome', + 'on-hand' => 'Disponível', + 'tag-name' => 'Nome da Tag', + 'price' => 'Preço', + 'sku' => 'Código', + 'view' => 'Visualizar', + ], + ], + 'create' => [ + 'save-btn' => 'Salvar Produtos', + 'title' => 'Adicionar Produtos', + 'general' => 'Geral', + 'price' => 'Preço', + ], + 'edit' => [ + 'title' => 'Editar Produtos', + 'save-btn' => 'Salvar Produtos', + 'general' => 'Geral', + 'price' => 'Preço', + ], + 'view' => [ + 'sku' => 'Código', + 'all' => 'Todos', + 'notes' => 'Notas', + 'files' => 'Arquivos', + 'inventories' => 'Inventário', + 'change-logs' => 'Histórico de Alterações', + 'attributes' => [ + 'about-product' => 'Sobre o Produto', + ], + 'inventory' => [ + 'source' => 'Origem', + 'in-stock' => 'Em Estoque', + 'allocated' => 'Alocado', + 'on-hand' => 'Disponível', + 'actions' => 'Ações', + 'assign' => 'Atribuir', + 'add-source' => 'Adicionar Origem', + 'location' => 'Localização', + 'add-more' => 'Adicionar Mais', + 'save' => 'Salvar', + ], + ], + ], + 'settings' => [ + 'title' => 'Configurações', + 'groups' => [ + 'index' => [ + 'create-btn' => 'Criar Grupo', + 'title' => 'Grupos', + 'create-success' => 'Grupo criado com sucesso.', + 'update-success' => 'Grupo atualizado com sucesso.', + 'destroy-success' => 'Grupo excluído com sucesso.', + 'delete-failed' => 'Não foi possível excluir o grupo.', + 'delete-failed-associated-users' => 'Não foi possível excluir o grupo, pois está sendo utilizado por usuários.', + 'datagrid' => [ + 'delete' => 'Excluir', + 'description' => 'Descrição', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nome', + ], + 'edit' => [ + 'title' => 'Editar Grupo', + ], + 'create' => [ + 'name' => 'Nome', + 'title' => 'Adicionar Grupo', + 'description' => 'Descrição', + 'save-btn' => 'Salvar Grupo', + ], + ], + ], + 'roles' => [ + 'index' => [ + 'being-used' => 'Não é possível excluir o cargo, pois está sendo usado por um usuário administrador.', + 'create-btn' => 'Adicionar Cargos', + 'create-success' => 'Cargo adicionado com sucesso.', + 'current-role-delete-error' => 'Não é possível excluir o cargo atribuído ao usuário atual.', + 'delete-failed' => 'Não foi possível excluir o cargo.', + 'delete-success' => 'Cargo excluído com sucesso.', + 'last-delete-error' => 'É necessário pelo menos um cargo.', + 'settings' => 'Configurações', + 'title' => 'Cargos', + 'update-success' => 'Cargo atualizado com sucesso.', + 'user-define-error' => 'Não é possível excluir cargo do sistema.', + 'datagrid' => [ + 'all' => 'Todos', + 'custom' => 'Personalizado', + 'delete' => 'Excluir', + 'description' => 'Descrição', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nome', + 'permission-type' => 'Tipo de Permissão', + ], + ], + 'create' => [ + 'access-control' => 'Controle de Acesso', + 'all' => 'Todos', + 'back-btn' => 'Voltar', + 'custom' => 'Personalizado', + 'description' => 'Descrição', + 'general' => 'Geral', + 'name' => 'Nome', + 'permissions' => 'Permissões', + 'save-btn' => 'Salvar Cargo', + 'title' => 'Adicionar Cargo', + ], + 'edit' => [ + 'access-control' => 'Controle de Acesso', + 'all' => 'Todos', + 'back-btn' => 'Voltar', + 'custom' => 'Personalizado', + 'description' => 'Descrição', + 'general' => 'Geral', + 'name' => 'Nome', + 'permissions' => 'Permissões', + 'save-btn' => 'Salvar Cargo', + 'title' => 'Editar Cargo', + ], + ], + 'types' => [ + 'index' => [ + 'create-btn' => 'Adicionar Tipo', + 'create-success' => 'Tipo adicionado com sucesso.', + 'delete-failed' => 'Não é possível excluir o tipo.', + 'delete-success' => 'Tipo excluído com sucesso.', + 'title' => 'Tipos', + 'update-success' => 'Tipo atualizado com sucesso.', + 'datagrid' => [ + 'delete' => 'Excluir', + 'description' => 'Descrição', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nome', + ], + 'create' => [ + 'name' => 'Nome', + 'save-btn' => 'Salvar Tipo', + 'title' => 'Adicionar Tipo', + ], + 'edit' => [ + 'title' => 'Editar Tipo', + ], + ], + ], + 'sources' => [ + 'index' => [ + 'title' => 'Fontes', + 'create-btn' => 'Criar Fonte', + 'create-success' => 'Fonte criada com sucesso.', + 'delete-failed' => 'Não foi possível excluir a fonte.', + 'delete-success' => 'Fonte excluída com sucesso.', + 'update-success' => 'Fonte atualizada com sucesso.', + 'delete-failed-associated-leads' => 'Não é possível excluir a fonte porque está associada a leads existentes. Por favor, desvincule ou atualize esses leads antes da exclusão.', + 'datagrid' => [ + 'delete' => 'Excluir', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nome', + ], + 'create' => [ + 'name' => 'Nome', + 'save-btn' => 'Salvar Origem', + 'title' => 'Adicionar Origem', + ], + 'edit' => [ + 'title' => 'Editar Origem', + ], + ], + ], + 'workflows' => [ + 'index' => [ + 'title' => 'Workflows', + 'create-btn' => 'Adicionar Workflow', + 'create-success' => 'Workflow adicionado com sucesso.', + 'update-success' => 'Workflow atualizado com sucesso.', + 'delete-success' => 'Workflow excluído com sucesso.', + 'delete-failed' => 'Não é possível excluir o Workflow.', + 'datagrid' => [ + 'delete' => 'Excluir', + 'description' => 'Descrição', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nome', + ], + ], + 'helpers' => [ + 'update-related-leads' => 'Atualizar leads relacionados', + 'send-email-to-sales-owner' => 'Enviar e-mail para o proprietário de vendas', + 'send-email-to-participants' => 'Enviar e-mail para os participantes', + 'add-webhook' => 'Adicionar Webhook', + 'update-lead' => 'Atualizar Oportunidade', + 'update-person' => 'Atualizar Pessoa', + 'send-email-to-person' => 'Enviar e-mail para a pessoa', + 'add-tag' => 'Adicionar Tag', + 'add-note-as-activity' => 'Adicionar Nota como Atividade', + 'update-quote' => 'Update Quote', + ], + 'create' => [ + 'title' => 'Adicionar Workflow', + 'event' => 'Evento', + 'back-btn' => 'Voltar', + 'save-btn' => 'Salvar Workflow', + 'name' => 'Nome', + 'basic-details' => 'Detalhes Básicos', + 'description' => 'Descrição', + 'actions' => 'Ações', + 'basic-details-info' => 'Informe as informações básicas do workflow.', + 'event-info' => 'Um evento dispara, verifica, aplica condições e executa ações predefinidas.', + 'conditions' => 'Condições', + 'conditions-info' => 'As condições são regras que verificam cenários, acionadas em ocasiões específicas.', + 'actions-info' => 'Uma ação não apenas reduz a carga de trabalho, mas também facilita a automação do CRM.', + 'value' => 'Valor', + 'condition-type' => 'Tipo de Condição', + 'all-condition-are-true' => 'Todas as condições são verdadeiras', + 'any-condition-are-true' => 'Qualquer condição é verdadeira', + 'add-condition' => 'Adicionar Condição', + 'add-action' => 'Adicionar Ação', + 'yes' => 'Sim', + 'no' => 'Não', + 'email' => 'E-mail', + 'is-equal-to' => 'É igual a', + 'is-not-equal-to' => 'Não é igual a', + 'equals-or-greater-than' => 'É igual ou maior que', + 'equals-or-less-than' => 'É igual ou menor que', + 'greater-than' => 'Maior que', + 'less-than' => 'Menor que', + 'type' => 'Tipo', + 'contain' => 'Contém', + 'contains' => 'Contém', + 'does-not-contain' => 'Não contém', + ], + 'edit' => [ + 'title' => 'Editar Workflow', + 'event' => 'Evento', + 'back-btn' => 'Voltar', + 'save-btn' => 'Salvar Workflow', + 'name' => 'Nome', + 'basic-details' => 'Detalhes Básicos', + 'description' => 'Descrição', + 'actions' => 'Ações', + 'type' => 'Tipo', + 'basic-details-info' => 'Informe as informações básicas do workflow.', + 'event-info' => 'Um evento dispara, verifica, aplica condições e executa ações predefinidas.', + 'conditions' => 'Condições', + 'conditions-info' => 'As condições são regras que verificam cenários, acionadas em ocasiões específicas.', + 'actions-info' => 'Uma ação não apenas reduz a carga de trabalho, mas também facilita a automação do CRM.', + 'value' => 'Valor', + 'condition-type' => 'Tipo de Condição', + 'all-condition-are-true' => 'Todas as condições são verdadeiras', + 'any-condition-are-true' => 'Qualquer condição é verdadeira', + 'add-condition' => 'Adicionar Condição', + 'add-action' => 'Adicionar Ação', + 'yes' => 'Sim', + 'no' => 'Não', + 'email' => 'E-mail', + 'is-equal-to' => 'É igual a', + 'is-not-equal-to' => 'Não é igual a', + 'equals-or-greater-than' => 'É igual ou maior que', + 'equals-or-less-than' => 'É igual ou menor que', + 'greater-than' => 'Maior que', + 'less-than' => 'Menor que', + 'contain' => 'Contém', + 'contains' => 'Contém', + 'does-not-contain' => 'Não contém', + ], + ], + 'webforms' => [ + 'index' => [ + 'title' => 'Webforms', + 'create-btn' => 'Adicionar Webform', + 'create-success' => 'Webform adicionado com sucesso.', + 'update-success' => 'Webform atualizado com sucesso.', + 'delete-success' => 'Webform excluído com sucesso.', + 'delete-failed' => 'Não é possível excluir o Webform.', + 'datagrid' => [ + 'id' => 'ID', + 'title' => 'Título', + 'edit' => 'Editar', + 'delete' => 'Excluir', + ], + ], + 'create' => [ + 'title' => 'Adicionar Webform', + 'add-attribute-btn' => 'Adicionar Botão de Atributo', + 'attribute-label-color' => 'Cor do Rótulo do Atributo', + 'attributes' => 'Atributos', + 'attributes-info' => 'Adicione atributos personalizados ao formulário.', + 'background-color' => 'Cor de Fundo', + 'create-lead' => 'Adicionar Oportunidade', + 'customize-webform' => 'Personalizar Webform', + 'customize-webform-info' => 'Personalize seu formulário com as cores dos elementos de sua escolha.', + 'description' => 'Descrição', + 'display-custom-message' => 'Exibir mensagem personalizada', + 'form-background-color' => 'Cor de Fundo do Formulário', + 'form-submit-btn-color' => 'Cor do Botão de Envio do Formulário', + 'form-submit-button-color' => 'Cor do Botão de Envio do Formulário', + 'form-title-color' => 'Cor do Título do Formulário', + 'general' => 'Geral', + 'leads' => 'Oportunidades', + 'person' => 'Pessoa', + 'save-btn' => 'Salvar Webform', + 'submit-button-label' => 'Rótulo do Botão de Envio', + 'submit-success-action' => 'Ação de Sucesso ao Enviar', + 'redirect-to-url' => 'Redirecionar Para URL', + 'choose-value' => 'Escolher Valor', + 'select-file' => 'Selecionar Arquivo', + 'select-image' => 'Selecionar Imagem', + 'enter-value' => 'Inserir Valor', + ], + 'edit' => [ + 'add-attribute-btn' => 'Adicionar Botão de Atributo', + 'attribute-label-color' => 'Cor do Rótulo do Atributo', + 'attributes' => 'Atributos', + 'attributes-info' => 'Adicione atributos personalizados ao formulário.', + 'background-color' => 'Cor de Fundo', + 'choose-value' => 'Escolher Valor', + 'code-snippet' => 'Trecho de Código', + 'copied' => 'Copiado', + 'copy' => 'Copiar', + 'create-lead' => 'Adicionar Oportunidade', + 'customize-webform' => 'Personalizar Webform', + 'customize-webform-info' => 'Personalize seu formulário com as cores dos elementos de sua escolha.', + 'description' => 'Descrição', + 'display-custom-message' => 'Exibir mensagem personalizada', + 'embed' => 'Incorporar', + 'enter-value' => 'Inserir Valor', + 'form-background-color' => 'Cor de Fundo do Formulário', + 'form-submit-btn-color' => 'Cor do Botão de Envio do Formulário', + 'form-submit-button-color' => 'Cor do Botão de Envio do Formulário', + 'form-title-color' => 'Cor do Título do Formulário', + 'general' => 'Geral', + 'leads' => 'Oportunidades', + 'person' => 'Pessoa', + 'preview' => 'Visualizar', + 'public-url' => 'URL Pública', + 'redirect-to-url' => 'Redirecionar Para URL', + 'save-btn' => 'Salvar Webform', + 'select-file' => 'Selecionar Arquivo', + 'select-image' => 'Selecionar Imagem', + 'submit-button-label' => 'Rótulo do Botão de Envio', + 'submit-success-action' => 'Ação de Sucesso ao Enviar', + 'title' => 'Editar Webform', + ], + ], + 'email-template' => [ + 'index' => [ + 'create-btn' => 'Adicionar Modelo de E-mail', + 'title' => 'Modelos de E-mail', + 'create-success' => 'Modelo de E-mail adicionado com sucesso.', + 'update-success' => 'Modelo de E-mail atualizado com sucesso.', + 'delete-success' => 'Modelo de E-mail excluído com sucesso.', + 'delete-failed' => 'Não é possível excluir o Modelo de E-mail.', + 'datagrid' => [ + 'delete' => 'Excluir', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nome', + 'subject' => 'Assunto', + ], + ], + 'create' => [ + 'title' => 'Adicionar Modelo de E-mail', + 'save-btn' => 'Salvar Modelo de E-mail', + 'email-template' => 'Modelo de E-mail', + 'subject' => 'Assunto', + 'content' => 'Conteúdo', + 'subject-placeholders' => 'Descrição do Assunto', + 'general' => 'Geral', + 'name' => 'Nome', + ], + 'edit' => [ + 'title' => 'Editar Modelo de E-mail', + 'save-btn' => 'Salvar Modelo de E-mail', + 'email-template' => 'Modelo de E-mail', + 'subject' => 'Assunto', + 'content' => 'Conteúdo', + 'subject-placeholders' => 'Descrição do Assunto', + 'general' => 'Geral', + 'name' => 'Nome', + ], + ], + 'marketing' => [ + 'events' => [ + 'index' => [ + 'create-btn' => 'Adicionar Evento', + 'title' => 'Eventos', + 'create-success' => 'Evento adicionado com sucesso.', + 'update-success' => 'Evento atualizado com sucesso.', + 'delete-success' => 'Evento excluído com sucesso.', + 'delete-failed' => 'Não é possível excluir o evento.', + 'mass-delete-success' => 'Eventos excluídos com sucesso', + 'datagrid' => [ + 'delete' => 'Excluir', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nome', + 'description' => 'Descrição', + 'date' => 'Data', + ], + 'create' => [ + 'title' => 'Adicionar Evento', + 'name' => 'Nome', + 'date' => 'Data', + 'description' => 'Descrição', + 'save-btn' => 'Salvar Evento', + ], + 'edit' => [ + 'title' => 'Editar Evento', + ], + ], + ], + 'campaigns' => [ + 'index' => [ + 'create-btn' => 'Adcionar Campanha', + 'title' => 'Campanhas', + 'create-success' => 'Campanha adicionada com sucesso.', + 'update-success' => 'Campanha atualizada com sucesso.', + 'delete-success' => 'Campanha excluída com sucesso.', + 'delete-failed' => 'Não é possível excluir a campanha.', + 'mass-delete-success' => 'Campanhas excluídas com sucesso', + 'datagrid' => [ + 'id' => 'ID', + 'name' => 'Nome', + 'subject' => 'Assunto', + 'status' => 'Status', + 'active' => 'Ativo', + 'inactive' => 'Inativo', + 'edit' => 'Editar', + 'delete' => 'Excluir', + ], + 'create' => [ + 'title' => 'Adicionar Campanha', + 'name' => 'Nome', + 'type' => 'Tipo', + 'subject' => 'Assunto', + 'event' => 'Evento', + 'email-template' => 'Modelo de E-mail', + 'status' => 'Status', + ], + 'edit' => [ + 'title' => 'Editar Campanha', + ], + ], + ], + ], + 'tags' => [ + 'index' => [ + 'create-btn' => 'Adicionar Tag', + 'title' => 'Tags', + 'create-success' => 'Tag adicionada com sucesso.', + 'update-success' => 'Tag atualizada com sucesso.', + 'delete-success' => 'Tag excluída com sucesso.', + 'delete-failed' => 'Não é possível excluir a Tag.', + 'datagrid' => [ + 'delete' => 'Excluir', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nome', + 'users' => 'Usuários', + 'created-at' => 'Criado Em', + ], + 'create' => [ + 'name' => 'Nome', + 'save-btn' => 'Salvar Tag', + 'title' => 'Adicionar Tag', + 'color' => 'Cor', + ], + 'edit' => [ + 'title' => 'Editar Tag', + ], + ], + ], + 'users' => [ + 'index' => [ + 'create-btn' => 'Adicionar Usuário', + 'create-success' => 'Usuário adicionado com sucesso.', + 'delete-failed' => 'Não foi possível excluir o usuário.', + 'delete-success' => 'Usuário excluído com sucesso.', + 'last-delete-error' => 'É necessário pelo menos um usuário.', + 'mass-delete-failed' => 'Não foi possível excluir os usuários.', + 'mass-delete-success' => 'Usuários excluídos com sucesso.', + 'mass-update-failed' => 'Não foi possível atualizar os usuários.', + 'mass-update-success' => 'Usuários atualizados com sucesso.', + 'title' => 'Usuários', + 'update-success' => 'Usuário atualizado com sucesso.', + 'user-define-error' => 'Não é possível excluir o usuário do sistema.', + 'active' => 'Ativo', + 'inactive' => 'Inativo', + 'datagrid' => [ + 'active' => 'Ativo', + 'created-at' => 'Criado Em', + 'delete' => 'Excluir', + 'edit' => 'Editar', + 'email' => 'E-mail', + 'id' => 'ID', + 'inactive' => 'Inativo', + 'name' => 'Nome', + 'status' => 'Status', + 'update-status' => 'Atualizar Status', + 'users' => 'Usuários', + ], + 'create' => [ + 'confirm-password' => 'Confirmar Senha', + 'email' => 'E-mail', + 'general' => 'Geral', + 'global' => 'Global', + 'group' => 'Grupo', + 'individual' => 'Individual', + 'name' => 'Nome', + 'password' => 'Senha', + 'permission' => 'Permissão', + 'role' => 'Função', + 'save-btn' => 'Salvar Usuário', + 'status' => 'Status', + 'title' => 'Adicionar Usuário', + 'view-permission' => 'Visualizar Permissão', + 'select-at-lest-one-group' => 'Select at least one group', + ], + 'edit' => [ + 'title' => 'Editar Usuário', + ], + ], + ], + 'pipelines' => [ + 'index' => [ + 'title' => 'Funis', + 'create-btn' => 'Adicionar Funil', + 'create-success' => 'Funil adicionado com sucesso.', + 'update-success' => 'Funil atualizado com sucesso.', + 'default-required' => 'É necessário pelo menos um pipeline padrão.', + 'delete-success' => 'Funil excluído com sucesso.', + 'delete-failed' => 'Não foi possível excluir o funil.', + 'default-delete-error' => 'Não é possível excluir o funil padrão.', + 'datagrid' => [ + 'delete' => 'Excluir', + 'edit' => 'Editar', + 'id' => 'ID', + 'is-default' => 'É Padrão', + 'name' => 'Nome', + 'no' => 'Não', + 'rotten-days' => 'Dias parado nesta etapa', + 'yes' => 'Sim', + ], + ], + 'create' => [ + 'title' => 'Adicionar Funil', + 'save-btn' => 'Salvar Funil', + 'name' => 'Nome', + 'rotten-days' => 'Dias parado nesta etapa', + 'mark-as-default' => 'Marcar como Padrão', + 'general' => 'Geral', + 'probability' => 'Probabilidade (%)', + 'new-stage' => 'Novo', + 'won-stage' => 'Ganho', + 'lost-stage' => 'Perdido', + 'stage-btn' => 'Adicionar Estágio', + 'stages' => 'Estágios', + 'duplicate-name' => 'O campo "Nome" não pode ser duplicado', + 'delete-stage' => 'Excluir Estágio', + 'add-new-stages' => 'Adicionar Novos Estágios', + 'add-stage-info' => 'Adicionar novo estágio para o seu Funil', + 'newly-added' => 'Adicionado Recentemente', + 'stage-delete-success' => 'Estágio excluído com sucesso', + ], + 'edit' => [ + 'title' => 'Editar Funil', + 'save-btn' => 'Salvar Funil', + 'name' => 'Nome', + 'rotten-days' => 'Dias parado nesta etapa', + 'mark-as-default' => 'Marcar como Padrão', + 'general' => 'Geral', + 'probability' => 'Probabilidade (%)', + 'new-stage' => 'Novo', + 'won-stage' => 'Ganho', + 'lost-stage' => 'Perdido', + 'stage-btn' => 'Adicionar Estágio', + 'stages' => 'Estágios', + 'duplicate-name' => 'O campo "Nome" não pode ser duplicado', + 'delete-stage' => 'Excluir Estágio', + 'add-new-stages' => 'Adicionar Novos Estágios', + 'add-stage-info' => 'Adicionar novo estágio para o seu Funil', + 'stage-delete-success' => 'Estágio excluído com sucesso', + ], + ], + 'webhooks' => [ + 'index' => [ + 'title' => 'Webhooks', + 'create-btn' => 'Adicionar Webhook', + 'create-success' => 'Webhook adicionado com sucesso.', + 'update-success' => 'Webhook atualizado com sucesso.', + 'delete-success' => 'Webhook deletado com sucesso.', + 'delete-failed' => 'Webhook não pode ser deletado.', + 'datagrid' => [ + 'id' => 'ID', + 'delete' => 'Deletar', + 'edit' => 'Editar', + 'name' => 'Nome', + 'entity-type' => 'Tipo de Entidade', + 'end-point' => 'Ponto de Acesso', + ], + ], + 'create' => [ + 'title' => 'Adcionar Webhook', + 'save-btn' => 'Salvar Webhook', + 'info' => 'Digite os detalhes dos webhooks', + 'url-and-parameters' => 'URL e Parâmetros', + 'method' => 'Método', + 'post' => 'Post', + 'put' => 'Put', + 'url-endpoint' => 'Endpoint da URL', + 'parameters' => 'Parâmetros', + 'add-new-parameter' => 'Adicionar Novo Parâmetro', + 'url-preview' => 'Pré-visualização da URL:', + 'headers' => 'Cabeçalhos', + 'add-new-header' => 'Adicionar Novo Cabeçalho', + 'body' => 'Corpo', + 'default' => 'Padrão', + 'x-www-form-urlencoded' => 'x-www-form-urlencoded', + 'key-and-value' => 'Chave e Valor', + 'add-new-payload' => 'Adicionar novo payload', + 'raw' => 'Raw', + 'general' => 'Geral', + 'name' => 'Nome', + 'entity-type' => 'Tipo de Entidade', + 'insert-placeholder' => 'Inserir Placeholder', + 'description' => 'Descrição', + 'json' => 'Json', + 'text' => 'Texto', + ], + 'edit' => [ + 'title' => 'Editar Webhook', + 'edit-btn' => 'Salvar Webhook', + 'save-btn' => 'Salvar Webhook', + 'info' => 'Digite os detalhes dos webhooks', + 'url-and-parameters' => 'URL e Parâmetros', + 'method' => 'Método', + 'post' => 'Post', + 'put' => 'Put', + 'url-endpoint' => 'Endpoint da URL', + 'parameters' => 'Parâmetros', + 'add-new-parameter' => 'Adicionar Novo Parâmetro', + 'url-preview' => 'Pré-visualização da URL:', + 'headers' => 'Cabeçalhos', + 'add-new-header' => 'Adicionar Novo Cabeçalho', + 'body' => 'Corpo', + 'default' => 'Padrão', + 'x-www-form-urlencoded' => 'x-www-form-urlencoded', + 'key-and-value' => 'Chave e Valor', + 'add-new-payload' => 'Adicionar novo payload', + 'raw' => 'Raw', + 'general' => 'Geral', + 'name' => 'Nome', + 'entity-type' => 'Tipo de Entidade', + 'insert-placeholder' => 'Inserir Placeholder', + 'description' => 'Descrição', + 'json' => 'Json', + 'text' => 'Texto', + ], + ], + 'warehouses' => [ + 'index' => [ + 'title' => 'Depósitos', + 'create-btn' => 'Adicionar Depósito', + 'create-success' => 'Depósito adicionado com sucesso.', + 'name-exists' => 'Nome do depósito já existe.', + 'update-success' => 'Depósito atualizado com sucesso.', + 'delete-success' => 'Depósito deletado com sucesso.', + 'delete-failed' => 'Depósito não pode ser deletado.', + 'datagrid' => [ + 'id' => 'ID', + 'name' => 'Nome', + 'contact-name' => 'Nome de Contato', + 'delete' => 'Deletar', + 'edit' => 'Editar', + 'view' => 'Visualizar', + 'created-at' => 'Criado em', + 'products' => 'Produtos', + 'contact-emails' => 'Emails de Contato', + 'contact-numbers' => 'Números de Contato', + ], + ], + 'create' => [ + 'title' => 'Adicionar Depósito', + 'save-btn' => 'Salvar Depósito', + 'contact-info' => 'Informações de Contato', + ], + 'edit' => [ + 'title' => 'Editar Depósito', + 'save-btn' => 'Salvar Depósito', + 'contact-info' => 'Informações de Contato', + ], + 'view' => [ + 'all' => 'Todos', + 'notes' => 'Notas', + 'files' => 'Arquivos', + 'location' => 'Localização', + 'change-logs' => 'Registros de Alterações', + 'locations' => [ + 'action' => 'Ação', + 'add-location' => 'Adicionar Localização', + 'create-success' => 'Localização adicionada com sucesso.', + 'delete' => 'Deletar', + 'delete-failed' => 'Localização não pode ser deletada.', + 'delete-success' => 'Localização deletada com sucesso.', + 'name' => 'Nome', + 'save-btn' => 'Salvar', + ], + 'general-information' => [ + 'title' => 'Informações Gerais', + ], + 'contact-information' => [ + 'title' => 'Informações de Contato', + ], + ], + ], + 'attributes' => [ + 'index' => [ + 'title' => 'Atributos', + 'create-btn' => 'Adicionar Atributo', + 'create-success' => 'Atributo criados com sucesso.', + 'update-success' => 'Atributo atualizados com sucesso.', + 'delete-success' => 'Atributo deletados com sucesso.', + 'delete-failed' => 'Atributo não podem ser deletados.', + 'user-define-error' => 'Não é possível deletar atributos do sistema.', + 'mass-delete-failed' => 'Atributos do sistema não podem ser deletados.', + 'datagrid' => [ + 'yes' => 'Sim', + 'no' => 'Não', + 'id' => 'ID', + 'code' => 'Código', + 'name' => 'Nome', + 'entity-type' => 'Tipo de Entidade', + 'type' => 'Tipo', + 'is-default' => 'É Padrão', + 'edit' => 'Editar', + 'delete' => 'Deletar', + 'entity-types' => [ + 'leads' => 'Oportunidades', + 'organizations' => 'Empresas', + 'persons' => 'Pessoas', + 'products' => 'Produtos', + 'quotes' => 'Cotações', + 'warehouses' => 'Depósitos', + ], + 'types' => [ + 'text' => 'Texto', + 'textarea' => 'Área de texto', + 'price' => 'Preço', + 'boolean' => 'Booleano', + 'select' => 'Selecionar', + 'multiselect' => 'Seleção múltipla', + 'checkbox' => 'Caixa de seleção', + 'email' => 'Email', + 'address' => 'Endereço', + 'phone' => 'Telefone', + 'lookup' => 'Busca', + 'datetime' => 'Data e hora', + 'date' => 'Data', + 'image' => 'Imagem', + 'file' => 'Arquivo', + ], + ], + ], + 'create' => [ + 'title' => 'Adicionar Atributo', + 'save-btn' => 'Salvar Atributo', + 'code' => 'Código', + 'name' => 'Nome', + 'entity-type' => 'Tipo de Entidade', + 'type' => 'Tipo', + 'validations' => 'Validações', + 'is-required' => 'É Obrigatório', + 'input-validation' => 'Validação de Entrada', + 'is-unique' => 'É Único', + 'labels' => 'Rótulos', + 'general' => 'Geral', + 'numeric' => 'Numérico', + 'decimal' => 'Decimal', + 'url' => 'URL', + 'options' => 'Opções', + 'option-type' => 'Tipo de Opção', + 'lookup-type' => 'Tipo de Pesquisa', + 'add-option' => 'Adicionar Opção', + 'save-option' => 'Salvar Opção', + 'option-name' => 'Nome da Opção', + 'add-attribute-options' => 'Adicionar Opções de Atributo', + 'text' => 'Texto', + 'textarea' => 'Área de Texto', + 'price' => 'Preço', + 'boolean' => 'Verdadeiro ou falso', + 'select' => 'Seleção', + 'multiselect' => 'Multiseleção', + 'email' => 'E-mail', + 'address' => 'Endereço', + 'phone' => 'Telefone', + 'datetime' => 'Data e Hora', + 'date' => 'Data', + 'image' => 'Imagem', + 'file' => 'Arquivo', + 'lookup' => 'Pesquisa', + 'entity_type' => 'Tipo de Entidade', + 'checkbox' => 'Caixa de Seleção', + 'is_required' => 'É Obrigatório', + 'is_unique' => 'É Único', + 'actions' => 'Ações', + ], + 'edit' => [ + 'actions' => 'Ações', + 'add-attribute-options' => 'Adicionar Opções de Atributo', + 'add-option' => 'Adicionar Opção', + 'address' => 'Endereço', + 'boolean' => 'Verdadeiro ou falso', + 'checkbox' => 'Caixa de Seleção', + 'code' => 'Código', + 'date' => 'Data', + 'datetime' => 'Data e Hora', + 'decimal' => 'Decimal', + 'email' => 'E-mail', + 'entity-type' => 'Tipo de Entidade', + 'entity_type' => 'Tipo de Entidade', + 'file' => 'Arquivo', + 'general' => 'Geral', + 'image' => 'Imagem', + 'input-validation' => 'Validação de Entrada', + 'is-required' => 'É Obrigatório', + 'is-unique' => 'É Único', + 'is_required' => 'É Obrigatório', + 'is_unique' => 'É Único', + 'labels' => 'Rótulos', + 'lookup' => 'Pesquisa', + 'lookup-type' => 'Tipo de Pesquisa', + 'multiselect' => 'Multiseleção', + 'name' => 'Nome', + 'numeric' => 'Numérico', + 'option-deleted' => 'Attribute Option is deleted successfully', + 'option-name' => 'Nome da Opção', + 'option-type' => 'Tipo de Opção', + 'options' => 'Opções', + 'phone' => 'Telefone', + 'price' => 'Preço', + 'save-btn' => 'Salvar Atributo', + 'save-option' => 'Salvar Opção', + 'select' => 'Seleção', + 'text' => 'Texto', + 'textarea' => 'Área de Texto', + 'title' => 'Editar Atributo', + 'type' => 'Tipo', + 'url' => 'URL', + 'validations' => 'Validações', + ], + ], + 'data-transfer' => [ + 'imports' => [ + 'create' => [ + 'action' => 'Action', + 'allowed-errors' => 'Allowed Errors', + 'back-btn' => 'Back', + 'create-update' => 'Create/Update', + 'delete' => 'Delete', + 'download-sample' => 'Download Sample', + 'field-separator' => 'Field Separator', + 'file' => 'File', + 'general' => 'General', + 'images-directory' => 'Images Directory Path', + 'process-in-queue' => 'Process In Queue', + 'results' => 'Results', + 'save-btn' => 'Save Import', + 'settings' => 'Settings', + 'skip-errors' => 'Skip Errors', + 'stop-on-errors' => 'Stop on Errors', + 'title' => 'Create Import', + 'type' => 'Type', + 'validation-strategy' => 'Validation Strategy', + ], + 'edit' => [ + 'action' => 'Action', + 'allowed-errors' => 'Allowed Errors', + 'back-btn' => 'Back', + 'create-update' => 'Create/Update', + 'delete' => 'Delete', + 'download-sample' => 'Download Sample', + 'field-separator' => 'Field Separator', + 'file' => 'File', + 'general' => 'General', + 'images-directory' => 'Images Directory Path', + 'process-in-queue' => 'Process In Queue', + 'results' => 'Results', + 'save-btn' => 'Save Import', + 'settings' => 'Settings', + 'skip-errors' => 'Skip Errors', + 'stop-on-errors' => 'Stop on Errors', + 'title' => 'Edit Import', + 'type' => 'Type', + 'validation-strategy' => 'Validation Strategy', + ], + 'index' => [ + 'button-title' => 'Create Import', + 'title' => 'Imports', + 'datagrid' => [ + 'actions' => 'Actions', + 'completed-at' => 'Completed At', + 'created' => 'Created', + 'delete' => 'Delete', + 'deleted' => 'Deleted', + 'edit' => 'Edit', + 'error-file' => 'Error File', + 'id' => 'ID', + 'started-at' => 'Started At', + 'state' => 'State', + 'summary' => 'Summary', + 'type' => 'Type', + 'updated' => 'Updated', + 'uploaded-file' => 'Uploaded File', + ], + ], + 'import' => [ + 'back-btn' => 'Back', + 'completed-batches' => 'Total Batches Completed:', + 'download-error-report' => 'Download Full Report', + 'edit-btn' => 'Edit', + 'imported-info' => 'Congratulations! Your import was successful.', + 'importing-info' => 'Import In Process', + 'indexing-info' => 'Resources Indexing (Price, Inventory and Elastic Search) In Progress', + 'linking-info' => 'Resources Linking In Progress', + 'progress' => 'Progress:', + 'title' => 'Import', + 'total-batches' => 'Total Batches:', + 'total-created' => 'Total Records Created:', + 'total-deleted' => 'Total Records Deleted:', + 'total-errors' => 'Total Errors:', + 'total-invalid-rows' => 'Total Invalid Rows:', + 'total-rows-processed' => 'Total Rows Processed:', + 'total-updated' => 'Total Records Updated:', + 'validate' => 'Validate', + 'validate-info' => 'Click on Validate Data to check your import.', + 'validating-info' => 'The data started reading and Validating', + 'validation-failed-info' => 'Your import is invalid. Please fix the following errors and try again.', + 'validation-success-info' => 'Your import is valid. Click on Import to start the import process.', + ], + 'create-success' => 'Import created successfully.', + 'delete-failed' => 'Import deletion failed unexpectedly.', + 'delete-success' => 'Import deleted successfully.', + 'not-valid' => 'Import is invalid', + 'nothing-to-import' => 'There are no resources to import.', + 'setup-queue-error' => 'Please change your queue driver to "database" or "redis" to start the import process.', + 'update-success' => 'Import updated successfully.', + ], + ], + ], + 'activities' => [ + 'index' => [ + 'title' => 'Atividades', + 'datagrid' => [ + 'comment' => 'Comentário', + 'created_at' => 'Criado Em', + 'created_by' => 'Criado Por', + 'edit' => 'Editar', + 'id' => 'ID', + 'done' => 'Concluído', + 'not-done' => 'Não Concluído', + 'lead' => 'Oportunidade', + 'mass-delete' => 'Excluir em Massa', + 'mass-update' => 'Atualizar em Massa', + 'schedule-from' => 'Agendado de', + 'schedule-to' => 'Agendado até', + 'schedule_from' => 'Agendado de', + 'schedule_to' => 'Agendado até', + 'title' => 'Título', + 'is_done' => 'Está Concluído', + 'type' => 'Tipo', + 'update' => 'Atualizar', + 'call' => 'Chamada', + 'meeting' => 'Reunião', + 'lunch' => 'Almoço', + ], + ], + 'edit' => [ + 'title' => 'Editar Atividade', + 'back-btn' => 'Voltar', + 'save-btn' => 'Salvar Atividade', + 'type' => 'Tipo de Atividade', + 'call' => 'Chamada', + 'meeting' => 'Reunião', + 'lunch' => 'Almoço', + 'schedule_to' => 'Agendado até', + 'schedule_from' => 'Agendado de', + 'location' => 'Localização', + 'comment' => 'Comentário', + 'lead' => 'Oportunidade', + 'participants' => 'Participantes', + 'general' => 'Geral', + 'persons' => 'Pessoas', + 'no-result-found' => 'Nenhum registro encontrado.', + 'users' => 'Usuários', + ], + 'updated' => 'Atualizado', + 'created' => 'Criado', + 'duration-overlapping' => 'Os participantes têm outra reunião neste horário. Deseja continuar?', + 'create-success' => 'Atividade adicionada com sucesso.', + 'update-success' => 'Atividade atualizada com sucesso.', + 'overlapping-error' => 'Os participantes têm outra reunião neste horário.', + 'destroy-success' => 'Atividade deletada com sucesso.', + 'delete-failed' => 'A atividade não pode ser deletada.', + 'mass-update-success' => 'Atividades atualizadas com sucesso.', + 'mass-destroy-success' => 'Activities deleted successfully.', + 'mass-delete-failed' => 'Activities can not be deleted.', + ], + 'mail' => [ + 'index' => [ + 'compose' => 'Escrever', + 'draft' => 'Rascunho', + 'inbox' => 'Caixa de Entrada', + 'outbox' => 'Caixa de Saída', + 'sent' => 'Enviado', + 'trash' => 'Lixeira', + 'compose-mail-btn' => 'Escrever E-mail', + 'btn' => 'E-mail', + 'mail' => [ + 'title' => 'Escrever E-mail', + 'to' => 'Para', + 'enter-emails' => 'Pressione Enter para adicionar e-mails', + 'cc' => 'Cópia', + 'bcc' => 'Cópia oculta', + 'subject' => 'Assunto', + 'send-btn' => 'Enviar', + 'message' => 'Mensagem', + 'draft' => 'Rascunho', + ], + 'datagrid' => [ + 'id' => 'ID', + 'from' => 'De', + 'to' => 'Para', + 'subject' => 'Assunto', + 'tags' => 'Tags', + 'content' => 'Content', + 'attachments' => 'Attachments', + 'date' => 'Date', + 'move-to-inbox' => 'Movido para Caixa de Entrada', + 'move-to-trash' => 'Movido para a lixeira', + 'edit' => 'Editar', + 'view' => 'Visualizar', + 'delete' => 'Excluir', + ], + ], + 'create-success' => 'E-mail enviado com sucesso.', + 'update-success' => 'E-mail atualizado com sucesso.', + 'mass-update-success' => 'E-mails atualizados com sucesso.', + 'delete-success' => 'E-mail excluído com sucesso.', + 'delete-failed' => 'E-mail não pode ser excluído.', + 'view' => [ + 'title' => 'E-mails', + 'subject' => ':subject', + 'link-mail' => 'Link do E-mail', + 'to' => 'Para', + 'cc' => 'Cópia', + 'bcc' => 'Cópia oculta', + 'reply' => 'Responder', + 'reply-all' => 'Responder a Todos', + 'forward' => 'Encaminhar', + 'delete' => 'Excluir', + 'enter-mails' => 'Digite o id do e-mail', + 'rotten-days' => 'O negócio está sem movimentação há :days dias', + 'search-an-existing-lead' => 'Pesquisar um negócio existente', + 'search-an-existing-contact' => 'Pesquisar um contato existente', + 'message' => 'Mensagem', + 'add-attachments' => 'Adicionar Anexos', + 'discard' => 'Descartar', + 'send' => 'Enviar', + 'no-result-found' => 'Nenhum resultado encontrado', + 'add-new-contact' => 'Adicionar Novo Contato', + 'description' => 'Descrição', + 'search' => 'Pesquisar...', + 'add-new-lead' => 'Adicionar Nova Oportunidade', + 'create-new-contact' => 'Adicionar Novo Contato', + 'save-contact' => 'Salvar Contato', + 'create-lead' => 'Adicionar Oportunidade', + 'linked-contact' => 'Contato Vinculado', + 'link-to-contact' => 'Vincular ao Contato', + 'link-to-lead' => 'Vincular a uma Oportunidade', + 'linked-lead' => 'Oportunidade Vinculado', + 'lead-details' => 'Detalhes da Oportunidade', + 'contact-person' => 'Pessoa de Contato', + 'product' => 'Produto', + 'tags' => [ + 'create-success' => 'Tag adicionada com sucesso.', + 'destroy-success' => 'Tag excluída com sucesso.', + ], + ], + ], + 'common' => [ + 'custom-attributes' => [ + 'add-more' => 'Adicionar Mais', + 'address' => 'Endereço', + 'city' => 'Cidade', + 'contact' => 'Números de Contato', + 'country' => 'País', + 'email' => 'E-mail', + 'home' => 'Casa', + 'postcode' => 'CEP', + 'save' => 'Salvar', + 'select' => 'Selecionar', + 'select-country' => 'Selecionar País', + 'select-state' => 'Selecionar Estado', + 'state' => 'Estado', + 'update-contact-title' => 'Atualizar Números de Contato', + 'update-emails-title' => 'Atualizar E-mails de Contato', + 'work' => 'Trabalho', + ], + ], + 'leads' => [ + 'create-success' => 'Negócio adicionado com sucesso.', + 'update-success' => 'Negócio atualizado com sucesso.', + 'update-failed' => 'Leads can not be deleted.', + 'destroy-success' => 'Negócio excluído com sucesso.', + 'destroy-failed' => 'Este negócio não pode ser excluído.', + 'file' => [ + 'data-not-found' => 'Dados não encontrados.', + 'empty-content' => 'O conteúdo do PDF está vazio ou não pôde ser extraído.', + 'failed-extract' => 'Falha ao extrair texto do arquivo.', + 'insufficient-info' => 'Devido a dados insuficientes, não podemos processar sua solicitação no momento.', + 'invalid-base64' => 'Formato base64 inválido.', + 'invalid-format' => 'Formato JSON inválido.', + 'invalid-response' => 'Formato de resposta de IA inválido.', + 'missing-api-key' => 'Chave API ou configuração do modelo ausente.', + 'not-found' => 'Arquivo não encontrado.', + 'recursive-call' => 'Chamada recursiva detectada.', + 'text-generation-failed' => 'Falha na extração de texto. O arquivo pode estar vazio ou ilegível.', + ], + 'index' => [ + 'title' => 'Oportunidades', + 'create-btn' => 'Adicionar Negócio', + 'datagrid' => [ + 'id' => 'ID', + 'sales-person' => 'Vendedor', + 'subject' => 'Assunto', + 'source' => 'Origem', + 'lead-value' => 'Valor do Negócio', + 'lead-type' => 'Tipo de Negócio', + 'tag-name' => 'Nome da Tag', + 'contact-person' => 'Pessoa de Contato', + 'stage' => 'Etapa', + 'rotten-lead' => 'Negócio estagnado', + 'date-to' => 'Data fechamento', + 'created-at' => 'Criado em', + 'no' => 'Não', + 'yes' => 'Sim', + 'delete' => 'Excluir', + 'mass-delete' => 'Excluir em Massa', + 'mass-update' => 'Atualizar em Massa', + ], + 'kanban' => [ + 'rotten-days' => 'Negócio estagnado por :days dias', + 'empty-list' => 'Sua lista de Negócios está vazia', + 'empty-list-description' => 'Adicione um negócio para organizar seus objetivos.', + 'create-lead-btn' => 'Adicionar Negócio', + 'stages' => [ + 'need-more-info' => 'Mais informações', + 'won-value' => 'Valor Ganho', + 'lost-reason' => 'Motivo da Perda', + 'closed-at' => 'Fechado em', + 'save-btn' => 'Salvar', + ], + 'columns' => [ + 'contact-person' => 'Pessoa de Contato', + 'id' => 'ID', + 'lead-type' => 'Tipo de Negócio', + 'lead-value' => 'Valor do negócio', + 'sales-person' => 'Vendedor', + 'source' => 'Origem', + 'title' => 'Título', + 'tags' => 'Tags', + 'expected-close-date' => 'Data Esperada de Fechamento', + 'created-at' => 'Criado em', + ], + 'toolbar' => [ + 'search' => [ + 'title' => 'Buscar por título', + ], + 'filters' => [ + 'apply-filters' => 'Aplicar Filtros', + 'clear-all' => 'Limpar Tudo', + 'filter' => 'Filtrar', + 'filters' => 'Filtros', + 'from' => 'De', + 'select' => 'Selecionar', + 'to' => 'Para', + ], + ], + ], + 'view-switcher' => [ + 'all-pipelines' => 'Todos os Funis', + 'create-new-pipeline' => 'Adicionar Novo Funil', + ], + 'upload' => [ + 'create-lead' => 'Adicionar Negócio Usando AI', + 'file' => 'Upload de arquivo', + 'file-info' => 'Apenas arquivos nos formatos pdf, bmp, jpg, jpeg, png são aceitos.', + 'file-required' => 'Por favor, selecione pelo menos um arquivo válido para prosseguir.', + 'save-btn' => 'Salvar', + 'upload-file' => 'Enviar arquivo', + ], + ], + 'create' => [ + 'title' => 'Adicionar Negócio', + 'save-btn' => 'Salvar', + 'details' => 'Detalhes', + 'details-info' => 'Coloque as informações básicas do Negócio', + 'contact-person' => 'Pessoa de Contato', + 'contact-info' => 'Informações sobre a Pessoa de Contato', + 'products' => 'Produtos', + 'products-info' => 'Informações sobre os Produtos', + ], + 'edit' => [ + 'title' => 'Editar Negócio', + 'save-btn' => 'Salvar', + 'details' => 'Detalhes', + 'details-info' => 'Coloque as informações básicas do Negócio', + 'contact-person' => 'Pessoa de Contato', + 'contact-info' => 'Informações sobre a Pessoa de Contato', + 'products' => 'Produtos', + 'products-info' => 'Informações sobre os Produtos', + ], + 'common' => [ + 'contact' => [ + 'name' => 'Nome', + 'email' => 'E-mail', + 'contact-number' => 'Número de Contato', + 'organization' => 'Empresa', + ], + 'products' => [ + 'product-name' => 'Nome do Produto', + 'quantity' => 'Quantidade', + 'price' => 'Preço', + 'amount' => 'Valor', + 'action' => 'Ação', + 'add-more' => 'Adicionar Mais', + 'total' => 'Total', + ], + ], + 'view' => [ + 'title' => 'Negócio: :title', + 'rotten-days' => ':days Dias', + 'tabs' => [ + 'description' => 'Descrição', + 'products' => 'Produtos', + 'quotes' => 'Cotações', + ], + 'attributes' => [ + 'title' => 'Sobre o Negócio', + ], + 'quotes' => [ + 'subject' => 'Assunto', + 'expired-at' => 'Expirado em', + 'sub-total' => 'Subtotal', + 'discount' => 'Desconto', + 'tax' => 'Imposto', + 'adjustment' => 'Ajuste', + 'grand-total' => 'Total Geral', + 'delete' => 'Excluir', + 'edit' => 'Editar', + 'download' => 'Baixar', + 'destroy-success' => 'Cotação excluída com sucesso.', + 'empty-title' => 'Nenhuma Cotação Encontrada', + 'empty-info' => 'Nenhuma Cotação Encontrada para este Negócio', + 'add-btn' => 'Adicionar Cotação', + ], + 'products' => [ + 'product-name' => 'Nome do Produto', + 'quantity' => 'Quantidade', + 'price' => 'Preço', + 'amount' => 'Valor', + 'action' => 'Ação', + 'add-more' => 'Adicionar Mais', + 'total' => 'Total', + 'empty-title' => 'Nenhum Produto Encontrado', + 'empty-info' => 'Nenhum Produto Encontrado para este Negócio', + 'add-product' => 'Adicionar Produto', + ], + 'persons' => [ + 'title' => 'Sobre as Pessoas', + 'job-title' => ':job_title em :organization', + ], + 'stages' => [ + 'won-lost' => 'Ganho/Perdido', + 'won' => 'Ganho', + 'lost' => 'Perdido', + 'need-more-info' => 'Precisa de Mais Informações', + 'closed-at' => 'Fechado em', + 'won-value' => 'Valor Ganhado', + 'lost-reason' => 'Motivo da Perda', + 'save-btn' => 'Salvar', + ], + 'tags' => [ + 'create-success' => 'Tag adicionada com sucesso.', + 'destroy-success' => 'Tag excluída com sucesso.', + ], + ], + ], + 'configuration' => [ + 'index' => [ + 'back' => 'Voltar', + 'delete' => 'Excluir', + 'save-btn' => 'Salvar Configuração', + 'save-success' => 'Configuração Salva com Sucesso.', + 'search' => 'Pesquisar', + 'select-country' => 'Selecionar País', + 'select-state' => 'Selecionar Estado', + 'title' => 'Configuração', + 'general' => [ + 'title' => 'Geral', + 'info' => 'Configuração Geral', + 'general' => [ + 'title' => 'Geral', + 'info' => 'Atualize suas configurações gerais aqui.', + 'locale-settings' => [ + 'title' => 'Configurações de Idioma', + 'title-info' => 'Define o idioma usado na interface do usuário.', + ], + 'admin-logo' => [ + 'logo-image' => 'Imagem do Logo', + 'title' => 'Logo do Admin', + 'title-info' => 'Configure a imagem do logo para o seu painel de administração.', + ], + ], + 'settings' => [ + 'title' => 'Settings', + 'info' => 'Update your settings here.', + 'footer' => [ + 'info' => 'We can configure the powered by section here.', + 'powered-by' => 'Powered by text editor', + 'title' => 'Powered by Section Configurations', + ], + 'menu' => [ + 'activities' => 'Activities', + 'configuration' => 'Configuration', + 'contacts' => 'Contacts', + 'dashboard' => 'Dashboard', + 'draft' => 'Draft', + 'inbox' => 'Inbox', + 'info' => 'We can configure the menu items name here.', + 'leads' => 'Leads', + 'mail' => 'Mail', + 'organizations' => 'Organizations', + 'outbox' => 'Outbox', + 'persons' => 'Persons', + 'products' => 'Products', + 'quotes' => 'Quotes', + 'sent' => 'Sent', + 'settings' => 'Settings', + 'title' => 'Menu Item Configurations', + 'trash' => 'Trash', + ], + 'menu-color' => [ + 'brand-color' => 'Brand Color', + 'info' => 'We can change the menu items colors here.', + 'title' => 'Menu Item Color Configurations', + ], + ], + ], + 'email' => [ + 'title' => 'Configurações de E-mail', + 'info' => 'Configuração de e-mail para a aplicação.', + 'imap' => [ + 'title' => 'Configurações IMAP', + 'info' => 'Configuração de e-mail IMAP para receber emails.', + 'account' => [ + 'title' => 'Conta IMAP', + 'title-info' => 'Configure as configurações da sua conta IMAP aqui.', + 'host' => 'Host', + 'port' => 'Porta', + 'encryption' => 'Tipo de Criptografia', + 'validate-cert' => 'Validar Certificado SSL', + 'username' => 'Nome de Usuário IMAP', + 'password' => 'Senha IMAP', + ], + ], + ], + 'magic-ai' => [ + 'title' => 'Magic AI', + 'info' => 'Configuração do Magic AI para a aplicação.', + 'settings' => [ + 'api-key' => 'Chave API', + 'api-key-info' => 'Lembre-se de usar uma chave API do OpenRouter para cada modelo. É um passo simples para melhorar a segurança e o desempenho.', + 'enable' => 'Habilitar', + 'info' => 'Melhore sua experiência com o Magic AI com sua chave API do OpenRouter. Integre-a agora para uma aventura de IA personalizada e perfeita, feita sob medida para você! Personalize as configurações com facilidade e assuma o controle da sua jornada de IA.', + 'other' => 'Outro Modelo', + 'other-model' => 'Para outros modelos, use o ID do Modelo do OpenRouter.', + 'doc-generation' => 'Geração de DOC', + 'doc-generation-info' => 'Ative o recurso de geração de DOC para extrair automaticamente dados de arquivos DOC e convertê-los em formato de texto. Aumente sua produtividade e eficiência ativando este recurso para simplificar seu fluxo de trabalho.', + 'title' => 'Configurações Gerais', + 'models' => [ + 'deepseek-r1' => 'Deepseek R1 Distill-llama-8b', + 'gemini-2-0-flash-001' => 'Gemini 2.0 flash-001', + 'gpt-4o' => 'GPT-4.0', + 'gpt-4o-mini' => 'GPT-4.0 mini', + 'grok-2-1212' => 'Grok 2.12', + 'llama-3-2-3b-instruct' => 'Llama 3.2 3b Instruct', + 'title' => 'Modelos', + ], + ], + ], + ], + ], + 'dashboard' => [ + 'index' => [ + 'title' => 'Início', + 'revenue' => [ + 'lost-revenue' => 'Negócios Perdidos', + 'won-revenue' => 'Negócios Ganhos', + ], + 'over-all' => [ + 'average-lead-value' => 'Ticket médio', + 'total-leads' => 'Total de negócios', + 'average-leads-per-day' => 'Média de negócios por dia', + 'total-quotations' => 'Total de cotações', + 'total-persons' => 'Total de pessoas', + 'total-organizations' => 'Total de empresas', + ], + 'total-leads' => [ + 'title' => 'Negócios', + 'total' => 'Total de negócios', + 'won' => 'Negócios ganhos', + 'lost' => 'Negócios perdidos', + ], + 'revenue-by-sources' => [ + 'title' => 'Faturamento por origens', + 'empty-title' => 'Ainda não há dados', + 'empty-info' => 'Nenhum dado disponível para o intervalo selecionado', + ], + 'revenue-by-types' => [ + 'title' => 'Faturamento por tipos', + 'empty-title' => 'Ainda não há dados', + 'empty-info' => 'Nenhum dado disponível para o intervalo selecionado', + ], + 'top-selling-products' => [ + 'title' => 'Produtos mais vendidos', + 'empty-title' => 'Ainda não há dados', + 'empty-info' => 'Nenhum produto disponível para o intervalo selecionado', + ], + 'top-persons' => [ + 'title' => 'Principais pessoas', + 'empty-title' => 'Ainda não há dados', + 'empty-info' => 'Nenhuma pessoa disponível para o intervalo selecionado', + ], + 'open-leads-by-states' => [ + 'title' => 'Negócios por estágios', + 'empty-title' => 'Ainda não há dados', + 'empty-info' => 'Nenhum dado disponível para o intervalo selecionado', + ], + 'start-date' => 'Data de Início', + 'end-date' => 'Data de Término', + ], + ], + 'layouts' => [ + 'app-version' => 'Versão: :version', + 'dashboard' => 'Início', + 'leads' => 'Oportunidades', + 'quotes' => 'Cotações', + 'quote' => 'Cotação', + 'mail' => [ + 'title' => 'E-mail', + 'compose' => 'Escrever', + 'inbox' => 'Caixa de Entrada', + 'draft' => 'Rascunho', + 'outbox' => 'Caixa de Saída', + 'sent' => 'Enviado', + 'trash' => 'Lixeira', + 'setting' => 'Configurações', + ], + 'activities' => 'Atividades', + 'contacts' => 'Contatos', + 'persons' => 'Pessoas', + 'person' => 'Pessoa', + 'organizations' => 'Empresas', + 'organization' => 'Empresa', + 'products' => 'Produtos', + 'product' => 'Produto', + 'settings' => 'Configurações', + 'user' => 'Usuário', + 'user-info' => 'Gerencie todos os seus usuários e suas permissões no CRM, o que eles estão autorizados a fazer.', + 'groups' => 'Grupos', + 'groups-info' => 'Adicionar, editar ou excluir grupos do CRM', + 'roles' => 'Funções', + 'role' => 'Função', + 'roles-info' => 'Adicionar, editar ou excluir funções do CRM', + 'users' => 'Usuários', + 'users-info' => 'Adicionar, editar ou excluir usuários do CRM', + 'lead' => 'Negócio', + 'lead-info' => 'Gerencie todas as configurações relacionadas aos Negócios no CRM', + 'pipelines' => 'Funis', + 'pipelines-info' => 'Adicionar, editar ou excluir funis do CRM', + 'sources' => 'Origens', + 'sources-info' => 'Adicionar, editar ou excluir origems do CRM', + 'types' => 'Tipos', + 'types-info' => 'Adicionar, editar ou excluir tipos do CRM', + 'automation' => 'Automação', + 'automation-info' => 'Gerencie todas as configurações de automação no CRM', + 'attributes' => 'Atributos', + 'attribute' => 'Atributo', + 'attributes-info' => 'Adicionar, editar ou excluir atributos do CRM', + 'email-templates' => 'Modelos de E-mail', + 'email' => 'E-mail', + 'email-templates-info' => 'Adicionar, editar ou excluir modelos de e-mail do CRM', + 'events' => 'Events', + 'events-info' => 'Add, edit or delete events from CRM', + 'campaigns' => 'Campaigns', + 'campaigns-info' => 'Add, edit or delete campaigns from CRM', + 'workflows' => 'Fluxos de Trabalho', + 'workflows-info' => 'Adicionar, editar ou excluir fluxos de trabalho do CRM', + 'webhooks' => 'Webhooks', + 'webhooks-info' => 'Add, edit or delete webhooks from CRM', + 'other-settings' => 'Outros Ajustes', + 'other-settings-info' => 'Gerencie todas as configurações extras no CRM', + 'tags' => 'Tags', + 'tags-info' => 'Adicionar, editar ou excluir tags do CRM', + 'my-account' => 'Minha conta', + 'sign-out' => 'Sair', + 'back' => 'Voltar', + 'name' => 'Nome', + 'configuration' => 'Ajustes', + 'howdy' => 'Olá!', + 'warehouses' => 'Depósitos', + 'warehouse' => 'Depósito', + 'warehouses-info' => 'Adicionar, editar ou excluir depósitos do CRM', + 'data_transfer' => 'Data Transfer', + 'data_transfer_info' => 'Manage persons, products and leads data transfer related settings in the CRM', + ], + 'user' => [ + 'account' => [ + 'name' => 'Nome', + 'email' => 'E-mail', + 'password' => 'Senha', + 'my_account' => 'Minha conta', + 'update_details' => 'Atualizar Detalhes', + 'current_password' => 'Senha atual', + 'confirm_password' => 'Confirmar senha', + 'password-match' => 'A senha atual não corresponde.', + 'account-save' => 'Alterações na conta salvas com sucesso.', + 'permission-denied' => 'Permissão Negada', + 'remove-image' => 'Remover Imagem', + 'upload_image_pix' => 'Carregar uma Imagem de Perfil (100px x 100px)', + 'upload_image_format' => 'em formato PNG ou JPG', + 'image_upload_message' => 'Somente imagens (.jpeg, .jpg, .png, ..) são permitidas.', + ], + ], + 'emails' => [ + 'common' => [ + 'dear' => 'Prezado(a) :name', + 'cheers' => 'Atenciosamente,
    Equipe :app_name', + 'user' => [ + 'dear' => 'Prezado(a) :username', + 'create-subject' => 'Você foi adicionado como membro.', + 'create-body' => 'Parabéns! Agora você é um membro da nossa equipe.', + 'forget-password' => [ + 'subject' => 'Redefinir Senha do Cliente', + 'dear' => 'Prezado(a) :username', + 'reset-password' => 'Redefinir Senha', + 'info' => 'Você está recebendo este e-mail porque recebemos uma solicitação de redefinição de senha para sua conta.', + 'final-summary' => 'Se você não solicitou a redefinição de senha, nenhuma outra ação é necessária.', + 'thanks' => 'Obrigado!', + ], + ], + ], + ], + 'validations' => [ + 'message' => [ + 'decimal' => 'The :attribute must be a decimal.', + ], + ], + 'errors' => [ + 'dashboard' => 'Dashboard', + 'go-back' => 'Go Back', + 'support' => 'If the problem persists, reach out to us at :email for assistance.', + '404' => [ + 'description' => 'Oops! The page you\'re looking for is on vacation. It seems we couldn\'t find what you were searching for.', + 'title' => '404 Page Not Found', + ], + '401' => [ + 'description' => 'Ops! Parece que você não tem permissão para acessar esta página. Parece que estão faltando as credenciais necessárias.', + 'title' => '401 Não autorizado.', + ], + '403' => [ + 'description' => 'Oops! This page is off-limits. It appears you don\'t have the required permissions to view this content.', + 'title' => '403 Forbidden', + ], + '500' => [ + 'description' => 'Oops! Something went wrong. It seems we\'re having trouble loading the page you\'re looking for.', + 'title' => '500 Internal Server Error', + ], + '503' => [ + 'description' => 'Oops! Looks like we\'re temporarily down for maintenance. Please check back in a bit.', + 'title' => '503 Service Unavailable', + ], + ], + 'export' => [ + 'csv' => 'CSV', + 'download' => 'Download', + 'export' => 'Exportar', + 'no-records' => 'Nenhum registro encontrado.', + 'xls' => 'XLS', + 'xlsx' => 'XLSX', + ], +]; diff --git a/packages/Webkul/Admin/src/Resources/lang/tr/app.php b/packages/Webkul/Admin/src/Resources/lang/tr/app.php new file mode 100644 index 0000000..b61d3eb --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/lang/tr/app.php @@ -0,0 +1,2225 @@ + [ + 'leads' => 'Potansiyeller', + 'lead' => 'Potansiyel', + 'quotes' => 'Teklifler', + 'mail' => 'Posta', + 'inbox' => 'Gelen Kutusu', + 'draft' => 'Taslak', + 'outbox' => 'Gönderilenler', + 'sent' => 'Gönderildi', + 'trash' => 'Çöp Kutusu', + 'activities' => 'Etkinlikler', + 'webhook' => 'Web Kancası', + 'contacts' => 'Kişiler', + 'persons' => 'Kişiler', + 'organizations' => 'Organizasyonlar', + 'products' => 'Ürünler', + 'settings' => 'Ayarlar', + 'groups' => 'Gruplar', + 'roles' => 'Roller', + 'users' => 'Kullanıcılar', + 'user' => 'Kullanıcı', + 'automation' => 'Otomasyon', + 'attributes' => 'Öznitelikler', + 'pipelines' => 'Pipelines', + 'sources' => 'Kaynaklar', + 'types' => 'Türler', + 'email-templates' => 'E-posta Şablonları', + 'workflows' => 'İş Akışları', + 'other-settings' => 'Diğer Ayarlar', + 'tags' => 'Etiketler', + 'configuration' => 'Yapılandırma', + 'create' => 'Oluştur', + 'edit' => 'Düzenle', + 'view' => 'Görüntüle', + 'print' => 'Yazdır', + 'delete' => 'Sil', + 'export' => 'Dışa Aktar', + 'mass-delete' => 'Toplu Sil', + 'data-transfer' => 'Veri Transferi', + 'imports' => 'İthalatlar', + 'import' => 'İthalat', + 'event' => 'Etkinlik', + 'campaigns' => 'Kampanyalar', + ], + 'users' => [ + 'activate-warning' => 'Hesabınız henüz etkinleştirilmedi. Lütfen yönetici ile iletişime geçin.', + 'login-error' => 'Kimlik bilgileri kayıtlarımızla eşleşmiyor.', + 'not-permission' => 'Yönetici paneline erişim izniniz yok.', + 'login' => [ + 'email' => 'E-posta Adresi', + 'forget-password-link' => 'Şifremi Unuttum?', + 'password' => 'Şifre', + 'submit-btn' => 'Giriş Yap', + 'title' => 'Giriş Yap', + ], + 'forget-password' => [ + 'create' => [ + 'email' => 'Kayıtlı E-posta', + 'email-not-exist' => 'E-posta Mevcut Değil', + 'page-title' => 'Şifremi Unuttum', + 'reset-link-sent' => 'Şifre sıfırlama bağlantısı gönderildi', + 'sign-in-link' => 'Giriş Yapmaya Dön?', + 'submit-btn' => 'Sıfırla', + 'title' => 'Şifre Kurtarma', + ], + ], + 'reset-password' => [ + 'back-link-title' => 'Giriş Yapmaya Dön?', + 'confirm-password' => 'Şifreyi Onayla', + 'email' => 'Kayıtlı E-posta', + 'password' => 'Şifre', + 'submit-btn' => 'Şifreyi Sıfırla', + 'title' => 'Şifre Sıfırlama', + ], + ], + 'account' => [ + 'edit' => [ + 'back-btn' => 'Geri', + 'change-password' => 'Şifreyi Değiştir', + 'confirm-password' => 'Şifreyi Onayla', + 'current-password' => 'Mevcut Şifre', + 'email' => 'E-posta', + 'general' => 'Genel', + 'invalid-password' => 'Girdiğiniz mevcut şifre yanlış.', + 'name' => 'Ad', + 'password' => 'Şifre', + 'profile-image' => 'Profil Resmi', + 'save-btn' => 'Hesabı Kaydet', + 'title' => 'Hesabım', + 'update-success' => 'Hesap başarıyla güncellendi', + 'upload-image-info' => 'Profil Resmi Yükleyin (110px X 110px) PNG veya JPG Formatında', + ], + ], + 'components' => [ + 'activities' => [ + 'actions' => [ + 'mail' => [ + 'btn' => 'Mail', + 'title' => 'Compose Mail', + 'to' => 'To', + 'enter-emails' => 'Press enter to add emails', + 'cc' => 'CC', + 'bcc' => 'BCC', + 'subject' => 'Subject', + 'send-btn' => 'Send', + 'message' => 'Message', + ], + 'file' => [ + 'btn' => 'File', + 'title' => 'Add File', + 'title-control' => 'Title', + 'name' => 'Name', + 'description' => 'Description', + 'file' => 'File', + 'save-btn' => 'Save File', + ], + 'note' => [ + 'btn' => 'Note', + 'title' => 'Add Note', + 'comment' => 'Comment', + 'save-btn' => 'Save Note', + ], + 'activity' => [ + 'btn' => 'Activity', + 'title' => 'Add Activity', + 'title-control' => 'Title', + 'description' => 'Description', + 'schedule-from' => 'Schedule From', + 'schedule-to' => 'Schedule To', + 'location' => 'Location', + 'call' => 'Call', + 'meeting' => 'Meeting', + 'lunch' => 'Lunch', + 'save-btn' => 'Save Activity', + 'participants' => [ + 'title' => 'Participants', + 'placeholder' => 'Type to search participants', + 'users' => 'Users', + 'persons' => 'Persons', + 'no-results' => 'No result found...', + ], + ], + ], + 'index' => [ + 'all' => 'All', + 'bcc' => 'Bcc', + 'by-user' => 'By :user', + 'calls' => 'Calls', + 'cc' => 'Cc', + 'change-log' => 'Changelogs', + 'delete' => 'Delete', + 'edit' => 'Edit', + 'emails' => 'Emails', + 'empty' => 'Empty', + 'files' => 'Files', + 'from' => 'From', + 'location' => 'Location', + 'lunches' => 'Lunches', + 'mark-as-done' => 'Mark as Done', + 'meetings' => 'Meetings', + 'notes' => 'Notes', + 'participants' => 'Participants', + 'planned' => 'Planned', + 'quotes' => 'Quotes', + 'scheduled-on' => 'Scheduled on', + 'system' => 'System', + 'to' => 'To', + 'unlink' => 'Unlink', + 'view' => 'View', + 'empty-placeholders' => [ + 'all' => [ + 'title' => 'No Activities Found', + 'description' => 'No activities found for this. You can add activities by clicking on the Activity button on the left panel.', + ], + 'planned' => [ + 'title' => 'No Planned Activities Found', + 'description' => 'No planned activities found for this. You can add planned activities by clicking on the Activity button on the left panel.', + ], + 'notes' => [ + 'title' => 'No Notes Found', + 'description' => 'No notes found for this. You can add notes by clicking on the Note button on the left panel.', + ], + 'calls' => [ + 'title' => 'No Calls Found', + 'description' => 'No calls found for this. You can add calls by clicking on the Activity button on the left panel and selecting the Call type.', + ], + 'meetings' => [ + 'title' => 'No Meetings Found', + 'description' => 'No meetings found for this. You can add meetings by clicking on the Activity button on the left panel and selecting the Meeting type.', + ], + 'lunches' => [ + 'title' => 'No Lunches Found', + 'description' => 'No lunches found for this. You can add lunches by clicking on the Activity button on the left panel and selecting the Lunch type.', + ], + 'files' => [ + 'title' => 'No Files Found', + 'description' => 'No files found for this. You can add files by clicking on the File button on the left panel.', + ], + 'emails' => [ + 'title' => 'No Emails Found', + 'description' => 'No emails found for this. You can add emails by clicking on the Mail button on the left panel.', + ], + 'system' => [ + 'title' => 'No Changelogs Found', + 'description' => 'No changelogs found for this.', + ], + ], + ], + ], + 'media' => [ + 'images' => [ + 'add-image-btn' => 'Resim Ekle', + 'ai-add-image-btn' => 'Sihirli AI', + 'allowed-types' => 'png, jpeg, jpg', + 'not-allowed-error' => 'Sadece resim dosyalarına (.jpeg, .jpg, .png, vb.) izin verilmektedir.', + 'placeholders' => [ + 'front' => 'Ön', + 'next' => 'Sonraki', + 'size' => 'Boyut', + 'use-cases' => 'Kullanım Alanları', + 'zoom' => 'Yakınlaştır', + ], + ], + 'videos' => [ + 'add-video-btn' => 'Video Ekle', + 'allowed-types' => 'mp4, webm, mkv', + 'not-allowed-error' => 'Sadece video dosyalarına (.mp4, .mov, .ogg vb.) izin verilmektedir.', + ], + ], + 'datagrid' => [ + 'index' => [ + 'no-records-selected' => 'Hiçbir kayıt seçilmedi.', + 'must-select-a-mass-action-option' => 'Bir toplu işlem seçeneği seçmelisiniz.', + 'must-select-a-mass-action' => 'Bir toplu işlem seçmelisiniz.', + ], + 'toolbar' => [ + 'length-of' => ':length kadar', + 'of' => 'üzerinden', + 'per-page' => 'Sayfa Başına', + 'results' => ':total Sonuç', + 'delete' => 'Sil', + 'selected' => ':total Seçilen Öğeler', + 'mass-actions' => [ + 'submit' => 'Gönder', + 'select-option' => 'Seçim Yap', + 'select-action' => 'Eylem Seç', + ], + 'filter' => [ + 'apply-filters-btn' => 'Filtreleri Uygula', + 'back-btn' => 'Geri', + 'create-new-filter' => 'Yeni Filtre Oluştur', + 'custom-filters' => 'Özel Filtreler', + 'delete-error' => 'Filtre silinirken bir hata oluştu, lütfen tekrar deneyin.', + 'delete-success' => 'Filtre başarıyla silindi.', + 'empty-description' => 'Kaydedilecek seçili filtre bulunmamaktadır. Lütfen kaydetmek için filtreler seçin.', + 'empty-title' => 'Kaydetmek İçin Filtreler Ekleyin', + 'name' => 'Ad', + 'quick-filters' => 'Hızlı Filtreler', + 'save-btn' => 'Kaydet', + 'save-filter' => 'Filtreyi Kaydet', + 'saved-success' => 'Filtre başarıyla kaydedildi.', + 'selected-filters' => 'Seçilen Filtreler', + 'title' => 'Filtre', + 'update' => 'Güncelle', + 'update-filter' => 'Filtreyi Güncelle', + 'updated-success' => 'Filtre başarıyla güncellendi.', + ], + 'search' => [ + 'title' => 'Ara', + ], + ], + 'filters' => [ + 'select' => 'Seç', + 'title' => 'Filtreler', + 'dropdown' => [ + 'searchable' => [ + 'at-least-two-chars' => 'En az 2 karakter yazın...', + 'no-results' => 'Sonuç bulunamadı...', + ], + ], + 'custom-filters' => [ + 'clear-all' => 'Hepsini Temizle', + 'title' => 'Özel Filtreler', + ], + 'boolean-options' => [ + 'false' => 'Yanlış', + 'true' => 'Doğru', + ], + 'date-options' => [ + 'last-month' => 'Geçen Ay', + 'last-six-months' => 'Son 6 Ay', + 'last-three-months' => 'Son 3 Ay', + 'this-month' => 'Bu Ay', + 'this-week' => 'Bu Hafta', + 'this-year' => 'Bu Yıl', + 'today' => 'Bugün', + 'yesterday' => 'Dün', + ], + ], + 'table' => [ + 'actions' => 'Eylemler', + 'no-records-available' => 'Kayıt Bulunmuyor.', + ], + ], + 'modal' => [ + 'confirm' => [ + 'agree-btn' => 'Kabul Et', + 'disagree-btn' => 'Reddet', + 'message' => 'Bu işlemi gerçekleştirmek istediğinizden emin misiniz?', + 'title' => 'Emin Misiniz?', + ], + ], + 'tags' => [ + 'index' => [ + 'title' => 'Etiketler', + 'added-tags' => 'Eklenen Etiketler', + 'save-btn' => 'Etiketi Kaydet', + 'placeholder' => 'Etiketleri aramak için yazın', + 'add-tag' => '\\" :term \\" Ekle...', + 'aquarelle-red' => 'Aquarelle Kırmızı', + 'crushed-cashew' => 'Ezilmiş Antep Fıstığı', + 'beeswax' => 'Abeş Mum', + 'lemon-chiffon' => 'Limon Şifon', + 'snow-flurry' => 'Kar Fırtınası', + 'honeydew' => 'Honeydew', + ], + ], + 'layouts' => [ + 'powered-by' => [ + 'description' => ':webkul tarafından geliştirilen açık kaynaklı bir proje olan :krayin tarafından desteklenmektedir.', + ], + 'header' => [ + 'mega-search' => [ + 'title' => 'Mega Arama', + 'tabs' => [ + 'leads' => 'Müşteriler', + 'quotes' => 'Teklifler', + 'persons' => 'Kişiler', + 'products' => 'Ürünler', + ], + 'explore-all-products' => 'Tüm Ürünleri Keşfet', + 'explore-all-leads' => 'Tüm Müşterileri Keşfet', + 'explore-all-contacts' => 'Tüm İletişimleri Keşfet', + 'explore-all-quotes' => 'Tüm Teklifleri Keşfet', + 'explore-all-matching-products' => '":query" (:count) ile eşleşen tüm ürünleri keşfet', + 'explore-all-matching-leads' => '":query" (:count) ile eşleşen tüm müşterileri keşfet', + 'explore-all-matching-contacts' => '":query" (:count) ile eşleşen tüm iletişimleri keşfet', + 'explore-all-matching-quotes' => '":query" (:count) ile eşleşen tüm teklifleri keşfet', + ], + ], + ], + 'attributes' => [ + 'edit' => [ + 'delete' => 'Sil', + ], + 'lookup' => [ + 'click-to-add' => 'Eklemek için tıklayın', + 'search' => 'Arama...', + 'no-result-found' => 'Sonuç bulunamadı', + ], + ], + 'lookup' => [ + 'click-to-add' => 'Eklemek için Tıklayın', + 'no-results' => 'Sonuç Bulunamadı', + 'add-as-new' => 'Yeni Olarak Ekle', + 'search' => 'Arama...', + ], + 'flash-group' => [ + 'success' => 'Başarı', + 'error' => 'Hata', + 'warning' => 'Uyarı', + 'info' => 'Bilgi', + ], + 'tiny-mce' => [ + 'http-error' => 'HTTP Hatası', + 'invalid-json' => 'Sunucudan geçersiz JSON yanıtı.', + 'upload-failed' => 'Dosya yüklemesi başarısız oldu. Lütfen tekrar deneyin.', + ], + ], + 'quotes' => [ + 'index' => [ + 'title' => 'Teklifler', + 'create-btn' => 'Teklif Oluştur', + 'create-success' => 'Teklif başarıyla oluşturuldu.', + 'update-success' => 'Teklif başarıyla güncellendi.', + 'delete-success' => 'Teklif başarıyla silindi.', + 'delete-failed' => 'Teklif silinemedi.', + 'datagrid' => [ + 'subject' => 'Konu', + 'sales-person' => 'Satış Temsilcisi', + 'expired-at' => 'Son Kullanma Tarihi', + 'created-at' => 'Oluşturulma Tarihi', + 'person' => 'Kişi', + 'subtotal' => 'Ara Toplam', + 'discount' => 'İndirim', + 'tax' => 'Vergi', + 'adjustment' => 'Düzenleme', + 'grand-total' => 'Genel Toplam', + 'edit' => 'Düzenle', + 'delete' => 'Sil', + 'print' => 'Yazdır', + ], + 'pdf' => [ + 'adjustment' => 'Düzenleme', + 'amount' => 'Tutar', + 'billing-address' => 'Fatura Adresi', + 'date' => 'Tarih', + 'discount' => 'İndirim', + 'expired-at' => 'Son Kullanma Tarihi', + 'grand-total' => 'Genel Toplam', + 'person' => 'Kişi', + 'price' => 'Fiyat', + 'product-name' => 'Ürün Adı', + 'quantity' => 'Miktar', + 'quote-id' => 'Teklif ID', + 'sales-person' => 'Satış Temsilcisi', + 'shipping-address' => 'Teslimat Adresi', + 'sku' => 'SKU', + 'sub-total' => 'Ara Toplam', + 'subject' => 'Konu', + 'tax' => 'Vergi', + 'title' => 'Teklif', + ], + ], + 'create' => [ + 'title' => 'Teklif Oluştur', + 'save-btn' => 'Teklifi Kaydet', + 'quote-info' => 'Teklif Bilgileri', + 'quote-info-info' => 'Teklifin temel bilgilerini girin.', + 'address-info' => 'Adres Bilgileri', + 'address-info-info' => 'Teklif ile ilgili adres bilgileri.', + 'quote-items' => 'Teklif Kalemleri', + 'search-products' => 'Ürünleri Ara', + 'link-to-lead' => 'Potansiyele Bağla', + 'quote-item-info' => 'Bu teklif için ürün talebi ekleyin.', + 'quote-name' => 'Teklif Adı', + 'quantity' => 'Miktar', + 'price' => 'Fiyat', + 'discount' => 'İndirim', + 'tax' => 'Vergi', + 'total' => 'Toplam', + 'amount' => 'Tutar', + 'add-item' => '+ Kalem Ekle', + 'sub-total' => 'Ara Toplam (:symbol)', + 'total-discount' => 'İndirim (:symbol)', + 'total-tax' => 'Vergi (:symbol)', + 'total-adjustment' => 'Düzenleme (:symbol)', + 'grand-total' => 'Genel Toplam (:symbol)', + 'discount-amount' => 'İndirim Tutarı', + 'tax-amount' => 'Vergi Tutarı', + 'adjustment-amount' => 'Düzenleme Tutarı', + 'product-name' => 'Ürün Adı', + 'action' => 'Eylem', + ], + 'edit' => [ + 'title' => 'Teklifi Düzenle', + 'save-btn' => 'Teklifi Kaydet', + 'quote-info' => 'Teklif Bilgileri', + 'quote-info-info' => 'Teklifin temel bilgilerini girin.', + 'address-info' => 'Adres Bilgileri', + 'address-info-info' => 'Teklif ile ilgili adres bilgileri.', + 'quote-items' => 'Teklif Kalemleri', + 'link-to-lead' => 'Potansiyele Bağla', + 'quote-item-info' => 'Bu teklif için ürün talebi ekleyin.', + 'quote-name' => 'Teklif Adı', + 'quantity' => 'Miktar', + 'price' => 'Fiyat', + 'search-products' => 'Ürünleri Ara', + 'discount' => 'İndirim', + 'tax' => 'Vergi', + 'total' => 'Toplam', + 'amount' => 'Tutar', + 'add-item' => '+ Kalem Ekle', + 'sub-total' => 'Ara Toplam (:symbol)', + 'total-discount' => 'İndirim (:symbol)', + 'total-tax' => 'Vergi (:symbol)', + 'total-adjustment' => 'Düzenleme (:symbol)', + 'grand-total' => 'Genel Toplam (:symbol)', + 'discount-amount' => 'İndirim Tutarı', + 'tax-amount' => 'Vergi Tutarı', + 'adjustment-amount' => 'Düzenleme Tutarı', + 'product-name' => 'Ürün Adı', + 'action' => 'Eylem', + ], + ], + 'contacts' => [ + 'persons' => [ + 'index' => [ + 'title' => 'Kişiler', + 'create-btn' => 'Kişi Oluştur', + 'create-success' => 'Kişi başarıyla oluşturuldu.', + 'update-success' => 'Kişi başarıyla güncellendi.', + 'all-delete-success' => 'Seçilen tüm kişiler başarıyla silindi.', + 'partial-delete-warning' => 'Bazı kişiler başarıyla silindi. Diğerleri potansiyel müşterilerle bağlantılı olduğu için silinemedi.', + 'none-delete-warning' => 'Seçilen kişilerin hiçbiri potansiyel müşterilerle bağlantılı olduğu için silinemedi.', + 'no-selection' => 'Silinecek kişi seçilmedi.', + 'delete-failed' => 'Seçilen kişiler silinemedi.', + 'datagrid' => [ + 'contact-numbers' => 'İletişim Numaraları', + 'delete' => 'Sil', + 'edit' => 'Düzenle', + 'emails' => 'E-postalar', + 'id' => 'ID', + 'view' => 'Görüntüle', + 'name' => 'Ad', + 'organization-name' => 'Kuruluş Adı', + ], + ], + 'view' => [ + 'title' => ':name', + 'about-person' => 'Kişi Hakkında', + 'about-organization' => 'Kuruluş Hakkında', + 'activities' => [ + 'index' => [ + 'all' => 'Hepsi', + 'calls' => 'Aramalar', + 'meetings' => 'Toplantılar', + 'lunches' => 'Öğle Yemekleri', + 'files' => 'Dosyalar', + 'quotes' => 'Teklifler', + 'notes' => 'Notlar', + 'emails' => 'E-postalar', + 'by-user' => ':user tarafından', + 'scheduled-on' => 'Planlandığı Tarih', + 'location' => 'Konum', + 'participants' => 'Katılımcılar', + 'mark-as-done' => 'Tamamlandı olarak işaretle', + 'delete' => 'Sil', + 'edit' => 'Düzenle', + ], + 'actions' => [ + 'mail' => [ + 'btn' => 'E-posta', + 'title' => 'E-posta Oluştur', + 'to' => 'Kime', + 'cc' => 'CC', + 'bcc' => 'BCC', + 'subject' => 'Konu', + 'send-btn' => 'Gönder', + 'message' => 'Mesaj', + ], + 'file' => [ + 'btn' => 'Dosya', + 'title' => 'Dosya Ekle', + 'title-control' => 'Başlık', + 'name' => 'Dosya Adı', + 'description' => 'Açıklama', + 'file' => 'Dosya', + 'save-btn' => 'Dosyayı Kaydet', + ], + 'note' => [ + 'btn' => 'Not', + 'title' => 'Not Ekle', + 'comment' => 'Yorum', + 'save-btn' => 'Notu Kaydet', + ], + 'activity' => [ + 'btn' => 'Etkinlik', + 'title' => 'Etkinlik Ekle', + 'title-control' => 'Başlık', + 'description' => 'Açıklama', + 'schedule-from' => 'Başlangıç Tarihi', + 'schedule-to' => 'Bitiş Tarihi', + 'location' => 'Konum', + 'call' => 'Çağrı', + 'meeting' => 'Toplantı', + 'lunch' => 'Öğle Yemeği', + 'save-btn' => 'Etkinliği Kaydet', + ], + ], + ], + 'tags' => [ + 'create-success' => 'Etiket başarıyla oluşturuldu.', + 'destroy-success' => 'Etiket başarıyla silindi.', + ], + ], + 'create' => [ + 'title' => 'Kişi Oluştur', + 'save-btn' => 'Kişiyi Kaydet', + ], + 'edit' => [ + 'title' => 'Kişiyi Düzenle', + 'save-btn' => 'Kişiyi Kaydet', + ], + ], + 'organizations' => [ + 'index' => [ + 'title' => 'Kuruluşlar', + 'create-btn' => 'Kuruluş Oluştur', + 'create-success' => 'Kuruluş başarıyla oluşturuldu.', + 'update-success' => 'Kuruluş başarıyla güncellendi.', + 'delete-success' => 'Kuruluş başarıyla silindi.', + 'delete-failed' => 'Kuruluş silinemedi.', + 'datagrid' => [ + 'delete' => 'Sil', + 'edit' => 'Düzenle', + 'id' => 'ID', + 'name' => 'Ad', + 'persons-count' => 'Kişi Sayısı', + ], + ], + 'create' => [ + 'title' => 'Kuruluş Oluştur', + 'save-btn' => 'Kuruluşu Kaydet', + ], + 'edit' => [ + 'title' => 'Kuruluşu Düzenle', + 'save-btn' => 'Kuruluşu Kaydet', + ], + ], + ], + 'products' => [ + 'index' => [ + 'title' => 'Ürünler', + 'create-btn' => 'Ürün Oluştur', + 'create-success' => 'Ürün başarıyla oluşturuldu.', + 'update-success' => 'Ürün başarıyla güncellendi.', + 'delete-success' => 'Ürün başarıyla silindi.', + 'delete-failed' => 'Ürün silinemedi.', + 'datagrid' => [ + 'allocated' => 'Tahsis Edilen', + 'delete' => 'Sil', + 'edit' => 'Düzenle', + 'id' => 'ID', + 'in-stock' => 'Stokta', + 'name' => 'Ad', + 'on-hand' => 'Elinde', + 'tag-name' => 'Etiket Adı', + 'price' => 'Fiyat', + 'sku' => 'SKU', + 'view' => 'Görüntüle', + ], + ], + 'create' => [ + 'save-btn' => 'Ürünleri Kaydet', + 'title' => 'Ürün Oluştur', + 'general' => 'Genel', + 'price' => 'Fiyat', + ], + 'edit' => [ + 'title' => 'Ürünleri Düzenle', + 'save-btn' => 'Ürünleri Kaydet', + 'general' => 'Genel', + 'price' => 'Fiyat', + ], + 'view' => [ + 'sku' => 'SKU', + 'all' => 'Hepsi', + 'notes' => 'Notlar', + 'files' => 'Dosyalar', + 'inventories' => 'Envanter', + 'change-logs' => 'Değişiklik Günlükleri', + 'attributes' => [ + 'about-product' => 'Ürün Hakkında', + ], + 'inventory' => [ + 'source' => 'Kaynak', + 'in-stock' => 'Stokta', + 'allocated' => 'Tahsis Edilen', + 'on-hand' => 'Elinde', + 'actions' => 'İşlemler', + 'assign' => 'Ata', + 'add-source' => 'Kaynak Ekle', + 'location' => 'Konum', + 'add-more' => 'Daha Fazla Ekle', + 'save' => 'Kaydet', + ], + ], + ], + 'settings' => [ + 'title' => 'Ayarlar', + 'groups' => [ + 'index' => [ + 'create-btn' => 'Grup Oluştur', + 'title' => 'Gruplar', + 'create-success' => 'Grup başarıyla oluşturuldu.', + 'update-success' => 'Grup başarıyla güncellendi.', + 'destroy-success' => 'Grup başarıyla silindi.', + 'delete-failed' => 'Grup silinemedi.', + 'delete-failed-associated-users' => 'Grup silinemiyor, çünkü kullanıcılar tarafından kullanılıyor.', + 'datagrid' => [ + 'delete' => 'Sil', + 'description' => 'Açıklama', + 'edit' => 'Düzenle', + 'id' => 'ID', + 'name' => 'Ad', + ], + 'edit' => [ + 'title' => 'Grubu Düzenle', + ], + 'create' => [ + 'name' => 'Ad', + 'title' => 'Grup Oluştur', + 'description' => 'Açıklama', + 'save-btn' => 'Grubu Kaydet', + ], + ], + ], + 'roles' => [ + 'index' => [ + 'being-used' => 'Rol silinemedi, çünkü bu admin kullanıcısında kullanılıyor.', + 'create-btn' => 'Rol Oluştur', + 'create-success' => 'Rol başarıyla oluşturuldu.', + 'current-role-delete-error' => 'Mevcut kullanıcıya atanmış rol silinemedi.', + 'delete-failed' => 'Rol silinemedi.', + 'delete-success' => 'Rol başarıyla silindi.', + 'last-delete-error' => 'En az bir rol gereklidir.', + 'settings' => 'Ayarlar', + 'title' => 'Roller', + 'update-success' => 'Rol başarıyla güncellendi.', + 'user-define-error' => 'Sistem rolü silinemedi.', + 'datagrid' => [ + 'all' => 'Hepsi', + 'custom' => 'Özel', + 'delete' => 'Sil', + 'description' => 'Açıklama', + 'edit' => 'Düzenle', + 'id' => 'ID', + 'name' => 'Ad', + 'permission-type' => 'İzin Türü', + ], + ], + 'create' => [ + 'access-control' => 'Erişim Kontrolü', + 'all' => 'Hepsi', + 'back-btn' => 'Geri', + 'custom' => 'Özel', + 'description' => 'Açıklama', + 'general' => 'Genel', + 'name' => 'Ad', + 'permissions' => 'İzinler', + 'save-btn' => 'Rolü Kaydet', + 'title' => 'Rol Oluştur', + ], + 'edit' => [ + 'access-control' => 'Erişim Kontrolü', + 'all' => 'Hepsi', + 'back-btn' => 'Geri', + 'custom' => 'Özel', + 'description' => 'Açıklama', + 'general' => 'Genel', + 'name' => 'Ad', + 'permissions' => 'İzinler', + 'save-btn' => 'Rolü Kaydet', + 'title' => 'Rol Düzenle', + ], + ], + 'types' => [ + 'index' => [ + 'create-btn' => 'Tür Oluştur', + 'create-success' => 'Tür başarıyla oluşturuldu.', + 'delete-failed' => 'Tür silinemedi.', + 'delete-success' => 'Tür başarıyla silindi.', + 'title' => 'Türler', + 'update-success' => 'Tür başarıyla güncellendi.', + 'datagrid' => [ + 'delete' => 'Sil', + 'description' => 'Açıklama', + 'edit' => 'Düzenle', + 'id' => 'ID', + 'name' => 'Ad', + ], + 'create' => [ + 'name' => 'Ad', + 'save-btn' => 'Türü Kaydet', + 'title' => 'Tür Oluştur', + ], + 'edit' => [ + 'title' => 'Tür Düzenle', + ], + ], + ], + 'sources' => [ + 'index' => [ + 'title' => 'Kaynaklar', + 'create-btn' => 'Kaynak Oluştur', + 'create-success' => 'Kaynak başarıyla oluşturuldu.', + 'delete-failed' => 'Kaynak silinemedi.', + 'delete-success' => 'Kaynak başarıyla silindi.', + 'update-success' => 'Kaynak başarıyla güncellendi.', + 'delete-failed-associated-leads' => 'Kaynak silinemiyor çünkü mevcut adaylarla ilişkili. Lütfen bu adayları silmeden önce bağlantılarını kaldırın veya güncelleyin.', + 'datagrid' => [ + 'delete' => 'Sil', + 'edit' => 'Düzenle', + 'id' => 'ID', + 'name' => 'Ad', + ], + 'create' => [ + 'name' => 'Ad', + 'save-btn' => 'Kaynağı Kaydet', + 'title' => 'Kaynak Oluştur', + ], + 'edit' => [ + 'title' => 'Kaynağı Düzenle', + ], + ], + ], + 'workflows' => [ + 'index' => [ + 'title' => 'İş Akışları', + 'create-btn' => 'İş Akışı Oluştur', + 'create-success' => 'İş akışı başarıyla oluşturuldu.', + 'update-success' => 'İş akışı başarıyla güncellendi.', + 'delete-success' => 'İş akışı başarıyla silindi.', + 'delete-failed' => 'İş akışı silinemedi.', + 'datagrid' => [ + 'delete' => 'Sil', + 'description' => 'Açıklama', + 'edit' => 'Düzenle', + 'id' => 'ID', + 'name' => 'Ad', + ], + ], + 'helpers' => [ + 'update-related-leads' => 'İlgili fırsatları güncelle', + 'send-email-to-sales-owner' => 'Satış sahibiyle e-posta gönder', + 'send-email-to-participants' => 'Katılımcılara e-posta gönder', + 'add-webhook' => 'Webhook Ekle', + 'update-lead' => 'Fırsatı Güncelle', + 'update-person' => 'Kişiyi Güncelle', + 'send-email-to-person' => 'Kişiye e-posta gönder', + 'add-tag' => 'Etiket Ekle', + 'add-note-as-activity' => 'Notu Aktivite Olarak Ekle', + 'update-quote' => 'Teklifi Güncelle', + ], + 'create' => [ + 'title' => 'İş Akışı Oluştur', + 'event' => 'Olay', + 'back-btn' => 'Geri', + 'save-btn' => 'İş Akışını Kaydet', + 'name' => 'Ad', + 'basic-details' => 'Temel Bilgiler', + 'description' => 'Açıklama', + 'actions' => 'Eylemler', + 'basic-details-info' => 'İş akışının temel bilgilerini girin.', + 'event-info' => 'Bir olay tetikler, kontrolleri yapar, koşulları değerlendirir ve önceden tanımlanmış eylemleri gerçekleştirir.', + 'conditions' => 'Koşullar', + 'conditions-info' => 'Koşullar, belirli durumlarda tetiklenen kurallardır.', + 'actions-info' => 'Bir eylem sadece iş yükünü azaltmakla kalmaz, aynı zamanda CRM otomasyonu için oldukça kolaylaştırır.', + 'value' => 'Değer', + 'condition-type' => 'Koşul Türü', + 'all-condition-are-true' => 'Tüm koşullar doğru', + 'any-condition-are-true' => 'Herhangi bir koşul doğru', + 'add-condition' => 'Koşul Ekle', + 'add-action' => 'Eylem Ekle', + 'yes' => 'Evet', + 'no' => 'Hayır', + 'email' => 'E-posta', + 'is-equal-to' => 'Eşittir', + 'is-not-equal-to' => 'Eşit değildir', + 'equals-or-greater-than' => 'Eşittir veya büyük', + 'equals-or-less-than' => 'Eşittir veya küçük', + 'greater-than' => 'Büyük', + 'less-than' => 'Küçük', + 'type' => 'Tür', + 'contain' => 'İçerir', + 'contains' => 'İçerir', + 'does-not-contain' => 'İçermez', + ], + 'edit' => [ + 'title' => 'İş Akışını Düzenle', + 'event' => 'Olay', + 'back-btn' => 'Geri', + 'save-btn' => 'İş Akışını Kaydet', + 'name' => 'Ad', + 'basic-details' => 'Temel Bilgiler', + 'description' => 'Açıklama', + 'actions' => 'Eylemler', + 'type' => 'Tür', + 'basic-details-info' => 'İş akışının temel bilgilerini girin.', + 'event-info' => 'Bir olay tetikler, kontrolleri yapar, koşulları değerlendirir ve önceden tanımlanmış eylemleri gerçekleştirir.', + 'conditions' => 'Koşullar', + 'conditions-info' => 'Koşullar, belirli durumlarda tetiklenen kurallardır.', + 'actions-info' => 'Bir eylem sadece iş yükünü azaltmakla kalmaz, aynı zamanda CRM otomasyonu için oldukça kolaylaştırır.', + 'value' => 'Değer', + 'condition-type' => 'Koşul Türü', + 'all-condition-are-true' => 'Tüm koşullar doğru', + 'any-condition-are-true' => 'Herhangi bir koşul doğru', + 'add-condition' => 'Koşul Ekle', + 'add-action' => 'Eylem Ekle', + 'yes' => 'Evet', + 'no' => 'Hayır', + 'email' => 'E-posta', + 'is-equal-to' => 'Eşittir', + 'is-not-equal-to' => 'Eşit değildir', + 'equals-or-greater-than' => 'Eşittir veya büyük', + 'equals-or-less-than' => 'Eşittir veya küçük', + 'greater-than' => 'Büyük', + 'less-than' => 'Küçük', + 'contain' => 'İçerir', + 'contains' => 'İçerir', + 'does-not-contain' => 'İçermez', + ], + ], + 'webforms' => [ + 'index' => [ + 'title' => 'Web Formları', + 'create-btn' => 'Web Formu Oluştur', + 'create-success' => 'Web formu başarıyla oluşturuldu.', + 'update-success' => 'Web formu başarıyla güncellendi.', + 'delete-success' => 'Web formu başarıyla silindi.', + 'delete-failed' => 'Web formu silinemedi.', + 'datagrid' => [ + 'id' => 'ID', + 'title' => 'Başlık', + 'edit' => 'Düzenle', + 'delete' => 'Sil', + ], + ], + 'create' => [ + 'title' => 'Web Formu Oluştur', + 'add-attribute-btn' => 'Öznitelik Düğmesi Ekle', + 'attribute-label-color' => 'Öznitelik Etiketi Rengi', + 'attributes' => 'Öznitelikler', + 'attributes-info' => 'Forma özel öznitelikler ekleyin.', + 'background-color' => 'Arka Plan Rengi', + 'create-lead' => 'Fırsat Oluştur', + 'customize-webform' => 'Web Formunu Özelleştir', + 'customize-webform-info' => 'Web formunuzu seçtiğiniz eleman renkleri ile özelleştirin.', + 'description' => 'Açıklama', + 'display-custom-message' => 'Özel mesaj göster', + 'form-background-color' => 'Form Arka Plan Rengi', + 'form-submit-btn-color' => 'Form Gönderim Düğmesi Rengi', + 'form-submit-button-color' => 'Form Gönderim Düğmesi Rengi', + 'form-title-color' => 'Form Başlık Rengi', + 'general' => 'Genel', + 'leads' => 'Fırsatlar', + 'person' => 'Kişi', + 'save-btn' => 'Web Formunu Kaydet', + 'submit-button-label' => 'Gönderim Düğmesi Etiketi', + 'submit-success-action' => 'Gönderim Başarı Eylemi', + 'redirect-to-url' => 'URL\'ye Yönlendir', + 'choose-value' => 'Değer Seç', + 'select-file' => 'Dosya Seç', + 'select-image' => 'Görüntü Seç', + 'enter-value' => 'Değer Gir', + ], + 'edit' => [ + 'add-attribute-btn' => 'Öznitelik Düğmesi Ekle', + 'attribute-label-color' => 'Öznitelik Etiketi Rengi', + 'attributes' => 'Öznitelikler', + 'attributes-info' => 'Forma özel öznitelikler ekleyin.', + 'background-color' => 'Arka Plan Rengi', + 'choose-value' => 'Değer Seç', + 'code-snippet' => 'Kod Parçası', + 'copied' => 'Kopyalandı', + 'copy' => 'Kopyala', + 'create-lead' => 'Fırsat Oluştur', + 'customize-webform' => 'Web Formunu Özelleştir', + 'customize-webform-info' => 'Web formunuzu seçtiğiniz eleman renkleri ile özelleştirin.', + 'description' => 'Açıklama', + 'display-custom-message' => 'Özel mesaj göster', + 'embed' => 'Göm', + 'enter-value' => 'Değer Gir', + 'form-background-color' => 'Form Arka Plan Rengi', + 'form-submit-btn-color' => 'Form Gönderim Düğmesi Rengi', + 'form-submit-button-color' => 'Form Gönderim Düğmesi Rengi', + 'form-title-color' => 'Form Başlık Rengi', + 'general' => 'Genel', + 'leads' => 'Fırsatlar', + 'person' => 'Kişi', + 'preview' => 'Önizleme', + 'public-url' => 'Genel URL', + 'redirect-to-url' => 'URL\'ye Yönlendir', + 'save-btn' => 'Web Formunu Kaydet', + 'select-file' => 'Dosya Seç', + 'select-image' => 'Görüntü Seç', + 'submit-button-label' => 'Gönderim Düğmesi Etiketi', + 'submit-success-action' => 'Gönderim Başarı Eylemi', + 'title' => 'Web Formunu Düzenle', + ], + ], + 'email-template' => [ + 'index' => [ + 'create-btn' => 'E-posta Şablonu Oluştur', + 'title' => 'E-posta Şablonları', + 'create-success' => 'E-posta şablonu başarıyla oluşturuldu.', + 'update-success' => 'E-posta şablonu başarıyla güncellendi.', + 'delete-success' => 'E-posta şablonu başarıyla silindi.', + 'delete-failed' => 'E-posta şablonu silinemedi.', + 'datagrid' => [ + 'delete' => 'Sil', + 'edit' => 'Düzenle', + 'id' => 'ID', + 'name' => 'Ad', + 'subject' => 'Konu', + ], + ], + 'create' => [ + 'title' => 'E-posta Şablonu Oluştur', + 'save-btn' => 'E-posta Şablonunu Kaydet', + 'email-template' => 'E-posta Şablonu', + 'subject' => 'Konu', + 'content' => 'İçerik', + 'subject-placeholders' => 'Konu Yer Tutucuları', + 'general' => 'Genel', + 'name' => 'Ad', + ], + 'edit' => [ + 'title' => 'E-posta Şablonunu Düzenle', + 'save-btn' => 'E-posta Şablonunu Kaydet', + 'email-template' => 'E-posta Şablonu', + 'subject' => 'Konu', + 'content' => 'İçerik', + 'subject-placeholders' => 'Konu Yer Tutucuları', + 'general' => 'Genel', + 'name' => 'Ad', + ], + ], + 'marketing' => [ + 'events' => [ + 'index' => [ + 'create-btn' => 'Etkinlik Oluştur', + 'title' => 'Etkinlikler', + 'create-success' => 'Etkinlik başarıyla oluşturuldu.', + 'update-success' => 'Etkinlik başarıyla güncellendi.', + 'delete-success' => 'Etkinlik başarıyla silindi.', + 'delete-failed' => 'Etkinlik silinemedi.', + 'mass-delete-success' => 'Etkinlikler başarıyla silindi', + 'datagrid' => [ + 'delete' => 'Sil', + 'edit' => 'Düzenle', + 'id' => 'ID', + 'name' => 'Ad', + 'description' => 'Açıklama', + 'date' => 'Tarih', + ], + 'create' => [ + 'title' => 'Etkinlik Oluştur', + 'name' => 'Ad', + 'date' => 'Tarih', + 'description' => 'Açıklama', + 'save-btn' => 'Etkinliği Kaydet', + ], + 'edit' => [ + 'title' => 'Etkinliği Düzenle', + ], + ], + ], + 'campaigns' => [ + 'index' => [ + 'create-btn' => 'Kampanya Oluştur', + 'title' => 'Kampanyalar', + 'create-success' => 'Kampanya başarıyla oluşturuldu.', + 'update-success' => 'Kampanya başarıyla güncellendi.', + 'delete-success' => 'Kampanya başarıyla silindi.', + 'delete-failed' => 'Kampanya silinemedi.', + 'mass-delete-success' => 'Kampanyalar başarıyla silindi', + 'datagrid' => [ + 'id' => 'ID', + 'name' => 'Ad', + 'subject' => 'Konu', + 'status' => 'Durum', + 'active' => 'Aktif', + 'inactive' => 'Pasif', + 'edit' => 'Düzenle', + 'delete' => 'Sil', + ], + 'create' => [ + 'title' => 'Kampanya Oluştur', + 'name' => 'Ad', + 'type' => 'Tür', + 'subject' => 'Konu', + 'event' => 'Etkinlik', + 'email-template' => 'E-posta Şablonu', + 'status' => 'Durum', + ], + 'edit' => [ + 'title' => 'Kampanyayı Düzenle', + ], + ], + ], + ], + 'tags' => [ + 'index' => [ + 'create-btn' => 'Etiket Oluştur', + 'title' => 'Etiketler', + 'create-success' => 'Etiket başarıyla oluşturuldu.', + 'update-success' => 'Etiket başarıyla güncellendi.', + 'delete-success' => 'Etiket başarıyla silindi.', + 'delete-failed' => 'Etiket silinemedi.', + 'datagrid' => [ + 'delete' => 'Sil', + 'edit' => 'Düzenle', + 'id' => 'ID', + 'name' => 'Ad', + 'users' => 'Kullanıcılar', + 'created-at' => 'Oluşturulma Tarihi', + ], + 'create' => [ + 'name' => 'Ad', + 'save-btn' => 'Etiketi Kaydet', + 'title' => 'Etiket Oluştur', + 'color' => 'Renk', + ], + 'edit' => [ + 'title' => 'Etiketi Düzenle', + ], + ], + ], + 'users' => [ + 'index' => [ + 'create-btn' => 'Kullanıcı Oluştur', + 'create-success' => 'Kullanıcı başarıyla oluşturuldu.', + 'delete-failed' => 'Kullanıcı silinemedi.', + 'delete-success' => 'Kullanıcı başarıyla silindi.', + 'last-delete-error' => 'En az bir kullanıcı gereklidir.', + 'mass-delete-failed' => 'Kullanıcılar silinemedi.', + 'mass-delete-success' => 'Kullanıcılar başarıyla silindi.', + 'mass-update-failed' => 'Kullanıcılar güncellenemedi.', + 'mass-update-success' => 'Kullanıcılar başarıyla güncellendi.', + 'title' => 'Kullanıcılar', + 'update-success' => 'Kullanıcı başarıyla güncellendi.', + 'user-define-error' => 'Sistem kullanıcısı silinemedi.', + 'active' => 'Aktif', + 'inactive' => 'Pasif', + 'datagrid' => [ + 'active' => 'Aktif', + 'created-at' => 'Oluşturulma Tarihi', + 'delete' => 'Sil', + 'edit' => 'Düzenle', + 'email' => 'E-posta', + 'id' => 'ID', + 'inactive' => 'Pasif', + 'name' => 'Ad', + 'status' => 'Durum', + 'update-status' => 'Durumu Güncelle', + 'users' => 'Kullanıcılar', + ], + 'create' => [ + 'confirm-password' => 'Şifreyi Onayla', + 'email' => 'E-posta', + 'general' => 'Genel', + 'global' => 'Küresel', + 'group' => 'Grup', + 'individual' => 'Bireysel', + 'name' => 'Ad', + 'password' => 'Şifre', + 'permission' => 'İzin', + 'role' => 'Rol', + 'save-btn' => 'Kullanıcıyı Kaydet', + 'status' => 'Durum', + 'title' => 'Kullanıcı Oluştur', + 'view-permission' => 'Görüntüleme İzni', + 'select-at-lest-one-group' => 'Select at least one group', + ], + 'edit' => [ + 'title' => 'Kullanıcıyı Düzenle', + ], + ], + ], + 'pipelines' => [ + 'index' => [ + 'title' => 'Pipelines', + 'create-btn' => 'Pipeline Oluştur', + 'create-success' => 'Pipeline başarıyla oluşturuldu.', + 'update-success' => 'Pipeline başarıyla güncellendi.', + 'default-required' => 'En az bir varsayılan boru hattı gereklidir.', + 'delete-success' => 'Pipeline başarıyla silindi.', + 'delete-failed' => 'Pipeline silinemedi.', + 'default-delete-error' => 'Varsayılan pipeline silinemez.', + 'datagrid' => [ + 'delete' => 'Sil', + 'edit' => 'Düzenle', + 'id' => 'ID', + 'is-default' => 'Varsayılan mı', + 'name' => 'Ad', + 'no' => 'Hayır', + 'rotten-days' => 'Çürük Günler', + 'yes' => 'Evet', + ], + ], + 'create' => [ + 'title' => 'Pipeline Oluştur', + 'save-btn' => 'Pipeline Kaydet', + 'name' => 'Ad', + 'rotten-days' => 'Çürük Günler', + 'mark-as-default' => 'Varsayılan Olarak İşaretle', + 'general' => 'Genel', + 'probability' => 'Olasılık (%)', + 'new-stage' => 'Yeni', + 'won-stage' => 'Kazandı', + 'lost-stage' => 'Kaybetti', + 'stage-btn' => 'Aşama Ekle', + 'stages' => 'Aşamalar', + 'duplicate-name' => '"Ad" alanı tekrar edemez', + 'delete-stage' => 'Aşama Sil', + 'add-new-stages' => 'Yeni Aşamalar Ekle', + 'add-stage-info' => 'Pipeline için yeni aşama ekleyin', + 'newly-added' => 'Yeni Eklenen', + 'stage-delete-success' => 'Aşama Başarıyla Silindi', + ], + 'edit' => [ + 'title' => 'Pipeline\'ı Düzenle', + 'save-btn' => 'Pipeline Kaydet', + 'name' => 'Ad', + 'rotten-days' => 'Çürük Günler', + 'mark-as-default' => 'Varsayılan Olarak İşaretle', + 'general' => 'Genel', + 'probability' => 'Olasılık (%)', + 'new-stage' => 'Yeni', + 'won-stage' => 'Kazandı', + 'lost-stage' => 'Kaybetti', + 'stage-btn' => 'Aşama Ekle', + 'stages' => 'Aşamalar', + 'duplicate-name' => '"Ad" alanı tekrar edemez', + 'delete-stage' => 'Aşama Sil', + 'add-new-stages' => 'Yeni Aşamalar Ekle', + 'add-stage-info' => 'Pipeline için yeni aşama ekleyin', + 'stage-delete-success' => 'Aşama Başarıyla Silindi', + ], + ], + 'webhooks' => [ + 'index' => [ + 'title' => 'Webhooks', + 'create-btn' => 'Webhook Oluştur', + 'create-success' => 'Webhook başarıyla oluşturuldu.', + 'update-success' => 'Webhook başarıyla güncellendi.', + 'delete-success' => 'Webhook başarıyla silindi.', + 'delete-failed' => 'Webhook silinemedi.', + 'datagrid' => [ + 'id' => 'ID', + 'delete' => 'Sil', + 'edit' => 'Düzenle', + 'name' => 'Ad', + 'entity-type' => 'Varlık Türü', + 'end-point' => 'Son Nokta', + ], + ], + 'create' => [ + 'title' => 'Webhook Oluştur', + 'save-btn' => 'Webhook Kaydet', + 'info' => 'Webhook detaylarını girin', + 'url-and-parameters' => 'URL ve Parametreler', + 'method' => 'Yöntem', + 'post' => 'Post', + 'put' => 'Put', + 'url-endpoint' => 'URL Son Noktası', + 'parameters' => 'Parametreler', + 'add-new-parameter' => 'Yeni Parametre Ekle', + 'url-preview' => 'URL Önizleme:', + 'headers' => 'Başlıklar', + 'add-new-header' => 'Yeni Başlık Ekle', + 'body' => 'Gövde', + 'default' => 'Varsayılan', + 'x-www-form-urlencoded' => 'x-www-form-urlencoded', + 'key-and-value' => 'Anahtar ve Değer', + 'add-new-payload' => 'Yeni yük ekle', + 'raw' => 'Ham', + 'general' => 'Genel', + 'name' => 'Ad', + 'entity-type' => 'Varlık Türü', + 'insert-placeholder' => 'Yer Tutucu Ekle', + 'description' => 'Açıklama', + 'json' => 'Json', + 'text' => 'Metin', + ], + 'edit' => [ + 'title' => 'Webhook\'u Düzenle', + 'edit-btn' => 'Webhook Kaydet', + 'save-btn' => 'Webhook Kaydet', + 'info' => 'Webhook detaylarını girin', + 'url-and-parameters' => 'URL ve Parametreler', + 'method' => 'Yöntem', + 'post' => 'Post', + 'put' => 'Put', + 'url-endpoint' => 'URL Son Noktası', + 'parameters' => 'Parametreler', + 'add-new-parameter' => 'Yeni Parametre Ekle', + 'url-preview' => 'URL Önizleme:', + 'headers' => 'Başlıklar', + 'add-new-header' => 'Yeni Başlık Ekle', + 'body' => 'Gövde', + 'default' => 'Varsayılan', + 'x-www-form-urlencoded' => 'x-www-form-urlencoded', + 'key-and-value' => 'Anahtar ve Değer', + 'add-new-payload' => 'Yeni yük ekle', + 'raw' => 'Ham', + 'general' => 'Genel', + 'name' => 'Ad', + 'entity-type' => 'Varlık Türü', + 'insert-placeholder' => 'Yer Tutucu Ekle', + 'description' => 'Açıklama', + 'json' => 'Json', + 'text' => 'Metin', + ], + ], + 'warehouses' => [ + 'index' => [ + 'title' => 'Depolar', + 'create-btn' => 'Depo Oluştur', + 'create-success' => 'Depo başarıyla oluşturuldu.', + 'name-exists' => 'Depo adı zaten mevcut.', + 'update-success' => 'Depo başarıyla güncellendi.', + 'delete-success' => 'Depo başarıyla silindi.', + 'delete-failed' => 'Depo silinemedi.', + 'datagrid' => [ + 'id' => 'ID', + 'name' => 'Ad', + 'contact-name' => 'İletişim Adı', + 'delete' => 'Sil', + 'edit' => 'Düzenle', + 'view' => 'Görüntüle', + 'created-at' => 'Oluşturulma Tarihi', + 'products' => 'Ürünler', + 'contact-emails' => 'İletişim E-postaları', + 'contact-numbers' => 'İletişim Numaraları', + ], + ], + 'create' => [ + 'title' => 'Depo Oluştur', + 'save-btn' => 'Depoyu Kaydet', + 'contact-info' => 'İletişim Bilgileri', + ], + 'edit' => [ + 'title' => 'Depoyu Düzenle', + 'save-btn' => 'Depoyu Kaydet', + 'contact-info' => 'İletişim Bilgileri', + ], + 'view' => [ + 'all' => 'Tümü', + 'notes' => 'Notlar', + 'files' => 'Dosyalar', + 'location' => 'Konum', + 'change-logs' => 'Değişiklik Kayıtları', + 'locations' => [ + 'action' => 'Eylem', + 'add-location' => 'Konum Ekle', + 'create-success' => 'Konum başarıyla oluşturuldu.', + 'delete' => 'Sil', + 'delete-failed' => 'Konum silinemedi.', + 'delete-success' => 'Konum başarıyla silindi.', + 'name' => 'Ad', + 'save-btn' => 'Kaydet', + ], + 'general-information' => [ + 'title' => 'Genel Bilgiler', + ], + 'contact-information' => [ + 'title' => 'İletişim Bilgileri', + ], + ], + ], + 'attributes' => [ + 'index' => [ + 'title' => 'Öznitelikler', + 'create-btn' => 'Öznitelik Oluştur', + 'create-success' => 'Öznitelik başarıyla oluşturuldu.', + 'update-success' => 'Öznitelik başarıyla güncellendi.', + 'delete-success' => 'Öznitelik başarıyla silindi.', + 'delete-failed' => 'Öznitelik silinemedi.', + 'user-define-error' => 'Sistem özniteliği silinemez.', + 'mass-delete-failed' => 'Sistem öznitelikleri silinemez.', + 'datagrid' => [ + 'yes' => 'Evet', + 'no' => 'Hayır', + 'id' => 'ID', + 'code' => 'Kod', + 'name' => 'Ad', + 'entity-type' => 'Varlık Türü', + 'type' => 'Tür', + 'is-default' => 'Varsayılan mı', + 'edit' => 'Düzenle', + 'delete' => 'Sil', + 'entity-types' => [ + 'leads' => 'Potansiyeller', + 'organizations' => 'Organizasyonlar', + 'persons' => 'Kişiler', + 'products' => 'Ürünler', + 'quotes' => 'Teklifler', + 'warehouses' => 'Depolar', + ], + 'types' => [ + 'text' => 'Metin', + 'textarea' => 'Metin alanı', + 'price' => 'Fiyat', + 'boolean' => 'Mantıksal', + 'select' => 'Seçim', + 'multiselect' => 'Çoklu seçim', + 'checkbox' => 'Onay kutusu', + 'email' => 'E-posta', + 'address' => 'Adres', + 'phone' => 'Telefon', + 'lookup' => 'Arama', + 'datetime' => 'Tarih ve saat', + 'date' => 'Tarih', + 'image' => 'Görsel', + 'file' => 'Dosya', + ], + ], + ], + 'create' => [ + 'title' => 'Öznitelik Oluştur', + 'save-btn' => 'Özniteliği Kaydet', + 'code' => 'Kod', + 'name' => 'Ad', + 'entity-type' => 'Varlık Türü', + 'type' => 'Tür', + 'validations' => 'Doğrulamalar', + 'is-required' => 'Gerekli mi', + 'input-validation' => 'Girdi Doğrulaması', + 'is-unique' => 'Benzersiz mi', + 'labels' => 'Etiketler', + 'general' => 'Genel', + 'numeric' => 'Sayısal', + 'decimal' => 'Ondalık', + 'url' => 'URL', + 'options' => 'Seçenekler', + 'option-type' => 'Seçenek Türü', + 'lookup-type' => 'Arama Türü', + 'add-option' => 'Seçenek Ekle', + 'save-option' => 'Seçeneği Kaydet', + 'option-name' => 'Seçenek Adı', + 'add-attribute-options' => 'Öznitelik Seçenekleri Ekle', + 'text' => 'Metin', + 'textarea' => 'Metin Alanı', + 'price' => 'Fiyat', + 'boolean' => 'Boolean', + 'select' => 'Seç', + 'multiselect' => 'Çoklu Seçim', + 'email' => 'E-posta', + 'address' => 'Adres', + 'phone' => 'Telefon', + 'datetime' => 'Tarih Saat', + 'date' => 'Tarih', + 'image' => 'Resim', + 'file' => 'Dosya', + 'lookup' => 'Arama', + 'entity_type' => 'Varlık türü', + 'checkbox' => 'Onay Kutusu', + 'is_required' => 'Gerekli mi', + 'is_unique' => 'Benzersiz mi', + 'actions' => 'İşlemler', + ], + 'edit' => [ + 'actions' => 'İşlemler', + 'add-attribute-options' => 'Öznitelik Seçenekleri Ekle', + 'add-option' => 'Seçenek Ekle', + 'address' => 'Adres', + 'boolean' => 'Boolean', + 'checkbox' => 'Onay Kutusu', + 'code' => 'Kod', + 'date' => 'Tarih', + 'datetime' => 'Tarih Saat', + 'decimal' => 'Ondalık', + 'email' => 'E-posta', + 'entity-type' => 'Varlık Türü', + 'entity_type' => 'Varlık türü', + 'file' => 'Dosya', + 'general' => 'Genel', + 'image' => 'Resim', + 'input-validation' => 'Girdi Doğrulaması', + 'is-required' => 'Gerekli mi', + 'is-unique' => 'Benzersiz mi', + 'is_required' => 'Gerekli mi', + 'is_unique' => 'Benzersiz mi', + 'labels' => 'Etiketler', + 'lookup' => 'Arama', + 'lookup-type' => 'Arama Türü', + 'multiselect' => 'Çoklu Seçim', + 'name' => 'Ad', + 'numeric' => 'Sayısal', + 'option-deleted' => 'Attribute Option is deleted successfully', + 'option-name' => 'Seçenek Adı', + 'option-type' => 'Seçenek Türü', + 'options' => 'Seçenekler', + 'phone' => 'Telefon', + 'price' => 'Fiyat', + 'save-btn' => 'Özniteliği Kaydet', + 'save-option' => 'Seçeneği Kaydet', + 'select' => 'Seç', + 'text' => 'Metin', + 'textarea' => 'Metin Alanı', + 'title' => 'Özniteliği Düzenle', + 'type' => 'Tür', + 'url' => 'URL', + 'validations' => 'Doğrulamalar', + ], + ], + 'data-transfer' => [ + 'imports' => [ + 'create' => [ + 'action' => 'Eylem', + 'allowed-errors' => 'İzin Verilen Hatalar', + 'back-btn' => 'Geri', + 'create-update' => 'Oluştur/Güncelle', + 'delete' => 'Sil', + 'download-sample' => 'Örneği İndir', + 'field-separator' => 'Alan Ayırıcı', + 'file' => 'Dosya', + 'general' => 'Genel', + 'images-directory' => 'Resim Dizini Yolu', + 'process-in-queue' => 'Kuyrukta İşle', + 'results' => 'Sonuçlar', + 'save-btn' => 'İthalatı Kaydet', + 'settings' => 'Ayarlar', + 'skip-errors' => 'Hataları Atla', + 'stop-on-errors' => 'Hatalarda Durdur', + 'title' => 'İthalat Oluştur', + 'type' => 'Tür', + 'validation-strategy' => 'Doğrulama Stratejisi', + ], + 'edit' => [ + 'action' => 'Eylem', + 'allowed-errors' => 'İzin Verilen Hatalar', + 'back-btn' => 'Geri', + 'create-update' => 'Oluştur/Güncelle', + 'delete' => 'Sil', + 'download-sample' => 'Örneği İndir', + 'field-separator' => 'Alan Ayırıcı', + 'file' => 'Dosya', + 'general' => 'Genel', + 'images-directory' => 'Resim Dizini Yolu', + 'process-in-queue' => 'Kuyrukta İşle', + 'results' => 'Sonuçlar', + 'save-btn' => 'İthalatı Kaydet', + 'settings' => 'Ayarlar', + 'skip-errors' => 'Hataları Atla', + 'stop-on-errors' => 'Hatalarda Durdur', + 'title' => 'İthalatı Düzenle', + 'type' => 'Tür', + 'validation-strategy' => 'Doğrulama Stratejisi', + ], + 'index' => [ + 'button-title' => 'İthalat Oluştur', + 'title' => 'İthalatlar', + 'datagrid' => [ + 'actions' => 'Eylemler', + 'completed-at' => 'Tamamlandığı Zaman', + 'created' => 'Oluşturuldu', + 'delete' => 'Sil', + 'deleted' => 'Silindi', + 'edit' => 'Düzenle', + 'error-file' => 'Hata Dosyası', + 'id' => 'Kimlik', + 'started-at' => 'Başlama Zamanı', + 'state' => 'Durum', + 'summary' => 'Özet', + 'type' => 'Tür', + 'updated' => 'Güncellendi', + 'uploaded-file' => 'Yüklenen Dosya', + ], + ], + 'import' => [ + 'back-btn' => 'Geri', + 'completed-batches' => 'Tamamlanan Toplam Gruplar:', + 'download-error-report' => 'Tam Raporu İndir', + 'edit-btn' => 'Düzenle', + 'imported-info' => 'Tebrikler! İthalatınız başarılı oldu.', + 'importing-info' => 'İthalat İşlemde', + 'indexing-info' => 'Kaynaklar İndeksleniyor (Fiyat, Stok ve Elastic Search) İlerliyor', + 'linking-info' => 'Kaynaklar Bağlanıyor', + 'progress' => 'İlerleme:', + 'title' => 'İthalat', + 'total-batches' => 'Toplam Gruplar:', + 'total-created' => 'Oluşturulan Toplam Kayıtlar:', + 'total-deleted' => 'Silinen Toplam Kayıtlar:', + 'total-errors' => 'Toplam Hatalar:', + 'total-invalid-rows' => 'Geçersiz Satırların Toplamı:', + 'total-rows-processed' => 'İşlenen Toplam Satırlar:', + 'total-updated' => 'Güncellenen Toplam Kayıtlar:', + 'validate' => 'Doğrula', + 'validate-info' => 'İthalatınızı kontrol etmek için Verileri Doğrula\'ya tıklayın.', + 'validating-info' => 'Veriler okunmaya ve doğrulanmaya başlandı', + 'validation-failed-info' => 'İthalatınız geçersiz. Lütfen aşağıdaki hataları düzeltin ve tekrar deneyin.', + 'validation-success-info' => 'İthalatınız geçerli. İthalat işlemini başlatmak için İthalat\'a tıklayın.', + ], + 'create-success' => 'İthalat başarıyla oluşturuldu.', + 'delete-failed' => 'İthalatı silme beklenmedik bir şekilde başarısız oldu.', + 'delete-success' => 'İthalat başarıyla silindi.', + 'not-valid' => 'İthalat geçersiz', + 'nothing-to-import' => 'İthal edilecek kaynak yok.', + 'setup-queue-error' => 'İthalat işlemini başlatmak için kuyruk sürücünüzü "veritabanı" veya "redis" olarak değiştirin.', + 'update-success' => 'İthalat başarıyla güncellendi.', + ], + ], + ], + 'activities' => [ + 'index' => [ + 'title' => 'Etkinlikler', + 'datagrid' => [ + 'comment' => 'Yorum', + 'created_at' => 'Oluşturulma Tarihi', + 'created_by' => 'Oluşturan', + 'edit' => 'Düzenle', + 'id' => 'ID', + 'done' => 'Tamamlandı mı', + 'not-done' => 'Tamamlanmadı', + 'lead' => 'Müşteri', + 'mass-delete' => 'Toplu Sil', + 'mass-update' => 'Toplu Güncelle', + 'schedule-from' => 'Başlangıç Tarihi', + 'schedule-to' => 'Bitiş Tarihi', + 'schedule_from' => 'Başlangıç Tarihi', + 'schedule_to' => 'Bitiş Tarihi', + 'title' => 'Başlık', + 'is_done' => 'Tamamlandı mı', + 'type' => 'Tür', + 'update' => 'Güncelle', + 'call' => 'Arama', + 'meeting' => 'Toplantı', + 'lunch' => 'Öğle Yemeği', + ], + ], + 'edit' => [ + 'title' => 'Etkinliği Düzenle', + 'back-btn' => 'Geri', + 'save-btn' => 'Etkinliği Kaydet', + 'type' => 'Etkinlik Türü', + 'call' => 'Arama', + 'meeting' => 'Toplantı', + 'lunch' => 'Öğle Yemeği', + 'schedule_to' => 'Bitiş Tarihi', + 'schedule_from' => 'Başlangıç Tarihi', + 'location' => 'Konum', + 'comment' => 'Yorum', + 'lead' => 'Müşteri', + 'participants' => 'Katılımcılar', + 'general' => 'Genel', + 'persons' => 'Kişiler', + 'no-result-found' => 'Kayıt bulunamadı.', + 'users' => 'Kullanıcılar', + ], + 'updated' => 'Güncellendi :attribute', + 'created' => 'Oluşturuldu', + 'duration-overlapping' => 'Katılımcıların bu saatte başka bir toplantısı var. Devam etmek istiyor musunuz?', + 'create-success' => 'Etkinlik başarıyla oluşturuldu.', + 'update-success' => 'Etkinlik başarıyla güncellendi.', + 'overlapping-error' => 'Katılımcıların bu saatte başka bir toplantısı var.', + 'destroy-success' => 'Etkinlik başarıyla silindi.', + 'delete-failed' => 'Etkinlik silinemiyor.', + 'mass-update-success' => 'Etkinlikler başarıyla güncellendi.', + 'mass-destroy-success' => 'Etkinlikler başarıyla silindi.', + 'mass-delete-failed' => 'Etkinlikler silinemiyor.', + ], + 'mail' => [ + 'index' => [ + 'compose' => 'Oluştur', + 'draft' => 'Taslak', + 'inbox' => 'Gelen Kutusu', + 'outbox' => 'Giden Kutusu', + 'sent' => 'Gönderildi', + 'trash' => 'Çöp', + 'compose-mail-btn' => 'Mail Oluştur', + 'btn' => 'Mail', + 'mail' => [ + 'title' => 'Mail Oluştur', + 'to' => 'Kime', + 'enter-emails' => 'E-posta eklemek için enter tuşuna basın', + 'cc' => 'CC', + 'bcc' => 'BCC', + 'subject' => 'Konu', + 'send-btn' => 'Gönder', + 'message' => 'Mesaj', + 'draft' => 'Taslak', + ], + 'datagrid' => [ + 'id' => 'ID', + 'from' => 'Gönderen', + 'to' => 'Alıcı', + 'subject' => 'Konu', + 'tags' => 'Etiketler', + 'content' => 'Eklentiler', + 'attachments' => 'Attachments', + 'date' => 'Tarih', + 'move-to-inbox' => 'Gelen Kutusuna Taşı', + 'move-to-trash' => 'Çöp kutusuna taşındı', + 'edit' => 'Düzenle', + 'view' => 'Görüntüle', + 'delete' => 'Sil', + ], + ], + 'create-success' => 'E-posta başarıyla gönderildi.', + 'update-success' => 'E-posta başarıyla güncellendi.', + 'mass-update-success' => 'E-postalar başarıyla güncellendi.', + 'delete-success' => 'E-posta başarıyla silindi.', + 'delete-failed' => 'E-posta silinemedi.', + 'view' => [ + 'title' => 'Mails', + 'subject' => ':subject', + 'link-mail' => 'Maili Bağla', + 'to' => 'Kime', + 'cc' => 'CC', + 'bcc' => 'BCC', + 'reply' => 'Yanıtla', + 'reply-all' => 'Hepsine Yanıtla', + 'forward' => 'Yönlendir', + 'delete' => 'Sil', + 'enter-mails' => 'E-posta ID girin', + 'rotten-days' => ':days gün boyunca geçersiz', + 'search-an-existing-lead' => 'Mevcut bir müşteri arayın', + 'search-an-existing-contact' => 'Mevcut bir kişi arayın', + 'message' => 'Mesaj', + 'add-attachments' => 'Ek Ekle', + 'discard' => 'İptal Et', + 'send' => 'Gönder', + 'no-result-found' => 'Sonuç bulunamadı', + 'add-new-contact' => 'Yeni İletişim Ekle', + 'description' => 'Açıklama', + 'search' => 'Ara...', + 'add-new-lead' => 'Yeni Müşteri Ekle', + 'create-new-contact' => 'Yeni İletişim Oluştur', + 'save-contact' => 'İletişimi Kaydet', + 'create-lead' => 'Müşteri Oluştur', + 'linked-contact' => 'Bağlı Kişi', + 'link-to-contact' => 'Kişiye Bağla', + 'link-to-lead' => 'Müşteriye Bağla', + 'linked-lead' => 'Bağlı Müşteri', + 'lead-details' => 'Müşteri Detayları', + 'contact-person' => 'İletişim Kişisi', + 'product' => 'Ürün', + 'tags' => [ + 'create-success' => 'Etiket başarıyla oluşturuldu.', + 'destroy-success' => 'Etiket başarıyla silindi.', + ], + ], + ], + 'common' => [ + 'custom-attributes' => [ + 'add-more' => 'Daha Fazla Ekle', + 'address' => 'Adres', + 'city' => 'Şehir', + 'contact' => 'İletişim Numaraları', + 'country' => 'Ülke', + 'email' => 'E-posta', + 'home' => 'Ev', + 'postcode' => 'Posta Kodu', + 'save' => 'Kaydet', + 'select' => 'Seç', + 'select-country' => 'Ülke Seç', + 'select-state' => 'Eyalet Seç', + 'state' => 'Eyalet', + 'update-contact-title' => 'İletişim Numaralarını Güncelle', + 'update-emails-title' => 'İletişim E-postalarını Güncelle', + 'work' => 'İş', + ], + ], + 'leads' => [ + 'create-success' => 'Lead başarıyla oluşturuldu.', + 'update-success' => 'Lead başarıyla güncellendi.', + 'update-failed' => 'Potansiyel müşteriler silinemez.', + 'destroy-success' => 'Lead başarıyla silindi.', + 'destroy-failed' => 'Lead silinemedi.', + 'file' => [ + 'data-not-found' => 'Veri bulunamadı.', + 'empty-content' => 'PDF içeriği boş veya çıkarılamadı.', + 'failed-extract' => 'Dosyadan metin çıkarılamadı.', + 'insufficient-info' => 'Yetersiz veri nedeniyle, şu anda isteğinizi işleyemiyoruz.', + 'invalid-base64' => 'Geçersiz base64 formatı.', + 'invalid-format' => 'Geçersiz JSON formatı.', + 'invalid-response' => 'Geçersiz AI yanıt formatı.', + 'missing-api-key' => 'API anahtarı veya model yapılandırması eksik.', + 'not-found' => 'Dosya bulunamadı.', + 'recursive-call' => 'Özyinelemeli çağrı tespit edildi.', + 'text-generation-failed' => 'Metin çıkarma başarısız oldu. Dosya boş veya okunamaz olabilir.', + ], + 'index' => [ + 'title' => 'Leads', + 'create-btn' => 'Lead Oluştur', + 'datagrid' => [ + 'id' => 'ID', + 'sales-person' => 'Satış Temsilcisi', + 'subject' => 'Konu', + 'source' => 'Kaynak', + 'lead-value' => 'Lead Değeri', + 'lead-type' => 'Potansiyel Müşteri Türü', + 'tag-name' => 'Etiket Adı', + 'contact-person' => 'İletişim Kişisi', + 'stage' => 'Aşama', + 'rotten-lead' => 'Çürümüş Lead', + 'date-to' => 'Bitiş Tarihi', + 'created-at' => 'Oluşturulma Tarihi', + 'no' => 'Hayır', + 'yes' => 'Evet', + 'delete' => 'Sil', + 'mass-delete' => 'Toplu Sil', + 'mass-update' => 'Toplu Güncelle', + ], + 'kanban' => [ + 'rotten-days' => 'Bu müşteri adayı :days gündür çürük', + 'empty-list' => 'Müşteri Adayı Listeniz Boş', + 'empty-list-description' => 'Hedeflerinizi düzenlemek için bir müşteri adayı oluşturun.', + 'create-lead-btn' => 'Müşteri Adayı Oluştur', + 'columns' => [ + 'contact-person' => 'İletişim Kişisi', + 'id' => 'ID', + 'lead-type' => 'Lead Türü', + 'lead-value' => 'Lead Değeri', + 'sales-person' => 'Satış Temsilcisi', + 'source' => 'Kaynak', + 'title' => 'Başlık', + 'tags' => 'Etiketler', + 'expected-close-date' => 'Beklenen Kapanış Tarihi', + 'created-at' => 'Oluşturulma Tarihi', + ], + 'toolbar' => [ + 'search' => [ + 'title' => 'Başlığa göre ara', + ], + 'filters' => [ + 'apply-filters' => 'Filtreleri Uygula', + 'clear-all' => 'Tümünü Temizle', + 'filter' => 'Filtre', + 'filters' => 'Filtreler', + 'from' => 'Kimden', + 'select' => 'Seç', + 'to' => 'Kime', + ], + ], + ], + 'view-switcher' => [ + 'all-pipelines' => 'Tüm Boru Hatları', + 'create-new-pipeline' => 'Yeni Boru Hattı Oluştur', + ], + 'upload' => [ + 'create-lead' => 'AI Kullanarak Lead Oluştur', + 'file' => 'Dosya yükleme', + 'file-info' => 'Yalnızca pdf, bmp, jpg, jpeg, png formatındaki dosyalar kabul edilir.', + 'file-required' => 'Devam etmek için lütfen en az bir geçerli dosya seçin.', + 'save-btn' => 'Kaydet', + 'upload-file' => 'Dosya yükle', + ], + ], + 'create' => [ + 'title' => 'Lead Oluştur', + 'save-btn' => 'Kaydet', + 'details' => 'Detaylar', + 'details-info' => 'Lead\'in Temel Bilgilerini Girin', + 'contact-person' => 'İletişim Kişisi', + 'contact-info' => 'İletişim Kişisi Hakkında Bilgiler', + 'products' => 'Ürünler', + 'products-info' => 'Ürünler Hakkında Bilgiler', + ], + 'edit' => [ + 'title' => 'Lead\'i Düzenle', + 'save-btn' => 'Kaydet', + 'details' => 'Detaylar', + 'details-info' => 'Lead\'in Temel Bilgilerini Girin', + 'contact-person' => 'İletişim Kişisi', + 'contact-info' => 'İletişim Kişisi Hakkında Bilgiler', + 'products' => 'Ürünler', + 'products-info' => 'Ürünler Hakkında Bilgiler', + ], + 'common' => [ + 'contact' => [ + 'name' => 'Ad', + 'email' => 'E-posta', + 'contact-number' => 'İletişim Numarası', + 'organization' => 'Kuruluş', + ], + 'products' => [ + 'product-name' => 'Ürün Adı', + 'quantity' => 'Miktar', + 'price' => 'Fiyat', + 'amount' => 'Tutar', + 'action' => 'Eylem', + 'add-more' => 'Daha Fazla Ekle', + 'total' => 'Toplam', + ], + ], + 'view' => [ + 'title' => 'Lead: :title', + 'rotten-days' => ':days Gün', + 'tabs' => [ + 'description' => 'Açıklama', + 'products' => 'Ürünler', + 'quotes' => 'Teklifler', + ], + 'attributes' => [ + 'title' => 'Lead Hakkında', + ], + 'quotes' => [ + 'subject' => 'Konu', + 'expired-at' => 'Son Tarih', + 'sub-total' => 'Ara Toplam', + 'discount' => 'İndirim', + 'tax' => 'Vergi', + 'adjustment' => 'Düzeltme', + 'grand-total' => 'Genel Toplam', + 'delete' => 'Sil', + 'edit' => 'Düzenle', + 'download' => 'İndir', + 'destroy-success' => 'Teklif başarıyla silindi.', + 'empty-title' => 'Teklif Bulunamadı', + 'empty-info' => 'Bu Lead için Teklif Bulunamadı', + 'add-btn' => 'Teklif Ekle', + ], + 'products' => [ + 'product-name' => 'Ürün Adı', + 'quantity' => 'Miktar', + 'price' => 'Fiyat', + 'amount' => 'Tutar', + 'action' => 'Eylem', + 'add-more' => 'Daha Fazla Ekle', + 'total' => 'Toplam', + 'empty-title' => 'Ürün Bulunamadı', + 'empty-info' => 'Bu Lead için Ürün Bulunamadı', + 'add-product' => 'Ürün Ekle', + ], + 'persons' => [ + 'title' => 'Kişiler Hakkında', + 'job-title' => ':job_title @ :organization', + ], + 'stages' => [ + 'won-lost' => 'Kazandı/Kayıp', + 'won' => 'Kazandı', + 'lost' => 'Kayıp', + 'need-more-info' => 'Daha Fazla Bilgi Gerekiyor', + 'closed-at' => 'Kapanış Tarihi', + 'won-value' => 'Kazanan Değer', + 'lost-reason' => 'Kayıp Nedeni', + 'save-btn' => 'Kaydet', + ], + 'tags' => [ + 'create-success' => 'Etiket başarıyla oluşturuldu.', + 'destroy-success' => 'Etiket başarıyla silindi.', + ], + ], + ], + 'configuration' => [ + 'index' => [ + 'back' => 'Geri', + 'delete' => 'Sil', + 'save-btn' => 'Yapılandırmayı Kaydet', + 'save-success' => 'Yapılandırma Başarıyla Kaydedildi.', + 'search' => 'Ara', + 'select-country' => 'Ülke Seç', + 'select-state' => 'Eyalet Seç', + 'title' => 'Yapılandırma', + 'general' => [ + 'title' => 'Genel', + 'info' => 'Genel Yapılandırma', + 'general' => [ + 'title' => 'Genel', + 'info' => 'Genel ayarlarınızı burada güncelleyin.', + 'locale-settings' => [ + 'title' => 'Yerel Ayarlar', + 'title-info' => 'Kullanıcı arayüzünde kullanılan dili tanımlar, örneğin Arapça (ar), İngilizce (en), İspanyolca (es), Farsça (fa) ve Türkçe (tr).', + ], + 'admin-logo' => [ + 'logo-image' => 'Logo Resmi', + 'title' => 'Yönetici Logosu', + 'title-info' => 'Yönetici paneliniz için logo resmini yapılandırın.', + ], + ], + 'settings' => [ + 'title' => 'Ayarlar', + 'info' => 'Ayarlarınızı burada güncelleyin.', + 'footer' => [ + 'info' => 'Powered by bölümünü burada yapılandırabiliriz.', + 'powered-by' => 'Powered by metin düzenleyici', + 'title' => 'Powered by Bölüm Yapılandırmaları', + ], + 'menu' => [ + 'activities' => 'Aktiviteler', + 'configuration' => 'Yapılandırma', + 'contacts' => 'İletişim', + 'dashboard' => 'Gösterge Paneli', + 'draft' => 'Taslak', + 'inbox' => 'Gelen Kutusu', + 'info' => 'Menü öğelerinin adlarını burada yapılandırabiliriz.', + 'leads' => 'Leadler', + 'mail' => 'Mail', + 'organizations' => 'Organizasyonlar', + 'outbox' => 'Gönderilenler', + 'persons' => 'Kişiler', + 'products' => 'Ürünler', + 'quotes' => 'Teklifler', + 'sent' => 'Gönderildi', + 'settings' => 'Ayarlar', + 'title' => 'Menü Öğesi Yapılandırmaları', + 'trash' => 'Çöp Kutusu', + ], + 'menu-color' => [ + 'brand-color' => 'Brand Color', + 'info' => 'Menü öğelerinin renklerini burada değiştirebiliriz.', + 'title' => 'Menü Öğesi Renk Yapılandırmaları', + ], + ], + ], + 'email' => [ + 'title' => 'Email Settings', + 'info' => 'Email configuration for the application.', + 'imap' => [ + 'title' => 'IMAP Settings', + 'info' => 'IMAP email configuration for receiving emails.', + 'account' => [ + 'title' => 'IMAP Account', + 'title-info' => 'Configure your IMAP account settings here.', + 'host' => 'Host', + 'port' => 'Port', + 'encryption' => 'Encryption Type', + 'validate-cert' => 'Validate SSL Certificate', + 'username' => 'IMAP Username', + 'password' => 'IMAP Password', + ], + ], + ], + 'magic-ai' => [ + 'title' => 'Sihirli AI', + 'info' => 'Uygulama için Sihirli AI yapılandırması.', + 'settings' => [ + 'api-key' => 'API Anahtarı', + 'api-key-info' => 'Her model için bir OpenRouter API anahtarı kullanmayı unutmayın. Bu, güvenliği ve performansı artırmak için basit bir adımdır.', + 'enable' => 'Etkinleştir', + 'info' => 'OpenRouter API Anahtarınız ile Magic AI deneyiminizi geliştirin. Şimdi entegre edin ve size özel, sorunsuz bir AI macerası yaşayın! Ayarları kolayca özelleştirin ve AI yolculuğunuzun kontrolünü elinize alın.', + 'other' => 'Diğer Model', + 'other-model' => 'Diğer modeller için OpenRouter\'dan Model ID kullanın.', + 'doc-generation' => 'DOC Oluşturma', + 'doc-generation-info' => 'DOC dosyalarından verileri otomatik olarak çıkartıp metin formatına dönüştürmek için DOC Oluşturma özelliğini etkinleştirin. Bu özelliği etkinleştirerek iş akışınızı kolaylaştırın ve verimliliğinizi artırın.', + 'title' => 'Genel Ayarlar', + 'models' => [ + 'deepseek-r1' => 'Deepseek R1 Distill-llama-8b', + 'gemini-2-0-flash-001' => 'Gemini 2.0 flash-001', + 'gpt-4o' => 'GPT-4.0', + 'gpt-4o-mini' => 'GPT-4.0 mini', + 'grok-2-1212' => 'Grok 2.12', + 'llama-3-2-3b-instruct' => 'Llama 3.2 3b Instruct', + 'title' => 'Modeller', + ], + ], + ], + ], + ], + 'dashboard' => [ + 'index' => [ + 'title' => 'Gösterge Paneli', + 'revenue' => [ + 'lost-revenue' => 'Kayıp Gelir', + 'won-revenue' => 'Kazançlı Gelir', + ], + 'over-all' => [ + 'average-lead-value' => 'Ortalama Lead Değeri', + 'total-leads' => 'Toplam Lead', + 'average-leads-per-day' => 'Günlük Ortalama Lead', + 'total-quotations' => 'Toplam Teklif', + 'total-persons' => 'Toplam Kişi', + 'total-organizations' => 'Toplam Organizasyon', + ], + 'total-leads' => [ + 'title' => 'Leadler', + 'total' => 'Toplam Lead', + 'won' => 'Kazanan Leadler', + 'lost' => 'Kayıp Leadler', + ], + 'revenue-by-sources' => [ + 'title' => 'Kaynaklara Göre Gelir', + 'empty-title' => 'Veri Bulunamadı', + 'empty-info' => 'Seçilen aralık için veri bulunamadı', + ], + 'revenue-by-types' => [ + 'title' => 'Türlere Göre Gelir', + 'empty-title' => 'Veri Bulunamadı', + 'empty-info' => 'Seçilen aralık için veri bulunamadı', + ], + 'top-selling-products' => [ + 'title' => 'En Çok Satılan Ürünler', + 'empty-title' => 'Ürün Bulunamadı', + 'empty-info' => 'Seçilen aralık için ürün bulunamadı', + ], + 'top-persons' => [ + 'title' => 'En İyi Kişiler', + 'empty-title' => 'Kişi Bulunamadı', + 'empty-info' => 'Seçilen aralık için kişi bulunamadı', + ], + 'open-leads-by-states' => [ + 'title' => 'Aşamalara Göre Açık Leadler', + 'empty-title' => 'Veri Bulunamadı', + 'empty-info' => 'Seçilen aralık için veri bulunamadı', + ], + ], + ], + 'layouts' => [ + 'app-version' => 'Sürüm: :version', + 'dashboard' => 'Gösterge Paneli', + 'leads' => 'Leadler', + 'quotes' => 'Teklifler', + 'quote' => 'Teklif', + 'mail' => [ + 'title' => 'Mail', + 'compose' => 'Yeni Mesaj', + 'inbox' => 'Gelen Kutusu', + 'draft' => 'Taslak', + 'outbox' => 'Gönderilenler', + 'sent' => 'Gönderildi', + 'trash' => 'Çöp Kutusu', + 'setting' => 'Ayar', + ], + 'activities' => 'Aktiviteler', + 'contacts' => 'İletişim', + 'persons' => 'Kişiler', + 'person' => 'Kişi', + 'organizations' => 'Organizasyonlar', + 'organization' => 'Organizasyon', + 'products' => 'Ürünler', + 'product' => 'Ürün', + 'settings' => 'Ayarlar', + 'user' => 'Kullanıcı', + 'user-info' => 'CRM’de tüm kullanıcılarınızı ve yetkilerini yönetin, ne yapmalarına izin verildiğini belirleyin.', + 'groups' => 'Gruplar', + 'groups-info' => 'CRM’den grupları ekleyin, düzenleyin veya silin', + 'roles' => 'Roller', + 'role' => 'Rol', + 'roles-info' => 'CRM’den rolleri ekleyin, düzenleyin veya silin', + 'users' => 'Kullanıcılar', + 'users-info' => 'CRM’den kullanıcıları ekleyin, düzenleyin veya silin', + 'lead' => 'Lead', + 'lead-info' => 'CRM’de tüm lead ayarlarınızı yönetin', + 'pipelines' => 'Pipeline’lar', + 'pipelines-info' => 'CRM’den pipeline’ları ekleyin, düzenleyin veya silin', + 'sources' => 'Kaynaklar', + 'sources-info' => 'CRM’den kaynakları ekleyin, düzenleyin veya silin', + 'types' => 'Türler', + 'types-info' => 'CRM’den türleri ekleyin, düzenleyin veya silin', + 'automation' => 'Otomasyon', + 'automation-info' => 'CRM’de tüm otomasyon ayarlarınızı yönetin', + 'attributes' => 'Nitelikler', + 'attribute' => 'Nitelik', + 'attributes-info' => 'CRM’den nitelikleri ekleyin, düzenleyin veya silin', + 'email-templates' => 'E-posta Şablonları', + 'email' => 'E-posta', + 'email-templates-info' => 'CRM’den e-posta şablonları ekleyin, düzenleyin veya silin', + 'events' => 'Etkinlikler', + 'events-info' => 'CRM üzerinden etkinlikleri ekleyin, düzenleyin veya silin', + 'campaigns' => 'Kampanyalar', + 'campaigns-info' => 'CRM üzerinden kampanyaları ekleyin, düzenleyin veya silin', + 'workflows' => 'İş Akışları', + 'workflows-info' => 'CRM’den iş akışlarını ekleyin, düzenleyin veya silin', + 'webhooks' => 'Webhooklar', + 'webhooks-info' => 'CRM’den webhookları ekleyin, düzenleyin veya silin', + 'other-settings' => 'Diğer Ayarlar', + 'other-settings-info' => 'CRM’de tüm ekstra ayarlarınızı yönetin', + 'tags' => 'Etiketler', + 'tags-info' => 'CRM’den etiketleri ekleyin, düzenleyin veya silin', + 'my-account' => 'Hesabım', + 'sign-out' => 'Çıkış Yap', + 'back' => 'Geri', + 'name' => 'Ad', + 'configuration' => 'Yapılandırma', + 'howdy' => 'Merhaba!', + 'warehouses' => 'Depolar', + 'warehouse' => 'Depo', + 'warehouses-info' => 'CRM’den depoları ekleyin, düzenleyin veya silin', + 'data_transfer' => 'Veri Transferi', + 'data_transfer_info' => 'CRM’de kişiler, ürünler ve potansiyel müşterilere ilişkin veri transferi ayarlarını yönetin', + ], + 'user' => [ + 'account' => [ + 'name' => 'İsim', + 'email' => 'E-posta', + 'password' => 'Şifre', + 'my_account' => 'Hesabım', + 'update_details' => 'Bilgileri Güncelle', + 'current_password' => 'Mevcut şifre', + 'confirm_password' => 'Şifreyi onayla', + 'password-match' => 'Mevcut şifre eşleşmiyor.', + 'account-save' => 'Hesap değişiklikleri başarıyla kaydedildi.', + 'permission-denied' => 'İzin Reddedildi', + 'remove-image' => 'Görseli Kaldır', + 'upload_image_pix' => 'Profil Görseli Yükle (100px x 100px)', + 'upload_image_format' => 'PNG veya JPG Formatında', + 'image_upload_message' => 'Sadece görseller (.jpeg, .jpg, .png, ..) izinlidir.', + ], + ], + 'emails' => [ + 'common' => [ + 'dear' => 'Sevgili :name', + 'cheers' => 'Saygılar,
    :app_name Ekibi', + 'user' => [ + 'dear' => 'Sevgili :username', + 'create-subject' => 'Bir üye olarak eklendiniz.', + 'create-body' => 'Tebrikler! Artık ekibimizin bir üyesisiniz.', + 'forget-password' => [ + 'subject' => 'Müşteri Şifre Sıfırlama', + 'dear' => 'Sevgili :username', + 'reset-password' => 'Şifreyi Sıfırla', + 'info' => 'Bu e-postayı almanız, hesabınız için bir şifre sıfırlama talebi aldığımız anlamına gelir', + 'final-summary' => 'Eğer şifre sıfırlama talebinde bulunmadıysanız, herhangi bir ek işlem yapmanıza gerek yoktur', + 'thanks' => 'Teşekkürler!', + ], + ], + ], + ], + 'validations' => [ + 'message' => [ + 'decimal' => ':attribute ondalıklı bir sayı olmalıdır.', + ], + ], + 'errors' => [ + 'dashboard' => 'Kontrol Paneli', + 'go-back' => 'Geri Dön', + 'support' => 'Sorun devam ederse, yardım için bize :email adresinden ulaşın.', + '404' => [ + 'description' => 'Oops! Aradığınız sayfa tatilde. Aradığınız şeyi bulamadık gibi görünüyor.', + 'title' => '404 Sayfa Bulunamadı', + ], + '401' => [ + 'description' => 'Oops! Bu sayfaya erişim izniniz yok gibi görünüyor. Gerekli yetkilere sahip değilsiniz.', + 'title' => '401 Yetkisiz', + ], + '403' => [ + 'description' => 'Oops! Bu sayfa erişime kapalı. Bu içeriği görüntülemek için gerekli izinlere sahip değilsiniz gibi görünüyor.', + 'title' => '403 Yasak', + ], + '500' => [ + 'description' => 'Oops! Bir şeyler ters gitti. Aradığınız sayfa yüklenirken sorun yaşıyoruz gibi görünüyor.', + 'title' => '500 Sunucu Hatası', + ], + '503' => [ + 'description' => 'Oops! Görünüşe göre geçici bir bakım nedeniyle kapalıyız. Lütfen kısa süre sonra tekrar kontrol edin.', + 'title' => '503 Hizmet Kullanılamıyor', + ], + ], + 'export' => [ + 'csv' => 'CSV', + 'download' => 'İndir', + 'export' => 'Dışa Aktar', + 'no-records' => 'Dışa aktarılacak kayıt bulunamadı.', + 'xls' => 'XLS', + 'xlsx' => 'XLSX', + ], +]; diff --git a/packages/Webkul/Admin/src/Resources/lang/vi/app.php b/packages/Webkul/Admin/src/Resources/lang/vi/app.php new file mode 100644 index 0000000..b853e79 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/lang/vi/app.php @@ -0,0 +1,2225 @@ + [ + 'leads' => 'Những Khách hàng tiềm năng', + 'lead' => 'Khách hàng tiềm năng', + 'quotes' => 'Báo giá', + 'mail' => 'Thư', + 'inbox' => 'Hộp thư đến', + 'draft' => 'Thư nháp', + 'outbox' => 'Hộp thư đi', + 'sent' => 'Đã gửi', + 'trash' => 'Thùng rác', + 'activities' => 'Hoạt động', + 'webhook' => 'Webhook', + 'contacts' => 'Danh bạ', + 'persons' => 'Cá nhân', + 'organizations' => 'Tổ chức', + 'products' => 'Sản phẩm', + 'settings' => 'Cài đặt', + 'groups' => 'Nhóm', + 'roles' => 'Vai trò', + 'users' => 'Người dùng', + 'user' => 'Người dùng', + 'automation' => 'Tự động hóa', + 'attributes' => 'Thuộc tính', + 'pipelines' => 'Quy trình', + 'sources' => 'Nguồn', + 'types' => 'Loại', + 'email-templates' => 'Mẫu email', + 'workflows' => 'Quy trình làm việc', + 'other-settings' => 'Cài đặt khác', + 'tags' => 'Thẻ', + 'configuration' => 'Cấu hình', + 'create' => 'Tạo mới', + 'edit' => 'Chỉnh sửa', + 'view' => 'Xem', + 'print' => 'In', + 'delete' => 'Xóa', + 'export' => 'Xuất khẩu', + 'mass-delete' => 'Xóa hàng loạt', + 'data-transfer' => 'Data Transfer', + 'imports' => 'Imports', + 'import' => 'Import', + 'event' => 'Sự kiện', + 'campaigns' => 'Chiến dịch', + ], + 'users' => [ + 'activate-warning' => 'Tài khoản của bạn chưa được kích hoạt. Vui lòng liên hệ quản trị viên.', + 'login-error' => 'Thông tin đăng nhập không khớp với hồ sơ của chúng tôi.', + 'not-permission' => 'Bạn không có quyền truy cập vào bảng quản trị.', + 'login' => [ + 'email' => 'Địa chỉ Email', + 'forget-password-link' => 'Quên Mật khẩu?', + 'password' => 'Mật khẩu', + 'submit-btn' => 'Đăng Nhập', + 'title' => 'Đăng Nhập', + ], + 'forget-password' => [ + 'create' => [ + 'email' => 'Email Đã Đăng Ký', + 'email-not-exist' => 'Email Không Tồn Tại', + 'page-title' => 'Quên Mật khẩu', + 'reset-link-sent' => 'Liên kết đặt lại mật khẩu đã được gửi', + 'sign-in-link' => 'Quay lại Đăng Nhập?', + 'submit-btn' => 'Đặt Lại', + 'title' => 'Khôi Phục Mật khẩu', + ], + ], + 'reset-password' => [ + 'back-link-title' => 'Quay lại Đăng Nhập?', + 'confirm-password' => 'Xác Nhận Mật Khẩu', + 'email' => 'Email Đã Đăng Ký', + 'password' => 'Mật Khẩu', + 'submit-btn' => 'Đặt Lại Mật Khẩu', + 'title' => 'Đặt Lại Mật Khẩu', + ], + ], + 'account' => [ + 'edit' => [ + 'back-btn' => 'Quay Lại', + 'change-password' => 'Đổi Mật Khẩu', + 'confirm-password' => 'Xác Nhận Mật Khẩu', + 'current-password' => 'Mật Khẩu Hiện Tại', + 'email' => 'Email', + 'general' => 'Chung', + 'invalid-password' => 'Mật khẩu hiện tại bạn nhập không đúng.', + 'name' => 'Tên', + 'password' => 'Mật Khẩu', + 'profile-image' => 'Ảnh Hồ Sơ', + 'save-btn' => 'Lưu Tài Khoản', + 'title' => 'Tài Khoản Của Tôi', + 'update-success' => 'Tài khoản đã được cập nhật thành công', + 'upload-image-info' => 'Tải lên Ảnh Hồ Sơ (110px X 110px) ở định dạng PNG hoặc JPG', + ], + ], + 'components' => [ + 'activities' => [ + 'actions' => [ + 'mail' => [ + 'btn' => 'Thư', + 'title' => 'Soạn thư', + 'to' => 'Tới', + 'enter-emails' => 'Nhấn enter để thêm email', + 'cc' => 'CC', + 'bcc' => 'BCC', + 'subject' => 'Chủ đề', + 'send-btn' => 'Gửi', + 'message' => 'Tin nhắn', + ], + 'file' => [ + 'btn' => 'Tệp', + 'title' => 'Thêm tệp', + 'title-control' => 'Tiêu đề', + 'name' => 'Tên', + 'description' => 'Mô tả', + 'file' => 'Tệp', + 'save-btn' => 'Lưu tệp', + ], + 'note' => [ + 'btn' => 'Ghi chú', + 'title' => 'Thêm ghi chú', + 'comment' => 'Bình luận', + 'save-btn' => 'Lưu ghi chú', + ], + 'activity' => [ + 'btn' => 'Hoạt động', + 'title' => 'Thêm hoạt động', + 'title-control' => 'Tiêu đề', + 'description' => 'Mô tả', + 'schedule-from' => 'Lịch từ', + 'schedule-to' => 'Lịch đến', + 'location' => 'Địa điểm', + 'call' => 'Cuộc gọi', + 'meeting' => 'Cuộc họp', + 'lunch' => 'Bữa trưa', + 'save-btn' => 'Lưu hoạt động', + 'participants' => [ + 'title' => 'Người tham gia', + 'placeholder' => 'Nhập để tìm kiếm người tham gia', + 'users' => 'Người dùng', + 'persons' => 'Người', + 'no-results' => 'Không có kết quả...', + ], + ], + ], + 'index' => [ + 'all' => 'Tất cả', + 'bcc' => 'Bcc', + 'by-user' => 'Bởi :user', + 'calls' => 'Cuộc gọi', + 'cc' => 'Cc', + 'change-log' => 'Nhật ký thay đổi', + 'delete' => 'Xóa', + 'edit' => 'Chỉnh sửa', + 'emails' => 'Email', + 'empty' => 'Trống', + 'files' => 'Tệp tin', + 'from' => 'Từ', + 'location' => 'Địa điểm', + 'lunches' => 'Bữa trưa', + 'mark-as-done' => 'Đánh dấu hoàn thành', + 'meetings' => 'Cuộc họp', + 'notes' => 'Ghi chú', + 'participants' => 'Người tham gia', + 'planned' => 'Đã lên kế hoạch', + 'quotes' => 'Báo giá', + 'scheduled-on' => 'Lên lịch vào', + 'system' => 'Hệ thống', + 'to' => 'Đến', + 'unlink' => 'Gỡ liên kết', + 'view' => 'Xem', + 'empty-placeholders' => [ + 'all' => [ + 'title' => 'Không tìm thấy hoạt động nào', + 'description' => 'Không có hoạt động nào được tìm thấy. Bạn có thể thêm hoạt động bằng cách nhấn nút Hoạt động ở bảng bên trái.', + ], + 'planned' => [ + 'title' => 'Không tìm thấy hoạt động đã lên kế hoạch', + 'description' => 'Không có hoạt động đã lên kế hoạch nào được tìm thấy. Thêm hoạt động bằng cách nhấn nút Hoạt động ở bảng bên trái.', + ], + 'notes' => [ + 'title' => 'Không tìm thấy ghi chú', + 'description' => 'Không có ghi chú nào được tìm thấy. Thêm ghi chú bằng cách nhấn nút Ghi chú ở bảng bên trái.', + ], + 'calls' => [ + 'title' => 'Không tìm thấy cuộc gọi', + 'description' => 'Không có cuộc gọi nào được tìm thấy. Thêm cuộc gọi bằng cách nhấn nút Hoạt động và chọn loại Cuộc gọi.', + ], + 'meetings' => [ + 'title' => 'Không tìm thấy cuộc họp', + 'description' => 'Không có cuộc họp nào được tìm thấy. Thêm cuộc họp bằng cách nhấn nút Hoạt động và chọn loại Cuộc họp.', + ], + 'lunches' => [ + 'title' => 'Không tìm thấy buổi ăn trưa', + 'description' => 'Không có buổi ăn trưa nào được tìm thấy. Thêm ăn trưa bằng cách nhấn nút Hoạt động và chọn loại Ăn trưa.', + ], + 'files' => [ + 'title' => 'Không tìm thấy tệp', + 'description' => 'Không có tệp nào được tìm thấy. Thêm tệp bằng cách nhấn nút Tệp ở bảng bên trái.', + ], + 'emails' => [ + 'title' => 'Không tìm thấy email', + 'description' => 'Không có email nào được tìm thấy. Thêm email bằng cách nhấn nút Thư ở bảng bên trái.', + ], + 'system' => [ + 'title' => 'Không tìm thấy nhật ký thay đổi', + 'description' => 'Không có nhật ký thay đổi nào được tìm thấy.', + ], + ], + ], + ], + 'media' => [ + 'images' => [ + 'add-image-btn' => 'Thêm hình ảnh', + 'ai-add-image-btn' => 'Magic AI', + 'allowed-types' => 'png, jpeg, jpg', + 'not-allowed-error' => 'Chỉ chấp nhận tệp hình ảnh (.jpeg, .jpg, .png, ..).', + 'placeholders' => [ + 'front' => 'Mặt trước', + 'next' => 'Kế tiếp', + 'size' => 'Kích thước', + 'use-cases' => 'Trường hợp sử dụng', + 'zoom' => 'Thu phóng', + ], + ], + 'videos' => [ + 'add-video-btn' => 'Thêm video', + 'allowed-types' => 'mp4, webm, mkv', + 'not-allowed-error' => 'Chỉ chấp nhận tệp video (.mp4, .mov, .ogg ..).', + ], + ], + 'datagrid' => [ + 'index' => [ + 'no-records-selected' => 'Chưa có bản ghi nào được chọn.', + 'must-select-a-mass-action-option' => 'Bạn phải chọn một tùy chọn hành động hàng loạt.', + 'must-select-a-mass-action' => 'Bạn phải chọn một hành động hàng loạt.', + ], + 'toolbar' => [ + 'length-of' => ':length của', + 'of' => 'của', + 'per-page' => 'Mỗi Trang', + 'results' => ':total Kết quả', + 'delete' => 'Xóa', + 'selected' => ':total Mục đã chọn', + 'mass-actions' => [ + 'submit' => 'Gửi', + 'select-option' => 'Chọn Tùy chọn', + 'select-action' => 'Chọn Hành động', + ], + 'filter' => [ + 'apply-filters-btn' => 'Áp dụng Bộ lọc', + 'back-btn' => 'Quay lại', + 'create-new-filter' => 'Tạo Bộ lọc Mới', + 'custom-filters' => 'Bộ lọc Tùy chỉnh', + 'delete-error' => 'Đã xảy ra lỗi khi xóa bộ lọc, vui lòng thử lại.', + 'delete-success' => 'Bộ lọc đã được xóa thành công.', + 'empty-description' => 'Không có bộ lọc nào được chọn để lưu. Vui lòng chọn bộ lọc để lưu.', + 'empty-title' => 'Thêm Bộ lọc để Lưu', + 'name' => 'Tên', + 'quick-filters' => 'Bộ lọc Nhanh', + 'save-btn' => 'Lưu', + 'save-filter' => 'Lưu Bộ lọc', + 'saved-success' => 'Bộ lọc đã được lưu thành công.', + 'selected-filters' => 'Bộ lọc đã chọn', + 'title' => 'Bộ lọc', + 'update' => 'Cập nhật', + 'update-filter' => 'Cập nhật Bộ lọc', + 'updated-success' => 'Bộ lọc đã được cập nhật thành công.', + ], + 'search' => [ + 'title' => 'Tìm kiếm', + ], + ], + 'filters' => [ + 'select' => 'Chọn', + 'title' => 'Bộ lọc', + 'dropdown' => [ + 'searchable' => [ + 'at-least-two-chars' => 'Nhập ít nhất 2 ký tự...', + 'no-results' => 'Không tìm thấy kết quả...', + ], + ], + 'custom-filters' => [ + 'clear-all' => 'Xóa tất cả', + 'title' => 'Bộ lọc Tùy chỉnh', + ], + 'boolean-options' => [ + 'false' => 'Sai', + 'true' => 'Đúng', + ], + 'date-options' => [ + 'last-month' => 'Tháng trước', + 'last-six-months' => '6 Tháng trước', + 'last-three-months' => '3 Tháng trước', + 'this-month' => 'Tháng này', + 'this-week' => 'Tuần này', + 'this-year' => 'Năm nay', + 'today' => 'Hôm nay', + 'yesterday' => 'Hôm qua', + ], + ], + 'table' => [ + 'actions' => 'Hành động', + 'no-records-available' => 'Không có Bản ghi nào.', + ], + ], + 'modal' => [ + 'confirm' => [ + 'agree-btn' => 'Đồng ý', + 'disagree-btn' => 'Không đồng ý', + 'message' => 'Bạn có chắc chắn muốn thực hiện hành động này không?', + 'title' => 'Bạn có chắc chắn?', + ], + ], + 'tags' => [ + 'index' => [ + 'title' => 'Thẻ', + 'added-tags' => 'Thẻ đã thêm', + 'save-btn' => 'Lưu Thẻ', + 'placeholder' => 'Nhập để tìm thẻ', + 'add-tag' => 'Thêm ":term"...', + 'aquarelle-red' => 'Đỏ Aquarelle', + 'crushed-cashew' => 'Hạt điều nghiền', + 'beeswax' => 'Sáp ong', + 'lemon-chiffon' => 'Vàng Chanh', + 'snow-flurry' => 'Tuyết Bay', + 'honeydew' => 'Mật Ong', + ], + ], + 'layouts' => [ + 'powered-by' => [ + 'description' => 'Được hỗ trợ bởi :krayin, một dự án mã nguồn mở được phát triển bởi :webkul.', + ], + 'header' => [ + 'mega-search' => [ + 'title' => 'Tìm kiếm Mega', + 'tabs' => [ + 'leads' => 'Khách hàng tiềm năng', + 'quotes' => 'Báo giá', + 'persons' => 'Người', + 'products' => 'Sản phẩm', + ], + 'explore-all-products' => 'Khám phá tất cả Sản phẩm', + 'explore-all-leads' => 'Khám phá tất cả Khách hàng tiềm năng', + 'explore-all-contacts' => 'Khám phá tất cả Liên hệ', + 'explore-all-quotes' => 'Khám phá tất cả Báo giá', + 'explore-all-matching-products' => 'Khám phá tất cả sản phẩm khớp với ":query" (:count)', + 'explore-all-matching-leads' => 'Khám phá tất cả khách hàng tiềm năng khớp với ":query" (:count)', + 'explore-all-matching-contacts' => 'Khám phá tất cả liên hệ khớp với ":query" (:count)', + 'explore-all-matching-quotes' => 'Khám phá tất cả báo giá khớp với ":query" (:count)', + ], + ], + ], + 'attributes' => [ + 'edit' => [ + 'delete' => 'Xóa', + ], + 'lookup' => [ + 'click-to-add' => 'Nhấn để thêm', + 'search' => 'Tìm kiếm...', + 'no-result-found' => 'Không tìm thấy kết quả', + ], + ], + 'lookup' => [ + 'click-to-add' => 'Nhấn để Thêm', + 'no-results' => 'Không tìm thấy kết quả', + 'add-as-new' => 'Thêm như mới', + 'search' => 'Tìm kiếm...', + ], + 'flash-group' => [ + 'success' => 'Thành công', + 'error' => 'Lỗi', + 'warning' => 'Cảnh báo', + 'info' => 'Thông tin', + ], + 'tiny-mce' => [ + 'http-error' => 'Lỗi HTTP', + 'invalid-json' => 'Phản hồi JSON không hợp lệ từ máy chủ.', + 'upload-failed' => 'Tải tệp lên không thành công. Vui lòng thử lại.', + ], + ], + 'quotes' => [ + 'index' => [ + 'title' => 'Báo giá', + 'create-btn' => 'Tạo Báo giá', + 'create-success' => 'Báo giá đã được tạo thành công.', + 'update-success' => 'Báo giá đã được cập nhật thành công.', + 'delete-success' => 'Báo giá đã được xóa thành công.', + 'delete-failed' => 'Không thể xóa báo giá.', + 'datagrid' => [ + 'subject' => 'Chủ đề', + 'sales-person' => 'Nhân viên bán hàng', + 'expired-at' => 'Hết hạn vào', + 'created-at' => 'Tạo vào', + 'person' => 'Người', + 'subtotal' => 'Tổng phụ', + 'discount' => 'Giảm giá', + 'tax' => 'Thuế', + 'adjustment' => 'Điều chỉnh', + 'grand-total' => 'Tổng cộng', + 'edit' => 'Chỉnh sửa', + 'delete' => 'Xóa', + 'print' => 'In', + ], + 'pdf' => [ + 'adjustment' => 'Điều chỉnh', + 'amount' => 'Số tiền', + 'billing-address' => 'Địa chỉ thanh toán', + 'date' => 'Ngày', + 'discount' => 'Giảm giá', + 'expired-at' => 'Hết hạn vào', + 'grand-total' => 'Tổng cộng', + 'person' => 'Người', + 'price' => 'Giá', + 'product-name' => 'Tên sản phẩm', + 'quantity' => 'Số lượng', + 'quote-id' => 'ID Báo giá', + 'sales-person' => 'Nhân viên bán hàng', + 'shipping-address' => 'Địa chỉ giao hàng', + 'sku' => 'Mã sản phẩm (SKU)', + 'sub-total' => 'Tổng phụ', + 'subject' => 'Chủ đề', + 'tax' => 'Thuế', + 'title' => 'Báo giá', + ], + ], + 'create' => [ + 'title' => 'Tạo Báo giá', + 'save-btn' => 'Lưu Báo giá', + 'quote-info' => 'Thông tin Báo giá', + 'quote-info-info' => 'Nhập thông tin cơ bản của báo giá.', + 'address-info' => 'Thông tin Địa chỉ', + 'address-info-info' => 'Thông tin về địa chỉ liên quan đến báo giá.', + 'quote-items' => 'Mục Báo giá', + 'search-products' => 'Tìm kiếm Sản phẩm', + 'link-to-lead' => 'Liên kết tới lead', + 'quote-item-info' => 'Thêm Yêu cầu Sản phẩm cho báo giá này.', + 'quote-name' => 'Tên Báo giá', + 'quantity' => 'Số lượng', + 'price' => 'Giá', + 'discount' => 'Giảm giá', + 'tax' => 'Thuế', + 'total' => 'Tổng cộng', + 'amount' => 'Số tiền', + 'add-item' => '+ Thêm Mục', + 'sub-total' => 'Tổng phụ (:symbol)', + 'total-discount' => 'Giảm giá (:symbol)', + 'total-tax' => 'Thuế (:symbol)', + 'total-adjustment' => 'Điều chỉnh (:symbol)', + 'grand-total' => 'Tổng cộng (:symbol)', + 'discount-amount' => 'Số tiền giảm giá', + 'tax-amount' => 'Số tiền thuế', + 'adjustment-amount' => 'Số tiền điều chỉnh', + 'product-name' => 'Tên Sản phẩm', + 'action' => 'Hành động', + ], + 'edit' => [ + 'title' => 'Chỉnh sửa Báo giá', + 'save-btn' => 'Lưu Báo giá', + 'quote-info' => 'Thông tin Báo giá', + 'quote-info-info' => 'Nhập thông tin cơ bản của báo giá.', + 'address-info' => 'Thông tin Địa chỉ', + 'address-info-info' => 'Thông tin về địa chỉ liên quan đến báo giá.', + 'quote-items' => 'Mục Báo giá', + 'link-to-lead' => 'Liên kết tới lead', + 'quote-item-info' => 'Thêm Yêu cầu Sản phẩm cho báo giá này.', + 'quote-name' => 'Tên Báo giá', + 'quantity' => 'Số lượng', + 'price' => 'Giá', + 'search-products' => 'Tìm kiếm Sản phẩm', + 'discount' => 'Giảm giá', + 'tax' => 'Thuế', + 'total' => 'Tổng cộng', + 'amount' => 'Số tiền', + 'add-item' => '+ Thêm Mục', + 'sub-total' => 'Tổng phụ (:symbol)', + 'total-discount' => 'Giảm giá (:symbol)', + 'total-tax' => 'Thuế (:symbol)', + 'total-adjustment' => 'Điều chỉnh (:symbol)', + 'grand-total' => 'Tổng cộng (:symbol)', + 'discount-amount' => 'Số tiền giảm giá', + 'tax-amount' => 'Số tiền thuế', + 'adjustment-amount' => 'Số tiền điều chỉnh', + 'product-name' => 'Tên Sản phẩm', + 'action' => 'Hành động', + ], + ], + 'contacts' => [ + 'persons' => [ + 'index' => [ + 'title' => 'Người', + 'create-btn' => 'Tạo Người', + 'create-success' => 'Người đã được tạo thành công.', + 'update-success' => 'Người đã được cập nhật thành công.', + 'all-delete-success' => 'Tất cả người được chọn đã được xóa thành công.', + 'partial-delete-warning' => 'Một số người đã được xóa thành công. Những người khác không thể xóa vì có liên kết với khách hàng tiềm năng.', + 'none-delete-warning' => 'Không thể xóa bất kỳ người nào được chọn vì họ có liên kết với khách hàng tiềm năng.', + 'no-selection' => 'Chưa chọn người nào để xóa.', + 'delete-failed' => 'Xóa người được chọn không thành công.', + 'datagrid' => [ + 'contact-numbers' => 'Số Liên hệ', + 'delete' => 'Xóa', + 'edit' => 'Chỉnh sửa', + 'emails' => 'Email', + 'id' => 'ID', + 'view' => 'Xem', + 'name' => 'Tên', + 'organization-name' => 'Tên Tổ chức', + ], + ], + 'view' => [ + 'title' => ':name', + 'about-person' => 'Thông tin về Người', + 'about-organization' => 'Thông tin về Tổ chức', + 'activities' => [ + 'index' => [ + 'all' => 'Tất cả', + 'calls' => 'Cuộc gọi', + 'meetings' => 'Cuộc họp', + 'lunches' => 'Bữa trưa', + 'files' => 'Tệp', + 'quotes' => 'Báo giá', + 'notes' => 'Ghi chú', + 'emails' => 'Email', + 'by-user' => 'Bởi :user', + 'scheduled-on' => 'Đã lên lịch vào', + 'location' => 'Vị trí', + 'participants' => 'Người tham gia', + 'mark-as-done' => 'Đánh dấu là Đã hoàn thành', + 'delete' => 'Xóa', + 'edit' => 'Chỉnh sửa', + ], + 'actions' => [ + 'mail' => [ + 'btn' => 'Mail', + 'title' => 'Soạn Mail', + 'to' => 'Đến', + 'cc' => 'CC', + 'bcc' => 'BCC', + 'subject' => 'Chủ đề', + 'send-btn' => 'Gửi', + 'message' => 'Tin nhắn', + ], + 'file' => [ + 'btn' => 'Tệp', + 'title' => 'Thêm Tệp', + 'title-control' => 'Tiêu đề', + 'name' => 'Tên Tệp', + 'description' => 'Mô tả', + 'file' => 'Tệp', + 'save-btn' => 'Lưu Tệp', + ], + 'note' => [ + 'btn' => 'Ghi chú', + 'title' => 'Thêm Ghi chú', + 'comment' => 'Bình luận', + 'save-btn' => 'Lưu Ghi chú', + ], + 'activity' => [ + 'btn' => 'Hoạt động', + 'title' => 'Thêm Hoạt động', + 'title-control' => 'Tiêu đề', + 'description' => 'Mô tả', + 'schedule-from' => 'Lên lịch từ', + 'schedule-to' => 'Lên lịch đến', + 'location' => 'Vị trí', + 'call' => 'Cuộc gọi', + 'meeting' => 'Cuộc họp', + 'lunch' => 'Bữa trưa', + 'save-btn' => 'Lưu Hoạt động', + ], + ], + ], + 'tags' => [ + 'create-success' => 'Thẻ được tạo thành công.', + 'destroy-success' => 'Thẻ đã được xóa thành công.', + ], + ], + 'create' => [ + 'title' => 'Tạo Người', + 'save-btn' => 'Lưu Người', + ], + 'edit' => [ + 'title' => 'Chỉnh sửa Người', + 'save-btn' => 'Lưu Người', + ], + ], + 'organizations' => [ + 'index' => [ + 'title' => 'Tổ chức', + 'create-btn' => 'Tạo Tổ chức', + 'create-success' => 'Tổ chức đã được tạo thành công.', + 'update-success' => 'Tổ chức đã được cập nhật thành công.', + 'delete-success' => 'Tổ chức đã được xóa thành công.', + 'delete-failed' => 'Không thể xóa tổ chức.', + 'datagrid' => [ + 'delete' => 'Xóa', + 'edit' => 'Chỉnh sửa', + 'id' => 'ID', + 'name' => 'Tên', + 'persons-count' => 'Số người', + ], + ], + 'create' => [ + 'title' => 'Tạo Tổ chức', + 'save-btn' => 'Lưu Tổ chức', + ], + 'edit' => [ + 'title' => 'Chỉnh sửa Tổ chức', + 'save-btn' => 'Lưu Tổ chức', + ], + ], + ], + 'products' => [ + 'index' => [ + 'title' => 'Sản phẩm', + 'create-btn' => 'Tạo Sản phẩm', + 'create-success' => 'Sản phẩm đã được tạo thành công.', + 'update-success' => 'Sản phẩm đã được cập nhật thành công.', + 'delete-success' => 'Sản phẩm đã được xóa thành công.', + 'delete-failed' => 'Không thể xóa sản phẩm.', + 'datagrid' => [ + 'allocated' => 'Đã phân bổ', + 'delete' => 'Xóa', + 'edit' => 'Chỉnh sửa', + 'id' => 'ID', + 'in-stock' => 'Có sẵn', + 'name' => 'Tên', + 'on-hand' => 'Sẵn có', + 'tag-name' => 'Tên thẻ', + 'price' => 'Giá', + 'sku' => 'SKU', + 'view' => 'Xem', + ], + ], + 'create' => [ + 'save-btn' => 'Lưu Sản phẩm', + 'title' => 'Tạo Sản phẩm', + 'general' => 'Thông tin chung', + 'price' => 'Giá', + ], + 'edit' => [ + 'title' => 'Chỉnh sửa Sản phẩm', + 'save-btn' => 'Lưu Sản phẩm', + 'general' => 'Thông tin chung', + 'price' => 'Giá', + ], + 'view' => [ + 'sku' => 'SKU', + 'all' => 'Tất cả', + 'notes' => 'Ghi chú', + 'files' => 'Tệp', + 'inventories' => 'Tồn kho', + 'change-logs' => 'Nhật ký thay đổi', + 'attributes' => [ + 'about-product' => 'Thông tin về sản phẩm', + ], + 'inventory' => [ + 'source' => 'Nguồn', + 'in-stock' => 'Có sẵn', + 'allocated' => 'Đã phân bổ', + 'on-hand' => 'Sẵn có', + 'actions' => 'Hành động', + 'assign' => 'Phân bổ', + 'add-source' => 'Thêm nguồn', + 'location' => 'Vị trí', + 'add-more' => 'Thêm nữa', + 'save' => 'Lưu', + ], + ], + ], + 'settings' => [ + 'title' => 'Cài đặt', + 'groups' => [ + 'index' => [ + 'create-btn' => 'Tạo Nhóm', + 'title' => 'Nhóm', + 'create-success' => 'Tạo nhóm thành công.', + 'update-success' => 'Cập nhật nhóm thành công.', + 'destroy-success' => 'Xóa nhóm thành công.', + 'delete-failed' => 'Không thể xóa nhóm.', + 'delete-failed-associated-users' => 'Không thể xóa nhóm vì đang được sử dụng bởi người dùng.', + 'datagrid' => [ + 'delete' => 'Xóa', + 'description' => 'Mô tả', + 'edit' => 'Chỉnh sửa', + 'id' => 'ID', + 'name' => 'Tên', + ], + 'edit' => [ + 'title' => 'Chỉnh sửa Nhóm', + ], + 'create' => [ + 'name' => 'Tên', + 'title' => 'Tạo Nhóm', + 'description' => 'Mô tả', + 'save-btn' => 'Lưu Nhóm', + ], + ], + ], + 'roles' => [ + 'index' => [ + 'being-used' => 'Vai trò không thể xóa, vì đang được sử dụng trong người dùng quản trị.', + 'create-btn' => 'Tạo Vai trò', + 'create-success' => 'Vai trò đã được tạo thành công.', + 'current-role-delete-error' => 'Không thể xóa vai trò đã gán cho người dùng hiện tại.', + 'delete-failed' => 'Không thể xóa vai trò.', + 'delete-success' => 'Vai trò đã được xóa thành công.', + 'last-delete-error' => 'Cần ít nhất một vai trò.', + 'settings' => 'Cài đặt', + 'title' => 'Vai trò', + 'update-success' => 'Vai trò đã được cập nhật thành công.', + 'user-define-error' => 'Không thể xóa vai trò hệ thống.', + 'datagrid' => [ + 'all' => 'Tất cả', + 'custom' => 'Tùy chỉnh', + 'delete' => 'Xóa', + 'description' => 'Mô tả', + 'edit' => 'Chỉnh sửa', + 'id' => 'ID', + 'name' => 'Tên', + 'permission-type' => 'Loại quyền', + ], + ], + 'create' => [ + 'access-control' => 'Kiểm soát truy cập', + 'all' => 'Tất cả', + 'back-btn' => 'Quay lại', + 'custom' => 'Tùy chỉnh', + 'description' => 'Mô tả', + 'general' => 'Thông tin chung', + 'name' => 'Tên', + 'permissions' => 'Quyền', + 'save-btn' => 'Lưu Vai trò', + 'title' => 'Tạo Vai trò', + ], + 'edit' => [ + 'access-control' => 'Kiểm soát truy cập', + 'all' => 'Tất cả', + 'back-btn' => 'Quay lại', + 'custom' => 'Tùy chỉnh', + 'description' => 'Mô tả', + 'general' => 'Thông tin chung', + 'name' => 'Tên', + 'permissions' => 'Quyền', + 'save-btn' => 'Lưu Vai trò', + 'title' => 'Chỉnh sửa Vai trò', + ], + ], + 'types' => [ + 'index' => [ + 'create-btn' => 'Tạo Loại', + 'create-success' => 'Loại đã được tạo thành công.', + 'delete-failed' => 'Không thể xóa loại.', + 'delete-success' => 'Loại đã được xóa thành công.', + 'title' => 'Các Loại', + 'update-success' => 'Loại đã được cập nhật thành công.', + 'datagrid' => [ + 'delete' => 'Xóa', + 'description' => 'Mô tả', + 'edit' => 'Chỉnh sửa', + 'id' => 'ID', + 'name' => 'Tên', + ], + 'create' => [ + 'name' => 'Tên', + 'save-btn' => 'Lưu Loại', + 'title' => 'Tạo Loại', + ], + 'edit' => [ + 'title' => 'Chỉnh sửa Loại', + ], + ], + ], + 'sources' => [ + 'index' => [ + 'title' => 'Nguồn', + 'create-btn' => 'Tạo Nguồn', + 'create-success' => 'Tạo nguồn thành công.', + 'delete-failed' => 'Không thể xóa nguồn.', + 'delete-success' => 'Xóa nguồn thành công.', + 'update-success' => 'Cập nhật nguồn thành công.', + 'delete-failed-associated-leads' => 'Không thể xóa nguồn vì nó đang được liên kết với các khách hàng tiềm năng. Vui lòng hủy liên kết hoặc cập nhật các khách hàng đó trước khi xóa.', + 'datagrid' => [ + 'delete' => 'Xóa', + 'edit' => 'Chỉnh sửa', + 'id' => 'ID', + 'name' => 'Tên', + ], + 'create' => [ + 'name' => 'Tên', + 'save-btn' => 'Lưu Nguồn', + 'title' => 'Tạo Nguồn', + ], + 'edit' => [ + 'title' => 'Chỉnh sửa Nguồn', + ], + ], + ], + 'workflows' => [ + 'index' => [ + 'title' => 'Quy trình', + 'create-btn' => 'Tạo Quy trình', + 'create-success' => 'Quy trình đã được tạo thành công.', + 'update-success' => 'Quy trình đã được cập nhật thành công.', + 'delete-success' => 'Quy trình đã được xóa thành công.', + 'delete-failed' => 'Không thể xóa quy trình.', + 'datagrid' => [ + 'delete' => 'Xóa', + 'description' => 'Mô tả', + 'edit' => 'Chỉnh sửa', + 'id' => 'ID', + 'name' => 'Tên', + ], + ], + 'helpers' => [ + 'update-related-leads' => 'Cập nhật các đầu mối liên quan', + 'send-email-to-sales-owner' => 'Gửi email đến người sở hữu bán hàng', + 'send-email-to-participants' => 'Gửi email đến các tham gia', + 'add-webhook' => 'Thêm Webhook', + 'update-lead' => 'Cập nhật đầu mối', + 'update-person' => 'Cập nhật người', + 'send-email-to-person' => 'Gửi email đến người', + 'add-tag' => 'Thêm Thẻ', + 'add-note-as-activity' => 'Thêm Ghi chú như Hoạt động', + 'update-quote' => 'Cập nhật báo giá', + ], + 'create' => [ + 'title' => 'Tạo Quy trình', + 'event' => 'Sự kiện', + 'back-btn' => 'Quay lại', + 'save-btn' => 'Lưu Quy trình', + 'name' => 'Tên', + 'basic-details' => 'Thông tin cơ bản', + 'description' => 'Mô tả', + 'actions' => 'Hành động', + 'basic-details-info' => 'Nhập thông tin cơ bản của quy trình.', + 'event-info' => 'Một sự kiện kích hoạt, kiểm tra, điều kiện và thực hiện các hành động đã được định nghĩa.', + 'conditions' => 'Điều kiện', + 'conditions-info' => 'Điều kiện là các quy tắc kiểm tra kịch bản, được kích hoạt trong các dịp cụ thể.', + 'actions-info' => 'Một hành động không chỉ giảm khối lượng công việc mà còn làm cho tự động hóa CRM dễ dàng hơn.', + 'value' => 'Giá trị', + 'condition-type' => 'Loại điều kiện', + 'all-condition-are-true' => 'Tất cả điều kiện đều đúng', + 'any-condition-are-true' => 'Bất kỳ điều kiện nào cũng đúng', + 'add-condition' => 'Thêm Điều kiện', + 'add-action' => 'Thêm Hành động', + 'yes' => 'Có', + 'no' => 'Không', + 'email' => 'Email', + 'is-equal-to' => 'Bằng với', + 'is-not-equal-to' => 'Không bằng với', + 'equals-or-greater-than' => 'Bằng hoặc lớn hơn', + 'equals-or-less-than' => 'Bằng hoặc nhỏ hơn', + 'greater-than' => 'Lớn hơn', + 'less-than' => 'Nhỏ hơn', + 'type' => 'Loại', + 'contain' => 'Chứa', + 'contains' => 'Chứa', + 'does-not-contain' => 'Không chứa', + ], + 'edit' => [ + 'title' => 'Chỉnh sửa Quy trình', + 'event' => 'Sự kiện', + 'back-btn' => 'Quay lại', + 'save-btn' => 'Lưu Quy trình', + 'name' => 'Tên', + 'basic-details' => 'Thông tin cơ bản', + 'description' => 'Mô tả', + 'actions' => 'Hành động', + 'type' => 'Loại', + 'basic-details-info' => 'Nhập thông tin cơ bản của quy trình.', + 'event-info' => 'Một sự kiện kích hoạt, kiểm tra, điều kiện và thực hiện các hành động đã được định nghĩa.', + 'conditions' => 'Điều kiện', + 'conditions-info' => 'Điều kiện là các quy tắc kiểm tra kịch bản, được kích hoạt trong các dịp cụ thể.', + 'actions-info' => 'Một hành động không chỉ giảm khối lượng công việc mà còn làm cho tự động hóa CRM dễ dàng hơn.', + 'value' => 'Giá trị', + 'condition-type' => 'Loại điều kiện', + 'all-condition-are-true' => 'Tất cả điều kiện đều đúng', + 'any-condition-are-true' => 'Bất kỳ điều kiện nào cũng đúng', + 'add-condition' => 'Thêm Điều kiện', + 'add-action' => 'Thêm Hành động', + 'yes' => 'Có', + 'no' => 'Không', + 'email' => 'Email', + 'is-equal-to' => 'Bằng với', + 'is-not-equal-to' => 'Không bằng với', + 'equals-or-greater-than' => 'Bằng hoặc lớn hơn', + 'equals-or-less-than' => 'Bằng hoặc nhỏ hơn', + 'greater-than' => 'Lớn hơn', + 'less-than' => 'Nhỏ hơn', + 'contain' => 'Chứa', + 'contains' => 'Chứa', + 'does-not-contain' => 'Không chứa', + ], + ], + 'webforms' => [ + 'index' => [ + 'title' => 'Biểu mẫu Web', + 'create-btn' => 'Tạo Biểu mẫu Web', + 'create-success' => 'Biểu mẫu Web đã được tạo thành công.', + 'update-success' => 'Biểu mẫu Web đã được cập nhật thành công.', + 'delete-success' => 'Biểu mẫu Web đã được xóa thành công.', + 'delete-failed' => 'Biểu mẫu Web không thể bị xóa.', + 'datagrid' => [ + 'id' => 'ID', + 'title' => 'Tiêu đề', + 'edit' => 'Chỉnh sửa', + 'delete' => 'Xóa', + ], + ], + 'create' => [ + 'title' => 'Tạo Biểu mẫu Web', + 'add-attribute-btn' => 'Thêm Nút Thuộc Tính', + 'attribute-label-color' => 'Màu Nhãn Thuộc Tính', + 'attributes' => 'Thuộc Tính', + 'attributes-info' => 'Thêm các thuộc tính tùy chỉnh vào biểu mẫu.', + 'background-color' => 'Màu Nền', + 'create-lead' => 'Tạo Dẫn Dắt', + 'customize-webform' => 'Tùy Chỉnh Biểu Mẫu Web', + 'customize-webform-info' => 'Tùy chỉnh biểu mẫu web của bạn với màu sắc của các phần tử theo lựa chọn của bạn.', + 'description' => 'Mô tả', + 'display-custom-message' => 'Hiển thị thông điệp tùy chỉnh', + 'form-background-color' => 'Màu Nền Biểu Mẫu', + 'form-submit-btn-color' => 'Màu Nút Gửi Biểu Mẫu', + 'form-submit-button-color' => 'Màu Nút Gửi Biểu Mẫu', + 'form-title-color' => 'Màu Tiêu Đề Biểu Mẫu', + 'general' => 'Chung', + 'leads' => 'Dẫn Dắt', + 'person' => 'Người', + 'save-btn' => 'Lưu Biểu Mẫu Web', + 'submit-button-label' => 'Nhãn Nút Gửi', + 'submit-success-action' => 'Hành Động Thành Công Khi Gửi', + 'redirect-to-url' => 'Chuyển Hướng Đến URL', + 'choose-value' => 'Chọn Giá Trị', + 'select-file' => 'Chọn Tập Tin', + 'select-image' => 'Chọn Hình Ảnh', + 'enter-value' => 'Nhập Giá Trị', + ], + 'edit' => [ + 'add-attribute-btn' => 'Thêm Nút Thuộc Tính', + 'attribute-label-color' => 'Màu Nhãn Thuộc Tính', + 'attributes' => 'Thuộc Tính', + 'attributes-info' => 'Thêm các thuộc tính tùy chỉnh vào biểu mẫu.', + 'background-color' => 'Màu Nền', + 'choose-value' => 'Chọn Giá Trị', + 'code-snippet' => 'Mã Snippet', + 'copied' => 'Đã Sao Chép', + 'copy' => 'Sao Chép', + 'create-lead' => 'Tạo Dẫn Dắt', + 'customize-webform' => 'Tùy Chỉnh Biểu Mẫu Web', + 'customize-webform-info' => 'Tùy chỉnh biểu mẫu web của bạn với màu sắc của các phần tử theo lựa chọn của bạn.', + 'description' => 'Mô tả', + 'display-custom-message' => 'Hiển thị thông điệp tùy chỉnh', + 'embed' => 'Nhúng', + 'enter-value' => 'Nhập Giá Trị', + 'form-background-color' => 'Màu Nền Biểu Mẫu', + 'form-submit-btn-color' => 'Màu Nút Gửi Biểu Mẫu', + 'form-submit-button-color' => 'Màu Nút Gửi Biểu Mẫu', + 'form-title-color' => 'Màu Tiêu Đề Biểu Mẫu', + 'general' => 'Chung', + 'leads' => 'Dẫn Dắt', + 'person' => 'Người', + 'preview' => 'Xem Trước', + 'public-url' => 'URL Công Khai', + 'redirect-to-url' => 'Chuyển Hướng Đến URL', + 'save-btn' => 'Lưu Biểu Mẫu Web', + 'select-file' => 'Chọn Tập Tin', + 'select-image' => 'Chọn Hình Ảnh', + 'submit-button-label' => 'Nhãn Nút Gửi', + 'submit-success-action' => 'Hành Động Thành Công Khi Gửi', + 'title' => 'Chỉnh Sửa Biểu Mẫu Web', + ], + ], + 'email-template' => [ + 'index' => [ + 'create-btn' => 'Tạo Mẫu Email', + 'title' => 'Mẫu Email', + 'create-success' => 'Mẫu Email đã được tạo thành công.', + 'update-success' => 'Mẫu Email đã được cập nhật thành công.', + 'delete-success' => 'Mẫu Email đã được xóa thành công.', + 'delete-failed' => 'Mẫu Email không thể bị xóa.', + 'datagrid' => [ + 'delete' => 'Xóa', + 'edit' => 'Chỉnh sửa', + 'id' => 'ID', + 'name' => 'Tên', + 'subject' => 'Chủ đề', + ], + ], + 'create' => [ + 'title' => 'Tạo Mẫu Email', + 'save-btn' => 'Lưu Mẫu Email', + 'email-template' => 'Mẫu Email', + 'subject' => 'Chủ đề', + 'content' => 'Nội dung', + 'subject-placeholders' => 'Biến thể Chủ đề', + 'general' => 'Chung', + 'name' => 'Tên', + ], + 'edit' => [ + 'title' => 'Chỉnh Sửa Mẫu Email', + 'save-btn' => 'Lưu Mẫu Email', + 'email-template' => 'Mẫu Email', + 'subject' => 'Chủ đề', + 'content' => 'Nội dung', + 'subject-placeholders' => 'Biến thể Chủ đề', + 'general' => 'Chung', + 'name' => 'Tên', + ], + ], + 'marketing' => [ + 'events' => [ + 'index' => [ + 'create-btn' => 'Tạo Sự kiện', + 'title' => 'Sự kiện', + 'create-success' => 'Sự kiện đã được tạo thành công.', + 'update-success' => 'Sự kiện đã được cập nhật thành công.', + 'delete-success' => 'Sự kiện đã được xóa thành công.', + 'delete-failed' => 'Không thể xóa sự kiện.', + 'mass-delete-success' => 'Các sự kiện đã được xóa thành công', + 'datagrid' => [ + 'delete' => 'Xóa', + 'edit' => 'Chỉnh sửa', + 'id' => 'ID', + 'name' => 'Tên', + 'description' => 'Mô tả', + 'date' => 'Ngày', + ], + 'create' => [ + 'title' => 'Tạo Sự kiện', + 'name' => 'Tên', + 'date' => 'Ngày', + 'description' => 'Mô tả', + 'save-btn' => 'Lưu Sự kiện', + ], + 'edit' => [ + 'title' => 'Chỉnh sửa Sự kiện', + ], + ], + ], + 'campaigns' => [ + 'index' => [ + 'create-btn' => 'Tạo Chiến dịch', + 'title' => 'Chiến dịch', + 'create-success' => 'Chiến dịch đã được tạo thành công.', + 'update-success' => 'Chiến dịch đã được cập nhật thành công.', + 'delete-success' => 'Chiến dịch đã được xóa thành công.', + 'delete-failed' => 'Không thể xóa chiến dịch.', + 'mass-delete-success' => 'Các chiến dịch đã được xóa thành công', + 'datagrid' => [ + 'id' => 'ID', + 'name' => 'Tên', + 'subject' => 'Chủ đề', + 'status' => 'Trạng thái', + 'active' => 'Kích hoạt', + 'inactive' => 'Không kích hoạt', + 'edit' => 'Chỉnh sửa', + 'delete' => 'Xóa', + ], + 'create' => [ + 'title' => 'Tạo Chiến dịch', + 'name' => 'Tên', + 'type' => 'Loại', + 'subject' => 'Chủ đề', + 'event' => 'Sự kiện', + 'email-template' => 'Mẫu Email', + 'status' => 'Trạng thái', + ], + 'edit' => [ + 'title' => 'Chỉnh sửa Chiến dịch', + ], + ], + ], + ], + 'tags' => [ + 'index' => [ + 'create-btn' => 'Tạo Thẻ', + 'title' => 'Thẻ', + 'create-success' => 'Thẻ đã được tạo thành công.', + 'update-success' => 'Thẻ đã được cập nhật thành công.', + 'delete-success' => 'Thẻ đã được xóa thành công.', + 'delete-failed' => 'Thẻ không thể bị xóa.', + 'datagrid' => [ + 'delete' => 'Xóa', + 'edit' => 'Chỉnh sửa', + 'id' => 'ID', + 'name' => 'Tên', + 'users' => 'Người dùng', + 'created-at' => 'Ngày tạo', + ], + 'create' => [ + 'name' => 'Tên', + 'save-btn' => 'Lưu Thẻ', + 'title' => 'Tạo Thẻ', + 'color' => 'Màu sắc', + ], + 'edit' => [ + 'title' => 'Chỉnh Sửa Thẻ', + ], + ], + ], + 'users' => [ + 'index' => [ + 'create-btn' => 'Tạo Người Dùng', + 'create-success' => 'Người dùng đã được tạo thành công.', + 'delete-failed' => 'Người dùng không thể bị xóa.', + 'delete-success' => 'Người dùng đã được xóa thành công.', + 'last-delete-error' => 'Cần ít nhất một người dùng.', + 'mass-delete-failed' => 'Người dùng không thể bị xóa.', + 'mass-delete-success' => 'Người dùng đã được xóa thành công.', + 'mass-update-failed' => 'Người dùng không thể được cập nhật.', + 'mass-update-success' => 'Người dùng đã được cập nhật thành công.', + 'title' => 'Người Dùng', + 'update-success' => 'Người dùng đã được cập nhật thành công.', + 'user-define-error' => 'Không thể xóa người dùng hệ thống.', + 'active' => 'Kích hoạt', + 'inactive' => 'Không kích hoạt', + 'datagrid' => [ + 'active' => 'Kích hoạt', + 'created-at' => 'Ngày tạo', + 'delete' => 'Xóa', + 'edit' => 'Chỉnh sửa', + 'email' => 'Email', + 'id' => 'ID', + 'inactive' => 'Không kích hoạt', + 'name' => 'Tên', + 'status' => 'Trạng thái', + 'update-status' => 'Cập nhật Trạng thái', + 'users' => 'Người dùng', + ], + 'create' => [ + 'confirm-password' => 'Xác nhận Mật khẩu', + 'email' => 'Email', + 'general' => 'Chung', + 'global' => 'Toàn cầu', + 'group' => 'Nhóm', + 'individual' => 'Cá nhân', + 'name' => 'Tên', + 'password' => 'Mật khẩu', + 'permission' => 'Quyền hạn', + 'role' => 'Vai trò', + 'save-btn' => 'Lưu Người Dùng', + 'status' => 'Trạng thái', + 'title' => 'Tạo Người Dùng', + 'view-permission' => 'Xem Quyền Hạn', + 'select-at-lest-one-group' => 'Select at least one group', + ], + 'edit' => [ + 'title' => 'Chỉnh Sửa Người Dùng', + ], + ], + ], + 'pipelines' => [ + 'index' => [ + 'title' => 'Quy Trình', + 'create-btn' => 'Tạo Quy Trình', + 'create-success' => 'Quy trình đã được tạo thành công.', + 'update-success' => 'Quy trình đã được cập nhật thành công.', + 'default-required' => 'Cần ít nhất một pipeline mặc định.', + 'delete-success' => 'Quy trình đã được xóa thành công.', + 'delete-failed' => 'Quy trình không thể bị xóa.', + 'default-delete-error' => 'Quy trình mặc định không thể bị xóa.', + 'datagrid' => [ + 'delete' => 'Xóa', + 'edit' => 'Chỉnh sửa', + 'id' => 'ID', + 'is-default' => 'Có phải là mặc định', + 'name' => 'Tên', + 'no' => 'Không', + 'rotten-days' => 'Ngày Hỏng', + 'yes' => 'Có', + ], + ], + 'create' => [ + 'title' => 'Tạo Quy Trình', + 'save-btn' => 'Lưu Quy Trình', + 'name' => 'Tên', + 'rotten-days' => 'Ngày Hỏng', + 'mark-as-default' => 'Đánh dấu là Mặc định', + 'general' => 'Chung', + 'probability' => 'Xác Suất (%)', + 'new-stage' => 'Mới', + 'won-stage' => 'Thắng', + 'lost-stage' => 'Thua', + 'stage-btn' => 'Thêm Giai Đoạn', + 'stages' => 'Các Giai Đoạn', + 'duplicate-name' => 'Trường "Tên" không được trùng lặp', + 'delete-stage' => 'Xóa Giai Đoạn', + 'add-new-stages' => 'Thêm Giai Đoạn Mới', + 'add-stage-info' => 'Thêm giai đoạn mới cho Quy trình của bạn', + 'newly-added' => 'Mới Thêm', + 'stage-delete-success' => 'Giai Đoạn đã được xóa thành công', + ], + 'edit' => [ + 'title' => 'Chỉnh Sửa Quy Trình', + 'save-btn' => 'Lưu Quy Trình', + 'name' => 'Tên', + 'rotten-days' => 'Ngày Hỏng', + 'mark-as-default' => 'Đánh dấu là Mặc định', + 'general' => 'Chung', + 'probability' => 'Xác Suất (%)', + 'new-stage' => 'Mới', + 'won-stage' => 'Thắng', + 'lost-stage' => 'Thua', + 'stage-btn' => 'Thêm Giai Đoạn', + 'stages' => 'Các Giai Đoạn', + 'duplicate-name' => 'Trường "Tên" không được trùng lặp', + 'delete-stage' => 'Xóa Giai Đoạn', + 'add-new-stages' => 'Thêm Giai Đoạn Mới', + 'add-stage-info' => 'Thêm giai đoạn mới cho Quy trình của bạn', + 'stage-delete-success' => 'Giai Đoạn đã được xóa thành công', + ], + ], + 'webhooks' => [ + 'index' => [ + 'title' => 'Webhooks', + 'create-btn' => 'Tạo Webhook', + 'create-success' => 'Webhook đã được tạo thành công.', + 'update-success' => 'Webhook đã được cập nhật thành công.', + 'delete-success' => 'Webhook đã được xóa thành công.', + 'delete-failed' => 'Webhook không thể bị xóa.', + 'datagrid' => [ + 'id' => 'ID', + 'delete' => 'Xóa', + 'edit' => 'Chỉnh sửa', + 'name' => 'Tên', + 'entity-type' => 'Loại Đối Tượng', + 'end-point' => 'Điểm Kết Thúc', + ], + ], + 'create' => [ + 'title' => 'Tạo Webhook', + 'save-btn' => 'Lưu Webhook', + 'info' => 'Nhập thông tin chi tiết của webhooks', + 'url-and-parameters' => 'URL Và Tham Số', + 'method' => 'Phương Thức', + 'post' => 'Post', + 'put' => 'Put', + 'url-endpoint' => 'Điểm Kết Thúc URL', + 'parameters' => 'Tham Số', + 'add-new-parameter' => 'Thêm Tham Số Mới', + 'url-preview' => 'Xem Trước URL:', + 'headers' => 'Tiêu Đề', + 'add-new-header' => 'Thêm Tiêu Đề Mới', + 'body' => 'Nội Dung', + 'default' => 'Mặc định', + 'x-www-form-urlencoded' => 'x-www-form-urlencoded', + 'key-and-value' => 'Khóa và Giá trị', + 'add-new-payload' => 'Thêm payload mới', + 'raw' => 'Thô', + 'general' => 'Chung', + 'name' => 'Tên', + 'entity-type' => 'Loại Đối Tượng', + 'insert-placeholder' => 'Chèn Placeholder', + 'description' => 'Mô Tả', + 'json' => 'Json', + 'text' => 'Văn bản', + ], + 'edit' => [ + 'title' => 'Chỉnh Sửa Webhook', + 'edit-btn' => 'Lưu Webhook', + 'save-btn' => 'Lưu Webhook', + 'info' => 'Nhập thông tin chi tiết của webhooks', + 'url-and-parameters' => 'URL Và Tham Số', + 'method' => 'Phương Thức', + 'post' => 'Post', + 'put' => 'Put', + 'url-endpoint' => 'Điểm Kết Thúc URL', + 'parameters' => 'Tham Số', + 'add-new-parameter' => 'Thêm Tham Số Mới', + 'url-preview' => 'Xem Trước URL:', + 'headers' => 'Tiêu Đề', + 'add-new-header' => 'Thêm Tiêu Đề Mới', + 'body' => 'Nội Dung', + 'default' => 'Mặc định', + 'x-www-form-urlencoded' => 'x-www-form-urlencoded', + 'key-and-value' => 'Khóa và Giá trị', + 'add-new-payload' => 'Thêm payload mới', + 'raw' => 'Thô', + 'general' => 'Chung', + 'name' => 'Tên', + 'entity-type' => 'Loại Đối Tượng', + 'insert-placeholder' => 'Chèn Placeholder', + 'description' => 'Mô Tả', + 'json' => 'Json', + 'text' => 'Văn bản', + ], + ], + 'warehouses' => [ + 'index' => [ + 'title' => 'Kho Hàng', + 'create-btn' => 'Tạo Kho Hàng', + 'create-success' => 'Kho hàng đã được tạo thành công.', + 'name-exists' => 'Tên kho hàng đã tồn tại.', + 'update-success' => 'Kho hàng đã được cập nhật thành công.', + 'delete-success' => 'Kho hàng đã được xóa thành công.', + 'delete-failed' => 'Kho hàng không thể bị xóa.', + 'datagrid' => [ + 'id' => 'ID', + 'name' => 'Tên', + 'contact-name' => 'Tên Liên Hệ', + 'delete' => 'Xóa', + 'edit' => 'Chỉnh sửa', + 'view' => 'Xem', + 'created-at' => 'Ngày Tạo', + 'products' => 'Sản Phẩm', + 'contact-emails' => 'Email Liên Hệ', + 'contact-numbers' => 'Số Điện Thoại Liên Hệ', + ], + ], + 'create' => [ + 'title' => 'Tạo Kho Hàng', + 'save-btn' => 'Lưu Kho Hàng', + 'contact-info' => 'Thông Tin Liên Hệ', + ], + 'edit' => [ + 'title' => 'Chỉnh Sửa Kho Hàng', + 'save-btn' => 'Lưu Kho Hàng', + 'contact-info' => 'Thông Tin Liên Hệ', + ], + 'view' => [ + 'all' => 'Tất Cả', + 'notes' => 'Ghi Chú', + 'files' => 'Tệp', + 'location' => 'Vị Trí', + 'change-logs' => 'Nhật Ký Thay Đổi', + 'locations' => [ + 'action' => 'Hành Động', + 'add-location' => 'Thêm Vị Trí', + 'create-success' => 'Vị trí đã được tạo thành công.', + 'delete' => 'Xóa', + 'delete-failed' => 'Vị trí không thể bị xóa.', + 'delete-success' => 'Vị trí đã được xóa thành công.', + 'name' => 'Tên', + 'save-btn' => 'Lưu', + ], + 'general-information' => [ + 'title' => 'Thông Tin Chung', + ], + 'contact-information' => [ + 'title' => 'Thông Tin Liên Hệ', + ], + ], + ], + 'attributes' => [ + 'index' => [ + 'title' => 'Thuộc Tính', + 'create-btn' => 'Tạo Thuộc Tính', + 'create-success' => 'Thuộc tính đã được tạo thành công.', + 'update-success' => 'Thuộc tính đã được cập nhật thành công.', + 'delete-success' => 'Thuộc tính đã được xóa thành công.', + 'delete-failed' => 'Không thể xóa thuộc tính.', + 'user-define-error' => 'Không thể xóa thuộc tính hệ thống.', + 'mass-delete-failed' => 'Các thuộc tính hệ thống không thể bị xóa.', + 'datagrid' => [ + 'yes' => 'Có', + 'no' => 'Không', + 'id' => 'ID', + 'code' => 'Mã', + 'name' => 'Tên', + 'entity-type' => 'Loại Thực Thể', + 'type' => 'Loại', + 'is-default' => 'Mặc Định', + 'edit' => 'Chỉnh sửa', + 'delete' => 'Xóa', + 'entity-types' => [ + 'leads' => 'Khách hàng tiềm năng', + 'organizations' => 'Tổ chức', + 'persons' => 'Người', + 'products' => 'Sản phẩm', + 'quotes' => 'Báo giá', + 'warehouses' => 'Kho hàng', + ], + 'types' => [ + 'text' => 'Văn bản', + 'textarea' => 'Vùng văn bản', + 'price' => 'Giá', + 'boolean' => 'Boolean', + 'select' => 'Chọn', + 'multiselect' => 'Chọn nhiều', + 'checkbox' => 'Hộp kiểm', + 'email' => 'Email', + 'address' => 'Địa chỉ', + 'phone' => 'Điện thoại', + 'lookup' => 'Tìm kiếm', + 'datetime' => 'Ngày giờ', + 'date' => 'Ngày', + 'image' => 'Hình ảnh', + 'file' => 'Tệp tin', + ], + ], + ], + 'create' => [ + 'title' => 'Tạo Thuộc Tính', + 'save-btn' => 'Lưu Thuộc Tính', + 'code' => 'Mã', + 'name' => 'Tên', + 'entity-type' => 'Loại Thực Thể', + 'type' => 'Loại', + 'validations' => 'Xác Thực', + 'is-required' => 'Bắt Buộc', + 'input-validation' => 'Xác Thực Đầu Vào', + 'is-unique' => 'Là Độc Nhất', + 'labels' => 'Nhãn', + 'general' => 'Chung', + 'numeric' => 'Số', + 'decimal' => 'Thập Phân', + 'url' => 'Url', + 'options' => 'Tùy Chọn', + 'option-type' => 'Loại Tùy Chọn', + 'lookup-type' => 'Loại Tra Cứu', + 'add-option' => 'Thêm Tùy Chọn', + 'save-option' => 'Lưu Tùy Chọn', + 'option-name' => 'Tên Tùy Chọn', + 'add-attribute-options' => 'Thêm Tùy Chọn Thuộc Tính', + 'text' => 'Văn Bản', + 'textarea' => 'Khung Văn Bản', + 'price' => 'Giá', + 'boolean' => 'Boolean', + 'select' => 'Chọn', + 'multiselect' => 'Chọn Nhiều', + 'email' => 'Email', + 'address' => 'Địa Chỉ', + 'phone' => 'Điện Thoại', + 'datetime' => 'Ngày Giờ', + 'date' => 'Ngày', + 'image' => 'Hình Ảnh', + 'file' => 'Tệp', + 'lookup' => 'Tra Cứu', + 'entity_type' => 'Loại thực thể', + 'checkbox' => 'Hộp Kiểm', + 'is_required' => 'Bắt Buộc', + 'is_unique' => 'Là Độc Nhất', + 'actions' => 'Hành Động', + ], + 'edit' => [ + 'actions' => 'Hành Động', + 'add-attribute-options' => 'Thêm Tùy Chọn Thuộc Tính', + 'add-option' => 'Thêm Tùy Chọn', + 'address' => 'Địa Chỉ', + 'boolean' => 'Boolean', + 'checkbox' => 'Hộp Kiểm', + 'code' => 'Mã', + 'date' => 'Ngày', + 'datetime' => 'Ngày Giờ', + 'decimal' => 'Thập Phân', + 'email' => 'Email', + 'entity-type' => 'Loại Thực Thể', + 'entity_type' => 'Loại thực thể', + 'file' => 'Tệp', + 'general' => 'Chung', + 'image' => 'Hình Ảnh', + 'input-validation' => 'Xác Thực Đầu Vào', + 'is-required' => 'Bắt Buộc', + 'is-unique' => 'Là Độc Nhất', + 'is_required' => 'Bắt Buộc', + 'is_unique' => 'Là Độc Nhất', + 'labels' => 'Nhãn', + 'lookup' => 'Tra Cứu', + 'lookup-type' => 'Loại Tra Cứu', + 'multiselect' => 'Chọn Nhiều', + 'name' => 'Tên', + 'numeric' => 'Số', + 'option-deleted' => 'Attribute Option is deleted successfully', + 'option-name' => 'Tên Tùy Chọn', + 'option-type' => 'Loại Tùy Chọn', + 'options' => 'Tùy Chọn', + 'phone' => 'Điện Thoại', + 'price' => 'Giá', + 'save-btn' => 'Lưu Thuộc Tính', + 'save-option' => 'Lưu Tùy Chọn', + 'select' => 'Chọn', + 'text' => 'Văn Bản', + 'textarea' => 'Khung Văn Bản', + 'title' => 'Chỉnh Sửa Thuộc Tính', + 'type' => 'Loại', + 'url' => 'Url', + 'validations' => 'Xác Thực', + ], + ], + 'data-transfer' => [ + 'imports' => [ + 'create' => [ + 'action' => 'Action', + 'allowed-errors' => 'Allowed Errors', + 'back-btn' => 'Back', + 'create-update' => 'Create/Update', + 'delete' => 'Delete', + 'download-sample' => 'Download Sample', + 'field-separator' => 'Field Separator', + 'file' => 'File', + 'general' => 'General', + 'images-directory' => 'Images Directory Path', + 'process-in-queue' => 'Process In Queue', + 'results' => 'Results', + 'save-btn' => 'Save Import', + 'settings' => 'Settings', + 'skip-errors' => 'Skip Errors', + 'stop-on-errors' => 'Stop on Errors', + 'title' => 'Create Import', + 'type' => 'Type', + 'validation-strategy' => 'Validation Strategy', + ], + 'edit' => [ + 'action' => 'Action', + 'allowed-errors' => 'Allowed Errors', + 'back-btn' => 'Back', + 'create-update' => 'Create/Update', + 'delete' => 'Delete', + 'download-sample' => 'Download Sample', + 'field-separator' => 'Field Separator', + 'file' => 'File', + 'general' => 'General', + 'images-directory' => 'Images Directory Path', + 'process-in-queue' => 'Process In Queue', + 'results' => 'Results', + 'save-btn' => 'Save Import', + 'settings' => 'Settings', + 'skip-errors' => 'Skip Errors', + 'stop-on-errors' => 'Stop on Errors', + 'title' => 'Edit Import', + 'type' => 'Type', + 'validation-strategy' => 'Validation Strategy', + ], + 'index' => [ + 'button-title' => 'Create Import', + 'title' => 'Imports', + 'datagrid' => [ + 'actions' => 'Actions', + 'completed-at' => 'Completed At', + 'created' => 'Created', + 'delete' => 'Delete', + 'deleted' => 'Deleted', + 'edit' => 'Edit', + 'error-file' => 'Error File', + 'id' => 'ID', + 'started-at' => 'Started At', + 'state' => 'State', + 'summary' => 'Summary', + 'type' => 'Type', + 'updated' => 'Updated', + 'uploaded-file' => 'Uploaded File', + ], + ], + 'import' => [ + 'back-btn' => 'Back', + 'completed-batches' => 'Total Batches Completed:', + 'download-error-report' => 'Download Full Report', + 'edit-btn' => 'Edit', + 'imported-info' => 'Congratulations! Your import was successful.', + 'importing-info' => 'Import In Process', + 'indexing-info' => 'Resources Indexing (Price, Inventory and Elastic Search) In Progress', + 'linking-info' => 'Resources Linking In Progress', + 'progress' => 'Progress:', + 'title' => 'Import', + 'total-batches' => 'Total Batches:', + 'total-created' => 'Total Records Created:', + 'total-deleted' => 'Total Records Deleted:', + 'total-errors' => 'Total Errors:', + 'total-invalid-rows' => 'Total Invalid Rows:', + 'total-rows-processed' => 'Total Rows Processed:', + 'total-updated' => 'Total Records Updated:', + 'validate' => 'Validate', + 'validate-info' => 'Click on Validate Data to check your import.', + 'validating-info' => 'The data started reading and Validating', + 'validation-failed-info' => 'Your import is invalid. Please fix the following errors and try again.', + 'validation-success-info' => 'Your import is valid. Click on Import to start the import process.', + ], + 'create-success' => 'Import created successfully.', + 'delete-failed' => 'Import deletion failed unexpectedly.', + 'delete-success' => 'Import deleted successfully.', + 'not-valid' => 'Import is invalid', + 'nothing-to-import' => 'There are no resources to import.', + 'setup-queue-error' => 'Please change your queue driver to "database" or "redis" to start the import process.', + 'update-success' => 'Import updated successfully.', + ], + ], + ], + 'activities' => [ + 'index' => [ + 'title' => 'Hoạt Động', + 'datagrid' => [ + 'comment' => 'Ghi Chú', + 'created_at' => 'Thời Gian Tạo', + 'created_by' => 'Người Tạo', + 'edit' => 'Chỉnh Sửa', + 'id' => 'ID', + 'done' => 'Đã Hoàn Thành', + 'not-done' => 'Chưa Hoàn Thành', + 'lead' => 'Người Dẫn Dắt', + 'mass-delete' => 'Xóa Hàng Loạt', + 'mass-update' => 'Cập Nhật Hàng Loạt', + 'schedule-from' => 'Lịch Từ', + 'schedule-to' => 'Lịch Đến', + 'schedule_from' => 'Lịch Từ', + 'schedule_to' => 'Lịch Đến', + 'title' => 'Tiêu Đề', + 'is_done' => 'Đã Hoàn Thành', + 'type' => 'Loại', + 'update' => 'Cập Nhật', + 'call' => 'Cuộc Gọi', + 'meeting' => 'Cuộc Họp', + 'lunch' => 'Bữa Trưa', + ], + ], + 'edit' => [ + 'title' => 'Chỉnh Sửa Hoạt Động', + 'back-btn' => 'Quay Lại', + 'save-btn' => 'Lưu Hoạt Động', + 'type' => 'Loại Hoạt Động', + 'call' => 'Cuộc Gọi', + 'meeting' => 'Cuộc Họp', + 'lunch' => 'Bữa Trưa', + 'schedule_to' => 'Lịch Đến', + 'schedule_from' => 'Lịch Từ', + 'location' => 'Địa Điểm', + 'comment' => 'Ghi Chú', + 'lead' => 'Người Dẫn Dắt', + 'participants' => 'Người Tham Gia', + 'general' => 'Chung', + 'persons' => 'Người', + 'no-result-found' => 'Không tìm thấy bản ghi.', + 'users' => 'Người Dùng', + ], + 'updated' => 'Đã cập nhật :attribute', + 'created' => 'Đã tạo', + 'duration-overlapping' => 'Người tham gia có một cuộc họp khác vào thời điểm này. Bạn có muốn tiếp tục không?', + 'create-success' => 'Hoạt động được tạo thành công.', + 'update-success' => 'Hoạt động được cập nhật thành công.', + 'overlapping-error' => 'Người tham gia có một cuộc họp khác vào thời điểm này.', + 'destroy-success' => 'Hoạt động đã được xóa thành công.', + 'delete-failed' => 'Không thể xóa hoạt động.', + 'mass-update-success' => 'Hoạt động được cập nhật thành công.', + 'mass-destroy-success' => 'Hoạt động đã được xóa thành công.', + 'mass-delete-failed' => 'Không thể xóa hoạt động.', + ], + 'mail' => [ + 'index' => [ + 'compose' => 'Soạn Thư', + 'draft' => 'Thư Nháp', + 'inbox' => 'Hộp Thư Đến', + 'outbox' => 'Hộp Thư Đi', + 'sent' => 'Đã Gửi', + 'trash' => 'Thùng Rác', + 'compose-mail-btn' => 'Soạn Thư', + 'btn' => 'Thư', + 'mail' => [ + 'title' => 'Soạn Thư', + 'to' => 'Đến', + 'enter-emails' => 'Nhấn enter để thêm email', + 'cc' => 'CC', + 'bcc' => 'BCC', + 'subject' => 'Chủ Đề', + 'send-btn' => 'Gửi', + 'message' => 'Tin Nhắn', + 'draft' => 'Thư Nháp', + ], + 'datagrid' => [ + 'id' => 'ID', + 'from' => 'Từ', + 'to' => 'Đến', + 'subject' => 'Chủ đề', + 'tags' => 'Thẻ', + 'content' => 'Nội dung', + 'attachments' => 'Tệp đính kèm', + 'date' => 'Ngày', + 'move-to-inbox' => 'Di chuyển vào hộp thư đến', + 'move-to-trash' => 'Đã chuyển vào thùng rác', + 'edit' => 'Chỉnh sửa', + 'view' => 'Xem', + 'delete' => 'Xóa', + ], + ], + 'create-success' => 'Email đã được gửi thành công.', + 'update-success' => 'Email đã được cập nhật thành công.', + 'mass-update-success' => 'Các email đã được cập nhật thành công.', + 'delete-success' => 'Email đã được xóa thành công.', + 'delete-failed' => 'Email không thể bị xóa.', + 'view' => [ + 'title' => 'Thư', + 'subject' => ':subject', + 'link-mail' => 'Liên Kết Thư', + 'to' => 'Đến', + 'cc' => 'CC', + 'bcc' => 'BCC', + 'reply' => 'Trả Lời', + 'reply-all' => 'Trả Lời Tất Cả', + 'forward' => 'Chuyển Tiếp', + 'delete' => 'Xóa', + 'enter-mails' => 'Nhập ID email', + 'rotten-days' => 'Người dẫn dắt đã hỏng trong :days ngày', + 'search-an-existing-lead' => 'Tìm kiếm người dẫn dắt hiện có', + 'search-an-existing-contact' => 'Tìm kiếm liên hệ hiện có', + 'message' => 'Tin Nhắn', + 'add-attachments' => 'Thêm Tệp Đính Kèm', + 'discard' => 'Bỏ Qua', + 'send' => 'Gửi', + 'no-result-found' => 'Không tìm thấy kết quả', + 'add-new-contact' => 'Thêm Liên Hệ Mới', + 'description' => 'Mô Tả', + 'search' => 'Tìm kiếm...', + 'add-new-lead' => 'Thêm Người Dẫn Dắt Mới', + 'create-new-contact' => 'Tạo Liên Hệ Mới', + 'save-contact' => 'Lưu Liên Hệ', + 'create-lead' => 'Tạo Người Dẫn Dắt', + 'linked-contact' => 'Liên Hệ Đã Liên Kết', + 'link-to-contact' => 'Liên Kết Với Liên Hệ', + 'link-to-lead' => 'Liên Kết Với Người Dẫn Dắt', + 'linked-lead' => 'Người Dẫn Dắt Đã Liên Kết', + 'lead-details' => 'Chi Tiết Người Dẫn Dắt', + 'contact-person' => 'Người Liên Hệ', + 'product' => 'Sản Phẩm', + 'tags' => [ + 'create-success' => 'Thẻ đã được tạo thành công.', + 'destroy-success' => 'Thẻ đã được xóa thành công.', + ], + ], + ], + 'common' => [ + 'custom-attributes' => [ + 'add-more' => 'Thêm Nữa', + 'address' => 'Địa Chỉ', + 'city' => 'Thành Phố', + 'contact' => 'Số Liên Lạc', + 'country' => 'Quốc Gia', + 'email' => 'Email', + 'home' => 'Nhà', + 'postcode' => 'Mã Bưu Chính', + 'save' => 'Lưu', + 'select' => 'Chọn', + 'select-country' => 'Chọn Quốc Gia', + 'select-state' => 'Chọn Bang', + 'state' => 'Bang', + 'update-contact-title' => 'Cập Nhật Số Liên Lạc', + 'update-emails-title' => 'Cập Nhật Email Liên Hệ', + 'work' => 'Công Việc', + ], + ], + 'leads' => [ + 'create-success' => 'Tạo khách hàng tiềm năng thành công.', + 'update-success' => 'Cập nhật khách hàng tiềm năng thành công.', + 'update-failed' => 'Leads can not be deleted.', + 'destroy-success' => 'Xóa khách hàng tiềm năng thành công.', + 'destroy-failed' => 'Không thể xóa khách hàng tiềm năng.', + 'file' => [ + 'data-not-found' => 'Không tìm thấy dữ liệu.', + 'empty-content' => 'Nội dung PDF trống hoặc không thể trích xuất.', + 'failed-extract' => 'Không thể trích xuất văn bản từ tệp.', + 'insufficient-info' => 'Do dữ liệu không đủ, chúng tôi không thể xử lý yêu cầu của bạn vào lúc này.', + 'invalid-base64' => 'Định dạng base64 không hợp lệ.', + 'invalid-format' => 'Định dạng JSON không hợp lệ.', + 'invalid-response' => 'Định dạng phản hồi AI không hợp lệ.', + 'missing-api-key' => 'Thiếu khóa API hoặc cấu hình mô hình.', + 'not-found' => 'Không tìm thấy tệp.', + 'recursive-call' => 'Phát hiện cuộc gọi đệ quy.', + 'text-generation-failed' => 'Trích xuất văn bản thất bại. Tệp có thể trống hoặc không đọc được.', + ], + 'index' => [ + 'title' => 'Khách Hàng Tiềm Năng', + 'create-btn' => 'Tạo Khách Hàng Tiềm Năng', + 'datagrid' => [ + 'id' => 'ID', + 'sales-person' => 'Nhân Viên Kinh Doanh', + 'subject' => 'Chủ Đề', + 'source' => 'Nguồn', + 'lead-value' => 'Giá Trị Khách Hàng', + 'lead-type' => 'Loại Khách Hàng', + 'tag-name' => 'Tên Thẻ', + 'contact-person' => 'Người Liên Hệ', + 'stage' => 'Giai Đoạn', + 'rotten-lead' => 'Khách Hàng Tiềm Năng Hết Hạn', + 'date-to' => 'Ngày Đến', + 'created-at' => 'Tạo Vào Lúc', + 'no' => 'Không', + 'yes' => 'Có', + 'delete' => 'Xóa', + 'mass-delete' => 'Xóa Hàng Loạt', + 'mass-update' => 'Cập Nhật Hàng Loạt', + ], + 'kanban' => [ + 'rotten-days' => 'Khách hàng tiềm năng đã hết hạn trong :days ngày', + 'empty-list' => 'Danh sách khách hàng tiềm năng của bạn trống', + 'empty-list-description' => 'Tạo một khách hàng tiềm năng để tổ chức các mục tiêu của bạn.', + 'create-lead-btn' => 'Tạo Khách Hàng Tiềm Năng', + 'columns' => [ + 'contact-person' => 'Người Liên Hệ', + 'id' => 'ID', + 'lead-type' => 'Loại Khách Hàng', + 'lead-value' => 'Giá Trị Khách Hàng', + 'sales-person' => 'Nhân Viên Kinh Doanh', + 'source' => 'Nguồn', + 'title' => 'Tiêu Đề', + 'tags' => 'Thẻ', + 'expected-close-date' => 'Ngày Dự Kiến Đóng', + 'created-at' => 'Tạo Vào Lúc', + ], + 'toolbar' => [ + 'search' => [ + 'title' => 'Tìm kiếm theo tiêu đề', + ], + 'filters' => [ + 'apply-filters' => 'Áp Dụng Bộ Lọc', + 'clear-all' => 'Xóa Tất Cả', + 'filter' => 'Bộ Lọc', + 'filters' => 'Bộ Lọc', + 'from' => 'Từ', + 'select' => 'Chọn', + 'to' => 'Đến', + ], + ], + ], + 'view-switcher' => [ + 'all-pipelines' => 'Tất Cả Các Quy Trình', + 'create-new-pipeline' => 'Tạo Quy Trình Mới', + ], + 'upload' => [ + 'create-lead' => 'Tạo Khách Hàng Tiềm Năng Bằng AI', + 'file' => 'Tải tệp lên', + 'file-info' => 'Chỉ chấp nhận các tệp định dạng pdf, bmp, jpg, jpeg, png.', + 'file-required' => 'Vui lòng chọn ít nhất một tệp hợp lệ để tiếp tục.', + 'save-btn' => 'Lưu', + 'upload-file' => 'Tải lên tệp', + ], + ], + 'create' => [ + 'title' => 'Tạo Khách Hàng Tiềm Năng', + 'save-btn' => 'Lưu', + 'details' => 'Chi Tiết', + 'details-info' => 'Nhập Thông Tin Cơ Bản Của Khách Hàng Tiềm Năng', + 'contact-person' => 'Người Liên Hệ', + 'contact-info' => 'Thông Tin Về Người Liên Hệ', + 'products' => 'Sản Phẩm', + 'products-info' => 'Thông Tin Về Sản Phẩm', + ], + 'edit' => [ + 'title' => 'Chỉnh Sửa Khách Hàng Tiềm Năng', + 'save-btn' => 'Lưu', + 'details' => 'Chi Tiết', + 'details-info' => 'Nhập Thông Tin Cơ Bản Của Khách Hàng Tiềm Năng', + 'contact-person' => 'Người Liên Hệ', + 'contact-info' => 'Thông Tin Về Người Liên Hệ', + 'products' => 'Sản Phẩm', + 'products-info' => 'Thông Tin Về Sản Phẩm', + ], + 'common' => [ + 'contact' => [ + 'name' => 'Tên', + 'email' => 'Email', + 'contact-number' => 'Số Liên Lạc', + 'organization' => 'Tổ Chức', + ], + 'products' => [ + 'product-name' => 'Tên Sản Phẩm', + 'quantity' => 'Số Lượng', + 'price' => 'Giá', + 'amount' => 'Tổng Tiền', + 'action' => 'Hành Động', + 'add-more' => 'Thêm Nữa', + 'total' => 'Tổng Cộng', + ], + ], + 'view' => [ + 'title' => 'Khách Hàng Tiềm Năng: :title', + 'rotten-days' => ':days Ngày', + 'tabs' => [ + 'description' => 'Mô Tả', + 'products' => 'Sản Phẩm', + 'quotes' => 'Báo Giá', + ], + 'attributes' => [ + 'title' => 'Về Khách Hàng Tiềm Năng', + ], + 'quotes' => [ + 'subject' => 'Chủ Đề', + 'expired-at' => 'Hết Hạn Vào', + 'sub-total' => 'Tạm Tính', + 'discount' => 'Giảm Giá', + 'tax' => 'Thuế', + 'adjustment' => 'Điều Chỉnh', + 'grand-total' => 'Tổng Cộng', + 'delete' => 'Xóa', + 'edit' => 'Chỉnh Sửa', + 'download' => 'Tải Xuống', + 'destroy-success' => 'Xóa báo giá thành công.', + 'empty-title' => 'Không Có Báo Giá', + 'empty-info' => 'Không Có Báo Giá Cho Khách Hàng Tiềm Năng Này', + 'add-btn' => 'Thêm Báo Giá', + ], + 'products' => [ + 'product-name' => 'Tên Sản Phẩm', + 'quantity' => 'Số Lượng', + 'price' => 'Giá', + 'amount' => 'Tổng Tiền', + 'action' => 'Hành Động', + 'add-more' => 'Thêm Nữa', + 'total' => 'Tổng Cộng', + 'empty-title' => 'Không Có Sản Phẩm', + 'empty-info' => 'Không Có Sản Phẩm Cho Khách Hàng Tiềm Năng Này', + 'add-product' => 'Thêm Sản Phẩm', + ], + 'persons' => [ + 'title' => 'Về Người Liên Hệ', + 'job-title' => ':job_title tại :organization', + ], + 'stages' => [ + 'won-lost' => 'Thắng/Thua', + 'won' => 'Thắng', + 'lost' => 'Thua', + 'need-more-info' => 'Cần Thêm Thông Tin', + 'closed-at' => 'Đóng Vào', + 'won-value' => 'Giá Trị Thắng', + 'lost-reason' => 'Lý Do Thua', + 'save-btn' => 'Lưu', + ], + 'tags' => [ + 'create-success' => 'Tạo thẻ thành công.', + 'destroy-success' => 'Xóa thẻ thành công.', + ], + ], + ], + 'configuration' => [ + 'index' => [ + 'back' => 'Quay lại', + 'delete' => 'Xóa', + 'save-btn' => 'Lưu Cấu hình', + 'save-success' => 'Cấu hình đã được lưu thành công.', + 'search' => 'Tìm kiếm', + 'select-country' => 'Chọn Quốc gia', + 'select-state' => 'Chọn Bang', + 'title' => 'Cấu hình', + 'general' => [ + 'title' => 'Chung', + 'info' => 'Cấu hình chung', + 'general' => [ + 'title' => 'Chung', + 'info' => 'Cập nhật cài đặt chung của bạn tại đây.', + 'locale-settings' => [ + 'title' => 'Cài đặt ngôn ngữ', + 'title-info' => 'Định nghĩa ngôn ngữ được sử dụng trong giao diện người dùng, như tiếng Ả Rập (ar), tiếng Anh (en), tiếng Tây Ban Nha (es), tiếng Ba Tư (fa) và tiếng Thổ Nhĩ Kỳ (tr).', + ], + 'admin-logo' => [ + 'logo-image' => 'Hình ảnh Logo', + 'title' => 'Logo Quản trị', + 'title-info' => 'Cấu hình hình ảnh logo cho bảng điều khiển quản trị của bạn.', + ], + ], + 'settings' => [ + 'title' => 'Settings', + 'info' => 'Update your settings here.', + 'footer' => [ + 'info' => 'We can configure the powered by section here.', + 'powered-by' => 'Powered by text editor', + 'title' => 'Powered by Section Configurations', + ], + 'menu' => [ + 'activities' => 'Activities', + 'configuration' => 'Configuration', + 'contacts' => 'Contacts', + 'dashboard' => 'Dashboard', + 'draft' => 'Draft', + 'inbox' => 'Inbox', + 'info' => 'We can configure the menu items name here.', + 'leads' => 'Leads', + 'mail' => 'Mail', + 'organizations' => 'Organizations', + 'outbox' => 'Outbox', + 'persons' => 'Persons', + 'products' => 'Products', + 'quotes' => 'Quotes', + 'sent' => 'Sent', + 'settings' => 'Settings', + 'title' => 'Menu Item Configurations', + 'trash' => 'Trash', + ], + 'menu-color' => [ + 'brand-color' => 'Brand Color', + 'info' => 'We can change the menu items colors here.', + 'title' => 'Menu Item Color Configurations', + ], + ], + ], + 'email' => [ + 'title' => 'Cài đặt Email', + 'info' => 'Cấu hình email cho ứng dụng.', + 'imap' => [ + 'title' => 'Cài đặt IMAP', + 'info' => 'Cấu hình email IMAP để nhận email.', + 'account' => [ + 'title' => 'Tài khoản IMAP', + 'title-info' => 'Cấu hình cài đặt tài khoản IMAP của bạn tại đây.', + 'host' => 'Máy chủ', + 'port' => 'Cổng', + 'encryption' => 'Loại mã hóa', + 'validate-cert' => 'Xác thực chứng chỉ SSL', + 'username' => 'Tên người dùng IMAP', + 'password' => 'Mật khẩu IMAP', + ], + ], + ], + 'magic-ai' => [ + 'title' => 'Magic AI', + 'info' => 'Cấu hình Magic AI cho ứng dụng.', + 'settings' => [ + 'api-key' => 'Khóa API', + 'api-key-info' => 'Nhớ sử dụng khóa API OpenRouter cho mỗi mô hình. Đây là một bước đơn giản để tăng cường bảo mật và hiệu suất.', + 'enable' => 'Kích hoạt', + 'info' => 'Nâng cao trải nghiệm Magic AI của bạn với Khóa API OpenRouter. Tích hợp ngay bây giờ để có một cuộc phiêu lưu AI liền mạch và cá nhân hóa chỉ dành cho bạn! Dễ dàng tùy chỉnh cài đặt và kiểm soát hành trình AI của bạn.', + 'other' => 'Mô hình khác', + 'other-model' => 'Đối với các mô hình khác, sử dụng ID Mô hình từ OpenRouter.', + 'doc-generation' => 'Tạo DOC', + 'doc-generation-info' => 'Bật tính năng Tạo DOC để tự động trích xuất dữ liệu từ các tệp DOC và chuyển đổi chúng sang định dạng văn bản. Nâng cao năng suất và hiệu quả công việc bằng cách bật tính năng này để đơn giản hóa quy trình làm việc của bạn.', + 'title' => 'General Settings', + 'models' => [ + 'deepseek-r1' => 'Deepseek R1 Distill-llama-8b', + 'gemini-2-0-flash-001' => 'Gemini 2.0 flash-001', + 'gpt-4o' => 'GPT-4.0', + 'gpt-4o-mini' => 'GPT-4.0 mini', + 'grok-2-1212' => 'Grok 2.12', + 'llama-3-2-3b-instruct' => 'Llama 3.2 3b Instruct', + 'title' => 'Mô hình', + ], + ], + ], + ], + ], + 'dashboard' => [ + 'index' => [ + 'title' => 'Bảng Điều Khiển', + 'revenue' => [ + 'lost-revenue' => 'Doanh Thu Bị Mất', + 'won-revenue' => 'Doanh Thu Đã Đạt', + ], + 'over-all' => [ + 'average-lead-value' => 'Giá Trị Lead Trung Bình', + 'total-leads' => 'Tổng Số Lead', + 'average-leads-per-day' => 'Số Lead Trung Bình Mỗi Ngày', + 'total-quotations' => 'Tổng Số Báo Giá', + 'total-persons' => 'Tổng Số Người Liên Hệ', + 'total-organizations' => 'Tổng Số Tổ Chức', + ], + 'total-leads' => [ + 'title' => 'Leads', + 'total' => 'Tổng Số Lead', + 'won' => 'Lead Đã Đạt', + 'lost' => 'Lead Bị Mất', + ], + 'revenue-by-sources' => [ + 'title' => 'Doanh Thu Theo Nguồn', + 'empty-title' => 'Không Có Dữ Liệu', + 'empty-info' => 'Không có dữ liệu cho khoảng thời gian được chọn', + ], + 'revenue-by-types' => [ + 'title' => 'Doanh Thu Theo Loại', + 'empty-title' => 'Không Có Dữ Liệu', + 'empty-info' => 'Không có dữ liệu cho khoảng thời gian được chọn', + ], + 'top-selling-products' => [ + 'title' => 'Sản Phẩm Bán Chạy Nhất', + 'empty-title' => 'Không Tìm Thấy Sản Phẩm', + 'empty-info' => 'Không có sản phẩm nào cho khoảng thời gian được chọn', + ], + 'top-persons' => [ + 'title' => 'Người Liên Hệ Hàng Đầu', + 'empty-title' => 'Không Tìm Thấy Người Liên Hệ', + 'empty-info' => 'Không có người liên hệ nào cho khoảng thời gian được chọn', + ], + 'open-leads-by-states' => [ + 'title' => 'Khách hàng tiềm năng mở theo giai đoạn', + 'empty-title' => 'Không Có Dữ Liệu', + 'empty-info' => 'Không có dữ liệu cho khoảng thời gian được chọn', + ], + ], + ], + 'layouts' => [ + 'app-version' => 'Phiên Bản : :version', + 'dashboard' => 'Bảng Điều Khiển', + 'leads' => 'Leads', + 'quotes' => 'Báo Giá', + 'quote' => 'Báo Giá', + 'mail' => [ + 'title' => 'Thư', + 'compose' => 'Soạn Thư', + 'inbox' => 'Hộp Thư Đến', + 'draft' => 'Thư Nháp', + 'outbox' => 'Hộp Thư Đi', + 'sent' => 'Đã Gửi', + 'trash' => 'Thùng Rác', + 'setting' => 'Cài Đặt', + ], + 'activities' => 'Hoạt Động', + 'contacts' => 'Liên Hệ', + 'persons' => 'Người Liên Hệ', + 'person' => 'Người Liên Hệ', + 'organizations' => 'Tổ Chức', + 'organization' => 'Tổ Chức', + 'products' => 'Sản Phẩm', + 'product' => 'Sản Phẩm', + 'settings' => 'Cài Đặt', + 'user' => 'Người Dùng', + 'user-info' => 'Quản lý tất cả người dùng và quyền hạn của họ trong CRM, những gì họ được phép làm.', + 'groups' => 'Nhóm', + 'groups-info' => 'Thêm, chỉnh sửa hoặc xóa nhóm khỏi CRM', + 'roles' => 'Vai Trò', + 'role' => 'Vai Trò', + 'roles-info' => 'Thêm, chỉnh sửa hoặc xóa vai trò khỏi CRM', + 'users' => 'Người Dùng', + 'users-info' => 'Thêm, chỉnh sửa hoặc xóa người dùng khỏi CRM', + 'lead' => 'Lead', + 'lead-info' => 'Quản lý tất cả các cài đặt liên quan đến leads trong CRM', + 'pipelines' => 'Pipelines', + 'pipelines-info' => 'Thêm, chỉnh sửa hoặc xóa pipelines khỏi CRM', + 'sources' => 'Nguồn', + 'sources-info' => 'Thêm, chỉnh sửa hoặc xóa nguồn khỏi CRM', + 'types' => 'Loại', + 'types-info' => 'Thêm, chỉnh sửa hoặc xóa loại khỏi CRM', + 'automation' => 'Tự Động Hóa', + 'automation-info' => 'Quản lý tất cả các cài đặt liên quan đến tự động hóa trong CRM', + 'attributes' => 'Thuộc Tính', + 'attribute' => 'Thuộc Tính', + 'attributes-info' => 'Thêm, chỉnh sửa hoặc xóa thuộc tính khỏi CRM', + 'email-templates' => 'Mẫu Email', + 'email' => 'Email', + 'email-templates-info' => 'Thêm, chỉnh sửa hoặc xóa mẫu email khỏi CRM', + 'events' => 'Sự kiện', + 'events-info' => 'Thêm, chỉnh sửa hoặc xóa sự kiện từ CRM', + 'campaigns' => 'Chiến dịch', + 'campaigns-info' => 'Thêm, chỉnh sửa hoặc xóa chiến dịch từ CRM', + 'workflows' => 'Quy Trình', + 'workflows-info' => 'Thêm, chỉnh sửa hoặc xóa quy trình khỏi CRM', + 'webhooks' => 'Webhook', + 'webhooks-info' => 'Thêm, chỉnh sửa hoặc xóa webhook từ CRM', + 'other-settings' => 'Cài Đặt Khác', + 'other-settings-info' => 'Quản lý tất cả các cài đặt khác trong CRM', + 'tags' => 'Thẻ', + 'tags-info' => 'Thêm, chỉnh sửa hoặc xóa thẻ khỏi CRM', + 'my-account' => 'Tài Khoản Của Tôi', + 'sign-out' => 'Đăng Xuất', + 'back' => 'Quay lại', + 'name' => 'Tên', + 'configuration' => 'Cấu hình', + 'howdy' => 'Xin chào!', + 'warehouses' => 'Kho hàng', + 'warehouse' => 'Kho hàng', + 'warehouses-info' => 'Thêm, chỉnh sửa hoặc xóa kho hàng từ CRM', + 'data_transfer' => 'Data Transfer', + 'data_transfer_info' => 'Manage persons, products and leads data transfer related settings in the CRM', + ], + 'user' => [ + 'account' => [ + 'name' => 'Tên', + 'email' => 'Email', + 'password' => 'Mật Khẩu', + 'my_account' => 'Tài Khoản Của Tôi', + 'update_details' => 'Cập Nhật Thông Tin', + 'current_password' => 'Mật Khẩu Hiện Tại', + 'confirm_password' => 'Xác Nhận Mật Khẩu', + 'password-match' => 'Mật khẩu hiện tại không khớp.', + 'account-save' => 'Thay đổi tài khoản đã được lưu thành công.', + 'permission-denied' => 'Từ Chối Quyền Truy Cập', + 'remove-image' => 'Xóa Hình Ảnh', + 'upload_image_pix' => 'Tải Lên Ảnh Hồ Sơ (100px x 100px)', + 'upload_image_format' => 'Định Dạng PNG hoặc JPG', + 'image_upload_message' => 'Chỉ chấp nhận hình ảnh (.jpeg, .jpg, .png, ..).', + ], + ], + 'emails' => [ + 'common' => [ + 'dear' => 'Kính gửi :name', + 'cheers' => 'Trân trọng,
    Đội ngũ :app_name', + 'user' => [ + 'dear' => 'Kính gửi :username', + 'create-subject' => 'Bạn đã được thêm làm thành viên.', + 'create-body' => 'Chúc mừng! Bạn đã trở thành thành viên của đội ngũ chúng tôi.', + 'forget-password' => [ + 'subject' => 'Khách hàng yêu cầu đặt lại mật khẩu', + 'dear' => 'Kính gửi :username', + 'reset-password' => 'Đặt Lại Mật Khẩu', + 'info' => 'Bạn nhận được email này vì chúng tôi đã nhận được yêu cầu đặt lại mật khẩu cho tài khoản của bạn.', + 'final-summary' => 'Nếu bạn không yêu cầu đặt lại mật khẩu, không cần thực hiện thêm hành động nào.', + 'thanks' => 'Cảm ơn!', + ], + ], + ], + ], + 'validations' => [ + 'message' => [ + 'decimal' => 'The :attribute must be a decimal.', + ], + ], + 'errors' => [ + 'dashboard' => 'Bảng điều khiển', + 'go-back' => 'Quay lại', + 'support' => 'Nếu sự cố vẫn tiếp diễn, vui lòng liên hệ với chúng tôi tại :email để được hỗ trợ.', + '404' => [ + 'description' => 'Rất tiếc! Trang bạn đang tìm kiếm hiện không có ở đây. Có vẻ như chúng tôi không thể tìm thấy những gì bạn đang tìm kiếm.', + 'title' => '404 Không Tìm Thấy Trang', + ], + '401' => [ + 'description' => 'Rất tiếc! Có vẻ như bạn không được phép truy cập vào trang này. Có vẻ bạn đang thiếu thông tin xác thực cần thiết.', + 'title' => '401 Không Được Phép', + ], + '403' => [ + 'description' => 'Rất tiếc! Trang này bị hạn chế. Có vẻ bạn không có quyền truy cập vào nội dung này.', + 'title' => '403 Cấm Truy Cập', + ], + '500' => [ + 'description' => 'Rất tiếc! Đã xảy ra sự cố. Có vẻ như chúng tôi đang gặp khó khăn trong việc tải trang mà bạn đang tìm kiếm.', + 'title' => '500 Lỗi Máy Chủ Nội Bộ', + ], + '503' => [ + 'description' => 'Rất tiếc! Có vẻ chúng tôi đang tạm ngừng để bảo trì. Vui lòng quay lại sau.', + 'title' => '503 Dịch Vụ Không Khả Dụng', + ], + ], + 'export' => [ + 'csv' => 'CSV', + 'download' => 'Tải Xuống', + 'export' => 'Xuất', + 'no-records' => 'Không có bản ghi nào được tìm thấy.', + 'xls' => 'XLS', + 'xlsx' => 'XLSX', + ], +]; diff --git a/packages/Webkul/Admin/src/Resources/views/activities/datagrid/is-done.blade.php b/packages/Webkul/Admin/src/Resources/views/activities/datagrid/is-done.blade.php new file mode 100644 index 0000000..3a3ea88 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/activities/datagrid/is-done.blade.php @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/activities/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/activities/edit.blade.php new file mode 100644 index 0000000..be46037 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/activities/edit.blade.php @@ -0,0 +1,463 @@ + + + + @lang('admin::app.activities.edit.title') + + + {!! view_render_event('admin.activities.edit.form.before') !!} + + +
    +
    +
    + + + + +
    + @lang('admin::app.activities.edit.title') +
    +
    + +
    + +
    + {!! view_render_event('admin.activities.edit.save_button.before') !!} + + + + + {!! view_render_event('admin.activities.edit.save_button.after') !!} +
    +
    +
    + + +
    + +
    + {!! view_render_event('admin.activities.edit.form_controls.before') !!} + + + +
    +
    + + @lang('admin::app.activities.edit.schedule_from') + + + + + +
    + +
    + + @lang('admin::app.activities.edit.schedule_to') + + + + + +
    +
    +
    + + + + + @lang('admin::app.activities.edit.comment') + + + + + + + + + + + @lang('admin::app.activities.edit.participants') + + + + +
    +
      +
    • + +
    • +
    + + +
    +
    +
    + + + + + @lang('admin::app.activities.edit.lead') + + + + + + + + + + + {!! view_render_event('admin.activities.edit.form_controls.after') !!} +
    + + +
    + {!! view_render_event('admin.activities.edit.accordion.general.before') !!} + + + +
    +

    + @lang('admin::app.activities.edit.general') +

    +
    + + + + + + + @lang('admin::app.activities.edit.title') + + + + + + + + + + + @lang('admin::app.activities.edit.type') + + + + + + + + + + + + + + + + + @lang('admin::app.activities.edit.location') + + + + + + + +
    + + {!! view_render_event('admin.activities.edit.accordion.general.after') !!} +
    +
    +
    +
    + + {!! view_render_event('admin.activities.edit.form.after') !!} + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/activities/index.blade.php b/packages/Webkul/Admin/src/Resources/views/activities/index.blade.php new file mode 100644 index 0000000..fc08e77 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/activities/index.blade.php @@ -0,0 +1,733 @@ + + + @lang('admin::app.activities.index.title') + + + {!! view_render_event('admin.activities.index.activities.before') !!} + + + +
    +
    +
    + + +
    + @lang('admin::app.activities.index.title') +
    +
    + +
    + + + +
    +
    + + + @if ( + request()->get('view-type') == 'table' + || ! request()->has('view-type') + ) + + @endif +
    +
    + + {!! view_render_event('admin.activities.index.activities.after') !!} + + @pushOnce('scripts') + + + + + + + + + + @endPushOnce + + @pushOnce('styles') + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/components/accordion/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/accordion/index.blade.php new file mode 100644 index 0000000..2358e71 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/accordion/index.blade.php @@ -0,0 +1,84 @@ +@props([ + 'isActive' => true, +]) + +
    merge(['class' => 'box-shadow rounded-lg border border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-900']) }}> + + + + @isset($header) + + @endisset + + @isset($content) + + @endisset + +
    + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/activities/actions/activity.blade.php b/packages/Webkul/Admin/src/Resources/views/components/activities/actions/activity.blade.php new file mode 100644 index 0000000..8364ea4 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/activities/actions/activity.blade.php @@ -0,0 +1,285 @@ +@props([ + 'entity' => null, + 'entityControlName' => null, +]) + + +
    + {!! view_render_event('admin.components.activities.actions.activity.create_btn.before') !!} + + + + {!! view_render_event('admin.components.activities.actions.activity.create_btn.after') !!} + + {!! view_render_event('admin.components.activities.actions.activity.before') !!} + + + + + {!! view_render_event('admin.components.activities.actions.activity.after') !!} +
    + + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/activities/actions/activity/participants.blade.php b/packages/Webkul/Admin/src/Resources/views/components/activities/actions/activity/participants.blade.php new file mode 100644 index 0000000..e76b782 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/activities/actions/activity/participants.blade.php @@ -0,0 +1,245 @@ +{!! view_render_event('admin.components.activities.actions.activity.participants.before') !!} + + + + +{!! view_render_event('admin.components.activities.actions.activity.participants.after') !!} + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/activities/actions/file.blade.php b/packages/Webkul/Admin/src/Resources/views/components/activities/actions/file.blade.php new file mode 100644 index 0000000..413a275 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/activities/actions/file.blade.php @@ -0,0 +1,216 @@ +@props([ + 'entity' => null, + 'entityControlName' => null, +]) + + +
    + {!! view_render_event('admin.components.activities.actions.file.create_btn.before') !!} + + + + {!! view_render_event('admin.components.activities.actions.file.create_btn.after') !!} + + {!! view_render_event('admin.components.activities.actions.file.before') !!} + + + + + {!! view_render_event('admin.components.activities.actions.file.after') !!} +
    + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/activities/actions/mail.blade.php b/packages/Webkul/Admin/src/Resources/views/components/activities/actions/mail.blade.php new file mode 100644 index 0000000..34451d6 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/activities/actions/mail.blade.php @@ -0,0 +1,293 @@ +@props([ + 'entity' => null, + 'entityControlName' => null, +]) + + +
    + {!! view_render_event('admin.components.activities.actions.mail.create_btn.before') !!} + + + + {!! view_render_event('admin.components.activities.actions.mail.create_btn.after') !!} + + {!! view_render_event('admin.components.activities.actions.mail.before') !!} + + + + + {!! view_render_event('admin.components.activities.actions.mail.after') !!} +
    + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/activities/actions/note.blade.php b/packages/Webkul/Admin/src/Resources/views/components/activities/actions/note.blade.php new file mode 100644 index 0000000..ff39d11 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/activities/actions/note.blade.php @@ -0,0 +1,175 @@ +@props([ + 'entity' => null, + 'entityControlName' => null, +]) + + +
    + {!! view_render_event('admin.components.activities.actions.note.create_btn.before') !!} + + + + {!! view_render_event('admin.components.activities.actions.note.create_btn.after') !!} + + {!! view_render_event('admin.components.activities.actions.note.before') !!} + + + + + {!! view_render_event('admin.components.activities.actions.note.after') !!} +
    + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/activities/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/activities/index.blade.php new file mode 100644 index 0000000..7413c42 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/activities/index.blade.php @@ -0,0 +1,640 @@ +@props([ + 'endpoint', + 'emailDetachEndpoint' => null, + 'activeType' => 'all', + 'types' => null, + 'extraTypes' => null, +]) + +{!! view_render_event('admin.components.activities.before') !!} + + + + + + + @foreach ($extraTypes ?? [] as $type) + + @endforeach + + +{!! view_render_event('admin.components.activities.after') !!} + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/attachments/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attachments/index.blade.php new file mode 100644 index 0000000..cd9c2b6 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attachments/index.blade.php @@ -0,0 +1,184 @@ +@props([ + 'name' => 'attachments', + 'validations' => null, + 'uploadedAttachments' => [], + 'allowMultiple' => false, + 'hideButton' => false, +]) + + + + +@pushOnce('scripts') + + + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/address.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/address.blade.php new file mode 100644 index 0000000..ac1d4e4 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/address.blade.php @@ -0,0 +1,165 @@ +@if (isset($attribute)) + + + + +@endif + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/boolean.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/boolean.blade.php new file mode 100755 index 0000000..d8e354d --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/boolean.blade.php @@ -0,0 +1,20 @@ +code) ?: $value ?> + + + + diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/checkbox.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/checkbox.blade.php new file mode 100644 index 0000000..c83a2a8 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/checkbox.blade.php @@ -0,0 +1,32 @@ +@php + $options = $attribute->lookup_type + ? app('Webkul\Attribute\Repositories\AttributeRepository')->getLookUpOptions($attribute->lookup_type) + : $attribute->options()->orderBy('sort_order')->get(); + + $selectedOption = old($attribute->code, $value); + + $selectedOption = is_array($selectedOption) ? $selectedOption : explode(',', $selectedOption); +@endphp + + + +@foreach ($options as $option) + + + + + +@endforeach diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/date.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/date.blade.php new file mode 100755 index 0000000..d66d053 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/date.blade.php @@ -0,0 +1,18 @@ +@php + if (! empty($value)) { + if ($value instanceof \Carbon\Carbon) { + $value = $value->format('Y-m-d'); + } elseif (is_string($value)) { + $value = \Carbon\Carbon::parse($value)->format('Y-m-d'); + } + } +@endphp + + diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/datetime.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/datetime.blade.php new file mode 100755 index 0000000..e04e80b --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/datetime.blade.php @@ -0,0 +1,8 @@ + diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/email.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/email.blade.php new file mode 100644 index 0000000..fbf2b31 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/email.blade.php @@ -0,0 +1,179 @@ +@if (isset($attribute)) + +
    + + +
    + +
    +
    + + + + + @lang("admin::app.common.custom-attributes.add-more") + +
    +@endif + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/file.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/file.blade.php new file mode 100644 index 0000000..116ab0c --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/file.blade.php @@ -0,0 +1,39 @@ +
    + @if ($value) + +
    + +
    +
    + @endif + + +
    + +@if ($value) +
    + + + +
    +@endif \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/image.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/image.blade.php new file mode 100644 index 0000000..dbfeba6 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/image.blade.php @@ -0,0 +1,42 @@ +
    + @if ($value) + + {{ $attribute->code }} + + @endif + + +
    + +@if ($value) +
    + + + +
    +@endif \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/index.blade.php new file mode 100644 index 0000000..bd9eb0b --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/index.blade.php @@ -0,0 +1,143 @@ +@props([ + 'attribute' => '', + 'value' => '', + 'validations' => '', +]) + +@switch($attribute->type) + @case('text') + + + @break + + @case('email') + + + @break + + @case('phone') + + + @break + + @case('lookup') + + + @break + + @case('select') + + + @break + + @case('multiselect') + + + @break + + @case('price') + + + @break + + @case('image') + + + @break + + @case('file') + + + @break + + @case('textarea') + + + @break + + @case('address') + + + @break + + @case('date') + + + @break + + @case('datetime') + + + @break + + @case('boolean') + + + @break + + @case('checkbox') + + + @break +@endswitch \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/lookup.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/lookup.blade.php new file mode 100644 index 0000000..f24aa27 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/lookup.blade.php @@ -0,0 +1,290 @@ +@if (isset($attribute)) + @php + $lookUpEntityData = app('Webkul\Attribute\Repositories\AttributeRepository')->getLookUpEntity($attribute->lookup_type, old($attribute->code) ?: $value); + @endphp + + +
    + +
    + @lang('admin::app.components.attributes.lookup.click-to-add') + + +
    + + +
    +
    +
    +
    +@endif + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/multiselect.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/multiselect.blade.php new file mode 100755 index 0000000..506a1c4 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/multiselect.blade.php @@ -0,0 +1,32 @@ +@php + $options = $attribute->lookup_type + ? app('Webkul\Attribute\Repositories\AttributeRepository')->getLookUpOptions($attribute->lookup_type) + : $attribute->options()->orderBy('sort_order')->get(); + + $selectedOption = old($attribute->code) ?: $value; +@endphp + + + + \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/phone.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/phone.blade.php new file mode 100644 index 0000000..c0f40cb --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/phone.blade.php @@ -0,0 +1,186 @@ +@if (isset($attribute)) + +
    + + +
    + +
    +
    + + + + + @lang("admin::app.common.custom-attributes.add-more") + +
    +@endif + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/price.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/price.blade.php new file mode 100755 index 0000000..c0b2bb9 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/price.blade.php @@ -0,0 +1,32 @@ +@if (isset($attribute)) + + +@endif + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/select.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/select.blade.php new file mode 100755 index 0000000..e7771e5 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/select.blade.php @@ -0,0 +1,21 @@ +@php + $options = $attribute->lookup_type + ? app('Webkul\Attribute\Repositories\AttributeRepository')->getLookUpOptions($attribute->lookup_type) + : $attribute->options()->orderBy('sort_order')->get(); +@endphp + + + @foreach ($options as $option) + + @endforeach + \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/text.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/text.blade.php new file mode 100755 index 0000000..59eafb9 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/text.blade.php @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/textarea.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/textarea.blade.php new file mode 100755 index 0000000..3bf326b --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/textarea.blade.php @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/index.blade.php new file mode 100644 index 0000000..9641e12 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/index.blade.php @@ -0,0 +1,40 @@ +@foreach ($customAttributes as $attribute) + @php + $validations = []; + + if ($attribute->is_required) { + $validations[] = 'required'; + } + + if ($attribute->type == 'price') { + $validations[] = 'decimal'; + } + + $validations[] = $attribute->validation; + + $validations = implode('|', array_filter($validations)); + @endphp + + + + {{ $attribute->name }} + + @if ($attribute->type == 'price') + ({{ core()->currencySymbol(config('app.currency')) }}) + @endif + + + @if (isset($attribute)) + + @endif + + + +@endforeach \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/view.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/view.blade.php new file mode 100644 index 0000000..93e51fa --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/view.blade.php @@ -0,0 +1,25 @@ +@props([ + 'customAttributes' => [], + 'entity' => null, + 'allowEdit' => false, + 'url' => null, +]) + +
    + @foreach ($customAttributes as $attribute) + @if (view()->exists($typeView = 'admin::components.attributes.view.' . $attribute->type)) +
    +
    {{ $attribute->name }}
    + +
    + @include ($typeView, [ + 'attribute' => $attribute, + 'value' => isset($entity) ? $entity[$attribute->code] : null, + 'allowEdit' => $allowEdit, + 'url' => $url, + ]) +
    +
    + @endif + @endforeach +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/view/address.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/address.blade.php new file mode 100644 index 0000000..610e260 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/address.blade.php @@ -0,0 +1,11 @@ + diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/view/boolean.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/boolean.blade.php new file mode 100755 index 0000000..8a8ec54 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/boolean.blade.php @@ -0,0 +1,11 @@ + diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/view/checkbox.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/checkbox.blade.php new file mode 100644 index 0000000..079494e --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/checkbox.blade.php @@ -0,0 +1,20 @@ +@php + $options = $attribute->lookup_type + ? app('Webkul\Attribute\Repositories\AttributeRepository')->getLookUpOptions($attribute->lookup_type) + : $attribute->options()->orderBy('sort_order')->get(); + + $selectedOption = old($attribute->code) ?: $value; +@endphp + + diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/view/date.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/date.blade.php new file mode 100755 index 0000000..c2d0851 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/date.blade.php @@ -0,0 +1,21 @@ +@php + if (! empty($value)) { + if ($value instanceof \Carbon\Carbon) { + $value = $value->format('Y-m-d'); + } elseif (is_string($value)) { + $value = \Carbon\Carbon::parse($value)->format('Y-m-d'); + } + } +@endphp + + \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/view/datetime.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/datetime.blade.php new file mode 100755 index 0000000..e1c030a --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/datetime.blade.php @@ -0,0 +1,11 @@ + diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/view/email.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/email.blade.php new file mode 100644 index 0000000..b745f43 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/email.blade.php @@ -0,0 +1,11 @@ + diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/view/file.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/file.blade.php new file mode 100644 index 0000000..fcda0c3 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/file.blade.php @@ -0,0 +1,11 @@ + diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/view/image.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/image.blade.php new file mode 100644 index 0000000..47e3c3e --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/image.blade.php @@ -0,0 +1,11 @@ + diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/view/lookup.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/lookup.blade.php new file mode 100644 index 0000000..9fa70cb --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/lookup.blade.php @@ -0,0 +1,16 @@ +@php + $lookUpEntity = app('Webkul\Attribute\Repositories\AttributeRepository')->getLookUpEntity($attribute->lookup_type, $value); +@endphp + + diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/view/multiselect.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/multiselect.blade.php new file mode 100755 index 0000000..079494e --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/multiselect.blade.php @@ -0,0 +1,20 @@ +@php + $options = $attribute->lookup_type + ? app('Webkul\Attribute\Repositories\AttributeRepository')->getLookUpOptions($attribute->lookup_type) + : $attribute->options()->orderBy('sort_order')->get(); + + $selectedOption = old($attribute->code) ?: $value; +@endphp + + diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/view/phone.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/phone.blade.php new file mode 100644 index 0000000..fd6d544 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/phone.blade.php @@ -0,0 +1,11 @@ + diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/view/price.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/price.blade.php new file mode 100755 index 0000000..9c43152 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/price.blade.php @@ -0,0 +1,12 @@ + diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/view/select.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/select.blade.php new file mode 100755 index 0000000..5fc0e38 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/select.blade.php @@ -0,0 +1,18 @@ +@php + $options = $attribute->lookup_type + ? app('Webkul\Attribute\Repositories\AttributeRepository')->getLookUpOptions($attribute->lookup_type) + : $attribute->options()->orderBy('sort_order')->get(); +@endphp + + diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/view/text.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/text.blade.php new file mode 100755 index 0000000..1be1e8b --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/text.blade.php @@ -0,0 +1,13 @@ + diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/view/textarea.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/textarea.blade.php new file mode 100755 index 0000000..b66f5b8 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/textarea.blade.php @@ -0,0 +1,12 @@ + diff --git a/packages/Webkul/Admin/src/Resources/views/components/avatar/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/avatar/index.blade.php new file mode 100644 index 0000000..fbe7182 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/avatar/index.blade.php @@ -0,0 +1,69 @@ + +
    +
    + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/breadcrumbs/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/breadcrumbs/index.blade.php new file mode 100644 index 0000000..2e942ee --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/breadcrumbs/index.blade.php @@ -0,0 +1,15 @@ +@props([ + 'name' => '', + 'entity' => null, + 'route' => null, +]) + +
    +
    + @if($route) + {{ Breadcrumbs::view('admin::partials.breadcrumbs', $name, $route, $entity) }} + @else + {{ Breadcrumbs::view('admin::partials.breadcrumbs', $name, $entity) }} + @endif +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/components/button/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/button/index.blade.php new file mode 100644 index 0000000..e4bc772 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/button/index.blade.php @@ -0,0 +1,40 @@ + + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/charts/bar.blade.php b/packages/Webkul/Admin/src/Resources/views/components/charts/bar.blade.php new file mode 100644 index 0000000..3dc549f --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/charts/bar.blade.php @@ -0,0 +1,100 @@ + + +@pushOnce('scripts') + + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/charts/doughnut.blade.php b/packages/Webkul/Admin/src/Resources/views/components/charts/doughnut.blade.php new file mode 100644 index 0000000..33e4bab --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/charts/doughnut.blade.php @@ -0,0 +1,68 @@ + + +@pushOnce('scripts') + + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/charts/line.blade.php b/packages/Webkul/Admin/src/Resources/views/components/charts/line.blade.php new file mode 100644 index 0000000..928a815 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/charts/line.blade.php @@ -0,0 +1,97 @@ + + +@pushOnce('scripts') + + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/datagrid/export/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/datagrid/export/index.blade.php new file mode 100644 index 0000000..58bdcaa --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/datagrid/export/index.blade.php @@ -0,0 +1,170 @@ + +
    + + + @lang('admin::app.export.export') +
    +
    + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/datagrid/export/temp.blade.php b/packages/Webkul/Admin/src/Resources/views/components/datagrid/export/temp.blade.php new file mode 100755 index 0000000..257cf65 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/datagrid/export/temp.blade.php @@ -0,0 +1,23 @@ + + + + @foreach ($columns as $column) + + @endforeach + + + + + @foreach ($records as $record) + + @foreach($columns as $column) + @if ($closure = $column->getClosure()) + + @else + + @endif + @endforeach + + @endforeach + +
    {{ $column->getLabel() }}
    {!! $closure($record) !!}{{ $record->{$column->getIndex()} }}
    diff --git a/packages/Webkul/Admin/src/Resources/views/components/datagrid/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/datagrid/index.blade.php new file mode 100644 index 0000000..ae93865 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/datagrid/index.blade.php @@ -0,0 +1,572 @@ +@props([ + 'isMultiRow' => false, + 'toolbarLeftBefore' => null, + 'toolbarLeftAfter' => null, + 'toolbarRightBefore' => null, + 'toolbarRightAfter' => null, +]) + + + {{ $slot }} + + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/datagrid/table.blade.php b/packages/Webkul/Admin/src/Resources/views/components/datagrid/table.blade.php new file mode 100644 index 0000000..ba4a491 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/datagrid/table.blade.php @@ -0,0 +1,377 @@ +@props(['isMultiRow' => false]) + + + {{ $slot }} + + +@pushOnce('scripts') + + + +@endpushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar.blade.php b/packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar.blade.php new file mode 100644 index 0000000..5d6563a --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar.blade.php @@ -0,0 +1,94 @@ + + + diff --git a/packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar/filter.blade.php b/packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar/filter.blade.php new file mode 100644 index 0000000..5f79f71 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar/filter.blade.php @@ -0,0 +1,1530 @@ + + {{ $slot }} + + +@pushOnce('scripts') + + + + + + + +@endpushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar/mass-action.blade.php b/packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar/mass-action.blade.php new file mode 100644 index 0000000..c47c44f --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar/mass-action.blade.php @@ -0,0 +1,220 @@ + + {{ $slot }} + + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar/pagination.blade.php b/packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar/pagination.blade.php new file mode 100644 index 0000000..3bb4e6d --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar/pagination.blade.php @@ -0,0 +1,157 @@ + + {{ $slot }} + + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar/search.blade.php b/packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar/search.blade.php new file mode 100644 index 0000000..1fdad78 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar/search.blade.php @@ -0,0 +1,157 @@ + + {{ $slot }} + + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/drawer/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/drawer/index.blade.php new file mode 100644 index 0000000..16e27b3 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/drawer/index.blade.php @@ -0,0 +1,201 @@ +@props([ + 'isActive' => false, + 'position' => 'right', + 'width' => '500px', +]) + + + @isset($toggle) + + @endisset + + @isset($header) + + @endisset + + @isset($content) + + @endisset + + @isset($footer) + + @endisset + + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/dropdown/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/dropdown/index.blade.php new file mode 100644 index 0000000..4faf14c --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/dropdown/index.blade.php @@ -0,0 +1,170 @@ +@props(['position' => 'bottom-left']) + +merge(['class' => 'relative']) }}> + @isset($toggle) + {{ $toggle }} + + + @endisset + + @isset($content) + + @endisset + + @isset($menu) + + @endisset + + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/dropdown/menu/item.blade.php b/packages/Webkul/Admin/src/Resources/views/components/dropdown/menu/item.blade.php new file mode 100644 index 0000000..513b575 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/dropdown/menu/item.blade.php @@ -0,0 +1,3 @@ +
  1. merge(['class' => 'cursor-pointer px-5 py-2 text-sm text-gray-800 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-950 ']) }}> + {{ $slot }} +
  2. diff --git a/packages/Webkul/Admin/src/Resources/views/components/example.blade.php b/packages/Webkul/Admin/src/Resources/views/components/example.blade.php new file mode 100644 index 0000000..374ccde --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/example.blade.php @@ -0,0 +1,12 @@ + +@php + $bgColors = ['bg-orange-100', 'bg-red-100', 'bg-green-100', 'bg-blue-100', 'bg-purple-100']; + $textColors = ['text-orange-800', 'text-red-800', 'text-green-800', 'text-blue-800', 'text-purple-800']; +@endphp +@foreach ($bgColors as $bgColor) +
    +@endforeach + +@foreach ($textColors as $textColor) +
    +@endforeach \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/flash-group/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/flash-group/index.blade.php new file mode 100644 index 0000000..f62a1d8 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/flash-group/index.blade.php @@ -0,0 +1,64 @@ + + +@pushOnce('scripts') + + + +@endpushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/flash-group/item.blade.php b/packages/Webkul/Admin/src/Resources/views/components/flash-group/item.blade.php new file mode 100644 index 0000000..81ccaa0 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/flash-group/item.blade.php @@ -0,0 +1,205 @@ + + + +@pushOnce('scripts') + + + +@endpushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/flat-picker/date.blade.php b/packages/Webkul/Admin/src/Resources/views/components/flat-picker/date.blade.php new file mode 100644 index 0000000..f5b3954 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/flat-picker/date.blade.php @@ -0,0 +1,81 @@ + + {{ $slot }} + + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/flat-picker/datetime.blade.php b/packages/Webkul/Admin/src/Resources/views/components/flat-picker/datetime.blade.php new file mode 100644 index 0000000..7c60790 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/flat-picker/datetime.blade.php @@ -0,0 +1,83 @@ + + {{ $slot }} + + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/control-group/control.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/control.blade.php new file mode 100644 index 0000000..616ec0f --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/control.blade.php @@ -0,0 +1,353 @@ +@props([ + 'type' => 'text', + 'name' => '', +]) + +@switch($type) + @case('hidden') + @case('text') + @case('email') + @case('password') + @case('number') + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label']) }} + name="{{ $name }}" + > + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400']) }} + /> + + + @break + + @case('price') + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label']) }} + name="{{ $name }}" + > +
    + @if (isset($currency)) + attributes->merge(['class' => 'py-2.5 text-gray-500 ltr:pl-4 rtl:pr-4']) }}> + {{ $currency }} + + @else + + {{ config('app.currency') }} + + @endif + + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full p-2.5 text-sm text-gray-600 dark:bg-gray-900 dark:text-gray-300']) }} + /> +
    +
    + + @break + + @case('file') + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label']) }} + name="{{ $name }}" + > + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full dark:file:bg-gray-800 dark:file:dark:text-white rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400']) }} + @change="handleChange" + @blur="handleBlur" + /> + + + @break + + @case('color') + except('class') }} + > + except(['value'])->merge(['class' => 'w-full appearance-none rounded-md border text-sm text-gray-600 transition-all hover:border-gray-400 dark:text-gray-300 dark:hover:border-gray-400']) }} + > + + @break + + @case('textarea') + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label']) }} + name="{{ $name }}" + > + @php + $defaultAttributes = [ + 'class' => 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400' + ]; + + if ($attributes->get('tinymce', false) || $attributes->get(':tinymce', false)) { + $defaultAttributes['id'] = $attributes->get(':id', 'id'); + } + @endphp + + + + @if ($attributes->get('tinymce', false) || $attributes->get(':tinymce', false)) + + @endif + + + @break + + @case('date') + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['rules' => 'regex:^\d{4}-\d{2}-\d{2}$']) }} + name="{{ $name }}" + > + + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400']) }} + autocomplete="off" + /> + + + + @break + + @case('datetime') + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['rules' => 'regex:^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$']) }} + name="{{ $name }}" + > + + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400']) }} + autocomplete="off" + > + + + @break + + @case('select') + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label']) }} + name="{{ $name }}" + > + + + + @break + + @case('multiselect') + except([])->merge(['class' => 'flex w-full flex-col rounded-md border bg-white px-3 py-2.5 text-sm font-normal text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400']) }} + name="{{ $name }}" + multiple + > + {{ $slot }} + + + @break + + @case('checkbox') + + + + + @break + + @case('radio') + + + + + @break + + @case('switch') + + + @break + + @case('image') + + + @break + + @case('inline') + + + @break + + @case('custom') + + {{ $slot }} + + + @break + + @case('tags') + + @break +@endswitch + +@pushOnce('scripts') + + + +@endpushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/address.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/address.blade.php new file mode 100644 index 0000000..ba4e2e4 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/address.blade.php @@ -0,0 +1,370 @@ +@props([ + 'allowEdit' => true, +]) + +except('value') }} + :value='@json($attributes->get('value'))' + :allow-edit="{{ $allowEdit ? 'true' : 'false' }}" +> +
    +
    +
    +
    +
    +
    + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/boolean.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/boolean.blade.php new file mode 100644 index 0000000..6f5a8b2 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/boolean.blade.php @@ -0,0 +1,250 @@ +@props([ + 'allowEdit' => true, +]) + +except('options') }} + :allow-edit="{{ $allowEdit ? 'true' : 'false' }}" +> +
    +
    +
    +
    +
    +
    + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/date.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/date.blade.php new file mode 100644 index 0000000..f5f3bd9 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/date.blade.php @@ -0,0 +1,245 @@ +@props([ + 'allowEdit' => true, +]) + + +
    +
    +
    +
    +
    +
    + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/datetime.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/datetime.blade.php new file mode 100644 index 0000000..8488c72 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/datetime.blade.php @@ -0,0 +1,245 @@ +@props([ + 'allowEdit' => true, +]) + + +
    +
    +
    +
    +
    +
    + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/email.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/email.blade.php new file mode 100644 index 0000000..507c375 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/email.blade.php @@ -0,0 +1,320 @@ +@props([ + 'allowEdit' => true, +]) + +except('value') }} + :value={{ json_encode($attributes->get('value')) }} + :allow-edit="{{ $allowEdit ? 'true' : 'false' }}" +> +
    +
    +
    +
    +
    +
    + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/file.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/file.blade.php new file mode 100644 index 0000000..0856a1a --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/file.blade.php @@ -0,0 +1,245 @@ +@props([ + 'allowEdit' => true, +]) + + +
    +
    +
    +
    +
    +
    + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/image.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/image.blade.php new file mode 100644 index 0000000..7386e18 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/image.blade.php @@ -0,0 +1,242 @@ +@props([ + 'allowEdit' => true, +]) + + +
    +
    +
    +
    +
    +
    + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/lookup.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/lookup.blade.php new file mode 100644 index 0000000..06e5018 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/lookup.blade.php @@ -0,0 +1,448 @@ +@props([ + 'allowEdit' => true, + 'attribute' => [], +]) + + +
    +
    +
    +
    +
    +
    + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/multiselect.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/multiselect.blade.php new file mode 100644 index 0000000..68d4ce1 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/multiselect.blade.php @@ -0,0 +1,367 @@ +@props([ + 'allowEdit' => true, + 'data' => [], +]) + +except('data') }} + :data="{{ json_encode($data) }}" + :allow-edit="{{ $allowEdit ? 'true' : 'false' }}" +> +
    +
    +
    +
    +
    +
    + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/phone.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/phone.blade.php new file mode 100644 index 0000000..58af08c --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/phone.blade.php @@ -0,0 +1,321 @@ +@props([ + 'allowEdit' => true, +]) + +except('value') }} + :value={{ json_encode($attributes->get('value')) }} + :allow-edit="{{ $allowEdit ? 'true' : 'false' }}" +> +
    +
    +
    +
    +
    +
    + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/select.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/select.blade.php new file mode 100644 index 0000000..5d79071 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/select.blade.php @@ -0,0 +1,270 @@ +@props([ + 'allowEdit' => true, + 'options' => [], +]) + +except('options') }} + :options="{{ json_encode($options) }}" + :allow-edit="{{ $allowEdit ? 'true' : 'false' }}" +> +
    +
    +
    +
    +
    +
    + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/text.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/text.blade.php new file mode 100644 index 0000000..8eb9dd2 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/text.blade.php @@ -0,0 +1,277 @@ +@props([ + 'allowEdit' => true, +]) + + +
    +
    +
    +
    +
    +
    + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/tags.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/tags.blade.php new file mode 100644 index 0000000..bdcad84 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/tags.blade.php @@ -0,0 +1,183 @@ + + +@pushOnce('scripts') + + + +@endpushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/control-group/error.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/error.blade.php new file mode 100644 index 0000000..88d5292 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/error.blade.php @@ -0,0 +1,16 @@ +@props([ + 'name' => null, + 'controlName' => '', +]) + + +

    merge(['class' => 'mt-1 text-xs italic text-red-600']) }} + v-text="message" + > +

    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/control-group/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/index.blade.php new file mode 100644 index 0000000..e391d10 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/index.blade.php @@ -0,0 +1,3 @@ +
    merge(['class' => 'mb-4']) }}> + {{ $slot }} +
    diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/control-group/label.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/label.blade.php new file mode 100644 index 0000000..8f7b393 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/label.blade.php @@ -0,0 +1,3 @@ + diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/index.blade.php new file mode 100644 index 0000000..0faa931 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/index.blade.php @@ -0,0 +1,40 @@ + +@if ($attributes->has('as')) + + {{ $slot }} + + + +@else + @props([ + 'method' => 'POST', + ]) + + @php + $method = strtoupper($method); + @endphp + + + @unless(in_array($method, ['HEAD', 'GET', 'OPTIONS'])) + @csrf + @endunless + + @if (! in_array($method, ['GET', 'POST'])) + @method($method) + @endif + + {{ $slot }} + +@endif \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/layouts/anonymous.blade.php b/packages/Webkul/Admin/src/Resources/views/components/layouts/anonymous.blade.php new file mode 100644 index 0000000..c1e7e2c --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/layouts/anonymous.blade.php @@ -0,0 +1,124 @@ + + + + + + {{ $title ?? '' }} + + + + + + + + + + + @stack('meta') + + {{ + vite()->set(['src/Resources/assets/css/app.css', 'src/Resources/assets/js/app.js']) + }} + + + + + + @if ($favicon = core()->getConfigData('general.design.admin_logo.favicon')) + + @else + + @endif + + @php + $brandColor = core()->getConfigData('general.settings.menu_color.brand_color') ?? '#0E90D9'; + @endphp + + @stack('styles') + + + + {!! view_render_event('admin.layout.head') !!} + + + + {!! view_render_event('admin.layout.body.before') !!} + +
    + + + + {!! view_render_event('admin.layout.content.before') !!} + + + {{ $slot }} + + {!! view_render_event('admin.layout.content.after') !!} +
    + + {!! view_render_event('admin.layout.body.after') !!} + + @stack('scripts') + + {!! view_render_event('admin.layout.vue-app-mount.before') !!} + + + + {!! view_render_event('admin.layout.vue-app-mount.after') !!} + + + + + diff --git a/packages/Webkul/Admin/src/Resources/views/components/layouts/header/desktop/mega-search.blade.php b/packages/Webkul/Admin/src/Resources/views/components/layouts/header/desktop/mega-search.blade.php new file mode 100644 index 0000000..893dd1c --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/layouts/header/desktop/mega-search.blade.php @@ -0,0 +1,567 @@ + +
    + + + +
    +
    + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/layouts/header/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/layouts/header/index.blade.php new file mode 100644 index 0000000..e9dcfc5 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/layouts/header/index.blade.php @@ -0,0 +1,191 @@ +
    + + + +
    + + @include('admin::components.layouts.header.desktop.mega-search') + + + @include('admin::components.layouts.header.quick-creation') +
    + +
    +
    + + @include('admin::components.layouts.header.mobile.mega-search') +
    + + + +
    + +
    +
    + +
    + + @include('admin::components.layouts.header.quick-creation') +
    + + + + + @php($user = auth()->guard('user')->user()) + + @if ($user->image) + + @else + + @endif + + + + +
    + + + +

    + @lang('admin::app.layouts.app-version', ['version' => core()->version()]) +

    +
    + + + +
    +
    +
    + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/layouts/header/mobile/mega-search.blade.php b/packages/Webkul/Admin/src/Resources/views/components/layouts/header/mobile/mega-search.blade.php new file mode 100644 index 0000000..9986eb1 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/layouts/header/mobile/mega-search.blade.php @@ -0,0 +1,593 @@ + + + + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/layouts/header/quick-creation.blade.php b/packages/Webkul/Admin/src/Resources/views/components/layouts/header/quick-creation.blade.php new file mode 100644 index 0000000..ef71747 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/layouts/header/quick-creation.blade.php @@ -0,0 +1,145 @@ +
    + @if (bouncer()->hasPermission('leads.create') + || bouncer()->hasPermission('quotes.create') + || bouncer()->hasPermission('mail.create') + || bouncer()->hasPermission('contacts.persons.create') + || bouncer()->hasPermission('contacts.organizations.create') + || bouncer()->hasPermission('products.create') + || bouncer()->hasPermission('settings.automation.attributes.create') + || bouncer()->hasPermission('settings.user.roles.create') + || bouncer()->hasPermission('settings.user.users.create') + ) + + + + + + + + +
    +
    + + @if (bouncer()->hasPermission('leads.create')) + + @endif + + + @if (bouncer()->hasPermission('quotes.create')) + + @endif + + + @if (bouncer()->hasPermission('mail.create')) + + @endif + + + @if (bouncer()->hasPermission('contacts.persons.create')) + + @endif + + + @if (bouncer()->hasPermission('contacts.organizations.create')) + + @endif + + + @if (bouncer()->hasPermission('products.create')) + + @endif + + + @if (bouncer()->hasPermission('settings.automation.attributes.create')) + + @endif + + + @if (bouncer()->hasPermission('settings.user.roles.create')) + + @endif + + + @if (bouncer()->hasPermission('settings.user.users.create')) + + @endif +
    +
    + +
    + @endif +
    diff --git a/packages/Webkul/Admin/src/Resources/views/components/layouts/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/layouts/index.blade.php new file mode 100644 index 0000000..5221ac3 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/layouts/index.blade.php @@ -0,0 +1,158 @@ + + + + + + + {!! view_render_event('admin.layout.head.before') !!} + + {{ $title ?? '' }} + + + + + + + + + + + @stack('meta') + + {{ + vite()->set(['src/Resources/assets/css/app.css', 'src/Resources/assets/js/app.js']) + }} + + + + + + @if ($favicon = core()->getConfigData('general.design.admin_logo.favicon')) + + @else + + @endif + + @php + $brandColor = core()->getConfigData('general.settings.menu_color.brand_color') ?? '#0E90D9'; + @endphp + + @stack('styles') + + + + {!! view_render_event('admin.layout.head.after') !!} + + + + {!! view_render_event('admin.layout.body.before') !!} + +
    + + + + + + + {!! view_render_event('admin.layout.content.before') !!} + + + + + + + {!! view_render_event('admin.layout.content.after') !!} +
    + + {!! view_render_event('admin.layout.body.after') !!} + + @stack('scripts') + + {!! view_render_event('admin.layout.vue-app-mount.before') !!} + + + + {!! view_render_event('admin.layout.vue-app-mount.after') !!} + + + diff --git a/packages/Webkul/Admin/src/Resources/views/components/layouts/sidebar/desktop/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/layouts/sidebar/desktop/index.blade.php new file mode 100644 index 0000000..ac20515 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/layouts/sidebar/desktop/index.blade.php @@ -0,0 +1,63 @@ +
    +
    + +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/layouts/sidebar/mobile/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/layouts/sidebar/mobile/index.blade.php new file mode 100644 index 0000000..c2c2b7f --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/layouts/sidebar/mobile/index.blade.php @@ -0,0 +1,120 @@ + + + + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/layouts/tabs.blade.php b/packages/Webkul/Admin/src/Resources/views/components/layouts/tabs.blade.php new file mode 100755 index 0000000..9a0b47f --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/layouts/tabs.blade.php @@ -0,0 +1,20 @@ +@php + $tabs = menu()->getCurrentActiveMenu('admin')?->getChildren(); +@endphp + +@if ( + $tabs + && $tabs->isNotEmpty() +) +
    +
    + @foreach ($tabs as $tab) + +
    + {{ $tab->getName() }} +
    +
    + @endforeach +
    +
    +@endif diff --git a/packages/Webkul/Admin/src/Resources/views/components/lookup/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/lookup/index.blade.php new file mode 100644 index 0000000..ccae8b4 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/lookup/index.blade.php @@ -0,0 +1,328 @@ + + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/media/images.blade.php b/packages/Webkul/Admin/src/Resources/views/components/media/images.blade.php new file mode 100644 index 0000000..5698450 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/media/images.blade.php @@ -0,0 +1,334 @@ +@props([ + 'name' => 'images', + 'allowMultiple' => false, + 'showPlaceholders' => false, + 'uploadedImages' => [], + 'width' => '120px', + 'height' => '120px' +]) + + + + + +@pushOnce('scripts') + + + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/media/videos.blade.php b/packages/Webkul/Admin/src/Resources/views/components/media/videos.blade.php new file mode 100644 index 0000000..1bab30e --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/media/videos.blade.php @@ -0,0 +1,307 @@ +@props([ + 'name' => 'images', + 'allowMultiple' => false, + 'uploadedVideos' => [], + 'width' => '210px', + 'height' => '120px' +]) + +get('class') }} +> + + +@pushOnce('scripts') + + + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/modal/confirm.blade.php b/packages/Webkul/Admin/src/Resources/views/components/modal/confirm.blade.php new file mode 100644 index 0000000..ed302b6 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/modal/confirm.blade.php @@ -0,0 +1,140 @@ + + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/modal/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/modal/index.blade.php new file mode 100644 index 0000000..4de1ce1 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/modal/index.blade.php @@ -0,0 +1,225 @@ +@props([ + 'isActive' => false, + 'position' => 'center', + 'size' => 'normal', +]) + + + @isset($toggle) + + @endisset + + @isset($header) + + @endisset + + @isset($content) + + @endisset + + @isset($footer) + + @endisset + + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/accordion/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/accordion/index.blade.php new file mode 100644 index 0000000..7c97ce1 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/accordion/index.blade.php @@ -0,0 +1,17 @@ +
    +
    +

    +

    +
    + +
    +
    +

    +

    +

    +

    +

    +

    +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/activities/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/activities/index.blade.php new file mode 100644 index 0000000..7a37245 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/activities/index.blade.php @@ -0,0 +1,41 @@ +
    + +
    + @for ($i = 0; $i < 5; $i++) +
    +
    +
    + @endfor +
    + + +
    + +
    + @for ($i = 0; $i < 5; $i++) + +
    + +
    + + +
    +
    +
    + +
    +
    +
    +
    + +
    +
    + + +
    +
    +
    + @endfor +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/charts/bar.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/charts/bar.blade.php new file mode 100644 index 0000000..4762e4b --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/charts/bar.blade.php @@ -0,0 +1,28 @@ +@props(['count' => 30]) + +
    +
    + @foreach (range(1, 10) as $i) +
    + @endforeach +
    + +
    +
    +
    + @foreach (range(1, $count) as $i) +
    + @endforeach +
    +
    + +
    + @foreach (range(1, $count) as $i) +
    + @endforeach +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/common/address.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/common/address.blade.php new file mode 100644 index 0000000..0eca400 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/common/address.blade.php @@ -0,0 +1,15 @@ +
    +
    +
    +
    + +
    +
    + +
    + +
    + +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/open-leads-by-states.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/open-leads-by-states.blade.php new file mode 100644 index 0000000..7f3ff55 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/open-leads-by-states.blade.php @@ -0,0 +1,16 @@ +
    +
    +
    +
    + +
    +
    + @for ($i = 0; $i < 4; $i++) +
    +
    +
    +
    + @endfor +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/over-all.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/over-all.blade.php new file mode 100644 index 0000000..2248363 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/over-all.blade.php @@ -0,0 +1,13 @@ +
    + @for ($i = 1; $i <= 6; $i++) +
    +
    + +
    +
    + +
    +
    +
    + @endfor +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/revenue-by-sources.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/revenue-by-sources.blade.php new file mode 100644 index 0000000..447d46c --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/revenue-by-sources.blade.php @@ -0,0 +1,21 @@ +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/revenue-by-types.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/revenue-by-types.blade.php new file mode 100644 index 0000000..447d46c --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/revenue-by-types.blade.php @@ -0,0 +1,21 @@ +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/revenue.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/revenue.blade.php new file mode 100644 index 0000000..1dcefe6 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/revenue.blade.php @@ -0,0 +1,46 @@ +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/top-persons.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/top-persons.blade.php new file mode 100644 index 0000000..fc5add2 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/top-persons.blade.php @@ -0,0 +1,25 @@ +
    +
    +
    +
    + +
    + @for ($i = 1; $i <= 5; $i++) +
    + +
    + +
    + +
    + +
    + + +
    +
    +
    +
    + @endfor +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/top-selling-products.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/top-selling-products.blade.php new file mode 100644 index 0000000..26e6436 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/top-selling-products.blade.php @@ -0,0 +1,25 @@ +
    +
    +
    +
    + +
    + @for ($i = 1; $i <= 5; $i++) +
    + +
    + +
    + +
    + +
    + + +
    +
    +
    +
    + @endfor +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/total-leads.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/total-leads.blade.php new file mode 100644 index 0000000..d07d3c3 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/total-leads.blade.php @@ -0,0 +1,18 @@ +
    +
    + + + + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/index.blade.php new file mode 100644 index 0000000..4222616 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/index.blade.php @@ -0,0 +1,15 @@ +@props(['isMultiRow' => false]) + +
    + + +
    +
    +
    + + + +
    +
    +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/table/body.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/table/body.blade.php new file mode 100644 index 0000000..a1689b1 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/table/body.blade.php @@ -0,0 +1,53 @@ +@props(['isMultiRow' => false]) + +@for ($i = 0; $i < 10; $i++) + @if (! $isMultiRow) +
    +
    + +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    + @else +
    +
    +
    + +
    +
    + +
    + +
    +
    +
    + +
    +
    + +
    + +
    +
    + +
    +
    + +
    + +
    +
    +
    + @endif +@endfor diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/table/head.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/table/head.blade.php new file mode 100644 index 0000000..60cf1d8 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/table/head.blade.php @@ -0,0 +1,29 @@ +@props(['isMultiRow' => false]) + +@if (! $isMultiRow) +
    +
    + +
    + +
    + +
    + +
    + +
    +
    +@else +
    +
    +
    + +
    +
    + +
    + +
    +
    +@endif diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/toolbar.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/toolbar.blade.php new file mode 100644 index 0000000..cdae5e1 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/toolbar.blade.php @@ -0,0 +1,27 @@ +
    + +
    +
    + +
    +
    + + +
    +
    +

    +
    + +
    +
    + +

    + +
    +
    + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/toolbar/filter.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/toolbar/filter.blade.php new file mode 100644 index 0000000..cc31c5b --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/toolbar/filter.blade.php @@ -0,0 +1,3 @@ +{{--
    +
    +
    --}} diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/toolbar/pagination.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/toolbar/pagination.blade.php new file mode 100644 index 0000000..23f8f3c --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/toolbar/pagination.blade.php @@ -0,0 +1,17 @@ +
    +
    +

    +
    + +
    +
    + +

    + +
    +
    + +
    +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/toolbar/search.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/toolbar/search.blade.php new file mode 100644 index 0000000..7e58b44 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/toolbar/search.blade.php @@ -0,0 +1,5 @@ +
    +
    + +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/configurations.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/configurations.blade.php new file mode 100644 index 0000000..5566bcc --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/configurations.blade.php @@ -0,0 +1,12 @@ +@for ($i = 0; $i < 3; $i++) +
    + +
    + +
    +

    +

    +
    +
    +
    +@endfor diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/leads.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/leads.blade.php new file mode 100644 index 0000000..36387e6 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/leads.blade.php @@ -0,0 +1,17 @@ +@for ($i = 0; $i < 3; $i++) +
    + +
    + +
    +

    +

    +
    +
    + + +
    +

    +
    +
    +@endfor diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/persons.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/persons.blade.php new file mode 100644 index 0000000..f339b28 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/persons.blade.php @@ -0,0 +1,17 @@ +@for ($i = 0; $i < 3; $i++) +
    + +
    + +
    +

    +

    +
    +
    + + +
    +

    +
    +
    +@endfor \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/products.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/products.blade.php new file mode 100644 index 0000000..98cbed4 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/products.blade.php @@ -0,0 +1,17 @@ +@for ($i = 0; $i < 3; $i++) +
    + +
    + +
    +

    +

    +
    +
    + + +
    +

    +
    +
    +@endfor \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/quotes.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/quotes.blade.php new file mode 100644 index 0000000..fffad36 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/quotes.blade.php @@ -0,0 +1,12 @@ +@for ($i = 0; $i < 3; $i++) +
    + +
    + +
    +

    +

    +
    +
    +
    +@endfor \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/settings.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/settings.blade.php new file mode 100644 index 0000000..5566bcc --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/settings.blade.php @@ -0,0 +1,12 @@ +@for ($i = 0; $i < 3; $i++) +
    + +
    + +
    +

    +

    +
    +
    +
    +@endfor diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/image/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/image/index.blade.php new file mode 100644 index 0000000..f4ff081 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/image/index.blade.php @@ -0,0 +1,44 @@ + +
    merge(['class' => 'shimmer bg-neutral-100']) }}>
    +
    + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/datagrid.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/datagrid.blade.php new file mode 100644 index 0000000..ba83758 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/datagrid.blade.php @@ -0,0 +1,144 @@ +
    + +
    +
    +
    +
    +
    + + +
    + +
    +
    +
    + +
    +
    + +
    + +
    +
    + +
    +
    + + +
    +
    + +
    +
    + +
    + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + +
    +
    +
    + +
    +
    + +
    + +
    +
    + +
    +
    + + +
    +
    + +
    + +
    +
    + + +
    +
    + +
    + +
    +
    + + +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    + +
    +
    + +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/index/kanban.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/index/kanban.blade.php new file mode 100644 index 0000000..8d8efab --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/index/kanban.blade.php @@ -0,0 +1,60 @@ + + +
    + + @for ($i = 1; $i <= 6; $i++) +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + + +
    + @for ($j = 1; $j <= 3; $j++) + +
    + +
    +
    + +
    + + +
    +
    +
    +
    +
    + + +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    + @endfor +
    +
    + @endfor +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/index/kanban/toolbar.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/index/kanban/toolbar.blade.php new file mode 100644 index 0000000..3b34210 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/index/kanban/toolbar.blade.php @@ -0,0 +1,17 @@ +
    +
    +
    +
    +
    + +
    + +
    + + +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/view/mail/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/view/mail/index.blade.php new file mode 100644 index 0000000..2547d55 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/view/mail/index.blade.php @@ -0,0 +1,111 @@ +@props([ + 'count' => 1, +]) + +
    +
    + @for ($i = 0; $i < $count; $i++) +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    + @endfor +
    + +
    +
    +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    + +
    +
    + + +
    +
    + +
    + + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/view/stages.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/view/stages.blade.php new file mode 100644 index 0000000..8373cc9 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/view/stages.blade.php @@ -0,0 +1,9 @@ +@props(['count' => 5]) + +
    + @for ($i = 0; $i < $count; $i++) +
    +
    +
    + @endfor +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/mail/datagrid/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/mail/datagrid/index.blade.php new file mode 100644 index 0000000..b9c7a98 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/mail/datagrid/index.blade.php @@ -0,0 +1,13 @@ +
    + + +
    +
    +
    + + + +
    +
    +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/mail/datagrid/table/body.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/mail/datagrid/table/body.blade.php new file mode 100644 index 0000000..11f80cd --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/mail/datagrid/table/body.blade.php @@ -0,0 +1,31 @@ +@for ($i = 0; $i < 10; $i++) +
    +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +@endfor \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/mail/datagrid/table/head.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/mail/datagrid/table/head.blade.php new file mode 100644 index 0000000..caf7f84 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/mail/datagrid/table/head.blade.php @@ -0,0 +1,13 @@ +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/person/view/activities/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/person/view/activities/index.blade.php new file mode 100644 index 0000000..f2cfa43 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/person/view/activities/index.blade.php @@ -0,0 +1,41 @@ +
    + +
    + @for ($i = 0; $i < 5; $i++) +
    +
    +
    + @endfor +
    + + +
    + +
    + @for ($i = 0; $i < 5; $i++) + +
    + +
    + + +
    +
    +
    + +
    +
    +
    +
    + +
    +
    + + +
    +
    +
    + @endfor +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/person/view/stages.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/person/view/stages.blade.php new file mode 100644 index 0000000..3a4d6a0 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/person/view/stages.blade.php @@ -0,0 +1,9 @@ +@props(['count' => 5]) + +
    + @for ($i = 0; $i < $count; $i++) +
    +
    +
    + @endfor +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/person/view/tags.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/person/view/tags.blade.php new file mode 100644 index 0000000..e03ac2d --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/person/view/tags.blade.php @@ -0,0 +1,9 @@ +@props(['count' => 5]) + +
    + @for ($i = 0; $i < $count; $i++) +
    + @endfor + +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/pipelines/kanban.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/pipelines/kanban.blade.php new file mode 100644 index 0000000..5b9a167 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/pipelines/kanban.blade.php @@ -0,0 +1,33 @@ +
    + @for ($i = 1; $i <= 6; $i++) +
    + +
    + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + +
    +
    + +
    +
    +
    + @endfor +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/quotes/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/quotes/index.blade.php new file mode 100644 index 0000000..c9e2003 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/quotes/index.blade.php @@ -0,0 +1,116 @@ +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/settings/attributes.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/settings/attributes.blade.php new file mode 100644 index 0000000..1cc494c --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/settings/attributes.blade.php @@ -0,0 +1,62 @@ + +
    + +
    +
    +
    + + @for ($i = 1; $i < 5; $i++) +
    +
    + +
    +
    + @endfor +
    +
    + + +
    + +
    +
    +

    + +

    +
    + +
    + @for ($i = 1; $i < 4; $i++) +
    +
    + +
    +
    + @endfor +
    +
    + + +
    +
    +

    + +

    +
    + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/settings/web-forms/body.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/settings/web-forms/body.blade.php new file mode 100644 index 0000000..fce4f85 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/settings/web-forms/body.blade.php @@ -0,0 +1,13 @@ +
    +
    + +
    + +
    +
    + +
    + +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/settings/web-forms/head.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/settings/web-forms/head.blade.php new file mode 100644 index 0000000..004d22f --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/settings/web-forms/head.blade.php @@ -0,0 +1,7 @@ +
    +
    + +
    + +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/settings/web-forms/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/settings/web-forms/index.blade.php new file mode 100644 index 0000000..f69d2cd --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/settings/web-forms/index.blade.php @@ -0,0 +1,13 @@ +
    + + +
    +
    +
    + + + +
    +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/tabs/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/tabs/index.blade.php new file mode 100644 index 0000000..614e942 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/tabs/index.blade.php @@ -0,0 +1,9 @@ +
    + + + + + + + +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/tags/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/tags/index.blade.php new file mode 100644 index 0000000..e03ac2d --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/tags/index.blade.php @@ -0,0 +1,9 @@ +@props(['count' => 5]) + +
    + @for ($i = 0; $i < $count; $i++) +
    + @endfor + +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/tinymce/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/tinymce/index.blade.php new file mode 100644 index 0000000..311bb35 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/tinymce/index.blade.php @@ -0,0 +1,3 @@ +
    merge(['class' => 'shimmer block bg-neutral-100']) }}> + +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/tree/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/tree/index.blade.php new file mode 100644 index 0000000..fc8e172 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/tree/index.blade.php @@ -0,0 +1,31 @@ +@for ($j = 0; $j < 3; $j++) +
    + +
    + +
    + + +
    +
    + +
    + +
    +
    +
    + + +
    + @for ($k = 0; $k < 5; $k++) +
    +
    + +
    + +
    +
    + @endfor +
    +
    +@endfor \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/spinner/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/spinner/index.blade.php new file mode 100644 index 0000000..ed724bd --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/spinner/index.blade.php @@ -0,0 +1,27 @@ + +@props(['color' => 'currentColor']) + + \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/table/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/table/index.blade.php new file mode 100644 index 0000000..a886898 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/table/index.blade.php @@ -0,0 +1,3 @@ +merge(['class' => 'table-fixed w-full min-w-[800px] text-left text-sm border border-gray-200 dark:border-gray-800']) }}> + {{ $slot }} +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/table/tbody/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/table/tbody/index.blade.php new file mode 100644 index 0000000..fd45937 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/table/tbody/index.blade.php @@ -0,0 +1,3 @@ +merge(['class' => 'bg-white dark:bg-gray-900 dark:text-gray-300 dark:border-gray-800']) }}> + {{ $slot }} + \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/table/tbody/tr.blade.php b/packages/Webkul/Admin/src/Resources/views/components/table/tbody/tr.blade.php new file mode 100644 index 0000000..3fb610a --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/table/tbody/tr.blade.php @@ -0,0 +1,3 @@ +merge(['scope' => 'row', 'class' => 'border-b border-gray-200 last:border-b-0 dark:border-gray-800']) }}> + {{ $slot }} + \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/table/td.blade.php b/packages/Webkul/Admin/src/Resources/views/components/table/td.blade.php new file mode 100644 index 0000000..06148f9 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/table/td.blade.php @@ -0,0 +1,4 @@ +merge(['scope' => 'row', 'class' => 'whitespace-nowrap px-6 py-4']) }}> + {{ $slot }} + + \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/table/th.blade.php b/packages/Webkul/Admin/src/Resources/views/components/table/th.blade.php new file mode 100644 index 0000000..57bc1d5 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/table/th.blade.php @@ -0,0 +1,3 @@ +merge(['scope' => 'col', 'class' => 'whitespace-nowrap px-6 py-4 font-semibold']) }}> + {{ $slot }} + diff --git a/packages/Webkul/Admin/src/Resources/views/components/table/thead/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/table/thead/index.blade.php new file mode 100644 index 0000000..ace6cd8 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/table/thead/index.blade.php @@ -0,0 +1,3 @@ +merge(['class' => 'bg-gray-50 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300']) }}> + {{ $slot }} + \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/table/thead/tr.blade.php b/packages/Webkul/Admin/src/Resources/views/components/table/thead/tr.blade.php new file mode 100644 index 0000000..87e980d --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/table/thead/tr.blade.php @@ -0,0 +1,3 @@ +merge(['scope' => 'row', 'class' => 'border-b border-gray-200 dark:border-gray-800']) }}> + {{ $slot }} + \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/tabs/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/tabs/index.blade.php new file mode 100644 index 0000000..e1ac715 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/tabs/index.blade.php @@ -0,0 +1,65 @@ +@props(['position' => 'left']) + + + + + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/tabs/item.blade.php b/packages/Webkul/Admin/src/Resources/views/components/tabs/item.blade.php new file mode 100644 index 0000000..dc1cd0b --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/tabs/item.blade.php @@ -0,0 +1,51 @@ +@props([ + 'title' => '', + 'isSelected' => false, +]) + +merge(['class' => 'p-4']) }} +> + + + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/tags/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/tags/index.blade.php new file mode 100644 index 0000000..5683d48 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/tags/index.blade.php @@ -0,0 +1,398 @@ +@props([ + 'attachEndpoint', + 'detachEndpoint', + 'addedTags' => [], +]) + + + + + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/tinymce/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/tinymce/index.blade.php new file mode 100644 index 0000000..733e65d --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/tinymce/index.blade.php @@ -0,0 +1,217 @@ +@php($placeholders = app('\Webkul\Automation\Helpers\Entity')->getEmailTemplatePlaceholders()) + + + +@pushOnce('scripts') + + + + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/tree/checkbox.blade.php b/packages/Webkul/Admin/src/Resources/views/components/tree/checkbox.blade.php new file mode 100644 index 0000000..8af3905 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/tree/checkbox.blade.php @@ -0,0 +1,55 @@ +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/tree/radio.blade.php b/packages/Webkul/Admin/src/Resources/views/components/tree/radio.blade.php new file mode 100644 index 0000000..769062a --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/tree/radio.blade.php @@ -0,0 +1,54 @@ +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/tree/view.blade.php b/packages/Webkul/Admin/src/Resources/views/components/tree/view.blade.php new file mode 100644 index 0000000..177d136 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/tree/view.blade.php @@ -0,0 +1,393 @@ +@props([ + 'inputType' => 'checkbox', + 'selectionType' => 'hierarchical', +]) + +@if ($inputType == 'checkbox') + + +@else + + +@endif + +except(['input-type', 'selection-type']) }} + input-type="{{ $inputType }}" + selection-type="{{ $selectionType }}" +> + + + +@pushOnce('scripts') + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/configuration/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/configuration/edit.blade.php new file mode 100644 index 0000000..08fbe00 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/configuration/edit.blade.php @@ -0,0 +1,83 @@ +@php + $activeConfiguration = system_config()->getActiveConfigurationItem(); +@endphp + + + + {{ $name = $activeConfiguration->getName() }} + + + {!! view_render_event('admin.configuration.edit.form_controls.before') !!} + + + + +
    +

    + {{ $name }} +

    + + +
    + {!! view_render_event('admin.configuration.edit.back_button.before') !!} + + + + @lang('admin::app.configuration.index.back') + + + {!! view_render_event('admin.configuration.edit.back_button.after') !!} + + {!! view_render_event('admin.configuration.edit.save_button.before') !!} + + + + {!! view_render_event('admin.configuration.edit.save_button.after') !!} +
    +
    + +
    + @foreach ($activeConfiguration->getChildren() as $child) +
    +

    + {{ $child->getName() }} +

    + +

    + {!! $child->getInfo() !!} +

    +
    + +
    + {!! view_render_event('admin.configuration.edit.form_controls.before') !!} + + @foreach ($child->getFields() as $field) + @if ( + $field->getType() == 'blade' + && view()->exists($path = $field->getPath()) + ) + {!! view($path, compact('field', 'child'))->render() !!} + @else + @include ('admin::configuration.field-type') + @endif + @endforeach + + {!! view_render_event('admin.configuration.edit.form_controls.after') !!} +
    + @endforeach +
    +
    + + {!! view_render_event('admin.configuration.edit.form_controls.after') !!} +
    diff --git a/packages/Webkul/Admin/src/Resources/views/configuration/field-type.blade.php b/packages/Webkul/Admin/src/Resources/views/configuration/field-type.blade.php new file mode 100755 index 0000000..31f0ab6 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/configuration/field-type.blade.php @@ -0,0 +1,524 @@ +@php($value = old($field->getNameKey()) ?? system_config()->getConfigData($field->getNameKey())) + + + +
    + +
    + +
    +
    +
    + +@pushOnce('scripts') + + + + + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/configuration/index.blade.php b/packages/Webkul/Admin/src/Resources/views/configuration/index.blade.php new file mode 100644 index 0000000..2ba8c0e --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/configuration/index.blade.php @@ -0,0 +1,196 @@ + + + + @lang('admin::app.configuration.index.title') + + + + + + {!! view_render_event('admin.configuration.index.header.before') !!} + + +
    +

    + @lang('admin::app.configuration.index.title') +

    + + {!! view_render_event('admin.configuration.index.header.configuration_search.before') !!} + + + +
    + + + +
    +
    + + {!! view_render_event('admin.configuration.index.header.configuration_search.after') !!} +
    + + {!! view_render_event('admin.configuration.index.header.after') !!} + + {!! view_render_event('admin.configuration.index.content.before') !!} + + +
    + @foreach (system_config()->getItems() as $item) +
    +
    + +

    + {{ $item->getName() }} +

    + + +

    + {{ $item->getInfo() }} +

    +
    + + +
    + @endforeach +
    + + {!! view_render_event('admin.configuration.index.content.after') !!} + + @pushOnce('scripts') + + + + @endpushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/contacts/organizations/create.blade.php b/packages/Webkul/Admin/src/Resources/views/contacts/organizations/create.blade.php new file mode 100644 index 0000000..f86e77f --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/contacts/organizations/create.blade.php @@ -0,0 +1,73 @@ + + + + + @lang('admin::app.contacts.organizations.create.title') + + + {!! view_render_event('admin.organizations.create.form.before') !!} + + + +
    +
    +
    + {!! view_render_event('admin.organizations.create.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.organizations.create.breadcrumbs.before') !!} + +
    + @lang('admin::app.contacts.organizations.create.title') +
    +
    + +
    +
    + {!! view_render_event('admin.organizations.create.save_buttons.before') !!} + + + + + {!! view_render_event('admin.organizations.create.save_buttons.before') !!} +
    +
    +
    + +
    + {!! view_render_event('admin.contacts.organizations.create.form_controls.before') !!} + + + + {!! view_render_event('admin.contacts.organizations.edit.form_controls.after') !!} +
    +
    +
    + + {!! view_render_event('admin.organizations.create.form.after') !!} +
    diff --git a/packages/Webkul/Admin/src/Resources/views/contacts/organizations/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/contacts/organizations/edit.blade.php new file mode 100644 index 0000000..d8710f4 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/contacts/organizations/edit.blade.php @@ -0,0 +1,75 @@ + + + + + @lang('admin::app.contacts.organizations.edit.title') + + + {!! view_render_event('admin.organizations.edit.form.before') !!} + + +
    +
    +
    + {!! view_render_event('admin.organizations.edit.breadcrumbs.before', ['organization' => $organization]) !!} + + + + {!! view_render_event('admin.organizations.edit.breadcrumbs.before', ['organization' => $organization]) !!} + +
    + @lang('admin::app.contacts.organizations.edit.title') +
    +
    + +
    +
    + {!! view_render_event('admin.organizations.edit.save_button.before', ['organization' => $organization]) !!} + + + + + {!! view_render_event('admin.organizations.edit.save_button.after', ['organization' => $organization]) !!} +
    +
    +
    + +
    + {!! view_render_event('admin.contacts.organizations.edit.form_controls.before') !!} + + + + {!! view_render_event('admin.contacts.organizations.edit.form_controls.after') !!} +
    +
    +
    + + {!! view_render_event('admin.organizations.edit.form.after') !!} +
    diff --git a/packages/Webkul/Admin/src/Resources/views/contacts/organizations/index.blade.php b/packages/Webkul/Admin/src/Resources/views/contacts/organizations/index.blade.php new file mode 100644 index 0000000..1f4d880 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/contacts/organizations/index.blade.php @@ -0,0 +1,50 @@ + + + + @lang('admin::app.contacts.organizations.index.title') + + +
    +
    +
    + {!! view_render_event('admin.organizations.index.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.organizations.index.breadcrumbs.before') !!} + +
    + @lang('admin::app.contacts.organizations.index.title') +
    +
    + +
    +
    + {!! view_render_event('admin.organizations.index.create_button.before') !!} + + @if (bouncer()->hasPermission('contacts.organizations.create')) + + + @lang('admin::app.contacts.organizations.index.create-btn') + + @endif + + {!! view_render_event('admin.organizations.index.create_button.after') !!} +
    +
    +
    + + {!! view_render_event('admin.organizations.datagrid.index.before') !!} + + + + + + + {!! view_render_event('admin.organizations.datagrid.index.after') !!} +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/contacts/persons/create.blade.php b/packages/Webkul/Admin/src/Resources/views/contacts/persons/create.blade.php new file mode 100644 index 0000000..1f91fba --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/contacts/persons/create.blade.php @@ -0,0 +1,117 @@ + + + + @lang('admin::app.contacts.persons.create.title') + + + {!! view_render_event('admin.persons.create.form.before') !!} + + + +
    + +
    +
    + {!! view_render_event('admin.persons.create.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.persons.create.breadcrumbs.after') !!} + +
    + @lang('admin::app.contacts.persons.create.title') +
    +
    + +
    +
    + {!! view_render_event('admin.persons.create.create_button.before') !!} + + + + + {!! view_render_event('admin.persons.create.create_button.after') !!} +
    +
    +
    + + +
    + {!! view_render_event('admin.persons.create.form_controls.before') !!} + + + + + + {!! view_render_event('admin.persons.create.form_controls.after') !!} +
    +
    +
    + + {!! view_render_event('admin.persons.create.form.after') !!} + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/contacts/persons/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/contacts/persons/edit.blade.php new file mode 100644 index 0000000..60e85fb --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/contacts/persons/edit.blade.php @@ -0,0 +1,120 @@ + + + + + @lang('admin::app.contacts.persons.edit.title') + + + {!! view_render_event('admin.persons.edit.form.before') !!} + + +
    +
    +
    + {!! view_render_event('admin.persons.edit.breadcrumbs.before') !!} + + + + {!! view_render_event('admin.persons.edit.breadcrumbs.after') !!} + +
    + @lang('admin::app.contacts.persons.edit.title') +
    +
    + +
    + +
    + {!! view_render_event('admin.persons.edit.save_button.before') !!} + + + + {!! view_render_event('admin.persons.edit.save_button.after') !!} +
    +
    +
    + +
    + {!! view_render_event('admin.contacts.persons.edit.form_controls.before') !!} + + + + + + {!! view_render_event('admin.contacts.persons.edit.form_controls.after') !!} +
    +
    +
    + + {!! view_render_event('admin.persons.edit.form.after') !!} + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/contacts/persons/index.blade.php b/packages/Webkul/Admin/src/Resources/views/contacts/persons/index.blade.php new file mode 100644 index 0000000..8f0e2b9 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/contacts/persons/index.blade.php @@ -0,0 +1,339 @@ + + + @lang('admin::app.contacts.persons.index.title') + + +
    +
    +
    + + +
    + @lang('admin::app.contacts.persons.index.title') +
    +
    + +
    + + + + +
    + {!! view_render_event('admin.persons.index.create_button.before') !!} + + @if (bouncer()->hasPermission('contacts.persons.create')) + + @lang('admin::app.contacts.persons.index.create-btn') + + @endif + + {!! view_render_event('admin.persons.index.create_button.after') !!} +
    +
    +
    + + {!! view_render_event('admin.persons.index.datagrid.before') !!} + + + + + + + {!! view_render_event('admin.persons.index.datagrid.after') !!} +
    + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/contacts/persons/view.blade.php b/packages/Webkul/Admin/src/Resources/views/contacts/persons/view.blade.php new file mode 100644 index 0000000..4348dc7 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/contacts/persons/view.blade.php @@ -0,0 +1,100 @@ + + + @lang('admin::app.contacts.persons.view.title', ['name' => $person->name]) + + + +
    + + {!! view_render_event('admin.contact.persons.view.left.before', ['person' => $person]) !!} + +
    + +
    + +
    + +
    + + {!! view_render_event('admin.contact.persons.view.tags.before', ['person' => $person]) !!} + + + + + {!! view_render_event('admin.contact.persons.view.tags.after', ['person' => $person]) !!} + + + +
    + {!! view_render_event('admin.contact.persons.view.title.before', ['person' => $person]) !!} + +

    + {{ $person->name }} +

    + +

    + {{ $person->job_title }} +

    + + {!! view_render_event('admin.contact.persons.view.title.after', ['person' => $person]) !!} +
    + + +
    + {!! view_render_event('admin.contact.persons.view.actions.before', ['person' => $person]) !!} + + + + + + + + + + + + + + {!! view_render_event('admin.contact.persons.view.actions.after', ['person' => $person]) !!} +
    +
    + + + @include ('admin::contacts.persons.view.attributes') + + + @include ('admin::contacts.persons.view.organization') +
    + + {!! view_render_event('admin.contact.persons.view.left.after', ['person' => $person]) !!} + + +
    + {!! view_render_event('admin.contact.persons.view.right.before', ['person' => $person]) !!} + + + + + {!! view_render_event('admin.contact.persons.view.right.after', ['person' => $person]) !!} +
    +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/contacts/persons/view/attributes.blade.php b/packages/Webkul/Admin/src/Resources/views/contacts/persons/view/attributes.blade.php new file mode 100644 index 0000000..16d605e --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/contacts/persons/view/attributes.blade.php @@ -0,0 +1,41 @@ +{!! view_render_event('admin.contacts.persons.view.attributes.before', ['person' => $person]) !!} + +
    + + +

    + @lang('admin::app.contacts.persons.view.about-person') +

    + + + + {!! view_render_event('admin.contacts.persons.view.attributes.form_controls.before', ['person' => $person]) !!} + + +
    + {!! view_render_event('admin.contacts.persons.view.attributes.form_controls.attributes_view.before', ['person' => $person]) !!} + + + + {!! view_render_event('admin.contacts.persons.view.attributes.form_controls.attributes_view.after', ['person' => $person]) !!} + +
    + + {!! view_render_event('admin.contacts.persons.view.attributes.form_controls.after', ['person' => $person]) !!} + +
    +
    + +{!! view_render_event('admin.contacts.persons.view.attributes.before', ['person' => $person]) !!} diff --git a/packages/Webkul/Admin/src/Resources/views/contacts/persons/view/organization.blade.php b/packages/Webkul/Admin/src/Resources/views/contacts/persons/view/organization.blade.php new file mode 100644 index 0000000..7f0569d --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/contacts/persons/view/organization.blade.php @@ -0,0 +1,73 @@ +{!! view_render_event('admin.contacts.persons.view.organization.before', ['person' => $person]) !!} + +@if ($person?->organization) +
    +

    + @lang('admin::app.contacts.persons.view.about-organization') + + +

    + +
    + {!! view_render_event('admin.contacts.persons.view.organization.avatar.before', ['person' => $person]) !!} + + + + + {!! view_render_event('admin.contacts.persons.view.organization.avatar.after', ['person' => $person]) !!} + + +
    + {!! view_render_event('admin.contacts.persons.view.organization.name.before', ['person' => $person]) !!} + + + {{ $person->organization->name }} + + + {!! view_render_event('admin.contacts.persons.view.organization.name.after', ['person' => $person]) !!} + + + {!! view_render_event('admin.contacts.persons.view.organization.address.before', ['person' => $person]) !!} + + @if ($person->organization->address) +
    + @isset($person->organization->address['address']) + + {{ $person->organization->address['address'] }} + + @endisset + + @if( + isset($person->organization->address['postcode']) + && isset($person->organization->address['city']) + ) + + {{ $person->organization->address['postcode'] . ' ' . $person->organization->address['city'] }} + + @endif + + @isset($person->organization->address['state']) + + {{ core()->state_name($person->organization->address['state']) }} + + @endisset + + @isset($person->organization->address['country']) + + {{ core()->country_name($person->organization->address['country']) }} + + @endisset +
    + @endif + + {!! view_render_event('admin.contacts.persons.view.organization.address.after', ['person' => $person]) !!} +
    +
    +
    +@endif + +{!! view_render_event('admin.contacts.persons.view.organization.after', ['person' => $person]) !!} diff --git a/packages/Webkul/Admin/src/Resources/views/dashboard/index.blade.php b/packages/Webkul/Admin/src/Resources/views/dashboard/index.blade.php new file mode 100644 index 0000000..467aae0 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/dashboard/index.blade.php @@ -0,0 +1,160 @@ + + + @lang('admin::app.dashboard.index.title') + + + + {!! view_render_event('admin.dashboard.index.header.before') !!} + +
    + {!! view_render_event('admin.dashboard.index.header.left.before') !!} + +
    +

    + @lang('admin::app.dashboard.index.title') +

    +
    + + {!! view_render_event('admin.dashboard.index.header.left.after') !!} + + + {!! view_render_event('admin.dashboard.index.header.right.before') !!} + + + +
    +
    +
    +
    +
    + + {!! view_render_event('admin.dashboard.index.header.right.after') !!} +
    + + {!! view_render_event('admin.dashboard.index.header.after') !!} + + + {!! view_render_event('admin.dashboard.index.content.before') !!} + +
    + + {!! view_render_event('admin.dashboard.index.content.left.before') !!} + +
    + + @include('admin::dashboard.index.revenue') + + + @include('admin::dashboard.index.over-all') + + + @include('admin::dashboard.index.total-leads') + +
    + + @include('admin::dashboard.index.top-selling-products') + + + @include('admin::dashboard.index.top-persons') +
    +
    + + {!! view_render_event('admin.dashboard.index.content.left.after') !!} + + + {!! view_render_event('admin.dashboard.index.content.right.before') !!} + +
    + + @include('admin::dashboard.index.open-leads-by-states') + + + @include('admin::dashboard.index.revenue-by-sources') + + + @include('admin::dashboard.index.revenue-by-types') +
    + + {!! view_render_event('admin.dashboard.index.content.left.after') !!} +
    + + {!! view_render_event('admin.dashboard.index.content.after') !!} + + @pushOnce('scripts') + + + + + + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/dashboard/index/open-leads-by-states.blade.php b/packages/Webkul/Admin/src/Resources/views/dashboard/index/open-leads-by-states.blade.php new file mode 100644 index 0000000..b88b5da --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/dashboard/index/open-leads-by-states.blade.php @@ -0,0 +1,168 @@ +{!! view_render_event('admin.dashboard.index.open_leads_by_states.before') !!} + + + + + + + +{!! view_render_event('admin.dashboard.index.open_leads_by_states.after') !!} + +@pushOnce('scripts') + + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/dashboard/index/over-all.blade.php b/packages/Webkul/Admin/src/Resources/views/dashboard/index/over-all.blade.php new file mode 100644 index 0000000..83d2360 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/dashboard/index/over-all.blade.php @@ -0,0 +1,231 @@ +{!! view_render_event('admin.dashboard.index.over_all.before') !!} + + + + + + + +{!! view_render_event('admin.dashboard.index.over_all.after') !!} + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/dashboard/index/revenue-by-sources.blade.php b/packages/Webkul/Admin/src/Resources/views/dashboard/index/revenue-by-sources.blade.php new file mode 100644 index 0000000..7aba2fb --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/dashboard/index/revenue-by-sources.blade.php @@ -0,0 +1,154 @@ +{!! view_render_event('admin.dashboard.index.revenue_by_sources.before') !!} + + + + + + + +{!! view_render_event('admin.dashboard.index.revenue_by_sources.after') !!} + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/dashboard/index/revenue-by-types.blade.php b/packages/Webkul/Admin/src/Resources/views/dashboard/index/revenue-by-types.blade.php new file mode 100644 index 0000000..60cea9e --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/dashboard/index/revenue-by-types.blade.php @@ -0,0 +1,154 @@ +{!! view_render_event('admin.dashboard.index.revenue_by_types.before') !!} + + + + + + + +{!! view_render_event('admin.dashboard.index.revenue_by_types.after') !!} + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/dashboard/index/revenue.blade.php b/packages/Webkul/Admin/src/Resources/views/dashboard/index/revenue.blade.php new file mode 100644 index 0000000..e803cf6 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/dashboard/index/revenue.blade.php @@ -0,0 +1,241 @@ +{!! view_render_event('admin.dashboard.index.revenue.after') !!} + + + + + + + +{!! view_render_event('admin.dashboard.index.revenue.after') !!} + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/dashboard/index/top-persons.blade.php b/packages/Webkul/Admin/src/Resources/views/dashboard/index/top-persons.blade.php new file mode 100644 index 0000000..11a6bc2 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/dashboard/index/top-persons.blade.php @@ -0,0 +1,120 @@ +{!! view_render_event('admin.dashboard.index.top_persons.before') !!} + + + + + + + +{!! view_render_event('admin.dashboard.index.top_persons.after') !!} + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/dashboard/index/top-selling-products.blade.php b/packages/Webkul/Admin/src/Resources/views/dashboard/index/top-selling-products.blade.php new file mode 100644 index 0000000..0c504a9 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/dashboard/index/top-selling-products.blade.php @@ -0,0 +1,129 @@ +{!! view_render_event('admin.dashboard.index.top_selling_proudcts.before') !!} + + + + + + + +{!! view_render_event('admin.dashboard.index.top_selling_proudcts.after') !!} + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/dashboard/index/total-leads.blade.php b/packages/Webkul/Admin/src/Resources/views/dashboard/index/total-leads.blade.php new file mode 100644 index 0000000..c84b9b1 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/dashboard/index/total-leads.blade.php @@ -0,0 +1,128 @@ +{!! view_render_event('admin.dashboard.index.total_leads.before') !!} + + + + + + + +{!! view_render_event('admin.dashboard.index.total_leads.after') !!} + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/emails/common/index.blade.php b/packages/Webkul/Admin/src/Resources/views/emails/common/index.blade.php new file mode 100644 index 0000000..f8a3edc --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/emails/common/index.blade.php @@ -0,0 +1,3 @@ +@component('admin::emails.layout') + {!! $body !!} +@endcomponent diff --git a/packages/Webkul/Admin/src/Resources/views/emails/layout.blade.php b/packages/Webkul/Admin/src/Resources/views/emails/layout.blade.php new file mode 100644 index 0000000..38e6f6a --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/emails/layout.blade.php @@ -0,0 +1,36 @@ + + + + + + + + + + + + +
    +
    + +
    + + {{ config('app.name') }} + +
    + + + {{ $slot }} + + +

    + @lang('admin::app.emails.common.cheers', ['app_name' => config('app.name')]) +

    +
    +
    + + diff --git a/packages/Webkul/Admin/src/Resources/views/emails/users/create.blade.php b/packages/Webkul/Admin/src/Resources/views/emails/users/create.blade.php new file mode 100644 index 0000000..1d83a1d --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/emails/users/create.blade.php @@ -0,0 +1,11 @@ +@component('admin::emails.layout') +
    +

    + @lang('admin::app.emails.common.user.dear', ['username' => $user_name]), 👋 +

    + +

    + @lang('admin::app.emails.common.user.create-body') +

    +
    +@endcomponent diff --git a/packages/Webkul/Admin/src/Resources/views/emails/users/forget-password.blade.php b/packages/Webkul/Admin/src/Resources/views/emails/users/forget-password.blade.php new file mode 100644 index 0000000..bad6350 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/emails/users/forget-password.blade.php @@ -0,0 +1,28 @@ +@component('admin::emails.layout') +
    +

    + @lang('admin::app.emails.common.user.forget-password.dear', ['username' => $user_name]), 👋 +

    + +

    + @lang('admin::app.emails.common.user.forget-password.info') +

    + +

    + + @lang('admin::app.emails.common.user.forget-password.reset-password') + +

    + +

    + @lang('admin::app.emails.common.user.forget-password.final-summary') +

    + +

    + @lang('admin::app.emails.common.user.forget-password.thanks') +

    +
    +@endcomponent diff --git a/packages/Webkul/Admin/src/Resources/views/errors/index.blade.php b/packages/Webkul/Admin/src/Resources/views/errors/index.blade.php new file mode 100644 index 0000000..0c73cc6 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/errors/index.blade.php @@ -0,0 +1,64 @@ + + + + @lang("admin::app.errors.{$errorCode}.title") + + + +
    +
    +
    + + +
    + {{ $errorCode }} +
    + +

    + @lang("admin::app.errors.{$errorCode}.description") +

    + + + +

    + @lang('admin::app.errors.support', [ + 'link' => 'mailto:support@example.com', + 'email' => 'support@example.com', + 'class' => 'font-semibold text-blue-600 transition-all hover:underline', + ]) +

    +
    + +
    + +
    +
    +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/leads/common/contact.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/common/contact.blade.php new file mode 100644 index 0000000..6f89f8d --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/common/contact.blade.php @@ -0,0 +1,141 @@ +{!! view_render_event('admin.leads.create.contact_person.form_controls.before') !!} + + + +{!! view_render_event('admin.leads.create.contact_person.form_controls.after') !!} + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/leads/common/products.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/common/products.blade.php new file mode 100644 index 0000000..9e08493 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/common/products.blade.php @@ -0,0 +1,269 @@ +{!! view_render_event('admin.leads.create.products.form_controls.before') !!} + + + +{!! view_render_event('admin.leads.create.products.form_controls.after') !!} + +@pushOnce('scripts') + + + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/leads/create.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/create.blade.php new file mode 100644 index 0000000..9a6e112 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/create.blade.php @@ -0,0 +1,272 @@ + + + @lang('admin::app.leads.create.title') + + + {!! view_render_event('admin.leads.create.form.before') !!} + + + +
    +
    +
    + + +
    + @lang('admin::app.leads.create.title') +
    +
    + + {!! view_render_event('admin.leads.create.save_button.before') !!} + +
    + +
    + {!! view_render_event('admin.leads.create.form_buttons.before') !!} + + + + {!! view_render_event('admin.leads.create.form_buttons.after') !!} +
    +
    + + {!! view_render_event('admin.leads.create.save_button.after') !!} +
    + + @if (request('stage_id')) + + @endif + + @if (request('pipeline_id')) + + @endif + + + + + +
    +
    + + {!! view_render_event('admin.leads.create.form.after') !!} + + @pushOnce('scripts') + + + + @endPushOnce + + @pushOnce('styles') + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/leads/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/edit.blade.php new file mode 100644 index 0000000..43b1d56 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/edit.blade.php @@ -0,0 +1,270 @@ + + + + @lang('admin::app.leads.edit.title') + + + {!! view_render_event('admin.leads.edit.form_controls.before', ['lead' => $lead]) !!} + + + +
    +
    +
    + + +
    + @lang('admin::app.leads.edit.title') +
    +
    + +
    + {!! view_render_event('admin.leads.edit.save_button.before', ['lead' => $lead]) !!} + + +
    + {!! view_render_event('admin.leads.edit.form_buttons.before') !!} + + + + {!! view_render_event('admin.leads.edit.form_buttons.after') !!} +
    + + {!! view_render_event('admin.leads.edit.save_button.after', ['lead' => $lead]) !!} +
    +
    + + + + + + + +
    +
    + + {!! view_render_event('admin.leads.edit.form_controls.after', ['lead' => $lead]) !!} + + @pushOnce('scripts') + + + + @endPushOnce + + @pushOnce('styles') + + @endPushOnce +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/leads/index.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/index.blade.php new file mode 100644 index 0000000..d278ff2 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/index.blade.php @@ -0,0 +1,66 @@ + + + @lang('admin::app.leads.index.title') + + + + {!! view_render_event('admin.leads.index.header.before') !!} + +
    + {!! view_render_event('admin.leads.index.header.left.before') !!} + +
    + + + +
    + @lang('admin::app.leads.index.title') +
    +
    + + {!! view_render_event('admin.leads.index.header.left.after') !!} + + {!! view_render_event('admin.leads.index.header.right.before') !!} + +
    + + @if(core()->getConfigData('general.magic_ai.doc_generation.enabled')) + @include('admin::leads.index.upload') + @endif + + @if ((request()->view_type ?? "kanban") == "table") + + + @endif + + +
    + @if (bouncer()->hasPermission('leads.create')) + + @lang('admin::app.leads.index.create-btn') + + @endif +
    +
    + + {!! view_render_event('admin.leads.index.header.right.after') !!} +
    + + {!! view_render_event('admin.leads.index.header.after') !!} + + {!! view_render_event('admin.leads.index.content.before') !!} + + +
    + @if ((request()->view_type ?? "kanban") == "table") + @include('admin::leads.index.table') + @else + @include('admin::leads.index.kanban') + @endif +
    + + {!! view_render_event('admin.leads.index.content.after') !!} +
    diff --git a/packages/Webkul/Admin/src/Resources/views/leads/index/kanban.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/index/kanban.blade.php new file mode 100644 index 0000000..1d4efe6 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/index/kanban.blade.php @@ -0,0 +1,772 @@ +{!! view_render_event('admin.leads.index.kanban.before') !!} + + + +
    + + +
    +
    + +{!! view_render_event('admin.leads.index.kanban.after') !!} + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/leads/index/kanban/filter.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/index/kanban/filter.blade.php new file mode 100644 index 0000000..d540df8 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/index/kanban/filter.blade.php @@ -0,0 +1,1093 @@ +{!! view_render_event('admin.leads.index.kanban.filter.before') !!} + + + + +{!! view_render_event('admin.leads.index.kanban.filter.after') !!} + +@pushOnce('scripts') + + + + + + + +@endpushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/leads/index/kanban/search.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/index/kanban/search.blade.php new file mode 100644 index 0000000..8dc605b --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/index/kanban/search.blade.php @@ -0,0 +1,98 @@ +{!! view_render_event('admin.leads.index.kanban.search.before') !!} + + + + +{!! view_render_event('admin.leads.index.kanban.search.after') !!} + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/leads/index/kanban/toolbar.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/index/kanban/toolbar.blade.php new file mode 100644 index 0000000..e72aab6 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/index/kanban/toolbar.blade.php @@ -0,0 +1,30 @@ +{!! view_render_event('admin.leads.index.kanban.toolbar.before') !!} + +
    +
    + {!! view_render_event('admin.leads.index.kanban.toolbar.search.before') !!} + + + @include('admin::leads.index.kanban.search') + + {!! view_render_event('admin.leads.index.kanban.toolbar.search.after') !!} + + {!! view_render_event('admin.leads.index.kanban.toolbar.filter.before') !!} + + + @include('admin::leads.index.kanban.filter') + + {!! view_render_event('admin.leads.index.kanban.toolbar.filter.after') !!} + + +
    + + {!! view_render_event('admin.leads.index.kanban.toolbar.switcher.before') !!} + + + @include('admin::leads.index.view-switcher') + + {!! view_render_event('admin.leads.index.kanban.toolbar.switcher.after') !!} +
    + +{!! view_render_event('admin.leads.index.kanban.toolbar.after') !!} diff --git a/packages/Webkul/Admin/src/Resources/views/leads/index/table.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/index/table.blade.php new file mode 100644 index 0000000..9f4a75b --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/index/table.blade.php @@ -0,0 +1,12 @@ +{!! view_render_event('admin.leads.index.table.before') !!} + + + + + + + @include('admin::leads.index.view-switcher') + + + +{!! view_render_event('admin.leads.index.table.after') !!} \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/leads/index/upload.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/index/upload.blade.php new file mode 100644 index 0000000..e6d598d --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/index/upload.blade.php @@ -0,0 +1,141 @@ + + + + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/leads/index/view-switcher.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/index/view-switcher.blade.php new file mode 100644 index 0000000..841f73a --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/index/view-switcher.blade.php @@ -0,0 +1,95 @@ +{!! view_render_event('admin.leads.index.view_switcher.before') !!} + +
    + + + {!! view_render_event('admin.leads.index.view_switcher.pipeline.button.before') !!} + + + + {!! view_render_event('admin.leads.index.view_switcher.pipeline.button.after') !!} + + + + {!! view_render_event('admin.leads.index.view_switcher.pipeline.content.header.before') !!} + + +
    + + @lang('admin::app.leads.index.view-switcher.all-pipelines') + +
    + + {!! view_render_event('admin.leads.index.view_switcher.pipeline.content.header.after') !!} + + + @foreach (app('Webkul\Lead\Repositories\PipelineRepository')->all() as $tempPipeline) + {!! view_render_event('admin.leads.index.view_switcher.pipeline.content.before', ['tempPipeline' => $tempPipeline]) !!} + + + {{ $tempPipeline->name }} + + + {!! view_render_event('admin.leads.index.view_switcher.pipeline.content.after', ['tempPipeline' => $tempPipeline]) !!} + @endforeach + + {!! view_render_event('admin.leads.index.view_switcher.pipeline.content.footer.before') !!} + + + + + @lang('admin::app.leads.index.view-switcher.create-new-pipeline') + + + + {!! view_render_event('admin.leads.index.view_switcher.pipeline.content.footer.after') !!} + +
    + +
    + {!! view_render_event('admin.leads.index.view_switcher.pipeline.view_type.before') !!} + + @if (request('view_type')) + + + + + + @else + + + + + + @endif + + {!! view_render_event('admin.leads.index.view_switcher.pipeline.view_type.after') !!} +
    +
    + +{!! view_render_event('admin.leads.index.view_switcher.after') !!} \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/leads/view.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/view.blade.php new file mode 100644 index 0000000..8b79070 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/view.blade.php @@ -0,0 +1,142 @@ + + + @lang('admin::app.leads.view.title', ['title' => $lead->title]) + + + +
    + + {!! view_render_event('admin.leads.view.left.before', ['lead' => $lead]) !!} + +
    + +
    + +
    + +
    + +
    + @if (($days = $lead->rotten_days) > 0) + @php + $lead->tags->prepend([ + 'name' => '' . trans('admin::app.leads.view.rotten-days', ['days' => $days]), + 'color' => '#FEE2E2' + ]); + @endphp + @endif + + {!! view_render_event('admin.leads.view.tags.before', ['lead' => $lead]) !!} + + + + + {!! view_render_event('admin.leads.view.tags.after', ['lead' => $lead]) !!} +
    + + + {!! view_render_event('admin.leads.view.title.before', ['lead' => $lead]) !!} + + +

    + {{ $lead->title }} +

    + + {!! view_render_event('admin.leads.view.title.after', ['lead' => $lead]) !!} + + +
    + {!! view_render_event('admin.leads.view.actions.before', ['lead' => $lead]) !!} + + @if (bouncer()->hasPermission('mail.compose')) + + + @endif + + @if (bouncer()->hasPermission('activities.create')) + + + + + + + + + @endif + + {!! view_render_event('admin.leads.view.actions.after', ['lead' => $lead]) !!} +
    +
    + + + @include ('admin::leads.view.attributes') + + + @include ('admin::leads.view.person') +
    + + {!! view_render_event('admin.leads.view.left.after', ['lead' => $lead]) !!} + + {!! view_render_event('admin.leads.view.right.before', ['lead' => $lead]) !!} + + +
    + + @include ('admin::leads.view.stages') + + + {!! view_render_event('admin.leads.view.activities.before', ['lead' => $lead]) !!} + + + + + @include ('admin::leads.view.products') + + + + + @include ('admin::leads.view.quotes') + + + + +
    + {{ $lead->description }} +
    + +
    + + {!! view_render_event('admin.leads.view.activities.after', ['lead' => $lead]) !!} +
    + + {!! view_render_event('admin.leads.view.right.after', ['lead' => $lead]) !!} +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/leads/view/attributes.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/view/attributes.blade.php new file mode 100644 index 0000000..33904b7 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/view/attributes.blade.php @@ -0,0 +1,49 @@ +{!! view_render_event('admin.leads.view.attributes.before', ['lead' => $lead]) !!} + +
    + + +
    +

    @lang('admin::app.leads.view.attributes.title')

    + + @if (bouncer()->hasPermission('leads.edit')) + + @endif +
    + + + + {!! view_render_event('admin.leads.view.attributes.form_controls.before', ['lead' => $lead]) !!} + + +
    + {!! view_render_event('admin.leads.view.attributes.form_controls.attributes.view.before', ['lead' => $lead]) !!} + + + + {!! view_render_event('admin.leads.view.attributes.form_controls.attributes.view.after', ['lead' => $lead]) !!} + +
    + + {!! view_render_event('admin.leads.view.attributes.form_controls.after', ['lead' => $lead]) !!} + +
    +
    + +{!! view_render_event('admin.leads.view.attributes.before', ['lead' => $lead]) !!} diff --git a/packages/Webkul/Admin/src/Resources/views/leads/view/person.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/view/person.blade.php new file mode 100644 index 0000000..4c18735 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/view/person.blade.php @@ -0,0 +1,103 @@ +{!! view_render_event('admin.leads.view.person.before', ['lead' => $lead]) !!} + +@if ($lead?->person) +
    + + +
    +

    @lang('admin::app.leads.view.persons.title')

    + + @if (bouncer()->hasPermission('contacts.persons.edit')) + + @endif +
    + + + +
    + {!! view_render_event('admin.leads.view.person.avatar.before', ['lead' => $lead]) !!} + + + + + {!! view_render_event('admin.leads.view.person.avatar.after', ['lead' => $lead]) !!} + + +
    + {!! view_render_event('admin.leads.view.person.name.before', ['lead' => $lead]) !!} + + + {{ $lead->person->name }} + + + {!! view_render_event('admin.leads.view.person.name.after', ['lead' => $lead]) !!} + + {!! view_render_event('admin.leads.view.person.job_title.before', ['lead' => $lead]) !!} + + @if ($lead->person->job_title) + + @if ($lead->person->organization) + @lang('admin::app.leads.view.persons.job-title', [ + 'job_title' => $lead->person->job_title, + 'organization' => $lead->person->organization->name + ]) + @else + {{ $lead->person->job_title }} + @endif + + @endif + + {!! view_render_event('admin.leads.view.person.job_title.after', ['lead' => $lead]) !!} + + {!! view_render_event('admin.leads.view.person.email.before', ['lead' => $lead]) !!} + + @foreach ($lead->person->emails as $email) +
    + + {{ $email['value'] }} + + + + ({{ $email['label'] }}) + +
    + @endforeach + + {!! view_render_event('admin.leads.view.person.email.after', ['lead' => $lead]) !!} + + {!! view_render_event('admin.leads.view.person.contact_numbers.before', ['lead' => $lead]) !!} + + @foreach ($lead->person->contact_numbers as $contactNumber) +
    + + {{ $contactNumber['value'] }} + + + + ({{ $contactNumber['label'] }}) + +
    + @endforeach + + {!! view_render_event('admin.leads.view.person.contact_numbers.after', ['lead' => $lead]) !!} +
    +
    + +
    +
    +@endif +{!! view_render_event('admin.leads.view.person.after', ['lead' => $lead]) !!} \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/leads/view/products.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/view/products.blade.php new file mode 100644 index 0000000..a9d9399 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/view/products.blade.php @@ -0,0 +1,379 @@ +{!! view_render_event('admin.leads.view.products.before', ['lead' => $lead]) !!} + + + +{!! view_render_event('admin.leads.view.products.after', ['lead' => $lead]) !!} + +@pushOnce('scripts') + + + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/leads/view/quotes.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/view/quotes.blade.php new file mode 100644 index 0000000..d22b7fe --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/view/quotes.blade.php @@ -0,0 +1,218 @@ +{!! view_render_event('admin.leads.view.quotes.before', ['lead' => $lead]) !!} + + + +{!! view_render_event('admin.leads.view.quotes.after', ['lead' => $lead]) !!} + +@pushOnce('scripts') + + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/leads/view/stages.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/view/stages.blade.php new file mode 100644 index 0000000..b07d8f7 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/view/stages.blade.php @@ -0,0 +1,262 @@ + +{!! view_render_event('admin.leads.view.stages.before', ['lead' => $lead]) !!} + + + + + + +{!! view_render_event('admin.leads.view.stages.after', ['lead' => $lead]) !!} + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/mail/index.blade.php b/packages/Webkul/Admin/src/Resources/views/mail/index.blade.php new file mode 100644 index 0000000..fd59cb2 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/mail/index.blade.php @@ -0,0 +1,712 @@ + + + @lang('admin::app.mail.index.' . request('route')) + + +
    +
    +
    + {!! view_render_event('admin.mail.create.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.mail.create.breadcrumbs.after') !!} + +
    + + @lang('admin::app.mail.index.' . request('route')) +
    +
    + +
    +
    + {!! view_render_event('admin.mail.create.compose_mail_btn.before') !!} + + + @if (bouncer()->hasPermission('mail.compose')) + + @endif + + {!! view_render_event('admin.mail.create.compose_mail_btn.after') !!} +
    +
    +
    + + + + + + +
    + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/mail/view.blade.php b/packages/Webkul/Admin/src/Resources/views/mail/view.blade.php new file mode 100644 index 0000000..7acc560 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/mail/view.blade.php @@ -0,0 +1,2019 @@ +@php + if (! $email->is_read) { + $email->is_read = true; + + $email->save(); + } +@endphp + + + + @lang('admin::app.mail.view.subject', ['subject' => $email->subject]) + + +
    +
    +
    + {!! view_render_event('admin.mail.view.form.before', ['email' => $email]) !!} + + + + + {!! view_render_event('admin.mail.view.form.after', ['email' => $email]) !!} + + +
    +
    + @lang('admin::app.mail.view.title') +
    + + {{ ucfirst(request('route')) }} + + {!! view_render_event('admin.mail.view.tags.before', ['email' => $email]) !!} + + + + {!! view_render_event('admin.mail.view.tags.after', ['email' => $email]) !!} +
    +
    +
    + + {!! view_render_event('admin.mail.view.email-list.before', ['email' => $email]) !!} + + + + + + + {!! view_render_event('admin.mail.view.email-list.before', ['email' => $email]) !!} +
    + + @pushOnce('scripts') + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/partials/breadcrumbs.blade.php b/packages/Webkul/Admin/src/Resources/views/partials/breadcrumbs.blade.php new file mode 100644 index 0000000..05eeb2b --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/partials/breadcrumbs.blade.php @@ -0,0 +1,27 @@ +@unless ($breadcrumbs->isEmpty()) + +@endunless diff --git a/packages/Webkul/Admin/src/Resources/views/products/create.blade.php b/packages/Webkul/Admin/src/Resources/views/products/create.blade.php new file mode 100644 index 0000000..83d7125 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/products/create.blade.php @@ -0,0 +1,107 @@ + + + + + @lang('admin::app.products.create.title') + + + {!! view_render_event('admin.products.create.form.before') !!} + + +
    +
    +
    + {!! view_render_event('admin.products.create.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.products.create.breadcrumbs.after') !!} + +
    + @lang('admin::app.products.create.title') +
    +
    + +
    +
    + {!! view_render_event('admin.products.create.save_button.before') !!} + + + @if (bouncer()->hasPermission('settings.user.groups.create')) + + @endif + + {!! view_render_event('admin.products.create.save_button.after') !!} +
    +
    +
    + +
    + +
    +
    +

    + @lang('admin::app.products.create.general') +

    + + {!! view_render_event('admin.products.create.attributes.before') !!} + + + + {!! view_render_event('admin.products.create.attributes.after') !!} +
    +
    + + +
    + {!! view_render_event('admin.products.create.accordion.before') !!} + + + + {!! view_render_event('admin.products.create.accordion.header.before') !!} + +
    +

    + @lang('admin::app.products.create.price') +

    +
    + + {!! view_render_event('admin.products.create.accordion.header.after') !!} + + + + {!! view_render_event('admin.products.create.accordion.content.attributes.before') !!} + + + + {!! view_render_event('admin.products.create.accordion.content.attributes.after') !!} + +
    + + {!! view_render_event('admin.products.create.accordion.before') !!} +
    +
    +
    +
    + + {!! view_render_event('admin.products.create.form.after') !!} +
    diff --git a/packages/Webkul/Admin/src/Resources/views/products/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/products/edit.blade.php new file mode 100644 index 0000000..a1ea5de --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/products/edit.blade.php @@ -0,0 +1,107 @@ + + + + + @lang('admin::app.products.edit.title') + + + {!! view_render_event('admin.products.edit.form.before') !!} + + +
    +
    +
    + + + +
    + @lang('admin::app.products.edit.title') +
    +
    + +
    +
    + {!! view_render_event('admin.products.edit.create_button.before', ['product' => $product]) !!} + + + + + {!! view_render_event('admin.products.edit.create_button.after', ['product' => $product]) !!} +
    +
    +
    + +
    + +
    +
    +

    + @lang('admin::app.products.create.general') +

    + + {!! view_render_event('admin.products.edit.attributes.before', ['product' => $product]) !!} + + + + {!! view_render_event('admin.products.edit.attributes.after', ['product' => $product]) !!} +
    +
    + + +
    + {!! view_render_event('admin.products.edit.accordion.before', ['product' => $product]) !!} + + + + {!! view_render_event('admin.products.edit.accordion.header.before', ['product' => $product]) !!} + +
    +

    + @lang('admin::app.products.create.price') +

    +
    + + {!! view_render_event('admin.products.edit.accordion.header.after', ['product' => $product]) !!} + + + + {!! view_render_event('admin.products.edit.accordion.content.attributes.before', ['product' => $product]) !!} + + + + {!! view_render_event('admin.products.edit.accordion.content.attributes.after', ['product' => $product]) !!} + +
    + + {!! view_render_event('admin.products.edit.accordion.after', ['product' => $product]) !!} +
    +
    +
    +
    + + {!! view_render_event('admin.products.edit.form.after') !!} +
    diff --git a/packages/Webkul/Admin/src/Resources/views/products/index.blade.php b/packages/Webkul/Admin/src/Resources/views/products/index.blade.php new file mode 100644 index 0000000..1716ae3 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/products/index.blade.php @@ -0,0 +1,45 @@ + + + @lang('admin::app.products.index.title') + + +
    +
    +
    + + + +
    + @lang('admin::app.products.index.title') +
    +
    + +
    + {!! view_render_event('admin.products.index.create_button.before') !!} + + + @if (bouncer()->hasPermission('products.create')) + + @endif + + {!! view_render_event('admin.products.index.create_button.after') !!} +
    +
    + + {!! view_render_event('admin.products.index.datagrid.before') !!} + + + + + + + {!! view_render_event('admin.products.index.datagrid.after') !!} +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/products/view.blade.php b/packages/Webkul/Admin/src/Resources/views/products/view.blade.php new file mode 100644 index 0000000..499cb13 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/products/view.blade.php @@ -0,0 +1,112 @@ + + + @lang ($product->name) + + + +
    + + {!! view_render_event('admin.products.view.left.before', ['product' => $product]) !!} + +
    + +
    + +
    + +
    + + {!! view_render_event('admin.products.view.left.tags.before', ['product' => $product]) !!} + + + + + {!! view_render_event('admin.products.view.left.tags.after', ['product' => $product]) !!} + + +
    + {!! view_render_event('admin.products.view.left.title.before', ['product' => $product]) !!} + +

    + {{ $product->name }} +

    + + {!! view_render_event('admin.products.view.left.title.after', ['product' => $product]) !!} + + {!! view_render_event('admin.products.view.left.sku.before', ['product' => $product]) !!} + +

    + @lang('admin::app.products.view.sku') : {{ $product->sku }} +

    + + {!! view_render_event('admin.products.view.left.sku.after', ['product' => $product]) !!} +
    + + {!! view_render_event('admin.products.view.left.activity_actions.before', ['product' => $product]) !!} + + +
    + {!! view_render_event('admin.products.view.left.activity_actions.note.before', ['product' => $product]) !!} + + + + + {!! view_render_event('admin.products.view.left.activity_actions.note.after', ['product' => $product]) !!} + + {!! view_render_event('admin.products.view.left.activity_actions.file.before', ['product' => $product]) !!} + + + + + {!! view_render_event('admin.products.view.left.activity_actions.file.after', ['product' => $product]) !!} +
    + + {!! view_render_event('admin.products.view.left.activity_actions.after', ['product' => $product]) !!} +
    + + + @include ('admin::products.view.attributes') +
    + + {!! view_render_event('admin.products.view.left.after', ['product' => $product]) !!} + + {!! view_render_event('admin.products.view.right.before', ['product' => $product]) !!} + + +
    + {!! view_render_event('admin.products.view.right.activities.before', ['product' => $product]) !!} + + + + + @include('admin::products.view.inventory') + + + + {!! view_render_event('admin.products.view.right.activities.after', ['product' => $product]) !!} +
    + + {!! view_render_event('admin.products.view.right.after', ['product' => $product]) !!} +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/products/view/attributes.blade.php b/packages/Webkul/Admin/src/Resources/views/products/view/attributes.blade.php new file mode 100644 index 0000000..360ddb9 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/products/view/attributes.blade.php @@ -0,0 +1,44 @@ +{!! view_render_event('admin.products.view.attributes.before', ['product' => $product]) !!} + +
    + + +

    + @lang('admin::app.products.view.attributes.about-product') +

    + + + + {!! view_render_event('admin.products.view.attributes.view.before', ['product' => $product]) !!} + + +
    + + + + + +
    + + {!! view_render_event('admin.products.view.attributes.view.after', ['product' => $product]) !!} + +
    +
    + +{!! view_render_event('admin.products.view.attributes.before', ['product' => $product]) !!} \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/products/view/inventory.blade.php b/packages/Webkul/Admin/src/Resources/views/products/view/inventory.blade.php new file mode 100644 index 0000000..b1d653b --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/products/view/inventory.blade.php @@ -0,0 +1,507 @@ +{!! view_render_event('admin.products.view.inventory.before', ['product' => $product]) !!} + + + + +{!! view_render_event('admin.products.view.inventory.after', ['product' => $product]) !!} + +@pushOnce('scripts') + + + + + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/quotes/create.blade.php b/packages/Webkul/Admin/src/Resources/views/quotes/create.blade.php new file mode 100644 index 0000000..fd99341 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/quotes/create.blade.php @@ -0,0 +1,807 @@ +@php + $quote = app('\Webkul\Quote\Repositories\QuoteRepository')->getModel(); + + if (isset($lead)) { + $quote->fill([ + 'person_id' => $lead->person_id, + 'user_id' => $lead->user_id, + 'billing_address' => $lead->person->organization ? $lead->person->organization->address : null + ]); + } +@endphp + + + + @lang('admin::app.quotes.create.title') + + + {!! view_render_event('admin.contacts.quotes.create.form_controls.before') !!} + + +
    +
    +
    + + +
    + @lang('admin::app.quotes.create.title') +
    +
    + +
    + +
    + {!! view_render_event('admin.contacts.quotes.create.save_button.before') !!} + + + + {!! view_render_event('admin.contacts.quotes.create.save_button.after') !!} +
    +
    +
    + + + + +
    +
    + + {!! view_render_event('admin.contacts.quotes.create.form_controls.after') !!} + + @pushOnce('scripts') + + + + + + + + @endPushOnce + + @pushOnce('styles') + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/quotes/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/quotes/edit.blade.php new file mode 100644 index 0000000..b3f1a7f --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/quotes/edit.blade.php @@ -0,0 +1,800 @@ + + + @lang('admin::app.quotes.edit.title') + + + {!! view_render_event('admin.contacts.quotes.edit.form_controls.before', ['quote' => $quote]) !!} + + +
    +
    +
    + + +
    + @lang('admin::app.quotes.edit.title') +
    +
    + +
    +
    + {!! view_render_event('admin.contacts.quotes.edit.save_button.before', ['quote' => $quote]) !!} + + + + + {!! view_render_event('admin.contacts.quotes.edit.save_button.after', ['quote' => $quote]) !!} +
    +
    +
    + + + + +
    +
    + + {!! view_render_event('admin.contacts.quotes.edit.form_controls.after', ['quote' => $quote]) !!} + + @pushOnce('scripts') + + + + + + + + @endPushOnce + + @pushOnce('styles') + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/quotes/index.blade.php b/packages/Webkul/Admin/src/Resources/views/quotes/index.blade.php new file mode 100644 index 0000000..06ede13 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/quotes/index.blade.php @@ -0,0 +1,88 @@ + + + @lang('admin::app.quotes.index.title') + + + +
    +
    +
    + + + +
    + @lang('admin::app.quotes.index.title') +
    +
    + +
    + +
    + @if (bouncer()->hasPermission('quotes.create')) + + @lang('admin::app.quotes.index.create-btn') + + @endif +
    +
    +
    + + + +
    +
    + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/quotes/pdf.blade.php b/packages/Webkul/Admin/src/Resources/views/quotes/pdf.blade.php new file mode 100755 index 0000000..945b802 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/quotes/pdf.blade.php @@ -0,0 +1,408 @@ + + + + + + + + + @php + if ($locale == 'en') { + $fontFamily = [ + 'regular' => 'DejaVu Sans', + 'bold' => 'DejaVu Sans', + ]; + } else { + $fontFamily = [ + 'regular' => 'Arial, sans-serif', + 'bold' => 'Arial, sans-serif', + ]; + } + + if (in_array($locale, ['ar', 'fa', 'tr'])) { + $fontFamily = [ + 'regular' => 'DejaVu Sans', + 'bold' => 'DejaVu Sans', + ]; + } + @endphp + + + + + + +
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + @lang('admin::app.quotes.index.pdf.quote-id'): + + + + #{{ $quote->id }} + + + + @lang('admin::app.quotes.index.pdf.person'): + + + + {{ $quote->person->name }} + +
    + + @lang('admin::app.quotes.index.pdf.sales-person'): + + + + {{ $quote->user->name }} + + + + @lang('admin::app.quotes.index.pdf.subject'): + + + + {{ $quote->subject }} + +
    + + @lang('admin::app.quotes.index.pdf.date'): + + + + {{ core()->formatDate($quote->created_at, 'd-m-Y') }} + + + + @lang('admin::app.quotes.index.pdf.sales-person'): + + + + {{ $quote->user->name }} + +
    + + @lang('admin::app.quotes.index.pdf.expired-at'): + + + + {{ core()->formatDate($quote->expired_at, 'd-m-Y') }} + +
    + + + + + + @if ($quote->billing_address) + + @endif + + @if ($quote->shipping_address) + + @endif + + + + + + @if ($quote->billing_address) + + @endif + + @if ($quote->shipping_address) + + @endif + + +
    + + @lang('admin::app.quotes.index.pdf.billing-address') + + + + @lang('admin::app.quotes.index.pdf.shipping-address') + +
    +
    {{ $quote->billing_address['address'] ?? '' }}
    + +
    {{ $quote->billing_address['postcode'] ?? '' . ' ' .$quote->billing_address['city'] ?? '' }}
    + +
    {{ $quote->billing_address['state'] ?? '' }}
    + +
    {{ core()->country_name($quote->billing_address['country'] ?? '') }}
    +
    +
    {{ $quote->shipping_address['address'] ?? ''}}
    + +
    {{ $quote->shipping_address['postcode'] ?? '' . ' ' .$quote->shipping_address['city'] ?? '' }}
    + +
    {{ $quote->shipping_address['state'] ?? '' }}
    + +
    {{ core()->country_name($quote->shipping_address['country'] ?? '') }}
    +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + @foreach ($quote->items as $item) + + + + + + + + + + + + + + + + + + @endforeach + +
    + @lang('admin::app.quotes.index.pdf.sku') + + @lang('admin::app.quotes.index.pdf.product-name') + + @lang('admin::app.quotes.index.pdf.price') + + @lang('admin::app.quotes.index.pdf.quantity') + + @lang('admin::app.quotes.index.pdf.amount') + + @lang('admin::app.quotes.index.pdf.discount') + + @lang('admin::app.quotes.index.pdf.tax') + + @lang('admin::app.quotes.index.pdf.grand-total') +
    {{ $item->sku }} + {{ $item->name }} + {!! core()->formatBasePrice($item->price, true) !!}{{ $item->quantity }}{!! core()->formatBasePrice($item->total, true) !!}{!! core()->formatBasePrice($item->discount_amount, true) !!}{!! core()->formatBasePrice($item->tax_amount, true) !!}{!! core()->formatBasePrice($item->total + $item->tax_amount - $item->discount_amount, true) !!}
    +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    @lang('admin::app.quotes.index.pdf.sub-total')-{!! core()->formatBasePrice($quote->sub_total, true) !!}
    @lang('admin::app.quotes.index.pdf.tax')-{!! core()->formatBasePrice($quote->tax_amount, true) !!}
    @lang('admin::app.quotes.index.pdf.discount')-{!! core()->formatBasePrice($quote->discount_amount, true) !!}
    @lang('admin::app.quotes.index.pdf.adjustment')-{!! core()->formatBasePrice($quote->adjustment_amount, true) !!}
    @lang('admin::app.quotes.index.pdf.grand-total')-{!! core()->formatBasePrice($quote->grand_total, true) !!}
    +
    +
    +
    + + diff --git a/packages/Webkul/Admin/src/Resources/views/sessions/forgot-password.blade.php b/packages/Webkul/Admin/src/Resources/views/sessions/forgot-password.blade.php new file mode 100644 index 0000000..61e9124 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/sessions/forgot-password.blade.php @@ -0,0 +1,91 @@ + + + + @lang('admin::app.users.forget-password.create.page-title') + + +
    +
    + + @if ($logo = core()->getConfigData('general.design.admin_logo.logo_image')) + {{ config('app.name') }} + @else + {{ config('app.name') }} + @endif + +
    + {!! view_render_event('admin.sessions.forgor_password.form_controls.before') !!} + + + +
    +

    + @lang('admin::app.users.forget-password.create.title') +

    +
    + +
    + + + + @lang('admin::app.users.forget-password.create.email') + + + + + + +
    + +
    + + + @lang('admin::app.users.forget-password.create.sign-in-link') + + + + +
    +
    + + {!! view_render_event('admin.sessions.forgor_password.form_controls.after') !!} +
    +
    + + +
    + Desenvolvido por + + Blyzer + +
    + + diff --git a/packages/Webkul/Admin/src/Resources/views/sessions/login.blade.php b/packages/Webkul/Admin/src/Resources/views/sessions/login.blade.php new file mode 100644 index 0000000..96d26df --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/sessions/login.blade.php @@ -0,0 +1,129 @@ + + + + @lang('admin::app.users.login.title') + + +
    +
    + + @if ($logo = core()->getConfigData('general.design.admin_logo.logo_image')) + {{ config('app.name') }} + @else + {{ config('app.name') }} + @endif + +
    + {!! view_render_event('admin.sessions.login.form_controls.before') !!} + + + +

    + @lang('admin::app.users.login.title') +

    + +
    + + + + @lang('admin::app.users.login.email') + + + + + + + + + + + @lang('admin::app.users.login.password') + + + + + + + + + +
    + +
    + + + @lang('admin::app.users.login.forget-password-link') + + + + +
    +
    + + {!! view_render_event('admin.sessions.login.form_controls.after') !!} +
    +
    + + +
    + Desenvolvido por + + Blyzer + +
    + + @push('scripts') + + @endpush + diff --git a/packages/Webkul/Admin/src/Resources/views/sessions/reset-password.blade.php b/packages/Webkul/Admin/src/Resources/views/sessions/reset-password.blade.php new file mode 100644 index 0000000..ef12185 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/sessions/reset-password.blade.php @@ -0,0 +1,136 @@ + + + + @lang('admin::app.users.reset-password.title') + + +
    +
    + + @if ($logo = core()->getConfigData('general.design.admin_logo.logo_image')) + {{ config('app.name') }} + @else + {{ config('app.name') }} + @endif + +
    + {!! view_render_event('admin.sessions.reset-password.form_controls.before') !!} + + + +
    +

    + @lang('admin::app.users.reset-password.title') +

    +
    + + + +
    + + + + @lang('admin::app.users.reset-password.email') + + + + + + + + + + + @lang('admin::app.users.reset-password.password') + + + + + + + + + + + @lang('admin::app.users.reset-password.confirm-password') + + + + + + +
    + +
    + + + @lang('admin::app.users.reset-password.back-link-title') + + + + +
    +
    + + {!! view_render_event('admin.sessions.reset-password.form_controls.after') !!} +
    +
    + + +
    + Desenvolvido por + + Blyzer + +
    + + diff --git a/packages/Webkul/Admin/src/Resources/views/settings/attributes/create.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/attributes/create.blade.php new file mode 100644 index 0000000..b259f5d --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/attributes/create.blade.php @@ -0,0 +1,658 @@ + + + @lang('admin::app.settings.attributes.create.title') + + + {!! view_render_event('admin.settings.attributes.create.before') !!} + + + +
    + {!! view_render_event('admin.settings.attributes.create.form_controls.before') !!} + + +
    +
    + {!! view_render_event('admin.settings.attributes.create.breadcrumbs.before') !!} + + + + {!! view_render_event('admin.settings.attributes.create.breadcrumbs.after') !!} + +
    + {!! view_render_event('admin.settings.attributes.create.title.before') !!} + + @lang('admin::app.settings.attributes.create.title') + + {!! view_render_event('admin.settings.attributes.create.title.after') !!} +
    +
    + +
    + +
    + {!! view_render_event('admin.settings.attributes.create.create_button.before') !!} + + @if (bouncer()->hasPermission('settings.automation.attributes.create')) + + @endif + + {!! view_render_event('admin.settings.attributes.create.create_button.after') !!} +
    +
    +
    + + + + + + + + {!! view_render_event('admin.settings.attributes.create.form_controls.after') !!} +
    +
    + + {!! view_render_event('admin.settings.attributes.create.after') !!} + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/attributes/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/attributes/edit.blade.php new file mode 100644 index 0000000..5650cbf --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/attributes/edit.blade.php @@ -0,0 +1,741 @@ + + + @lang('admin::app.settings.attributes.edit.title') + + + {!! view_render_event('admin.catalog.attributes.edit.before', ['attribute' => $attribute]) !!} + + + +
    + {!! view_render_event('admin.settings.attributes.edit.form_controls.before', ['attribute' => $attribute]) !!} + + +
    +
    + {!! view_render_event('admin.settings.attributes.edit.breadcrumbs.before', ['attribute' => $attribute]) !!} + + + + {!! view_render_event('admin.settings.attributes.edit.breadcrumbs.after', ['attribute' => $attribute]) !!} + +
    + {!! view_render_event('admin.settings.attributes.edit.title.before', ['attribute' => $attribute]) !!} + + @lang('admin::app.settings.attributes.edit.title') + + {!! view_render_event('admin.settings.attributes.edit.title.after', ['attribute' => $attribute]) !!} +
    +
    + +
    + +
    + {!! view_render_event('admin.settings.attributes.edit.edit_button.before', ['attribute' => $attribute]) !!} + + @if (bouncer()->hasPermission('settings.automation.attributes.edit')) + + @endif + + {!! view_render_event('admin.settings.attributes.edit.edit_button.after', ['attribute' => $attribute]) !!} +
    +
    +
    + + + + + + + + {!! view_render_event('admin.settings.attributes.edit.form_controls.after', ['attribute' => $attribute]) !!} +
    +
    + + {!! view_render_event('admin.catalog.attributes.edit.after', ['attribute' => $attribute]) !!} + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/attributes/index.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/attributes/index.blade.php new file mode 100644 index 0000000..ed79705 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/attributes/index.blade.php @@ -0,0 +1,51 @@ + + + @lang('admin::app.settings.attributes.index.title') + + +
    +
    +
    + {!! view_render_event('admin.settings.attributes.index.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.attributes.index.breadcrumbs.after') !!} + +
    + + @lang('admin::app.settings.attributes.index.title') +
    +
    + +
    + +
    + {!! view_render_event('admin.settings.attributes.index.create_button.before') !!} + + @if (bouncer()->hasPermission('settings.automation.attributes.create')) + + @lang('admin::app.settings.attributes.index.create-btn') + + @endif + + {!! view_render_event('admin.settings.attributes.index.create_button.after') !!} +
    +
    +
    + + {!! view_render_event('admin.settings.attributes.index.datagrid.before') !!} + + + + + + + + {!! view_render_event('admin.settings.attributes.index.datagrid.after') !!} +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/data-transfer/imports/create.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/data-transfer/imports/create.blade.php new file mode 100644 index 0000000..1a67a98 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/data-transfer/imports/create.blade.php @@ -0,0 +1,232 @@ + + + + @lang('admin::app.settings.data-transfer.imports.create.title') + + + {!! view_render_event('admin.settings.data_transfer.imports.create.before') !!} + + + {!! view_render_event('admin.settings.data_transfer.imports.create.create_form_controls.before') !!} + + +
    +
    + {!! view_render_event('admin.settings.data_transfers.create.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.data_transfers.create.breadcrumbs.after') !!} + +
    + @lang('admin::app.settings.data-transfer.imports.create.title') +
    +
    + +
    + +
    + {!! view_render_event('admin.settings.data_transfers.create.save_button.before') !!} + + @if (bouncer()->hasPermission('settings.data_transfer.imports.create')) + + + @endif + + {!! view_render_event('admin.settings.data_transfers.create.save_button.after') !!} +
    +
    +
    + + +
    + +
    + {!! view_render_event('admin.settings.data_transfer.imports.create.card.general.before') !!} + + +
    +

    + @lang('admin::app.settings.data-transfer.imports.create.general') +

    + + + + + @lang('admin::app.settings.data-transfer.imports.create.type') + + + + @foreach (config('importers') as $code => $importer) + + @endforeach + + + + + @lang('admin::app.settings.data-transfer.imports.create.download-sample') + + + + + + + + + @lang('admin::app.settings.data-transfer.imports.create.file') + + + + + + +
    + + {!! view_render_event('admin.settings.data_transfer.imports.create.card.general.after') !!} +
    + + +
    + {!! view_render_event('admin.settings.data_transfer.imports.create.card.accordion.settings.before') !!} + + + + +
    +

    + @lang('admin::app.settings.data-transfer.imports.create.settings') +

    +
    + + + + + + + @lang('admin::app.settings.data-transfer.imports.create.action') + + + + + + + + + + + + + + @lang('admin::app.settings.data-transfer.imports.create.validation-strategy') + + + + + + + + + + + + + + @lang('admin::app.settings.data-transfer.imports.create.allowed-errors') + + + + + + + + + + + @lang('admin::app.settings.data-transfer.imports.create.field-separator') + + + + + + + + + + + @lang('admin::app.settings.data-transfer.imports.create.process-in-queue') + + + + + + + +
    + + {!! view_render_event('admin.settings.data_transfer.imports.create.card.accordion.settings.after') !!} +
    +
    + + {!! view_render_event('admin.settings.data_transfer.imports.create.create_form_controls.after') !!} +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/data-transfer/imports/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/data-transfer/imports/edit.blade.php new file mode 100644 index 0000000..025ae21 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/data-transfer/imports/edit.blade.php @@ -0,0 +1,251 @@ + + + + @lang('admin::app.settings.data-transfer.imports.edit.title') + + + {!! view_render_event('admin.settings.data_transfer.imports.edit.before', ['import' => $import]) !!} + + + {!! view_render_event('admin.settings.data_transfer.imports.edit.edit_form_controls.before', ['import' => $import]) !!} + + +
    +
    + {!! view_render_event('admin.settings.data_transfers.edit.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.data_transfers.edit.breadcrumbs.after') !!} + +
    + @lang('admin::app.settings.data-transfer.imports.edit.title') +
    +
    + +
    + +
    + {!! view_render_event('admin.settings.data_transfers.edit.save_button.before') !!} + + @if (bouncer()->hasPermission('settings.data_transfer.imports.edit')) + + + @endif + + {!! view_render_event('admin.settings.data_transfers.edit.save_button.after') !!} +
    +
    +
    + + +
    + +
    + {!! view_render_event('admin.settings.data_transfer.imports.edit.card.general.before', ['import' => $import]) !!} + + +
    +

    + @lang('admin::app.settings.data-transfer.imports.edit.general') +

    + + + + + @lang('admin::app.settings.data-transfer.imports.edit.type') + + +
    + + @foreach (config('importers') as $code => $importer) + + @endforeach + + + + + @lang('admin::app.settings.data-transfer.imports.edit.download-sample') + +
    + + +
    + + + + + @lang('admin::app.settings.data-transfer.imports.edit.file') + + +
    + + + + + @if ($import?->file_path) + + + {{ $import?->file_name }} + + @endif +
    +
    +
    + + {!! view_render_event('admin.settings.data_transfer.imports.edit.card.general.after', ['import' => $import]) !!} +
    + + +
    + {!! view_render_event('admin.settings.data_transfer.imports.edit.card.accordion.settings.before', ['import' => $import]) !!} + + + + +
    +

    + @lang('admin::app.settings.data-transfer.imports.edit.settings') +

    +
    + + + + + + + @lang('admin::app.settings.data-transfer.imports.edit.action') + + + + + + + + + + + + + + @lang('admin::app.settings.data-transfer.imports.edit.validation-strategy') + + + + + + + + + + + + + + @lang('admin::app.settings.data-transfer.imports.edit.allowed-errors') + + + + + + + + + + + @lang('admin::app.settings.data-transfer.imports.edit.field-separator') + + + + + + + + + + + @lang('admin::app.settings.data-transfer.imports.edit.process-in-queue') + + + + + + + +
    + + {!! view_render_event('admin.settings.data_transfer.imports.edit.card.accordion.settings.after', ['import' => $import]) !!} +
    +
    + + {!! view_render_event('admin.settings.data_transfer.imports.edit.edit_form_controls.after', ['import' => $import]) !!} +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/data-transfer/imports/import.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/data-transfer/imports/import.blade.php new file mode 100644 index 0000000..b77cbda --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/data-transfer/imports/import.blade.php @@ -0,0 +1,539 @@ + + + @lang('admin::app.settings.data-transfer.imports.import.title') + + + +
    +
    + {!! view_render_event('admin.settings.data_transfers.import.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.data_transfers.import.breadcrumbs.after') !!} + +
    + @lang('admin::app.settings.data-transfer.imports.import.title') +
    +
    + +
    + +
    + {!! view_render_event('admin.settings.data_transfers.import.edit_button.before') !!} + + + @if (bouncer()->hasPermission('settings.data_transfer.imports.edit')) + + @lang('admin::app.settings.data-transfer.imports.import.edit-btn') + + @endif + + {!! view_render_event('admin.settings.data_transfers.import.edit_button.after') !!} +
    +
    +
    + + + + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/data-transfer/imports/index.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/data-transfer/imports/index.blade.php new file mode 100644 index 0000000..5860dbf --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/data-transfer/imports/index.blade.php @@ -0,0 +1,50 @@ + + + @lang('admin::app.settings.data-transfer.imports.index.title') + + +
    +
    +
    + {!! view_render_event('admin.settings.data_transfers.index.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.data_transfers.index.breadcrumbs.after') !!} + +
    + @lang('admin::app.settings.data-transfer.imports.index.title') +
    +
    + +
    + +
    + {!! view_render_event('admin.settings.data_transfers.index.create_button.before') !!} + + @if (bouncer()->hasPermission('settings.data_transfer.imports.create')) + + @lang('admin::app.settings.data-transfer.imports.index.button-title') + + @endif + + {!! view_render_event('admin.settings.data_transfers.index.create_button.after') !!} +
    +
    +
    + + {!! view_render_event('admin.settings.data_transfers.index.datagrid.before') !!} + + + + + + + + {!! view_render_event('admin.settings.data_transfers.index.datagrid.after') !!} +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/email-templates/create.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/email-templates/create.blade.php new file mode 100644 index 0000000..0280463 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/email-templates/create.blade.php @@ -0,0 +1,234 @@ + + + + + @lang('admin::app.settings.email-template.create.title') + + + {!! view_render_event('admin.settings.email_template.create.form.before') !!} + + +
    +
    +
    + {!! view_render_event('admin.settings.email_template.create.breadcrumbs.after') !!} + + + + + {!! view_render_event('admin.settings.email_template.create.breadcrumbs.after') !!} + +
    + @lang('admin::app.settings.email-template.create.title') +
    +
    + +
    + +
    + {!! view_render_event('admin.settings.email_template.create.save_button.before') !!} + + + + {!! view_render_event('admin.settings.email_template.create.save_button.after') !!} +
    +
    +
    + + +
    +
    + + {!! view_render_event('admin.email_template.create.form.after') !!} + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/email-templates/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/email-templates/edit.blade.php new file mode 100644 index 0000000..614c229 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/email-templates/edit.blade.php @@ -0,0 +1,238 @@ + + + + + @lang('admin::app.settings.email-template.edit.title') + + + {!! view_render_event('admin.settings.email_template.edit.form.before') !!} + + +
    +
    +
    + {!! view_render_event('admin.settings.email_template.edit.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.email_template.edit.breadcrumbs.after') !!} + +
    + @lang('admin::app.settings.email-template.edit.title') +
    +
    + +
    + +
    + {!! view_render_event('admin.settings.email_template.edit.save_button.before') !!} + + + + {!! view_render_event('admin.settings.email_template.edit.save_button.before') !!} +
    +
    +
    + + +
    +
    + + {!! view_render_event('admin.settings.email_template.edit.form.after') !!} + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/email-templates/index.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/email-templates/index.blade.php new file mode 100644 index 0000000..ab73a04 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/email-templates/index.blade.php @@ -0,0 +1,51 @@ + + + + @lang('admin::app.settings.email-template.index.title') + + +
    +
    +
    + {!! view_render_event('admin.settings.email_template.index.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.email_template.index.breadcrumbs.after') !!} + +
    + @lang('admin::app.settings.email-template.index.title') +
    +
    + +
    + +
    + {!! view_render_event('admin.settings.email_template.index.create_button.before') !!} + + @if (bouncer()->hasPermission('settings.automation.email_templates.create')) + + @lang('admin::app.settings.email-template.index.create-btn') + + @endif + + {!! view_render_event('admin.settings.email_template.index.create_button.after') !!} +
    +
    +
    + + {!! view_render_event('admin.settings.email_template.index.datagrid.before') !!} + + + + + + + + {!! view_render_event('admin.settings.email_template.index.datagrid.after') !!} +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/groups/index.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/groups/index.blade.php new file mode 100644 index 0000000..ff0d8ce --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/groups/index.blade.php @@ -0,0 +1,352 @@ + + + + @lang('admin::app.settings.groups.index.title') + + +
    + +
    +
    + {!! view_render_event('admin.settings.groups.index.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.groups.index.breadcrumbs.after') !!} + +
    + @lang('admin::app.settings.groups.index.title') +
    +
    + +
    + +
    + {!! view_render_event('admin.settings.groups.index.breadcrumbs.after') !!} + + @if (bouncer()->hasPermission('settings.user.groups.create')) + + @endif + + {!! view_render_event('admin.settings.groups.index.create_button.after') !!} +
    +
    +
    + + + + + +
    + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/index.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/index.blade.php new file mode 100644 index 0000000..9dc4727 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/index.blade.php @@ -0,0 +1,58 @@ + + + + @lang('admin::app.settings.title') + + + + + +
    +

    + @lang('admin::app.settings.title') +

    +
    + + +
    + @foreach (menu()->getAdminMenuByKey('settings')->getChildren() as $setting) +
    +
    + +

    + {{ $setting->getName() }} +

    + + +

    + {{ $setting->getInfo() }} +

    +
    + +
    + + @foreach ($setting->getChildren() as $key => $child) + +
    + +
    + +
    +

    + {{ $child->getName() }} +

    + +

    + {{ $child->getInfo() }} +

    +
    +
    + @endforeach +
    +
    + @endforeach +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/marketing/campaigns/index.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/marketing/campaigns/index.blade.php new file mode 100644 index 0000000..0a32604 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/marketing/campaigns/index.blade.php @@ -0,0 +1,525 @@ + + + + @lang('admin::app.settings.marketing.campaigns.index.title') + + +
    + +
    +
    +
    + {!! view_render_event('admin.settings.marketing.campaigns.index.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.marketing.campaigns.index.breadcrumbs.after') !!} +
    + +
    + @lang('admin::app.settings.marketing.campaigns.index.title') +
    +
    + +
    + +
    + {!! view_render_event('admin.settings.marketing.campaigns.index.breadcrumbs.after') !!} + + @if (bouncer()->hasPermission('settings.automation.campaigns.create')) + + @endif + + {!! view_render_event('admin.settings.marketing.campaigns.index.create_button.after') !!} +
    +
    +
    + + + + +
    + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/marketing/events/index.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/marketing/events/index.blade.php new file mode 100644 index 0000000..b9fb1f0 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/marketing/events/index.blade.php @@ -0,0 +1,410 @@ + + + + @lang('admin::app.settings.marketing.events.index.title') + + +
    + +
    +
    + {!! view_render_event('admin.settings.marketing.events.index.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.marketing.events.index.breadcrumbs.after') !!} + +
    + @lang('admin::app.settings.marketing.events.index.title') +
    +
    + +
    + +
    + {!! view_render_event('admin.settings.marketing.events.index.breadcrumbs.after') !!} + + @if (bouncer()->hasPermission('settings.automation.events.create')) + + @endif + + {!! view_render_event('admin.settings.marketing.events.index.create_button.after') !!} +
    +
    +
    + + + + +
    + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/pipelines/create.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/pipelines/create.blade.php new file mode 100644 index 0000000..0c91cb8 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/pipelines/create.blade.php @@ -0,0 +1,427 @@ + + + + @lang('admin::app.settings.pipelines.create.title') + + + {!! view_render_event('admin.settings.pipelines.create.form.before') !!} + + +
    +
    +
    + {!! view_render_event('admin.settings.pipelines.create.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.pipelines.create.breadcrumbs.after') !!} + + +
    + @lang('admin::app.settings.pipelines.create.title') +
    +
    + +
    +
    + {!! view_render_event('admin.settings.pipelines.create.save_button.before') !!} + + + + + {!! view_render_event('admin.settings.pipelines.create.save_button.after') !!} +
    +
    +
    + +
    + {!! view_render_event('admin.settings.pipelines.create.form.name.before') !!} + + + + + @lang('admin::app.settings.pipelines.create.name') + + + + + + + + {!! view_render_event('admin.settings.pipelines.create.form.name.after') !!} + + {!! view_render_event('admin.settings.pipelines.create.form.rotten_days.before') !!} + + + + + @lang('admin::app.settings.pipelines.create.rotten-days') + + + + + + + + {!! view_render_event('admin.settings.pipelines.create.form.rotten_days.after') !!} + + {!! view_render_event('admin.settings.pipelines.create.form.is_default.before') !!} + + + + + @lang('admin::app.settings.pipelines.create.mark-as-default') + + + + + + + + {!! view_render_event('admin.settings.pipelines.create.form.is_default.after') !!} +
    +
    + + +
    + {!! view_render_event('admin.settings.pipelines.create.form.stages.before') !!} + + + + + + {!! view_render_event('admin.settings.pipelines.create.form.stages.after') !!} +
    +
    + + {!! view_render_event('admin.settings.pipelines.create.form.after') !!} + + @pushOnce('scripts') + + + + @endPushOnce +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/settings/pipelines/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/pipelines/edit.blade.php new file mode 100644 index 0000000..d61ea32 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/pipelines/edit.blade.php @@ -0,0 +1,377 @@ + + + + @lang('admin::app.settings.pipelines.edit.title') + + + {!! view_render_event('admin.settings.pipelines.edit.form.before', ['pipeline' => $pipeline]) !!} + + + +
    +
    +
    + {!! view_render_event('admin.settings.pipelines.edit.breadcrumbs.before', ['pipeline' => $pipeline]) !!} + + + + + {!! view_render_event('admin.settings.pipelines.edit.breadcrumbs.after', ['pipeline' => $pipeline]) !!} + + +
    + @lang('admin::app.settings.pipelines.edit.title') +
    +
    + +
    +
    + {!! view_render_event('admin.settings.pipelines.edit.save_button.before', ['pipeline' => $pipeline]) !!} + + + + + {!! view_render_event('admin.settings.pipelines.edit.save_button.after', ['pipeline' => $pipeline]) !!} +
    +
    +
    + +
    + {!! view_render_event('admin.settings.pipelines.edit.form.name.before', ['pipeline' => $pipeline]) !!} + + + + + @lang('admin::app.settings.pipelines.edit.name') + + + + + + + + {!! view_render_event('admin.settings.pipelines.edit.form.name.after', ['pipeline' => $pipeline]) !!} + + {!! view_render_event('admin.settings.pipelines.edit.form.rotten_days.before', ['pipeline' => $pipeline]) !!} + + + + + @lang('admin::app.settings.pipelines.edit.rotten-days') + + + + + + + + {!! view_render_event('admin.settings.pipelines.edit.form.rotten_days.after', ['pipeline' => $pipeline]) !!} + + {!! view_render_event('admin.settings.pipelines.edit.form.is_default.before', ['pipeline' => $pipeline]) !!} + + + + + @lang('admin::app.settings.pipelines.edit.mark-as-default') + + + + + + + + {!! view_render_event('admin.settings.pipelines.edit.form.is_default.after', ['pipeline' => $pipeline]) !!} +
    +
    + +
    + + + + +
    +
    + + {!! view_render_event('admin.settings.pipelines.edit.form.after', ['pipeline' => $pipeline]) !!} + + @pushOnce('scripts') + + + + @endPushOnce +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/settings/pipelines/index.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/pipelines/index.blade.php new file mode 100644 index 0000000..b5dd042 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/pipelines/index.blade.php @@ -0,0 +1,52 @@ + + + + @lang('admin::app.settings.pipelines.index.title') + + +
    +
    +
    + {!! view_render_event('admin.settings.pipelines.index.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.pipelines.index.breadcrumbs.after') !!} + +
    + + @lang('admin::app.settings.pipelines.index.title') +
    +
    + +
    +
    + {!! view_render_event('admin.settings.pipelines.index.create_button.before') !!} + + @if (bouncer()->hasPermission('settings.lead.pipelines.create')) + + + @lang('admin::app.settings.pipelines.index.create-btn') + + @endif + + {!! view_render_event('admin.settings.pipelines.index.create_button.after') !!} +
    +
    +
    + + {!! view_render_event('admin.settings.pipelines.index.datagrid.before') !!} + + + + + + + + {!! view_render_event('admin.settings.pipelines.index.datagrid.after') !!} +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/roles/create.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/roles/create.blade.php new file mode 100644 index 0000000..e158578 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/roles/create.blade.php @@ -0,0 +1,214 @@ + + + + @lang('admin::app.settings.roles.create.title') + + + {!! view_render_event('admin.settings.roles.create.form.before') !!} + + + +
    +
    +
    + {!! view_render_event('admin.settings.roles.create.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.roles.create.breadcrumbs.after') !!} + +
    + @lang('admin::app.settings.roles.create.title') +
    +
    + +
    +
    + {!! view_render_event('admin.settings.roles.create.create_button.before') !!} + + @if (bouncer()->hasPermission('settings.user.roles.create')) + + + @endif + + {!! view_render_event('admin.settings.roles.create.create_button.after') !!} +
    +
    +
    + + {!! view_render_event('admin.settings.roles.create.content.before') !!} + + +
    + {!! view_render_event('admin.settings.roles.create.content.left.before') !!} + + +
    +
    + + + +
    +
    + +
    +
    + + + +
    +
    +
    + + {!! view_render_event('admin.settings.roles.create.content.left.after') !!} + + {!! view_render_event('admin.settings.roles.create.content.right.before') !!} + + +
    + {!! view_render_event('admin.settings.roles.create.accordion.general.before') !!} + + + +
    +

    + @lang('admin::app.settings.roles.create.general') +

    +
    + + + + {!! view_render_event('admin.settings.roles.create.form.name.before') !!} + + + + + @lang('admin::app.settings.roles.create.name') + + + + + + + + {!! view_render_event('admin.settings.roles.create.form.name.after') !!} + + {!! view_render_event('admin.settings.roles.create.form.description.before') !!} + + + + + @lang('admin::app.settings.roles.create.description') + + + + + + + + {!! view_render_event('admin.settings.roles.create.form.description.after') !!} + +
    + + {!! view_render_event('admin.settings.roles.create.accordion.general.after') !!} +
    + + {!! view_render_event('admin.settings.roles.create.content.right.after') !!} +
    + + {!! view_render_event('admin.settings.roles.create.content.after') !!} +
    +
    + + {!! view_render_event('admin.settings.roles.create.form.after') !!} + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/roles/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/roles/edit.blade.php new file mode 100644 index 0000000..a631feb --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/roles/edit.blade.php @@ -0,0 +1,222 @@ + + + + @lang('admin::app.settings.roles.edit.title') + + + {!! view_render_event('admin.settings.roles.edit.form.before', ['role' => $role]) !!} + + +
    +
    +
    + {!! view_render_event('admin.settings.roles.edit.breadcrumbs.before', ['role' => $role]) !!} + + + + + {!! view_render_event('admin.settings.roles.edit.breadcrumbs.after', ['role' => $role]) !!} + +
    + @lang('admin::app.settings.roles.edit.title') +
    +
    + +
    +
    + {!! view_render_event('admin.settings.roles.edit.save_button.before', ['role' => $role]) !!} + + @if (bouncer()->hasPermission('settings.user.roles.edit')) + + + @endif + + {!! view_render_event('admin.settings.roles.edit.save_button.after', ['role' => $role]) !!} +
    +
    +
    + + {!! view_render_event('admin.settings.roles.edit.content.before', ['role' => $role]) !!} + + +
    + {!! view_render_event('admin.settings.roles.edit.content.left.before', ['role' => $role]) !!} + + +
    +
    +

    + @lang('admin::app.settings.roles.edit.access-control') +

    + + + + +
    +
    + +
    +
    + + + +
    +
    +
    + + {!! view_render_event('admin.settings.roles.edit.content.left.after', ['role' => $role]) !!} + + {!! view_render_event('admin.settings.roles.edit.content.right.before', ['role' => $role]) !!} + + +
    + {!! view_render_event('admin.settings.roles.edit.accordion.general.before', ['role' => $role]) !!} + + + +
    +

    + @lang('admin::app.settings.roles.edit.general') +

    +
    + + + + {!! view_render_event('admin.settings.roles.edit.form.name.before', ['role' => $role]) !!} + + + + + @lang('admin::app.settings.roles.edit.name') + + + + + + + + {!! view_render_event('admin.settings.roles.edit.form.name.after', ['role' => $role]) !!} + + {!! view_render_event('admin.settings.roles.edit.form.description.before', ['role' => $role]) !!} + + + + + @lang('admin::app.settings.roles.edit.description') + + + + + + + + {!! view_render_event('admin.settings.roles.edit.form.description.after', ['role' => $role]) !!} + +
    + + {!! view_render_event('admin.settings.roles.edit.accordion.general.after', ['role' => $role]) !!} +
    +
    + + {!! view_render_event('admin.settings.roles.edit.content.after', ['role' => $role]) !!} +
    +
    + + {!! view_render_event('admin.settings.roles.edit.form.after', ['role' => $role]) !!} + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/roles/index.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/roles/index.blade.php new file mode 100644 index 0000000..2c0ad94 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/roles/index.blade.php @@ -0,0 +1,47 @@ + + + + @lang('admin::app.settings.roles.index.title') + + +
    +
    +
    + {!! view_render_event('admin.settings.roles.index.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.roles.index.breadcrumbs.after') !!} + +
    + + @lang('admin::app.settings.roles.index.title') +
    +
    + +
    + +
    + {!! view_render_event('admin.settings.roles.index.create_button.before') !!} + + @if (bouncer()->hasPermission('settings.user.roles.create')) + + @lang('admin::app.settings.roles.index.create-btn') + + @endif + + {!! view_render_event('admin.settings.roles.index.create_button.after') !!} +
    +
    +
    + + + + + +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/sources/index.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/sources/index.blade.php new file mode 100644 index 0000000..5b43059 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/sources/index.blade.php @@ -0,0 +1,317 @@ + + + @lang('admin::app.settings.sources.index.title') + + +
    + +
    +
    + {!! view_render_event('admin.settings.sources.index.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.sources.index.breadcrumbs.after') !!} + +
    + @lang('admin::app.settings.sources.index.title') +
    +
    + +
    + {!! view_render_event('admin.settings.sources.index.create_button.before') !!} + + + @if (bouncer()->hasPermission('settings.lead.sources.create')) +
    + +
    + @endif + + {!! view_render_event('admin.settings.sources.index.create_button.after') !!} +
    +
    + + + + + +
    + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/tags/index.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/tags/index.blade.php new file mode 100644 index 0000000..371a344 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/tags/index.blade.php @@ -0,0 +1,392 @@ + + + + @lang('admin::app.settings.tags.index.title') + + +
    + +
    +
    + {!! view_render_event('admin.settings.tags.index.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.tags.index.breadcrumbs.after') !!} + +
    + @lang('admin::app.settings.tags.index.title') +
    +
    + +
    + {!! view_render_event('admin.settings.tags.index.create_button.before') !!} + + + @if (bouncer()->hasPermission('settings.other_settings.tags.create')) +
    + +
    + @endif + + {!! view_render_event('admin.settings.tags.index.create_button.after') !!} +
    +
    + + + + + +
    + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/types/index.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/types/index.blade.php new file mode 100644 index 0000000..f4cd1b1 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/types/index.blade.php @@ -0,0 +1,311 @@ + + + @lang('admin::app.settings.types.index.title') + + +
    + +
    +
    + + + +
    + @lang('admin::app.settings.types.index.title') +
    +
    + +
    + {!! view_render_event('admin.settings.types.index.create_button.before') !!} + + +
    + @if (bouncer()->hasPermission('settings.lead.types.create')) + + @endif +
    + + {!! view_render_event('admin.settings.types.index.create_button.after') !!} +
    +
    + + + + + +
    + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/users/index.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/users/index.blade.php new file mode 100644 index 0000000..1366fa2 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/users/index.blade.php @@ -0,0 +1,592 @@ + + + @lang('admin::app.settings.users.index.title') + + +
    +
    +
    + + + +
    + @lang('admin::app.settings.users.index.title') +
    +
    + +
    + {!! view_render_event('admin.settings.users.index.create_button.before') !!} + + + @if (bouncer()->hasPermission('settings.user.users.create')) +
    + +
    + @endif + + {!! view_render_event('admin.settings.users.index.create_button.after') !!} +
    +
    + + + + + +
    + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/warehouses/create.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/warehouses/create.blade.php new file mode 100644 index 0000000..d9a316c --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/warehouses/create.blade.php @@ -0,0 +1,106 @@ + + + + + @lang('admin::app.settings.warehouses.create.title') + + + {!! view_render_event('admin.settings.warehouses.create.form.before') !!} + + +
    +
    +
    + {!! view_render_event('admin.settings.warehouses.create.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.warehouses.create.breadcrumbs.after') !!} + +
    + @lang('admin::app.settings.warehouses.create.title') +
    +
    + +
    +
    + {!! view_render_event('admin.settings.warehouses.create.save_button.before') !!} + + + + + {!! view_render_event('admin.settings.warehouses.create.save_button.after') !!} +
    +
    +
    + +
    + +
    +
    +

    + @lang('admin::app.settings.warehouses.create.contact-info') +

    + + {!! view_render_event('admin.settings.warehouses.create.left.form_controls.before') !!} + + + + {!! view_render_event('admin.settings.warehouses.create.left.form_controls.after') !!} +
    +
    + + +
    + + +
    +

    + @lang('admin::app.settings.roles.create.general') +

    +
    + + + + {!! view_render_event('admin.settings.warehouses.create.right.form_controls.before') !!} + + + + {!! view_render_event('admin.settings.warehouses.create.right.form_controls.after') !!} + +
    +
    +
    +
    +
    + + {!! view_render_event('admin.settings.warehouses.create.form.after') !!} + +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/warehouses/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/warehouses/edit.blade.php new file mode 100644 index 0000000..6803ccb --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/warehouses/edit.blade.php @@ -0,0 +1,110 @@ + + + + + @lang('admin::app.settings.warehouses.edit.title') + + + {!! view_render_event('admin.settings.warehouses.edit.form.before', ['warehouse' => $warehouse]) !!} + + +
    +
    +
    + {!! view_render_event('admin.settings.warehouses.edit.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.warehouses.edit.breadcrumbs.after') !!} + +
    + @lang('admin::app.settings.warehouses.edit.title') +
    +
    + +
    +
    + {!! view_render_event('admin.settings.warehouses.edit.save_button.after') !!} + + + + + {!! view_render_event('admin.settings.warehouses.edit.save_button.before') !!} +
    +
    +
    + +
    + +
    +
    +

    + @lang('admin::app.settings.warehouses.edit.contact-info') +

    + + {!! view_render_event('admin.settings.warehouses.edit.left.form_controls.before', ['warehouse' => $warehouse]) !!} + + + + {!! view_render_event('admin.settings.warehouses.edit.left.form_controls.after', ['warehouse' => $warehouse]) !!} +
    +
    + + +
    + + +
    +

    + @lang('admin::app.settings.roles.create.general') +

    +
    + + + + {!! view_render_event('admin.settings.warehouses.edit.right.form_controls.before', ['warehouse' => $warehouse]) !!} + + + + {!! view_render_event('admin.settings.warehouses.edit.right.form_controls.after', ['warehouse' => $warehouse]) !!} + +
    +
    +
    +
    +
    + + {!! view_render_event('admin.settings.warehouses.edit.form.after', ['warehouse' => $warehouse]) !!} +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/warehouses/index.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/warehouses/index.blade.php new file mode 100644 index 0000000..d4e5078 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/warehouses/index.blade.php @@ -0,0 +1,47 @@ + + + @lang('admin::app.settings.warehouses.index.title') + + +
    +
    +
    + + + +
    + + @lang('admin::app.settings.warehouses.index.title') +
    +
    + +
    + +
    + {!! view_render_event('admin.settings.warehouses.index.create_button.before') !!} + + @if (bouncer()->hasPermission('settings.automation.warehouses.create')) + + @lang('admin::app.settings.warehouses.index.create-btn') + + @endif + + {!! view_render_event('admin.settings.warehouses.index.create_button.after') !!} +
    +
    +
    + + {!! view_render_event('admin.settings.warehouses.index.datagrid.before') !!} + + + + + + + + {!! view_render_event('admin.settings.warehouses.index.datagrid.after') !!} +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/warehouses/view.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/warehouses/view.blade.php new file mode 100644 index 0000000..2960d9d --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/warehouses/view.blade.php @@ -0,0 +1,117 @@ + + + @lang ($warehouse->name) + + +
    + + {!! view_render_event('admin.settings.warehouses.view.left.before', ['warehouse' => $warehouse]) !!} + +
    + +
    + +
    + +
    + + {!! view_render_event('admin.settings.warehouses.view.left.tags.before', ['warehouse' => $warehouse]) !!} + + + + + {!! view_render_event('admin.settings.warehouses.view.left.tags.after', ['warehouse' => $warehouse]) !!} + + {!! view_render_event('admin.settings.warehouses.view.left.title.before', ['warehouse' => $warehouse]) !!} + + +

    + {{ $warehouse->name }} +

    + + {!! view_render_event('admin.settings.warehouses.view.left.title.after', ['warehouse' => $warehouse]) !!} + + {!! view_render_event('admin.settings.warehouses.view.left.actions.before', ['warehouse' => $warehouse]) !!} + + +
    + {!! view_render_event('admin.settings.warehouses.view.left.actions.file.before', ['warehouse' => $warehouse]) !!} + + + + + {!! view_render_event('admin.settings.warehouses.view.left.actions.file.after', ['warehouse' => $warehouse]) !!} + + {!! view_render_event('admin.settings.warehouses.view.left.actions.note.before', ['warehouse' => $warehouse]) !!} + + + + + {!! view_render_event('admin.settings.warehouses.view.left.actions.note.after', ['warehouse' => $warehouse]) !!} + + {!! view_render_event('admin.settings.warehouses.view.left.actions.activity.before', ['warehouse' => $warehouse]) !!} + + + + + {!! view_render_event('admin.settings.warehouses.view.left.actions.activity.after', ['warehouse' => $warehouse]) !!} +
    + + {!! view_render_event('admin.settings.warehouses.view.left.actions.after', ['warehouse' => $warehouse]) !!} +
    + + + @include ('admin::settings.warehouses.view.general-information') + + + @include ('admin::settings.warehouses.view.contact-information') +
    + + {!! view_render_event('admin.settings.warehouses.view.left.after', ['warehouse' => $warehouse]) !!} + + {!! view_render_event('admin.settings.warehouses.view.right.before', ['warehouse' => $warehouse]) !!} + + +
    + {!! view_render_event('admin.settings.warehouses.view.right.attributes.before', ['warehouse' => $warehouse]) !!} + + + + + @include ('admin::settings.warehouses.view.locations') + + + + {!! view_render_event('admin.settings.warehouses.view.right.attributes.after', ['warehouse' => $warehouse]) !!} +
    + + {!! view_render_event('admin.warehouse.view.right.after', ['warehouse' => $warehouse]) !!} +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/settings/warehouses/view/contact-information.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/warehouses/view/contact-information.blade.php new file mode 100644 index 0000000..de87d97 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/warehouses/view/contact-information.blade.php @@ -0,0 +1,38 @@ +{!! view_render_event('admin.leads.view.person.before', ['warehouse' => $warehouse]) !!} + +
    + + +

    + @lang('admin::app.settings.warehouses.view.contact-information.title') +

    + + + + + +
    + {!! view_render_event('admin.leads.view.person.attributes.view.before', ['warehouse' => $warehouse]) !!} + + + + {!! view_render_event('admin.leads.view.person.attributes.view.after', ['warehouse' => $warehouse]) !!} + +
    + +
    +
    + +{!! view_render_event('admin.leads.view.person.after', ['warehouse' => $warehouse]) !!} \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/settings/warehouses/view/general-information.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/warehouses/view/general-information.blade.php new file mode 100644 index 0000000..acb02b7 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/warehouses/view/general-information.blade.php @@ -0,0 +1,38 @@ +{!! view_render_event('admin.leads.view.person.before', ['warehouse' => $warehouse]) !!} + +
    + + +

    + @lang('admin::app.settings.warehouses.view.general-information.title') +

    + + + + + +
    + {!! view_render_event('admin.leads.view.person.attributes.view.before', ['warehouse' => $warehouse]) !!} + + + + {!! view_render_event('admin.leads.view.person.attributes.view.after', ['warehouse' => $warehouse]) !!} + +
    + +
    +
    + +{!! view_render_event('admin.leads.view.person.after', ['warehouse' => $warehouse]) !!} \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/settings/warehouses/view/locations.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/warehouses/view/locations.blade.php new file mode 100644 index 0000000..b8c32ed --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/warehouses/view/locations.blade.php @@ -0,0 +1,208 @@ + + + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/settings/web-forms/create.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/web-forms/create.blade.php new file mode 100644 index 0000000..68ede2c --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/web-forms/create.blade.php @@ -0,0 +1,717 @@ + + + + @lang('admin::app.settings.webforms.create.title') + + + +
    +
    +
    + {!! view_render_event('admin.settings.webform.create.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.webform.create.breadcrumbs.after') !!} + +
    + @lang('admin::app.settings.webforms.create.title') +
    +
    + +
    +
    + {!! view_render_event('admin.settings.webform.create.save_button.before') !!} + + + + + {!! view_render_event('admin.settings.webform.create.save_button.after') !!} +
    +
    +
    + + +
    +
    + + @pushOnce('scripts') + + + + + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/web-forms/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/web-forms/edit.blade.php new file mode 100644 index 0000000..0807583 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/web-forms/edit.blade.php @@ -0,0 +1,832 @@ + + + + @lang('admin::app.settings.webforms.edit.title') + + + +
    +
    +
    + {!! view_render_event('admin.settings.webform.edit.breadcrumbs.before', ['webform' => $webForm]) !!} + + + + + {!! view_render_event('admin.settings.webform.edit.breadcrumbs.after', ['webform' => $webForm]) !!} + +
    + @lang('admin::app.settings.webforms.edit.title') +
    +
    + +
    +
    + {!! view_render_event('admin.settings.webform.edit.embed_button.before', ['webform' => $webForm]) !!} + + + + + {!! view_render_event('admin.settings.webform.edit.embed_button.after', ['webform' => $webForm]) !!} + + {!! view_render_event('admin.settings.webform.edit.preview_button.before', ['webform' => $webForm]) !!} + + + @lang('admin::app.settings.webforms.edit.preview') + + + {!! view_render_event('admin.settings.webform.edit.preview_button.after', ['webform' => $webForm]) !!} + + {!! view_render_event('admin.settings.webform.edit.save_button.before', ['webform' => $webForm]) !!} + + + + {!! view_render_event('admin.settings.webform.edit.save_button.after', ['webform' => $webForm]) !!} +
    +
    +
    + + + +
    +
    + + @pushOnce('scripts') + ' }}" + /> + + + @lang('admin::app.settings.webforms.edit.copy') + + + + {!! view_render_event('admin.settings.webform.edit.modal.form_controls.after', ['webform' => $webForm]) !!} + + +
    + + + + + + + + @endPushOnce + diff --git a/packages/Webkul/Admin/src/Resources/views/settings/web-forms/index.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/web-forms/index.blade.php new file mode 100644 index 0000000..fe6ace9 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/web-forms/index.blade.php @@ -0,0 +1,120 @@ + + + @lang('admin::app.settings.webforms.index.title') + + + +
    +
    +
    + + + +
    + @lang('admin::app.settings.webforms.index.title') +
    +
    + +
    + +
    + @if (bouncer()->hasPermission('admin.settings.web_forms.create')) + + @endif +
    +
    +
    + + + +
    +
    + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/webhook/create.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/webhook/create.blade.php new file mode 100644 index 0000000..b6ebd9d --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/webhook/create.blade.php @@ -0,0 +1,699 @@ +@php($placeholders = app('\Webkul\Automation\Helpers\Entity')->getEmailTemplatePlaceholders()) + + + + + @lang('admin::app.settings.webhooks.create.title') + + + {!! view_render_event('admin.settings.webhook.edit.form.before') !!} + + +
    +
    +
    + {!! view_render_event('admin.settings.webhook.edit.breadrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.webhook.edit.breadrumbs.after') !!} + +
    + @lang('admin::app.settings.webhooks.create.title') +
    +
    + +
    +
    + {!! view_render_event('admin.settings.webhook.edit.save_button.before') !!} + + + + + {!! view_render_event('admin.settings.webhook.edit.save_button.after') !!} +
    +
    +
    + + +
    +
    + + {!! view_render_event('admin.settings.webhook.edit.form.after') !!} + + @pushOnce('scripts') + + + + + + + + + + + + + @endPushOnce + + @pushOnce('styles') + + + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/webhook/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/webhook/edit.blade.php new file mode 100644 index 0000000..75376f5 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/webhook/edit.blade.php @@ -0,0 +1,712 @@ +@php($placeholders = app('\Webkul\Automation\Helpers\Entity')->getEmailTemplatePlaceholders()) + + + + + @lang('admin::app.settings.webhooks.edit.title') + + + {!! view_render_event('admin.settings.webhook.edit.form.before', ['webhook' => $webhook]) !!} + + +
    +
    +
    + {!! view_render_event('admin.settings.webhook.edit.breadcrumbs.before', ['webhook' => $webhook]) !!} + + + + + {!! view_render_event('admin.settings.webhook.edit.breadcrumbs.after', ['webhook' => $webhook]) !!} + +
    + @lang('admin::app.settings.webhooks.edit.title') +
    +
    + +
    +
    + {!! view_render_event('admin.settings.webhook.edit.save_button.before', ['webhook' => $webhook]) !!} + + + + + {!! view_render_event('admin.settings.webhook.edit.save_button.after', ['webhook' => $webhook]) !!} +
    +
    +
    + + +
    +
    + + {!! view_render_event('admin.settings.webhook.edit.form.after', ['webhook' => $webhook]) !!} + + @pushOnce('scripts') + + + + + + + + + + + + @endPushOnce + + @pushOnce('styles') + + + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/webhook/index.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/webhook/index.blade.php new file mode 100644 index 0000000..84264da --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/webhook/index.blade.php @@ -0,0 +1,46 @@ + + + @lang('admin::app.settings.webhooks.index.title') + + +
    +
    +
    + {!! view_render_event('admin.settings.webhooks.breadcrumbs.datagrid.before') !!} + + + + {!! view_render_event('admin.settings.webhooks.breadcrumbs.datagrid.after') !!} + +
    + @lang('admin::app.settings.webhooks.index.title') +
    +
    + +
    +
    + {!! view_render_event('admin.settings.webhooks.create_button.datagrid.before') !!} + + + + @lang('admin::app.settings.webhooks.index.create-btn') + + + {!! view_render_event('admin.settings.webhooks.create_button.datagrid.after') !!} +
    +
    +
    + + {!! view_render_event('admin.settings.webhooks.index.datagrid.before') !!} + + + + + + + {!! view_render_event('admin.settings.webhooks.index.datagrid.after') !!} +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/workflows/create.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/workflows/create.blade.php new file mode 100644 index 0000000..66ec4c0 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/workflows/create.blade.php @@ -0,0 +1,1262 @@ + + + @lang('admin::app.settings.workflows.create.title') + + + {!! view_render_event('admin.settings.workflow.form.before') !!} + + +
    +
    +
    + {!! view_render_event('admin.settings.workflow.breadcrumbs.before') !!} + + + + {!! view_render_event('admin.settings.webhooks.breadcrumbs.after') !!} + +
    + @lang('admin::app.settings.workflows.create.title') +
    +
    + +
    +
    + {!! view_render_event('admin.settings.workflow.save_button.before') !!} + + + + + {!! view_render_event('admin.settings.workflow.save_button.after') !!} +
    +
    +
    + + + + + +
    +
    + + {!! view_render_event('admin.settings.workflow.form.after') !!} + + @pushOnce('scripts') + + + + + + + + + + + + @endPushOnce + + @pushOnce('styles') + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/workflows/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/workflows/edit.blade.php new file mode 100644 index 0000000..12f5999 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/workflows/edit.blade.php @@ -0,0 +1,1280 @@ + + + @lang('admin::app.settings.workflows.edit.title') + + + {!! view_render_event('admin.activities.edit.form.before') !!} + + +
    +
    +
    + {!! view_render_event('admin.settings.workflows.edit.breadcrumbs.before', ['workflow' => $workflow]) !!} + + + + {!! view_render_event('admin.settings.workflows.edit.breadcrumbs.after', ['workflow' => $workflow]) !!} + +
    + @lang('admin::app.settings.workflows.edit.title') +
    +
    + +
    +
    + {!! view_render_event('admin.settings.workflows.edit.save_button.before', ['workflow' => $workflow]) !!} + + + + + {!! view_render_event('admin.settings.workflows.edit.save_button.after', ['workflow' => $workflow]) !!} +
    +
    +
    + + + + + +
    +
    + + @pushOnce('scripts') + + + + + + + + + + + + @endPushOnce + + @pushOnce('styles') + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/workflows/index.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/workflows/index.blade.php new file mode 100644 index 0000000..46a4546 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/workflows/index.blade.php @@ -0,0 +1,50 @@ + + + + @lang('admin::app.settings.workflows.index.title') + + +
    +
    +
    + {!! view_render_event('admin.settings.workflows.index.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.workflows.index.breadcrumbs.after') !!} + +
    + @lang('admin::app.settings.workflows.index.title') +
    +
    + +
    + +
    + {!! view_render_event('admin.settings.workflows.index.create_button.before') !!} + + @if (bouncer()->hasPermission('settings.automation.workflows.create')) + + @lang('admin::app.settings.workflows.index.create-btn') + + @endif + + {!! view_render_event('admin.settings.workflows.index.create_button.after') !!} +
    +
    +
    + + {!! view_render_event('admin.settings.workflows.index.datagrid.before') !!} + + + + + + + {!! view_render_event('admin.settings.workflows.index.datagrid.after') !!} +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/user/account/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/user/account/edit.blade.php new file mode 100644 index 0000000..60da96d --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/user/account/edit.blade.php @@ -0,0 +1,201 @@ + + + + @lang('admin::app.account.edit.title') + + + {!! view_render_event('admin.user.account.form.before', ['user' => $user]) !!} + + + +
    +
    + {!! view_render_event('admin.user.account.breadcrumbs.before', ['user' => $user]) !!} + + + + + {!! view_render_event('admin.user.account.breadcrumbs.after', ['user' => $user]) !!} + +
    + {!! view_render_event('admin.user.account.title.before', ['user' => $user]) !!} + + @lang('admin::app.account.edit.title') + + {!! view_render_event('admin.user.account.title.after', ['user' => $user]) !!} +
    +
    + +
    + +
    + {!! view_render_event('admin.user.account.save_btn.before', ['user' => $user]) !!} + + + + {!! view_render_event('admin.user.account.save_btn.after', ['user' => $user]) !!} +
    +
    +
    + + +
    + {!! view_render_event('admin.user.account.left.before', ['user' => $user]) !!} + + +
    + +
    +

    + @lang('admin::app.account.edit.general') +

    + + + + + + +

    + @lang('admin::app.account.edit.upload-image-info') +

    + + + + + @lang('admin::app.account.edit.name') + + + + + + + + + + + @lang('admin::app.account.edit.email') + + + + + + +
    +
    + + {!! view_render_event('admin.user.account.left.after', ['user' => $user]) !!} + + {!! view_render_event('admin.user.account.right.before', ['user' => $user]) !!} + + +
    + + +

    + @lang('admin::app.account.edit.change-password') +

    + + + + + {!! view_render_event('admin.user.current_password.before', ['user' => $user]) !!} + + + + + @lang('admin::app.account.edit.current-password') + + + + + + + + {!! view_render_event('admin.user.current_password.after', ['user' => $user]) !!} + + {!! view_render_event('admin.user.password.before', ['user' => $user]) !!} + + + + + @lang('admin::app.account.edit.password') + + + + + + + + {!! view_render_event('admin.user.password.after', ['user' => $user]) !!} + + {!! view_render_event('admin.user.confirm-password.before', ['user' => $user]) !!} + + + + + @lang('admin::app.account.edit.confirm-password') + + + + + + + + {!! view_render_event('admin.user.confirm-password.after', ['user' => $user]) !!} + +
    +
    + + {!! view_render_event('admin.user.account.right.after', ['user' => $user]) !!} +
    +
    + + {!! view_render_event('admin.user.account.form.after') !!} +
    diff --git a/packages/Webkul/Admin/src/Routes/Admin/activities-routes.php b/packages/Webkul/Admin/src/Routes/Admin/activities-routes.php new file mode 100644 index 0000000..1fe00ec --- /dev/null +++ b/packages/Webkul/Admin/src/Routes/Admin/activities-routes.php @@ -0,0 +1,24 @@ +prefix('activities')->group(function () { + Route::get('', 'index')->name('admin.activities.index'); + + Route::get('get', 'get')->name('admin.activities.get'); + + Route::post('create', 'store')->name('admin.activities.store'); + + Route::get('edit/{id}', 'edit')->name('admin.activities.edit'); + + Route::put('edit/{id}', 'update')->name('admin.activities.update'); + + Route::get('download/{id}', 'download')->name('admin.activities.file_download'); + + Route::delete('{id}', 'destroy')->name('admin.activities.delete'); + + Route::post('mass-update', 'massUpdate')->name('admin.activities.mass_update'); + + Route::post('mass-destroy', 'massDestroy')->name('admin.activities.mass_delete'); +}); diff --git a/packages/Webkul/Admin/src/Routes/Admin/auth-routes.php b/packages/Webkul/Admin/src/Routes/Admin/auth-routes.php new file mode 100644 index 0000000..783223c --- /dev/null +++ b/packages/Webkul/Admin/src/Routes/Admin/auth-routes.php @@ -0,0 +1,47 @@ +group(function () { + /** + * Redirect route. + */ + Route::get('/', [Controller::class, 'redirectToLogin']); + + /** + * Session routes. + */ + Route::controller(SessionController::class)->group(function () { + Route::prefix('login')->group(function () { + Route::get('', 'create')->name('admin.session.create'); + + Route::post('', 'store')->name('admin.session.store'); + }); + + Route::middleware(['user'])->group(function () { + Route::delete('logout', 'destroy')->name('admin.session.destroy'); + }); + }); + + /** + * Forgot password routes. + */ + Route::controller(ForgotPasswordController::class)->prefix('forget-password')->group(function () { + Route::get('', 'create')->name('admin.forgot_password.create'); + + Route::post('', 'store')->name('admin.forgot_password.store'); + }); + + /** + * Reset password routes. + */ + Route::controller(ResetPasswordController::class)->prefix('reset-password')->group(function () { + Route::get('{token}', 'create')->name('admin.reset_password.create'); + + Route::post('', 'store')->name('admin.reset_password.store'); + }); +}); diff --git a/packages/Webkul/Admin/src/Routes/Admin/configuration-routes.php b/packages/Webkul/Admin/src/Routes/Admin/configuration-routes.php new file mode 100644 index 0000000..f6c253e --- /dev/null +++ b/packages/Webkul/Admin/src/Routes/Admin/configuration-routes.php @@ -0,0 +1,16 @@ +prefix('configuration')->group(function () { + Route::get('search', 'search')->name('admin.configuration.search'); + + Route::prefix('{slug?}/{slug2?}')->group(function () { + Route::get('', 'index')->name('admin.configuration.index'); + + Route::post('', 'store')->name('admin.configuration.store'); + + Route::get('{path}', 'download')->name('admin.configuration.download'); + }); +}); diff --git a/packages/Webkul/Admin/src/Routes/Admin/contacts-routes.php b/packages/Webkul/Admin/src/Routes/Admin/contacts-routes.php new file mode 100644 index 0000000..7bdb394 --- /dev/null +++ b/packages/Webkul/Admin/src/Routes/Admin/contacts-routes.php @@ -0,0 +1,67 @@ +group(function () { + /** + * Persons routes. + */ + Route::controller(PersonController::class)->prefix('persons')->group(function () { + Route::get('', 'index')->name('admin.contacts.persons.index'); + + Route::get('create', 'create')->name('admin.contacts.persons.create'); + + Route::post('create', 'store')->name('admin.contacts.persons.store'); + + Route::get('view/{id}', 'show')->name('admin.contacts.persons.view'); + + Route::get('edit/{id}', 'edit')->name('admin.contacts.persons.edit'); + + Route::put('edit/{id}', 'update')->name('admin.contacts.persons.update'); + + Route::get('search', 'search')->name('admin.contacts.persons.search'); + + Route::middleware(['throttle:100,60'])->delete('{id}', 'destroy')->name('admin.contacts.persons.delete'); + + Route::post('mass-destroy', 'massDestroy')->name('admin.contacts.persons.mass_delete'); + + /** + * Tag routes. + */ + Route::controller(TagController::class)->prefix('{id}/tags')->group(function () { + Route::post('', 'attach')->name('admin.contacts.persons.tags.attach'); + + Route::delete('', 'detach')->name('admin.contacts.persons.tags.detach'); + }); + + /** + * Activity routes. + */ + Route::controller(ActivityController::class)->prefix('{id}/activities')->group(function () { + Route::get('', 'index')->name('admin.contacts.persons.activities.index'); + }); + }); + + /** + * Organization routes. + */ + Route::controller(OrganizationController::class)->prefix('organizations')->group(function () { + Route::get('', 'index')->name('admin.contacts.organizations.index'); + + Route::get('create', 'create')->name('admin.contacts.organizations.create'); + + Route::post('create', 'store')->name('admin.contacts.organizations.store'); + + Route::get('edit/{id?}', 'edit')->name('admin.contacts.organizations.edit'); + + Route::put('edit/{id}', 'update')->name('admin.contacts.organizations.update'); + + Route::delete('{id}', 'destroy')->name('admin.contacts.organizations.delete'); + + Route::put('mass-destroy', 'massDestroy')->name('admin.contacts.organizations.mass_delete'); + }); +}); diff --git a/packages/Webkul/Admin/src/Routes/Admin/leads-routes.php b/packages/Webkul/Admin/src/Routes/Admin/leads-routes.php new file mode 100644 index 0000000..43a0be0 --- /dev/null +++ b/packages/Webkul/Admin/src/Routes/Admin/leads-routes.php @@ -0,0 +1,64 @@ +prefix('leads')->group(function () { + Route::get('', 'index')->name('admin.leads.index'); + + Route::get('create', 'create')->name('admin.leads.create'); + + Route::post('create', 'store')->name('admin.leads.store'); + + Route::post('create-by-ai', 'createByAI')->name('admin.leads.create_by_ai'); + + Route::get('view/{id}', 'view')->name('admin.leads.view'); + + Route::get('edit/{id}', 'edit')->name('admin.leads.edit'); + + Route::put('edit/{id}', 'update')->name('admin.leads.update'); + + Route::put('attributes/edit/{id}', 'updateAttributes')->name('admin.leads.attributes.update'); + + Route::put('stage/edit/{id}', 'updateStage')->name('admin.leads.stage.update'); + + Route::get('search', 'search')->name('admin.leads.search'); + + Route::delete('{id}', 'destroy')->name('admin.leads.delete'); + + Route::post('mass-update', 'massUpdate')->name('admin.leads.mass_update'); + + Route::post('mass-destroy', 'massDestroy')->name('admin.leads.mass_delete'); + + Route::get('get/{pipeline_id?}', 'get')->name('admin.leads.get'); + + Route::delete('product/{lead_id}', 'removeProduct')->name('admin.leads.product.remove'); + + Route::put('product/{lead_id}', 'addProduct')->name('admin.leads.product.add'); + + Route::get('kanban/look-up', [LeadController::class, 'kanbanLookup'])->name('admin.leads.kanban.look_up'); + + Route::controller(ActivityController::class)->prefix('{id}/activities')->group(function () { + Route::get('', 'index')->name('admin.leads.activities.index'); + }); + + Route::controller(TagController::class)->prefix('{id}/tags')->group(function () { + Route::post('', 'attach')->name('admin.leads.tags.attach'); + + Route::delete('', 'detach')->name('admin.leads.tags.detach'); + }); + + Route::controller(EmailController::class)->prefix('{id}/emails')->group(function () { + Route::post('', 'store')->name('admin.leads.emails.store'); + + Route::delete('', 'detach')->name('admin.leads.emails.detach'); + }); + + Route::controller(QuoteController::class)->prefix('{id}/quotes')->group(function () { + Route::delete('{quote_id?}', 'delete')->name('admin.leads.quotes.delete'); + }); +}); diff --git a/packages/Webkul/Admin/src/Routes/Admin/mail-routes.php b/packages/Webkul/Admin/src/Routes/Admin/mail-routes.php new file mode 100644 index 0000000..371fe62 --- /dev/null +++ b/packages/Webkul/Admin/src/Routes/Admin/mail-routes.php @@ -0,0 +1,33 @@ +group(function () { + Route::controller(EmailController::class)->group(function () { + Route::post('create', 'store')->name('admin.mail.store'); + + Route::put('edit/{id}', 'update')->name('admin.mail.update'); + + Route::get('attachment-download/{id?}', 'download')->name('admin.mail.attachment_download'); + + Route::get('{route?}', 'index')->name('admin.mail.index'); + + Route::get('{route}/{id}', 'view')->name('admin.mail.view'); + + Route::delete('{id}', 'destroy')->name('admin.mail.delete'); + + Route::post('mass-update', 'massUpdate')->name('admin.mail.mass_update'); + + Route::post('mass-destroy', 'massDestroy')->name('admin.mail.mass_delete'); + + Route::post('inbound-parse', 'inboundParse')->name('admin.mail.inbound_parse')->withoutMiddleware('user'); + }); + + Route::controller(TagController::class)->prefix('{id}/tags')->group(function () { + Route::post('', 'attach')->name('admin.mail.tags.attach'); + + Route::delete('', 'detach')->name('admin.mail.tags.detach'); + }); +}); diff --git a/packages/Webkul/Admin/src/Routes/Admin/products-routes.php b/packages/Webkul/Admin/src/Routes/Admin/products-routes.php new file mode 100644 index 0000000..6a58e12 --- /dev/null +++ b/packages/Webkul/Admin/src/Routes/Admin/products-routes.php @@ -0,0 +1,42 @@ + ['user']], function () { + Route::controller(ProductController::class)->prefix('products')->group(function () { + Route::get('', 'index')->name('admin.products.index'); + + Route::get('create', 'create')->name('admin.products.create'); + + Route::post('create', 'store')->name('admin.products.store'); + + Route::get('view/{id}', 'view')->name('admin.products.view'); + + Route::get('edit/{id}', 'edit')->name('admin.products.edit'); + + Route::put('edit/{id}', 'update')->name('admin.products.update'); + + Route::get('search', 'search')->name('admin.products.search'); + + Route::get('{id}/warehouses', 'warehouses')->name('admin.products.warehouses'); + + Route::post('{id}/inventories/{warehouseId?}', 'storeInventories')->name('admin.products.inventories.store'); + + Route::delete('{id}', 'destroy')->name('admin.products.delete'); + + Route::post('mass-destroy', 'massDestroy')->name('admin.products.mass_delete'); + + Route::controller(ActivityController::class)->prefix('{id}/activities')->group(function () { + Route::get('', 'index')->name('admin.products.activities.index'); + }); + + Route::controller(TagController::class)->prefix('{id}/tags')->group(function () { + Route::post('', 'attach')->name('admin.products.tags.attach'); + + Route::delete('', 'detach')->name('admin.products.tags.detach'); + }); + }); +}); diff --git a/packages/Webkul/Admin/src/Routes/Admin/quote-routes.php b/packages/Webkul/Admin/src/Routes/Admin/quote-routes.php new file mode 100644 index 0000000..25421ab --- /dev/null +++ b/packages/Webkul/Admin/src/Routes/Admin/quote-routes.php @@ -0,0 +1,24 @@ +prefix('quotes')->group(function () { + Route::get('', 'index')->name('admin.quotes.index'); + + Route::get('create/{lead_id?}', 'create')->name('admin.quotes.create'); + + Route::post('create', 'store')->name('admin.quotes.store'); + + Route::get('edit/{id?}', 'edit')->name('admin.quotes.edit'); + + Route::put('edit/{id}', 'update')->name('admin.quotes.update'); + + Route::get('print/{id?}', 'print')->name('admin.quotes.print'); + + Route::delete('{id}', 'destroy')->name('admin.quotes.delete'); + + Route::get('search', 'search')->name('admin.quotes.search'); + + Route::post('mass-destroy', 'massDestroy')->name('admin.quotes.mass_delete'); +}); diff --git a/packages/Webkul/Admin/src/Routes/Admin/rest-routes.php b/packages/Webkul/Admin/src/Routes/Admin/rest-routes.php new file mode 100644 index 0000000..7167a03 --- /dev/null +++ b/packages/Webkul/Admin/src/Routes/Admin/rest-routes.php @@ -0,0 +1,54 @@ +prefix('dashboard')->group(function () { + Route::get('', 'index')->name('admin.dashboard.index'); + + Route::get('stats', 'stats')->name('admin.dashboard.stats'); +}); + +/** + * DataGrid routes. + */ +Route::prefix('datagrid')->group(function () { + /** + * Saved filter routes. + */ + Route::controller(SavedFilterController::class)->prefix('datagrid/saved-filters')->group(function () { + Route::post('', 'store')->name('admin.datagrid.saved_filters.store'); + + Route::get('', 'get')->name('admin.datagrid.saved_filters.index'); + + Route::put('{id}', 'update')->name('admin.datagrid.saved_filters.update'); + + Route::delete('{id}', 'destroy')->name('admin.datagrid.saved_filters.destroy'); + }); + + /** + * Lookup routes. + */ + Route::get('datagrid/look-up', [DataGridController::class, 'lookUp'])->name('admin.datagrid.look_up'); +}); + +/** + * Tinymce file upload handler. + */ +Route::post('tinymce/upload', [TinyMCEController::class, 'upload'])->name('admin.tinymce.upload'); + +/** + * User profile routes. + */ +Route::controller(AccountController::class)->prefix('account')->group(function () { + Route::get('', 'edit')->name('admin.user.account.edit'); + + Route::put('update', 'update')->name('admin.user.account.update'); +}); diff --git a/packages/Webkul/Admin/src/Routes/Admin/settings-routes.php b/packages/Webkul/Admin/src/Routes/Admin/settings-routes.php new file mode 100644 index 0000000..7bdfcb2 --- /dev/null +++ b/packages/Webkul/Admin/src/Routes/Admin/settings-routes.php @@ -0,0 +1,377 @@ +group(function () { + /** + * Settings routes. + */ + Route::controller(SettingController::class)->prefix('settings')->group(function () { + Route::get('', 'index')->name('admin.settings.index'); + + Route::get('search', 'search')->name('admin.settings.search'); + }); + + /** + * Groups routes. + */ + Route::controller(GroupController::class)->prefix('groups')->group(function () { + Route::get('', 'index')->name('admin.settings.groups.index'); + + Route::post('create', 'store')->name('admin.settings.groups.store'); + + Route::get('edit/{id}', 'edit')->name('admin.settings.groups.edit'); + + Route::put('edit/{id}', 'update')->name('admin.settings.groups.update'); + + Route::delete('{id}', 'destroy')->name('admin.settings.groups.delete'); + }); + + /** + * Type routes. + */ + Route::controller(TypeController::class)->prefix('types')->group(function () { + Route::get('', 'index')->name('admin.settings.types.index'); + + Route::post('create', 'store')->name('admin.settings.types.store'); + + Route::get('edit/{id?}', 'edit')->name('admin.settings.types.edit'); + + Route::put('edit/{id}', 'update')->name('admin.settings.types.update'); + + Route::delete('{id}', 'destroy')->name('admin.settings.types.delete'); + }); + + /** + * Roles routes. + */ + Route::controller(RoleController::class)->prefix('roles')->group(function () { + Route::get('', 'index')->name('admin.settings.roles.index'); + + Route::get('create', 'create')->name('admin.settings.roles.create'); + + Route::post('create', 'store')->name('admin.settings.roles.store'); + + Route::get('edit/{id}', 'edit')->name('admin.settings.roles.edit'); + + Route::put('edit/{id}', 'update')->name('admin.settings.roles.update'); + + Route::delete('{id}', 'destroy')->name('admin.settings.roles.delete'); + }); + + /** + * WebForms Routes. + */ + Route::controller(WebFormController::class)->prefix('web-forms')->group(function () { + Route::group(['middleware' => ['user']], function () { + Route::get('', 'index')->name('admin.settings.web_forms.index'); + + Route::get('create', 'create')->name('admin.settings.web_forms.create'); + + Route::post('create', 'store')->name('admin.settings.web_forms.store'); + + Route::get('edit/{id?}', 'edit')->name('admin.settings.web_forms.edit'); + + Route::put('edit/{id}', 'update')->name('admin.settings.web_forms.update'); + + Route::delete('{id}', 'destroy')->name('admin.settings.web_forms.delete'); + }); + }); + + /** + * Workflows Routes. + */ + Route::controller(WorkflowController::class)->prefix('workflows')->group(function () { + Route::get('', 'index')->name('admin.settings.workflows.index'); + + Route::get('create', 'create')->name('admin.settings.workflows.create'); + + Route::post('create', 'store')->name('admin.settings.workflows.store'); + + Route::get('edit/{id?}', 'edit')->name('admin.settings.workflows.edit'); + + Route::put('edit/{id}', 'update')->name('admin.settings.workflows.update'); + + Route::delete('{id}', 'destroy')->name('admin.settings.workflows.delete'); + }); + + /** + * Webhook Routes. + */ + Route::controller(WebhookController::class)->prefix('webhooks')->group(function () { + Route::get('', 'index')->name('admin.settings.webhooks.index'); + + Route::get('create', 'create')->name('admin.settings.webhooks.create'); + + Route::post('create', 'store')->name('admin.settings.webhooks.store'); + + Route::get('edit/{id?}', 'edit')->name('admin.settings.webhooks.edit'); + + Route::put('edit/{id}', 'update')->name('admin.settings.webhooks.update'); + + Route::delete('{id}', 'destroy')->name('admin.settings.webhooks.delete'); + }); + + /** + * Tags Routes. + */ + Route::controller(TagController::class)->prefix('tags')->group(function () { + Route::get('', 'index')->name('admin.settings.tags.index'); + + Route::post('create', 'store')->name('admin.settings.tags.store'); + + Route::get('edit/{id}', 'edit')->name('admin.settings.tags.edit'); + + Route::put('edit/{id}', 'update')->name('admin.settings.tags.update'); + + Route::get('search', 'search')->name('admin.settings.tags.search'); + + Route::delete('{id}', 'destroy')->name('admin.settings.tags.delete'); + + Route::post('mass-destroy', 'massDestroy')->name('admin.settings.tags.mass_delete'); + }); + + /** + * Users Routes. + */ + Route::controller(UserController::class)->prefix('users')->group(function () { + Route::get('', 'index')->name('admin.settings.users.index'); + + Route::post('create', 'store')->name('admin.settings.users.store'); + + Route::get('edit/{id?}', 'edit')->name('admin.settings.users.edit'); + + Route::put('edit/{id}', 'update')->name('admin.settings.users.update'); + + Route::get('search', 'search')->name('admin.settings.users.search'); + + Route::delete('{id}', 'destroy')->name('admin.settings.users.delete'); + + Route::post('mass-update', 'massUpdate')->name('admin.settings.users.mass_update'); + + Route::post('mass-destroy', 'massDestroy')->name('admin.settings.users.mass_delete'); + }); + + /** + * Pipelines Routes. + */ + Route::controller(PipelineController::class)->prefix('pipelines')->group(function () { + Route::get('', 'index')->name('admin.settings.pipelines.index'); + + Route::get('create', 'create')->name('admin.settings.pipelines.create'); + + Route::post('create', 'store')->name('admin.settings.pipelines.store'); + + Route::get('edit/{id?}', 'edit')->name('admin.settings.pipelines.edit'); + + Route::post('edit/{id}', 'update')->name('admin.settings.pipelines.update'); + + Route::delete('{id}', 'destroy')->name('admin.settings.pipelines.delete'); + }); + + /** + * Sources Routes. + */ + Route::controller(SourceController::class)->prefix('sources')->group(function () { + Route::get('', 'index')->name('admin.settings.sources.index'); + + Route::post('create', 'store')->name('admin.settings.sources.store'); + + Route::get('edit/{id?}', 'edit')->name('admin.settings.sources.edit'); + + Route::put('edit/{id}', 'update')->name('admin.settings.sources.update'); + + Route::delete('{id}', 'destroy')->name('admin.settings.sources.delete'); + }); + + /** + * Attributes Routes. + */ + Route::controller(AttributeController::class)->prefix('attributes')->group(function () { + Route::get('', 'index')->name('admin.settings.attributes.index'); + + Route::get('check-unique-validation', 'checkUniqueValidation')->name('admin.settings.attributes.check_unique_validation'); + + Route::get('create', 'create')->name('admin.settings.attributes.create'); + + Route::post('create', 'store')->name('admin.settings.attributes.store'); + + Route::get('edit/{id}', 'edit')->name('admin.settings.attributes.edit'); + + Route::put('edit/{id}', 'update')->name('admin.settings.attributes.update'); + + Route::get('lookup/{lookup?}', 'lookup')->name('admin.settings.attributes.lookup'); + + Route::get('lookup-entity/{lookup?}', 'lookupEntity')->name('admin.settings.attributes.lookup_entity'); + + Route::delete('{id}', 'destroy')->name('admin.settings.attributes.delete'); + + Route::get('{id}/options', 'getAttributeOptions')->name('admin.settings.attributes.options'); + + Route::post('mass-update', 'massUpdate')->name('admin.settings.attributes.mass_update'); + + Route::post('mass-destroy', 'massDestroy')->name('admin.settings.attributes.mass_delete'); + + Route::get('download', 'download')->name('admin.settings.attributes.download'); + }); + + /** + * Warehouses Routes. + */ + Route::controller(WarehouseController::class)->prefix('warehouses')->group(function () { + Route::put('edit/{id}', 'update')->name('admin.settings.warehouses.update'); + + Route::get('', 'index')->name('admin.settings.warehouses.index'); + + Route::get('search', 'search')->name('admin.settings.warehouses.search'); + + Route::get('{id}/products', 'products')->name('admin.settings.warehouses.products.index'); + + Route::get('create', 'create')->name('admin.settings.warehouses.create'); + + Route::post('create', 'store')->name('admin.settings.warehouses.store'); + + Route::get('view/{id}', 'view')->name('admin.settings.warehouses.view'); + + Route::get('edit/{id?}', 'edit')->name('admin.settings.warehouses.edit'); + + Route::delete('{id}', 'destroy')->name('admin.settings.warehouses.delete'); + + Route::controller(WarehouseTagController::class)->prefix('{id}/tags')->group(function () { + Route::post('', 'attach')->name('admin.settings.warehouses.tags.attach'); + + Route::delete('', 'detach')->name('admin.settings.warehouses.tags.detach'); + }); + + Route::controller(ActivityController::class)->prefix('{id}/activities')->group(function () { + Route::get('', 'index')->name('admin.settings.warehouse.activities.index'); + }); + }); + + /** + * Warehouses Location Routes. + */ + Route::controller(LocationController::class)->prefix('locations')->group(function () { + Route::get('search', 'search')->name('admin.settings.locations.search'); + + Route::post('create', 'store')->name('admin.settings.locations.store'); + + Route::put('edit/{id}', 'update')->name('admin.settings.locations.update'); + + Route::delete('{id}', 'destroy')->name('admin.settings.locations.delete'); + }); + + /** + * Email Templates Routes. + */ + Route::controller(EmailTemplateController::class)->prefix('email-templates')->group(function () { + Route::get('', 'index')->name('admin.settings.email_templates.index'); + + Route::get('create', 'create')->name('admin.settings.email_templates.create'); + + Route::post('create', 'store')->name('admin.settings.email_templates.store'); + + Route::get('edit/{id?}', 'edit')->name('admin.settings.email_templates.edit'); + + Route::put('edit/{id}', 'update')->name('admin.settings.email_templates.update'); + + Route::delete('{id}', 'destroy')->name('admin.settings.email_templates.delete'); + }); + + /** + * Events Routes. + */ + Route::group(['prefix' => 'marketing'], function () { + Route::controller(EventController::class)->prefix('events')->group(function () { + Route::get('', 'index')->name('admin.settings.marketing.events.index'); + + Route::post('create', 'store')->name('admin.settings.marketing.events.store'); + + Route::get('edit/{id?}', 'edit')->name('admin.settings.marketing.events.edit'); + + Route::put('edit/{id}', 'update')->name('admin.settings.marketing.events.update'); + + Route::delete('{id}', 'destroy')->name('admin.settings.marketing.events.delete'); + + Route::post('mass-destroy', 'massDestroy')->name('admin.settings.marketing.events.mass_delete'); + }); + + Route::controller(CampaignsController::class)->prefix('campaigns')->group(function () { + Route::get('', 'index')->name('admin.settings.marketing.campaigns.index'); + + Route::get('events', 'getEvents')->name('admin.settings.marketing.campaigns.events'); + + Route::get('email-templates', 'getEmailTemplates')->name('admin.settings.marketing.campaigns.email-templates'); + + Route::post('', 'store')->name('admin.settings.marketing.campaigns.store'); + + Route::get('{id}', 'show')->name('admin.settings.marketing.campaigns.edit'); + + Route::put('{id}', 'update')->name('admin.settings.marketing.campaigns.update'); + + Route::delete('{id}', 'destroy')->name('admin.settings.marketing.campaigns.delete'); + + Route::post('mass-destroy', 'massDestroy')->name('admin.settings.marketing.campaigns.mass_delete'); + }); + }); + + Route::prefix('data-transfer')->group(function () { + /** + * Import routes. + */ + Route::controller(ImportController::class)->prefix('imports')->group(function () { + Route::get('', 'index')->name('admin.settings.data_transfer.imports.index'); + + Route::get('create', 'create')->name('admin.settings.data_transfer.imports.create'); + + Route::post('create', 'store')->name('admin.settings.data_transfer.imports.store'); + + Route::get('edit/{id}', 'edit')->name('admin.settings.data_transfer.imports.edit'); + + Route::put('update/{id}', 'update')->name('admin.settings.data_transfer.imports.update'); + + Route::delete('destroy/{id}', 'destroy')->name('admin.settings.data_transfer.imports.delete'); + + Route::get('import/{id}', 'import')->name('admin.settings.data_transfer.imports.import'); + + Route::get('validate/{id}', 'validateImport')->name('admin.settings.data_transfer.imports.validate'); + + Route::get('start/{id}', 'start')->name('admin.settings.data_transfer.imports.start'); + + Route::get('link/{id}', 'link')->name('admin.settings.data_transfer.imports.link'); + + Route::get('index/{id}', 'indexData')->name('admin.settings.data_transfer.imports.index_data'); + + Route::get('stats/{id}/{state?}', 'stats')->name('admin.settings.data_transfer.imports.stats'); + + Route::get('download-sample/{sample?}', 'downloadSample')->name('admin.settings.data_transfer.imports.download_sample'); + + Route::get('download/{id}', 'download')->name('admin.settings.data_transfer.imports.download'); + + Route::get('download-error-report/{id}', 'downloadErrorReport')->name('admin.settings.data_transfer.imports.download_error_report'); + }); + }); +}); diff --git a/packages/Webkul/Admin/src/Routes/Admin/web.php b/packages/Webkul/Admin/src/Routes/Admin/web.php new file mode 100644 index 0000000..10683c3 --- /dev/null +++ b/packages/Webkul/Admin/src/Routes/Admin/web.php @@ -0,0 +1,51 @@ +name('krayin.home'); diff --git a/packages/Webkul/Admin/src/Traits/ProvideDropdownOptions.php b/packages/Webkul/Admin/src/Traits/ProvideDropdownOptions.php new file mode 100644 index 0000000..545cd6f --- /dev/null +++ b/packages/Webkul/Admin/src/Traits/ProvideDropdownOptions.php @@ -0,0 +1,279 @@ +booleanDropdownChoices); + } + + /** + * Get boolean dropdown options. + * + * @param string $choice + */ + public function getBooleanDropdownOptions($choice = 'active_inactive'): array + { + return $this->isBooleanDropdownChoiceExists($choice) && $choice == 'active_inactive' + ? $this->getActiveInactiveDropdownOptions() + : $this->getYesNoDropdownOptions(); + } + + /** + * Get active/inactive dropdown options. + */ + public function getActiveInactiveDropdownOptions(): array + { + return [ + [ + 'value' => '', + 'label' => __('admin::app.common.select-options'), + 'disabled' => true, + 'selected' => true, + ], + [ + 'label' => trans('admin::app.datagrid.active'), + 'value' => 1, + 'disabled' => false, + 'selected' => false, + ], [ + 'label' => trans('admin::app.datagrid.inactive'), + 'value' => 0, + 'disabled' => false, + 'selected' => false, + ], + ]; + } + + /** + * Get yes/no dropdown options. + */ + public function getYesNoDropdownOptions(): array + { + return [ + [ + 'value' => '', + 'label' => __('admin::app.common.select-options'), + 'disabled' => true, + 'selected' => true, + ], + [ + 'value' => 0, + 'label' => __('admin::app.common.no'), + 'disabled' => false, + 'selected' => false, + ], [ + 'value' => 1, + 'label' => __('admin::app.common.yes'), + 'disabled' => false, + 'selected' => false, + ], + ]; + } + + /** + * Get user dropdown options. + */ + public function getUserDropdownOptions(): array + { + $options = app(\Webkul\User\Repositories\UserRepository::class) + ->get(['id as value', 'name as label']) + ->map(function ($item, $key) { + $item->disabled = false; + + $item->selected = false; + + return $item; + }) + ->toArray(); + + return [ + [ + 'label' => __('admin::app.common.select-users'), + 'value' => '', + 'disabled' => true, + 'selected' => true, + ], + ...$options, + ]; + } + + /** + * Get lead source options. + */ + public function getLeadSourcesOptions(): array + { + $options = app(\Webkul\Lead\Repositories\SourceRepository::class) + ->get(['id as value', 'name as label']) + ->map(function ($item, $key) { + $item->disabled = false; + + $item->selected = false; + + return $item; + }) + ->toArray(); + + return [ + [ + 'label' => __('admin::app.common.select-users'), + 'value' => '', + 'disabled' => true, + 'selected' => true, + ], + ...$options, + ]; + } + + /** + * Get organization dropdown options. + */ + public function getOrganizationDropdownOptions(): array + { + $options = app(\Webkul\Contact\Repositories\OrganizationRepository::class) + ->get(['id as value', 'name as label']) + ->map(function ($item, $key) { + $item->disabled = false; + + $item->selected = false; + + return $item; + }) + ->toArray(); + + return [ + [ + 'label' => __('admin::app.common.select-organization'), + 'value' => '', + 'disabled' => true, + 'selected' => true, + ], + ...$options, + ]; + } + + /** + * Get role dropdown options. + */ + public function getRoleDropdownOptions(): array + { + return [ + [ + 'label' => trans('admin::app.settings.roles.all'), + 'value' => 'all', + 'disabled' => false, + 'selected' => false, + ], [ + 'label' => trans('admin::app.settings.roles.custom'), + 'value' => 'custom', + 'disabled' => false, + 'selected' => false, + ], + ]; + } + + /** + * Get activity type dropdown options. + */ + public function getActivityTypeDropdownOptions(): array + { + return [ + [ + 'label' => trans('admin::app.common.select-type'), + 'value' => '', + 'disabled' => true, + 'selected' => true, + ], [ + 'label' => trans('admin::app.common.select-call'), + 'value' => 'call', + 'disabled' => false, + 'selected' => false, + ], [ + 'label' => trans('admin::app.common.select-meeting'), + 'value' => 'meeting', + 'disabled' => false, + 'selected' => false, + ], [ + 'label' => trans('admin::app.common.select-lunch'), + 'value' => 'lunch', + 'disabled' => false, + 'selected' => false, + ], + ]; + } + + /** + * Get attribute type dropdown options. + */ + public function getAttributeTypeDropdownOptions(): array + { + return [ + [ + 'label' => trans('admin::app.common.select-options'), + 'value' => '', + 'disabled' => true, + 'selected' => true, + ], + [ + 'label' => trans('admin::app.common.system_attribute'), + 'value' => '0', + 'disabled' => false, + 'selected' => false, + ], + [ + 'label' => trans('admin::app.common.custom_attribute'), + 'value' => '1', + 'disabled' => false, + 'selected' => false, + ], + ]; + } + + /** + * Get organization dropdown options. + */ + public function getWarehouseDropdownOptions(): array + { + $options = app(\Webkul\Warehouse\Repositories\WarehouseRepository::class) + ->get(['id as value', 'name as label']) + ->map(function ($item, $key) { + $item->disabled = false; + + $item->selected = false; + + return $item; + }) + ->toArray(); + + return [ + [ + 'label' => __('admin::app.common.select-warehouse'), + 'value' => '', + 'disabled' => true, + 'selected' => true, + ], + ...$options, + ]; + } +} diff --git a/packages/Webkul/Admin/tailwind.config.js b/packages/Webkul/Admin/tailwind.config.js new file mode 100644 index 0000000..7fe663a --- /dev/null +++ b/packages/Webkul/Admin/tailwind.config.js @@ -0,0 +1,49 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ["./src/Resources/**/*.blade.php", "./src/Resources/**/*.js"], + + theme: { + container: { + center: true, + + screens: { + "4xl": "1920px", + }, + + padding: { + DEFAULT: "16px", + }, + }, + + screens: { + sm: "525px", + md: "768px", + lg: "1024px", + xl: "1240px", + "2xl": "1440px", + "3xl": "1680px", + "4xl": "1920px", + }, + + extend: { + colors: { + brandColor: "var(--brand-color)", + }, + + fontFamily: { + inter: ['Inter'], + icon: ['icomoon'] + } + }, + }, + + darkMode: 'class', + + plugins: [], + + safelist: [ + { + pattern: /icon-/, + } + ] +}; \ No newline at end of file diff --git a/packages/Webkul/Admin/tests/e2e-pw/.gitignore b/packages/Webkul/Admin/tests/e2e-pw/.gitignore new file mode 100644 index 0000000..52e84d7 --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/.gitignore @@ -0,0 +1,2 @@ +/playwright-report +/test-results diff --git a/packages/Webkul/Admin/tests/e2e-pw/data/images/1.webp b/packages/Webkul/Admin/tests/e2e-pw/data/images/1.webp new file mode 100644 index 0000000000000000000000000000000000000000..4886617acd1ac6229aff72040c91e2f2b65d9230 GIT binary patch literal 174236 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

    uYjzQQB?KuY83HD$l1*a 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 literal 0 HcmV?d00001 diff --git a/packages/Webkul/Admin/tests/e2e-pw/data/images/10.webp b/packages/Webkul/Admin/tests/e2e-pw/data/images/10.webp new file mode 100644 index 0000000000000000000000000000000000000000..933f80102fe3f48861bdf67ea6c4099e98ef1094 GIT binary patch literal 29098 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 literal 0 HcmV?d00001 diff --git a/packages/Webkul/Admin/tests/e2e-pw/data/images/11.webp b/packages/Webkul/Admin/tests/e2e-pw/data/images/11.webp new file mode 100644 index 0000000000000000000000000000000000000000..9a9bdb2c7a82424955d0cc0d892c5d4a3d87b7c2 GIT binary patch literal 21748 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 literal 0 HcmV?d00001 diff --git a/packages/Webkul/Admin/tests/e2e-pw/data/images/2.webp b/packages/Webkul/Admin/tests/e2e-pw/data/images/2.webp new file mode 100644 index 0000000000000000000000000000000000000000..0c2d450bec144e156f23d7665ca3eba6e8e4ede6 GIT binary patch literal 248118 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%0DN(7U} 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 M+_^h-vwbZruM;h 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 literal 0 HcmV?d00001 diff --git a/packages/Webkul/Admin/tests/e2e-pw/data/images/4.webp b/packages/Webkul/Admin/tests/e2e-pw/data/images/4.webp new file mode 100644 index 0000000000000000000000000000000000000000..c22001306d06ba1197096909f0a4e1266181d346 GIT binary patch literal 90892 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

    <0WN2A?;{sTYC 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 L(PSM!00000d>&+q literal 0 HcmV?d00001 diff --git a/packages/Webkul/Admin/tests/e2e-pw/data/images/5.webp b/packages/Webkul/Admin/tests/e2e-pw/data/images/5.webp new file mode 100644 index 0000000000000000000000000000000000000000..a775e3a2d6c36dcad814aae3d51e0db81a9ee041 GIT binary patch literal 208684 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

    ^ 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

    sg%yUod{&KU@N3Ck71&kL~ z?A7LV%2o_z4j>6305t((?{+N9Ds`__6f1em)J#wn#9tlj9F34mXL^*!Zm1p)&g2c- z_C2^c4r*!B6;6VK!C`@Yz%W$YRw_HvA{hO#`%bJ`0oh!2d%#2u7n0{NsrM1bFnl~v zzZ&=}Xf2JZ88bYE_}Ecb<$3@3*HB0ZJziZ=plo&RMz*+jW-vfA*J$nNA>>BaTd)n!NB6xzNF(54jw>Od`PJKCTlUoVqKYwC(r|WA{`d4y0D= z7cEp}%B4gnf#j4vA=l-h#aQ#ziaz)*0B zT-YuX;le^~K^Y+^N~wJN)E0JYZ^}IEn^wEC?e0rsmb%M5yO%HL( z9dZYK25F=<$MDnlAe+0vIE0xoWpEST(Lbo1+9U!>`(Hc=@%Pj}Qi`V89Nsc%#`FH(`^Wat^6C~~@d&**XWR6E9!89PKkzTHdL)6{OkI;m zm#nYf={ydp&X4yV6FIFR?S{# z&7+J)&6T7uw`Sq)^kNTyp+JidnKc{^R^`1dJ%Ex!4Vv7IA+;f6ZssF`dnQm!Cw)wk z2!oPkEkm1}>9P@y21*06blo6ov|hv&)otxILpIv6sqQa>g%*|-++Y@-i;)<4*edV> zo@|z<8l||Ubq8wkZy4CklAbB$$`Vk4@(9oUg+7VJC;}kLs`$fYrP4xNSRg_it=p(V zok7eBBj8N&(lxfSLh4%_IctQmzyo~g*6j`7C2FRPf>5~(NwR~lKwBV73C-HMpmyW+_d}zp#g&$^f@oP#OqhjEhgE%EOSV! zzq;8g$MxT0IZI@e#jeWX?UxW??*3}IMA5$nb(QBj*+?;Q8K4cVHq$n~&M$s?)c$M3 z56iR-O2E+lNybx9#^qy+9j_GeXtZr!IRsHIy}RQ<=1+I;nKwL)S^k-WG-U31xUqii zVx?w@)0_TU&?BJHh+2DU0Rj0?abS$GVt!h3tS?0A{$yh>tYa^lVPVvG3Ec;vEUcl; zJw^%cp^vv1d5I>_4Wo6o@#U~_oLe|K++NG7qF!pTh}E>%FG*NeF0Fe@Ub9tk)?^%; zwu;n_HVe;t)qo0Osi=O#+N@F+g!bHv44W7u$cT7fwnnz;vc-uu5>*paj5kOr-rDgX>s zxmMH_R&N~O@8l_*CF*iT_jLO8&X$rHXYdzGA=2 zUpbVNvtAV*F?tY-)iahv5?}=39*60tc9buCM7|~P&~X3U%h@zu2GL)zFc4ie%ZgVQ zX?!um(k|J3Jb!0$dBg%hM%>GP+J8GV!t0L?6xkPEyGUX?u|W%HYvN|2ZPzrf>9ml> zWG*6t;lZ1}Y$HH=V`{grlt&_Bk|(31 z7JsJTaZ5NJT*oH7QgXyWy;cC77&@D)Z4~vYhuN8&wW#{xz0wf#pMI1&y*c?YLXN)s2%h07T`+nkjyJ{8nS0PUK?4 zw+@m#0#+KO!%GaahN){Wo%3pXC9d=u4V2i5Y@5&+u;xvZbIFa>!p>;5X;e7*x@&!G z-*j-^3CKAmpl#I^cpMc)vdzb$smgk3QJQ+(&@v8-Az1g4;|IUHF^*r}ddI<(-7dF0 zwO6wnP97vS8pS2bN@Ytc7Qb?Y$#mp&p_7M@ySwlGrh!fsTSX3uw*+Ksxzyk4($65zKL6j|Zb$R|Qt+M}fY;j`+o1k2DjrK5LGG$mnv0EcLM zumZUbT%ZFu%80;R`s+FF)U;~5Rk}=|td1eXiH^+cJh=i^VM(4B9FWUX8ZZP<=hbW5 z_~4ru7<8|TrT^8UMpH@D-`hMSU@v;

    l8`Ehv@TaDi;l`}_tIIQf2cyBY}nsS|S( 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 a;x{@TI60$wn%C_&&ZY5F;c!l~tUv(Su!}+f literal 0 HcmV?d00001 diff --git a/packages/Webkul/Admin/tests/e2e-pw/data/images/6.webp b/packages/Webkul/Admin/tests/e2e-pw/data/images/6.webp new file mode 100644 index 0000000000000000000000000000000000000000..fbd3733f3ddab88d65a5604f8e47c287651a8039 GIT binary patch literal 36952 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 ACjbBd literal 0 HcmV?d00001 diff --git a/packages/Webkul/Admin/tests/e2e-pw/data/images/7.webp b/packages/Webkul/Admin/tests/e2e-pw/data/images/7.webp new file mode 100644 index 0000000000000000000000000000000000000000..aae603cbe1b71528094a47e5d322b17582be7e6a GIT binary patch literal 24766 zcmV(%K;pkrNk&GtU;qGDMM6+kP&go}U;qFRy#bv8DgXii0zNSqibJ9yp(G^I321-@ z31@EMa(+$A@PJtt#(kCi-}GIgvd_oAU-?`8Pv1wC{D1dHk^i{-`2Ux_pNRj1=0nT> z?ti-eRQ%BYwd;ra*Y6*=N9%9w$NBGVpWF|9{$xLEe{wzPf8c)1d&mCM{=e7@`ltFY z|31B5$=|!a!r#%q;Q#;jlmFBEmGI^LxBh?bXSG-VuV4@V{-7WK^{;%#?th7Xhkm=Y zeiZ%}z|Xf2*!gn%pZ-sRe>=4c_WuMJ4E_&@hvz~7qwTV5@Hn*X8u zGw=`n7yLi{-|~Ny-%fLu$Sytr=PRG-Jk#d?_as&$n2=(q^^G3pQ%<# z*=T=NgF+i84mo5>Sn-~ZMDjW%)buM{&^CRsrQkz4+PqI=;ty}UB$g*I;(j|SIVmhZ ze^>dA(il0l1K_<`$lYUb?F*B7J&Ko_#{HlJBOxQLJdmi3xit;gvgA1_t0#Hwx0n?=92}e{q;o1=h#( z@3X`puKBa1#5Fi9!gM6rmD4qJnfd_bXIowQ?oZ$ijdoOWQdpeBiT7?oCTWW+C%6bu zzbb=s%HzJ6Ag{5YC``d(yE6OK@dIln+HcBn3P6;IZc{>_dlf8p2rsX)GSJshGP+_e z)gn}fB_)Z>IG>KmNkjKBl~JMbmhIpVLzv!LfDRFcD+oO-ROcUD(wmvYXM=tUEvU<- zMX3tE=x_NJwqPzh;o`3i?t^XvW3yzo+)*t{3x5Ck!s}&6B_)Z<={jBFar_M*5Z);3 z+v@~&$U^XwxkZ=P$};v_{~dcG!I-{BtHr9QT1|m3mlj(Ss|2=`d~X|S?MvB0h?cy2G5f8&8e>BrOZQZc z0IGvcDDVV^!{=X!vCB9)xc!QWGHr)RC|n;VtzX+IB30-BRyTmkG??bL&>-N z1_NjcBUWT_UGpdh#LE508KYXa7#|&wxY^bUF*C-P!N_rd+o1Cj)ev5@%QY(p*M=MxY7TzE`{xTnE1( zd`;lWaSl-6)9F%L_LU4P*~L;!K{>-61j#j3cq*#&58|wn$F^8{(Y+tWSNXI|DpJ4% zp2FD~JVL&7KtLFwQdclRR1rECx{Q8{J2?huARBF3k)fqWRENj!_lKYNS?Gat!`4ii%AEdfJV;=FD@nXqrkGGe1E@1FxAfrE)9I+jd@Aw{XfW0XAT z(54y&m68jsOV8gr&tSGGjmPdO@cWPZCodP6VEm5CtV2qJxNLcP^UUI%F2D}J6o+*% zE=$JTy%G?)8~`AZPDqV`nE)e#3!(K!_M#-z5v7qbT)g&ZhF;6IaRe;7X-=Z;jcX%V zh{0lZl9IT~bT1f34LJw87Ap54MP%y&sr;tPCyNN_uoBlRAZ)Snz|_l8)p_vffL=^7 z;2Hl^x^@8y8oaSfue2D_@R@$VkZ`7Dck{%1B;^Z{GrT$;TSscr8qy)=&P)>!$p9}p z6v(WtBvR*MX2&bVTbqNK1b}uF1X@Tb@ED3@eBjn3Az$zS!vy<7L)|DP%RC?Umd}!i zXE-h>iWXarfU%~%7GVNXUu7dE>3Mx}z{zs)kFxGb?nHsk_`-0yAGTsu>rtVi?(ipn#V-F39^ zb+*k@NFI?&p>VI1jFBJ}mp}z1^C(G~)uEG2RekO9wvLwf1daS1 zW=?iL^!^(gsis;eId+EpYLH%?J8PuGCMo=HUAk1b(EeEifak={du`blR#OqAo{9Z% zWx_5oEf}67g=H}7GaMV}CT8!d@{_*OOuw(j{e%wmrUqS+2$MrOLjh~Y0pn89K#~%p zIj}f$deY#hG&Uq~GngQ^cPc%l=U6@ltJGjCWGmgbyK^k7>x|ziTvycZDn`};%%2q` ztKrh*UKF+aTkt*|_m3@DqyeeZui$<5xBXN^{Ws=f*$m}Bpu`!j$I8u6pqu1laP;3U z5*1pD)Wm-Sk9KIbTnW41fBtlM^Uc4CEcME7OR_W}3A&XL3_QYpbY-}a9EF6zM1xux z<@&IuD*LvVWn|S4Nu+LwcBSW@kAQmjAig>&dYvpn<6$6Mgzp}rR2$1&Z|{?xnpeTO zD1akSz)4_|Z#$-u4Y+j~?L4%fa2us_4(!eoXz2`UL~s>!z&z%6;ThA-icW6u`NdF2a*N<0q|g})=F zGQXaDlXq_dJ;k>?Mtx`HRd6X*QEj|}lmb5eIE zPpZSVEP1I)Q1}Z+3_*rO$oc11-*Oo+By@(Q%w=RuTrJX?synn-2j4<$*w+OZ;73EO zq4(V`O@v`sQm~*EFAwb2e(SgMTUMH3x_hyusM6`1g)QzfAN~D}#n8C$I>{GEG52vUM8@U(~iO;B_g8E7JfdzHnnL8|Tah7P_E2 z{u+|imZrT!U0GdIjuz?pklOW-GIzr-5F{ajqmUl|ojB%0)H`PO+nF32fo}yBJT#yD?f3_ijcq<_ zM2v+X*5vSsmVL(s)~JPw%R-EDS;)ax_8g*0g+%`4tQDZi$N79B1s^5};gvd0d0)Gs zNBk6mfJ3t=Z^=&bST-h3aBI_AyEcf8RqDMdkA{@KjX&!+cKo-IZY)!mZutXFCxMEj zRc!@ft=!{69gW-n2G2BBCS_i9DM;rGcQgLHSdq6VmW<)}v~K2V(?UCC3AMG7;)UaR z+yGNFCkRwGl{hx{@t`3p_?{C(y25axt{7(?a<*!;6O1)=QV0bCpg#2a}1BkpXchBS# z-nA>bVaW@N5YO&6H82(&v^A9%Z?dNrQ1GEecuY_rkc|7rnGqZ%-qfG86ID61#FQ+hj)2Z#|{!)h6}*Hq{F! zwpP#2cJfI{GU=`HvXau{l(OowQ91{zYd_>0-mbbRHE9X>?5O0SY!>2Bf90A+S18^9 zpk*P%q(RC!P2i93Q%SEUCFXPwx(FRv3+=4C*C9hDrEmLKH~Uyr(c0T-q|c;MOAw^KIE9h?oT@qKFw(1lHy1D6xEY{v zF5hR8YHTMrw-_7}>3FBi*;;jnOU8nY3rF=`oIhqc!SX(xX5>LJv|61}x%kZ;3VdMu z`Ra@AAU?!qKiv+^oKMGPM-i)V_*U9!ZQ8jMUCfu+np?F!{9!k5&E!{DlFr?D+snas zfFJNFr+c*O^+Zl5GY2-r-an#iv5h8abVa7URCPkg%a$@aXEn!|`tR4R&`ae-fju?9 zVmz;fhsQ7g0RHpYzsdjrk}XQRu;_J+j>z{veBUiDAZ6_XhGjRH6F*Bq$s}B6X*c*S ze?iAC8L2Ei2ztk*{THBjC&doIqxtUpa_m>5$0KQKY#FuN4;?(ZE9W%W&*SO3pe)y^ zfqf%T9{jWAC=oHq{f_f__7OP#%ht;J3)wFIli77EY8;VDE2A{Cy7pmi9s=OxJN)m@ zhSP?^L_lK1Lj#I*MjtdF4L%3zzfrUbs;oaNCEvlC*zP851sJ@BBrl6!$Lnh8$&6PL zwq&%JzSVpw4;;R^)V@s=Z@q~}3VuTuzm?+JXbO<5qr$Bb0qf)k7>~Eb^13psVXO%I zFLZtQ=`!|uTxtz@zM2)KU^?scg(D)nwh=8nNGUYQIIskN<6y(iL~OwZujXKu^SUOy z-2Unu&AyrLoF5w9Zm5DqKnTXc3h_RCs7fd&@$z){vhAvS_?`$p_xrCl1gk%il#mw< zzVt8Q8@Q`Q-Eou`NZd~k|AvBQ0gIM!GvJS@QyqWG#BNUhW-STp8yyw^*bR_ki_|t+ zC|UU2puiWxCap1sj+Ueh+YmO{H>#)pjOTks5fSnn&aW-U*Jt~*i*B2uV5wzx-l&#i z{D`xU!|p1`-U=fuQopg^`Gy}2CoYn#=_ruN3$W{p2D1~}o9=ra&<@UWE%~gEcq2su zo+q_OX}pa`?fC&h?tJBn-8=Ww_hVy<8i*a;(ijbktB>-Lx$mAh zZpeX~fRtPUOejj^woR@$c)iwn`ns&GM%fk!ZOE*+V4*6v36F^H>vz?Fyn6hs!j zcKH#R?3Y+|6V~`?U3G67D!HJ=OotlyI3!3@XM0ZC&JsgR(GkEzdxSA9$?kOeIr{He z^O`J{I&^AMv0U&jZ(p>**h5EWrv$1@+Q*!*B>w#u6V&9AJbCP|V62pSo&iu$4`@KIr zjcQdBhVM>u=Vj9cn;ns{#f>TS4Y4uCxI%Zs`IaJnaUQ!^fztfb}wQB^6XhpPyog7=sD4&F*cRG7_81+y&S#X)^5VqV_#b$$IL&t=_AZWW23p=I{ zxdq|e*zAh3p`16~0-`bzRU=ccvsN22%*&a#u6gB8c?Q4JMk{vr^K`_!JhQ#y_v=hLTFxG5+V4&iCN!MTqUx(c7S?8 zZ{Vx(M`LH;(IsS8P9WV(Pqj9i2i&per?l5u=b*D-!!epaLv=R)678}fdr^O(zBrm% zvx)Q(Fx`M}nsV|Vn44Kc#^aJ~?8gqA(0Y1PcEFF@s*Lw@7RWxEg#c9{3pP)Y1fhtG z#cGxAEJKAjXkm!{#5WV6u59U7JpSDsm6rZ$qo6c5)-dQV6E?2X_UqpCb&V!lI^t8T zn5qL%d|oJ_>>F6V?IeN|hKnrxD-xrK_rBjMrn>^7nW^>2t(qXe#eabcKuGz5&cxHV zt)`VNHZ&bd&|9G z?w{v5Jq~4mQ>cTiGhR8EDken3J*{!H4y6Af5$OuQ3wetX>-kCpEGN%^x1aB2=cY4s z*I@J88pxb3bgAjbOa1|4N*r2;+$1~8v@9Fs2af?WTcEvSGQug{v6dw*pYsuM)Mqba z=WVsvgCQAWI+R~g#^QFTf3)^7VyFl+Iwp`|!*MIjH^N@kY z%o8%MI^U*kUFPI2Jmo`VMv-Fv2&YP=x3Hb2`b+*@8FiF}tFjq9w4b8bvvuQ6nu;SO zezLBRsApCX(}};C7D6duP&LKU%6-T|{d?ib)*1?7@_xC>j@#d(W%7<9x#5~#o*#FU zWsmidcHWKhOm2`|)FCKC5dkU;00G8S&l6%pe^{N!LovD$gh8jkxrDM~8_;jm(q-#? zFODHJh~@$>+t(hHJNO`BSZ-6_UB<}3Rha})pJERV9nPCyTgz>dP0&;dwjaC?3XyLtWQa#*cPCfYpNGo zJqeac>Ty!@Y{!*qP;&_op4s|c!)9pqtEFpOKEqbu ze83#&!s@&DR;(Z-98;>FPuj6zZtaZnCld{TafhHz{Jfx}&h?qWz$R!qL zsk>>;w_~Wmrnru($JMfW0qrGo8P@57RAxaLPSwz$@vBNp)Gfvqm?&#Gpea0tO# z*I-@D>VX5E9_St>n7i$TAcM^Ax03L{Rh>cFpW9Vn?sBS`$+9fx+#HO$V}||_7NONj zAkA`|Z9P90eS;192jd_*K~Ih@!gKO&hp1|!s#)~6aHgq6W%63w$Ky9v(-VgsYT7|>+nU_9hj6wS!!iqhSIXK0t|J>1;H0FcJDoQyeiGCH* zb`2-d4D;iMNHtqruZKf26DCdDb^j4uaN1NQf@RlViO9NSkF6azFM%HQbc1W(HJore zxiHS>YN#fhfSisqlC4wZKdvjD(( z#v>MIQvvn(M-+1B_K1n=GVXt~j9=?Sn(BozkR(W7qb_-%P&NdTX~?227D|SJ7;ILdM4yiq81bH5vcH*jhA60?o%h5!3aK=bsj& zzyJyAKYF{S8%{9`jHS;E&Y8#{=9H{X+cdsabEgd%q9tvt!e)uOE~J%>BU8UmeTGt+ znr5Z(yWy0P6K%pO|70^rC?_@Hk<`6Nrbt_nlHwoird(bxFlCR9-I_rW=tKGgAF^WBn}u@?QIl@hMN=;ZP`}sjJ^3KfdL@~2 zo0HRq-%7HTkWBNj;EbG%rbnni?9$LU>3@Q#pR<@gZ5s0kbc z)_zxZ8vQ@HBE%gqQ?B)MMGFT5MN_ zjsZ0&t_3G1b~P_v0ko&$mXIkOz#p18>i4p0TOuStGgHJzcdr1fm|iC;H%W){xx0IC&$kS&50ic?4f{9U+F0J>2S?7hAk zOXUqd`k2v-045$#V^EXH*dbqqPm(is1VOGLqLhEXUMn5|CM7|P>Z3Ddi=<93DI)s0 zG$JZ&2UTv>VO;;M!Y5S0F+&U7@T&iM8c=aQe;yMB5eUbhP|g(~#7kvZvfJeaUK3`N z*@TCnDV#Gj<8zf<8mWj3#$+v~dsn~&J@*2maOT>iZM4Yn3eWCg_9(?{BKfb5rkf26 z(~Y1l5(`yB61A=iWoq=wN6KcGa9kG`wT4v43KIupj6e{&*)Ro?zONP9ICelLe@(OL zc&?R0xcs}YQF_s#jzdjZIZYd}h+lC2UzhcGSpc1{nzL?}{UdSsrf0bPCazVKLMY&0 zYT^+bEC}CvTz!?0tx0{IvHcFF3a!@}nEEdZX$aRoM1mfa?^7=R7**MK6u_O3JwllT zIq+}h)X!F6uLYe=BzR&G+W^30-3|s_IhzzUVW|cyMZt;i0W&l|`i8={>Ql#rc+2*w zNtV0}Xww>ZEG{Um+NpJC#?z6<(tES_HJOsHUmpX$SM$3JtfSHVxHsv2JI=?Bb?Vibn z0g=pv=g8)IXh62}{eCP#(!VL|b)e(AoOUvv4S%-hu>I}vey3ODC{6l2L+tx5P)9j&Sz^tfyu-iL$c6Lhz{s(jMuXXn;q2S7cz0spK> zBTe_Q855TA`DjVvEzwXw?h~`s#L?<4qd&q(p&Im#S;qP*Y%0~b+qeVb#3jVAjSU*t z6Gj<9^cYKJ*++4dX^6~NiT&e7s^j2&yUO?xoX?T>eym{~eulxaIC*)?1klU*pP9>6 zYH(I@gj%G4vh0mgUPYG%#cg)h;V&@>b&oW6>WuST3%b?gf{cBFRoHPb11d^X1f{b% znB4fKKdRsi=0H*d$bkSaTUIcoGa|4+RqA(@dfCIb1jLhqdNkHg){YP{_hrB!8OG6^ z4H8k5ge87rnw=U(;>&+R(nJtQ%goaDNZBuf%geROY?&o-eoc&O;OA38Wix zooCvGU${5*Csc=KP^>g3O|z@Y`A7VL510XYsv4+w=_c^`%aYd?t2>utj^SqPRyuVV zs@gOMQI*89DdQtpg5m!3#|y^I8O)Du(IcEL)o=m|lo`I2TTf@SAwEt2iZ}7-GsQYQ zKTnM+&$#X6fl`g#6RrKwK-0W*&9E3J|VK2J%#fidZE>b@<9DwrQoF}h2rQQQw%HPF zl3w%av{YVv7c;N$`;Yd&sPU`2RCpsSvIP*;-FREzm-sviF}C6-^YjWHHcwYcDaDvZ z&U+cRCQ0l3S4#)^TZ}7@NRzN*P&K1Y=Q$#@C`=5uzYiXfih1A1Z8f zRb8JH7iqt3v#xd~29}F!sa~>fbt;q9b?q_k#V&0-OdUawR<7OXfH0WyDwAxvVV?zJ zcnAydYS)pudqAdYaIYnc%2N6Iin{ql8CKosQ!x+D$!#EUq8MXo;J$wyxH-YmKl6QW zBmeDIKp9zQ53)O1ALKczR^SJ&R7H1uU#Y$uM*LX{S^+C+HEr`Bqq{s9sb2CB%Pif> z53qz&?0#ZhCet@*VaPMed!q3qdjpmp?~`OnFEdMfOga9?DgmsNN+{Zcfge-@`4~(z z+)#07Qk-2d#4w?bMmk{#jI&8Pgci($jtk=F` zIL6YUN4IR93I}0-4NWehNXjNW(V+zO6c0}brZ52bO=-8Q0pxj_CF{EHmu3Z zwim!Nxc$P}7S)j07YE+AI5PKN#PbGBG9v^wkHv?V%qhMB!1!Lwo81P9ia}pJ**2%T zi)fM_{NcRJ^13l5;PQ5j(7TXO*O;6RfXNY7tK{wS6=BxaG1 z6`P3o?(zhZJ2t!gRo~;P-GY0(u)t)*Ub9s9UOBMiol9`)l;H0TJugSJ&;eF?KO%RK zshd|9=3gD!B)gI~ATXJ8};2mHFepk@}jx7S@fYV;y5aAGZSx6wch* z=?T>bCqX>Gw*>k2Cn?vMgw4*V*{`UVU!L0P;}0mmUg;h6t3o8r0Y6_tQ1#cdl3oNK z3Ji2W27ef)^^vwT?p=|_Jq626cb_iRnEIr+r45o_MJ7Bxz>rB848o_Xr=8!!6Ok8q zR@&SsWe6YyraTb9R$^GoP>4i22)6u_BQaiRT$uisiNr6GaPS3@JNS5x)w+M1wSJOn zD6GPDUmc6BeJpGGlX+4{%uMoafd4M~x7?5U?v0_6k|>YZLHhSqsG2WQNwjH!_KaE5 zBbeI&HAWjTHi@Px&@`F+E?Ac@BTk$|&U0g-{^PB(Qblmu7UohjkBmN}f1I?~`byu| z&UA{$Xj_hp(iF~&povpicI~YlalsYISBhs_WddVlu)=Lc(Zgq{)sDLkee;Ga8(5j1 zsux%p(5BpQfH}Rnb-%PmF>(S8)eTxZ?2Vhu%OGcSlVMaG@YWjcqpjdbsr3PE682gk zZ5qx0naoGW{Zr3{@fOJv7=TnK( z>4JPu!u7P!MnV#eX&Bl|NP`)1Qm<^FNW%6s$fQ&n1I07`iDGC($9%ODViaXiLOQ!)S%agwYyJc64d|IJ*Cd!>zfeCWd*B;+UlV}uAjw};aKDZ%lA`$B#zAxQJ<@fZB}qbF3K zk&zYWQ%TZ8$kyMNqyoUr?==GV`#rY2k}&uz4{-yUEsR*6nF&& zPZs1;+jH={z?6*5+BY&-{M9qU79fNvtAeVSIIex>#fksVX5Q4}!5tUu7pq(iz3dcRPPwtAZuj=EpGQZP3n( zrJT}-raK~3HjJ?vJK75r%xGxLZlS940UfM`b&FKR#{S<7KdQ?W-#zC*_^@wT_R(;g zO;@>5!b!9*YtG~A6MU*zmCvMX%S>%A5|+5$Gvh-5U$?On2{qKdDt_X~s1gv&NJ^}3 zN|bv{t%MJZ_=ve_t4L_2`VXhp?kgB{5Cinet@eQG8{oNmDPp0~0a<$?vph!be$9>`6 zTA$9=r;WUW3H?NOCg+3K{K9*N2ux1wPLCc!+2hb&&_~AujwmEQOdVxCEVM(Ge9)om z=30pG$*=9AFHFb~);+kRHbZg;ovJjYgR-JM0FLyFRD6j7m0u5vA?X{)SvFV-@4xz3 zhmxA>EB*1fb$WKi; zXKk7l@En?T6~;#;paw44b13^1o}cQ9fSo8eQF=f($>y$Lp$l0N4J)#>?PdlW`F;ch zWpw83KvvNoSzG=|G3=x5&sdFH&s5JmSTG^51aGK345My1aN!j`XTu%ISY|<7kNnAj zWTR5~DXcM9m*;!dZbnc_*^)VE;<(5DS_+7yxa*;aXktASj0I_929o~4yZhEp?uL=C5$}gu7FjIHStL2!3zF)0d!LNQ8GBNPx__nH@K}Iwc%z`)pYd>dejJ+**f-3QE`f*_vI8V zgpr82wd@5A&i6T)ij2Rcnu4m<2E#5qxyBI}MuMI^Y{E)kzErO(PP|x^gi*9A_N#yG z_*6fsG}EWwR61Nm4y0YVTsnCa?@`%apw(DPh1t38a8^AJvR{N$vhrl*Y0eq-lqqNn zV4aWqi8&L;6jRx|*nv|8!RFHJyelLR@ko(be{-uh-O^f*f9`;Ofmsa_A_^8Lnq{@7 zvd?(8`~>C{-k>`Y3|HAUmnsyZ8ngK`d*DU~-l$oI>DmkF@r5xt5Kwv_=_ zP(opLzwe;u2JY2@q`!vZ^NGp95mNl|;jDlFkMk`f$x#p@D>7ngk(x&eI3_QX332kZ ztHn_)FgTHCz;~f2b+MukloIv=d?ruFj3=7N2RBK8;9BI6FBG?9H1K3=aAFcjFi9GO zr2rZ_Ya_on&VMz&A$II|sU_5?@9b{GOv%;hg_KQ10y}=jU0u_Mt!%v#I_g zwuro3nH$jRmqm0%u?W;BP_cGc2K2+}BN{e{WEw*B{RzD#0ErkMeys`JHm-4tv82_} zJ$!Op42WE3Fa%6$t=q_waW)|tZDh>6QYW}!4!&qst{G96dM(_>aj{8Hyq#LN^~BYI zPvj_5GLZ`HDJPYb$@XfL=JuQI0;M&*aoW*%nGL&;Dspspf+|N8z?yIgjj%G@l78Iu z9Pp{@tHDk&DaYkfWAdI}h0Q7YuWRA6EIt8Qrywi%F(x+Bjw_~ba%bq5w7<7el$f-24OA|g#= zD-ga85rjAsEc(h{zk4f-HAReGT6OH!yB`qbiyED%B?UuoCp_Pza%ufl91? z6nSfZc_Zw`!Dy641#yk4@9x7XySrD&b&E2y;`8^#Q&VuGgzB_Rmo(zN*{MlF)rQS= z7w{yo-s@sB@Bb+a+;s|K5oI@hfv`3G(hw8wvh$H-KWWO(Rg25?W#uN}@eQ0(fmP4^ z&3bH&qZhR&4BTJZ9Tr#N{b>a(lxuE{%+q#9>iz8J)rT&IYRy;S9XpzECSL6$Jq&dw zrCUay*9GQk-t(Ua!NpusQi-BZc#8Ze?-$sCB$;Pe7^Q zh+rWcFyCRIf*O^_AoMG3D&Mnmt1omE7W>I&dRRlUV4{fKm#JH;5obCCsLZTB<&}U5 ztl>!v)FLIOOVQ*D?BCuQlN!@7ir4wv~EP zAh)|lm5;Ye%zzSyYj`^_P9~n-md~ci?J!OHe7Nmz4JsQg1st7T`1A#Id7e9kXc~0U zzWYITThW9g9kDTi*gAR;9Q==S9NF41<^n2q;JI@#)zRiEPcWA}ZMU}k_hm!hyCU_n zFYPbq2lz(A{`&(s&gag&(v=Gd+3oNlm+?gmqd9o{=8ycBKPXadZs*r)N&MALWa5?5 za9xS6&(hGw*@VW#0if^3=Gi#AxY?TZP8~prqdgGOI=E@vIVM!ib+3&849z+}%awjS z=Rh3-=}F^aQH5f;nY0gd7bw8~=S0U6BT?DCJbH4!2pM5DUEhw?g}k|G=5Y9#<0?nj zGF{daegFq=NXqYgzf63fL?(VR31ZxI$>f6?BJRT`ykGwE{1vKHjBdL^w!i@poMilm zqI$%i4;X9GnsP{#E}_(q(P6-Ui6_uw!r-8A-5*P`CEc5ZnJ2mbHSpTl^; z5YqqB=a}?IF%%UOi6mqYrcYjM?7=a_^!p!mRED+HPYUb$dz4Qjjef|xe{|o;kFzQU zRo{&tol8+x@x;l*V6k9C$*?=Ch5h{-pF{g^UyezxeP9l{iZ5isiJ5&d7&$bUTFTpa zFUS8fSc^7uADVF5@1U1=;8@%tYa4Fzj-JHZ64Hk~cR2OX6_<#t-tB+y=~HulFKQpKfoU_5$ln4IU{BBxrR=e6?aJjUt&Wh%T7 zalDca^qv4??q55u^y_l8@I&A+jI%z(-%R)q;u30lyiu~L-1LX6){{Lt5yyik8;X4%|i9L1o%1yjWAOeeH^>dIy8bzJh-Sl9Gw7eK1#CT7k*fIgL zm*pSF&7`MjqI$GxQ5ZK`>>oj2B)mYhawht3#pnVDxzA4#*|d6yUSXep&a~gh7#30_ z-@%d=`Xvr^Fu2Y>cS@j}OPL)=@sy+=G0vSPXG*^r89`_BVr69}P@rvk4a$+?p;wVS zjrWkg!y~UxtUWNM7Bf_kyQU(q*XW4~BwnI+`=s5p+z9}1I-XMd$^d`^rsSbi&VV6Z zz;N=pupsw)M4hph0X25R0Qi*ezT{0T;p%lO4frcUi}*|IduuX zT4+G1Iji-e)7<&=mTPd{%K!bWArJl?SfQWcmss8Dt`eZTTAD<^%Dsh;Erq9mbL$8QDkMn#-p*t-aP5j<_~S<<^~Tcp zQ^?cWe?DJ}{CdXVj5irK)R+O{JDX?Z`m0Y+<`=f=e?3$p>+>i1d1~m5o4Hq{KK_1L zSLkPE6H%yq2)CMunpQc*V>+L8%wP=h%4%)`^1okEsO<7hnksSpyhu_baU(+QU`z1L z=Up$|AdtV7wj5Lo*Om0SzL`VG{1~rf7A7-DtJAUZlzBw;9ByVW1Poq9MT%y43PraT z+a$ib+{7+{Nc3{Va;ACf^Sd)w683-GPG9YLe?O#3(3+=6ITj5kmbX2=K#R8)8i6y@ zg?)=iHp2Uwq5us&}`GX01EwNsNp?fXJX+4^Wv68}xG z^O60cw~6uGQUCef&evy=6t0^P5Z=(aqaU{JU}D;utN5l$(CM=o&Xs=zx7_-*4HHG} z@p^E?kw#>^D6fSVM6!0n0*Y>|z|4nv6_+RN!s%DZ#@MsR_Z8h$uZB52{Uws@oXyP2hw6(>X{!NrbF$KPcR`Du#OH!QFKwjIhM5oYJ) zts%*sFj%YNWVqDfB&a7GvM^vuR>Lz@U(DX4PQ;Eq#%CZ(O)B{0q51I*j3hD@(LC5u zdq8lTte>y9vhoh{4p?XN$(Js=t|PQf?Ikl=BT17cL1HelY7~_DJ@XGxCH@_57G<0c zEs{$rPK|%=a5V((m!kXRC@Z^$2PzlQ`?`;5{D54>*}!=>UWKA+K)3ja3G_O|W{5kH zJxKPf0bcP>9hrAaGy#`c`z4DNhQnfT*GSl)|6S!N%@R_am92uT@V~&QS?-B5o(QtR z9hd)Pw-@~on%0yK0i-@j4=yGL2!% zNd`P;Ki||$aSCck1v<~Kh0x;@Ve<17;-NXdCcAT_`u8uYV|syQ5i|zjSNS&j?FRWf<9D6`-{Kvfpm< zz~gxB7uvRm3JKoPF3&c`i!?kC#CG@+>xA^qd(R>9Yc;3N!$i%fVT{UGtB-h#|Ebq& zG*Hr=NLoP;VxI-25b$4C`7H_>Up|<*{EM8kOHi8a?FP$>>VL=7z< z-bs&+OmsK94|MaIzsslSFe7nyy2=msK0`AhL*})G%jJ~Td0VdhO+2h2lC}Ux`C*ey zK*BB?_>Q>5=cPrtE4k*4g_XIfqw)N*1mQDW7b{q;@}hcEDDU(SghB1d7777GN$rF4 zqFhyYM*~I~hUY!*(=?6n@uhni)~OI<1l#H)>bmu~`mxJ3mS^R23>mxvGt~02ciJ#( z;Kn+|(=yu#n*ncjlq^0eOXJBA8+|3?e5#UhjoN>)kJ~p0H-CzVqm?<);FpVzncsNO`PMsr8mvc2m?|FF(x`A3V9aXBPX~%wZa#h zHF)3m{qM`vc3ABdJ{|ryVyOWP|Sz%XH>XX>FVl> zly08X8#1zs7n(%vnyTz5uz~P{tOOS6QO^ir`H$C2%r5k?u7Y>g0h~f`&YA1PDchyM zs7q==hReGLm^)TLtkhB*anlb61tvQm4a+uHX^qYg_5-qi`VD6xGbk1>Imw1H^RB0J z$NpMAUZ&Ruy$pUNM;7-DrTCePdNOUlC7ac8YUOpgsLX1v6b@2eLM02~6?5cTcNruWz7P`S>pa-BE9pZZznKB zrw13`@)id|K_J&5X`GNiIv^?*gdT>%1`V~f3dJ8us9c~0i5i^w+ z0$_G_5)JX8^%815eLZdw$A1R8geeAd6Z6-+h)hh!u?6tTl#wH@i1)Rx!F$HPdat*- z5?V$aXyX&ph?Mr|E*o6TP?X)neW>Ch*l#=>&XxH|X4Si*;-BrA&NSj-d*v)rH~h!f z5jTH`wxWa>nmiDp8@lG*xnuVO{q`Ium?~peL1GM8w7)ZlHZ`mwwbr#w5R&!ewDOJ_ z18K#hm>61WH}8(KbS}w!6Uo5LSeN%QsUE5(%n|GNwSi1w#t$v8H(y0k;BVc{4_(;khmOhzF-&Ep*;Dig? zbi9ReCX(+3bjC^_1oY+)5N%;CX#bg{W93dMKM62T*LSQ)ArM^C7>S;X>a(GR$va5! zgUWM}&_+}!CEpQWvOEO6vv7EIA2C?x_>vicj11!_KHXYk{2TZZZM{HRb@0R9IkOwe zXvFSh*{!d}nSqvt1|eTOxVq3T6S)Upm8`FB9aP zMX}R^ze>9yzA+Gg*wOZZ`?`EPu;E8HDPv+MjwIRjX8~w@Eq(7WhI7%$Qa@MkRdtT? ztm=faJg*D<{9h?nltVKX$=P4bAKZw7k2MD;7DvwU%g@b#Rv%#2Zo+GHx6H}MeGb=- z(}%ts&hrh^PLfju2h`bFyHQ)R30Z4R&$H$Zy#NG0*Ab_XqjK2Zj0|luvZzBp3etqM zkrR$5C(fRfj6ezc)cG#XcSKdCl+qGpvy0AN9Qg)7_P1%*a>!>O0*_g@5DxJ)jk_9Y zY4$38L#D%h!R?I!mB!Ffb&3*%m6#pzI}k6Umk=B~f?T;M9U%j3(yY(!Dv{0%3(P8d zY*V>F$HM^`NS48fVRRWg7tUh{uW@h@R5#miQ;4<>%i?geSx2*;n3e0!_wlVo+ft7e z^=BpH`H$Rc?AyfF#T9Df0oeR~p)O&uF2HF`dCf{)&a3&FM$BiD7L&27r-DZ?Ds-%{ zH}8wt(=&a(#fBZjuqEDh&!41<4liDwjn{NHeXf70fb8HcCalE9bV&%b8#(u!il$B} zC%>4R0P5{bDsF)39gpGUX}7`t-O*?Di?l0xpxs~3pzDOZ2H#4iHcwOCgXOf3i^tG3 z*vrR&c|HUO2ODA-01{jz&1ktNDfw;p9|F`(G9{BB1y2HS#RjWalAuh#qB&t1h2z7< z=;1au>+NrX|7USzwe9}+9FXPnZ{QxCL^m8QW%fZ4a8G@G*fkjjwpYEVMj`SX ziIN0+P~kf3v08-0gFXx4+BR<%RvT5M)0N=OKEw7zgWS1QN2#~QyQsTJYZIprBLFD5RYROx`FyK+T^kc1{Ip8NegvCsIM{j+m;)uA-Q^PA8X58a7q-h;zY%GG}^B zAz=9fQgWF`61%w0xIYSB!l4yKMC9qj)-mzB2~s)axyn&2%I+1+T$PV2m-oO@6?Vyp zfTX~zsM#i-O1SP^$MT1DmT_hL}_{CRsU8Gr&R zDUKS|h|XEKNFYlW_@++->V*d-YvLfpjU!Fjht9K+af`yNjAjB$OcvJqi9V?)tQI?& zV&Li7v@s4|Pr#h>Wz0T{KPcjPdO3|fMNtilT#K2=9qw^{dYx!f+ezQkwry;gE@FPZ zvts3Z$Fvr`Gk?pqj%&CxXOaqhmDm|`ve{9v)!?iTZ@EYcfsZ`oPC5yHC9hU5aF;>6dOAuc5{=X+EW}-bOho#xrQU^ZQ(iuh!HCN-ZfR;BVtBQe>0BEVRzw_SO?5(S-t$z4$1LLW+CaS=Ee|F9v})^ z*KWaWAJ{VBC)}M;y~QXrM#A!XggLJNEkY~Jt5vG+^?!ld-Dj?Ez!h!8xmY1*Di?n~ z(oqbMcEE6gtBlQMFnpMQ{AM;ARe&JB!wL@M=%mbAU-ZEJj|rB)Fh8xn*_gL1%HmCK8)Z5ir5k+-6Objz z&I0)DOTPebtp~pG`g9Y{KW;@+cy9hpJE+&XQ;pjCt7!^&Q2ER_z~ zkb(*#9nFfobkJWjyCE?o1zlQMmhT4^;4<7?;4+zo?^z<@&srsy^O4JF0lCvHC%X*<8 zLpugg;{ziwIXdEhr`w!Ihb}HP6D7Oqe(~$01I^G0?&pG<`990htu2#udliKU`%`SC zivfP{cH`bP@3{~J;EI0FSGiUq^M(y+vMvDqyuYF-!V>k&n{Y%x*B1p(6N#pC5n3ls z=erw9y)w2*DPH=}z#tnB4$D&!pd3Agu>&==TKwbNiC0x4vNHvt$U-P1fFJU|-I&-c z+A~zTd#Mso*D^QN=PsAE-2_X}<1D4Z9wP$_u+Ph)>p+N+a!W=&o;2H&K5QXX4xyXd zv0#oG1kwI|XkORpwqo6y5LH!hC>{gs7`9RUEO>*np`C%Bi?GU8qWR`4@Yw2Fr2CVMrMT4qt zD5tINH@T^+nbPylf_oE@)~T`i8&sMP6fH$pc|P2W1>6xb96nLuAweD>Ik`j2jc0Ll8MlW3H4Wd+RsizL6}(aJ z-7p|Bk9Uttz-%$lc+~%SH6t3^37o__Y~g)TzR6#d_~8Sq{lk12*4Af-_=3?#n&@4g zWB>yj8<_Ibw|s%QtXK6-#97cUtS|v8!n=2dfJ&6HJQRhCLaz1ZZVf$Tzit7V8v2k7 z4dZ~8$P{(iC<|K$WTG-aGqi_l?np&^{q#oLv@H8Bm*w_0?04o8G))mB z=09U)n}Fo2iY2c8yuc*cD7+y=yHEQZv-~l2p%q7q^W*W0vsm!|sUBme1lRd%%ymw|wSBduO+# z=sC_<#7Y&q3(WGWKhK_y`vu1_@%#$aD5A19LGzH(LB{NAi~TRTDkA%_$la!fXeSJ+ zhYR;xOR02o<0?s_dqJi>Bw7L-G;cCP97FhPIKOseOfTk7Q6Mw^IUM z!4~t3i+Qj^bx=Q}{I2_bswa<-Z zcc_aiX_!tEIj@k-(`YeeIop+r<+)yXxr90~66Kq$E>!7Hi-`BSB`QM8C|2w<%@$&2 z54hk7_L3?qZ`iBN0*ApLeeVA4yp#GGa&RU!R00l(1xZNm>274Xyuv0l|QncG4l68(rt3J#`DPQ4n&G|<({^l$q1;P?Hz zNjJgy44)s$E#xyphWWn$4v&S4Sr7%AztWKGw)6x%+7Fc@_@=H#R&e;#4Va#~2;9rh ztb`eP{o}CPWVUYNAEicA#F9GKM*N2vE^th?@?ohuwW0zBEq~;KdklI;CGF93T-v4w+IC{(d5Z>w81)R zIGNA`*el?2w;tJKR=_DI%8oa5doSo}DYxB`!n0y7r)*yUQg4__b0V4*tcN z_>>q?CHvP@(b0WkU)z84mR1~-h*EVxea%x&-xGi~%CY?|sY-FT%rnAhD`}rY|K5CD z!9y-wai9PR%aOmJ_`FdLjor$D!J8fpdcqmSw<@kWfFZUsvtno*6sSCPswzJGIBt>{ zuM_7u-=q@~lS7B8dV2VGs@$YM&rr(IT^;_Y|fq*{#D`l)n$Z;#0QXnG4>(R_(qP(C6Yg2+{bW0jDvg zj>OC$5o@48-R6?K2-{s&$Y8XvJ&p-46^Ed9^^>vdT#0o}WQ!fS6U1R_NARH9Q3go}{*I)G>Cadj(PYv@1 z99(B6dOjjzHP0DpkRIk-?lual6bIE|+@VSA?LXe_#SzYyBT7OuYb&JkC$N8xD>2iD zqwP{yUDkm1r$eAx#6@DygXG_Q-!6jv8RD&hf*}4&RgEEf*y_y!9rwHmJR=m}1Tc5ucJ4EI z`dwqTjc8z^pp8OnA+>J#+ATt0q6J?%!P80}lyLl`7?Uuq-rC988QIdb4A{tEf;Vr5 zey_SEYYzQglKBz(brUYry3?r(Em;Loc~mwh&yNIvz80*ihGk_5kXS6WW7jjh=;Mx( zZIgb&{%1O4J2L(2C`dgoH;XHHKKfCsfeQkUAnVaHdLD6FOCQBY}W%w_rIupIJHSV_|kCz<}&h2A-*tvS7dI$E<1`fIWR z#C5TCyaFtj^^7JW``+NdZfLIalY)dF4zS3%wBGHDf&rfEl#3UM;J)nJgsB;e+>OD zG3zrd+Z#Ha^29P@l4jc7^Gm?0?D4wta!)^(YsL@4G+`BTBDa^nVrT!wXkfE0Qo2e% z)mm`}yR4iryx2@ro|EM=?z`bOr<}6#pW5D$FqGy{2&Cr^&&UA@B2Tq`K_uVDS)ZGu z+tRv;wsbt=PCJpxpUy^n?iL$K2e;U?2W$WU6XIcsZt@_ql)O#^T=-DS(WS&d5(unz zOwdtT^nhPb=07x-JtRY3)}Z+lsywWkC}L1Jf%b?KP+;j4a;36aH!dcyd`R0;X92N3 zRN<0c;zHv5J9W&dfGFGlzDkqic>546F5KVecXcV|eKlQm^n9qscu%p>eLe+v9X2>k z{4CQ3JXs}9Ul&|!1QB+5_08u9tnN0F;OyY%mqpS^LlRgO7sXUHBF*KdyjWK`9wPWl z((m~c(U>T1EdC?!6 z^D?R{O}n)PKFU-wO-g4(&Xm{S2#dZ!@?n#9CiCtShTWtDF_BXXoW{0*#&dJUAH7Hg zX^bDE(Uh&%Eyo#?X^8r1sUM28n>@EL-ee{MG1mDsf6jnAUIQ!xp5b)&W*$M%;5;@l zwAEy@3|dy-cQ6bVM*guir}7Gi6&Pienz!}}%GwiUz?j&Ai7PFxJVqD-H})#}iA*{`b~=jahYD{PY+DTz_k^eQy?YHi-cK0y(t+kGc1#40A_LWfr=> zXA2k@S0}R{i-Dd~W9rDIwu?FFd6jhcoHo*RjPN9te}%9$U=%iT&oEiOjW)Y2{2kX_ zi_M3`2DM>=DQW!dP?GR5EqC)1bJV?6jB*uyra32t*jL`-&fh$z)J~bKBCIs}h#ksM5+D6@bVWmf-H3IG-Q7Hk?MDy5NS z!D%X^`^d>GY<(3};3>t?3V%^~~WsW5H$ z`0F-`{My2U5F_0*+e81rLK;y(@*o)lJFKUp+1S;Kuji0!`!4P}sSM0SGU zh*>RLnhV}C&f;?oTso2^a1T4HQeZhw6Opz47ex1sh${W0r*uPE@Q~d4JRbEBl7vP_ z102CqC1}_NpB)E@U@7n{a~ck2<7DnYVf~g`K9oBYkp%Q8Bx;KK|!YgHC6ni02trId4k$VeEbHBSQ#HtJC*MK zO`p-Fn9utp5JZEQlYB^z|NcAYb>r!sl1Y=zOUgaZl&&c+5}hr=o?b6O83q}nAWS2M zVvms@wbR3 z8D9Ra>YGa;YwA@agX}W`?tjjg-FkiH?VtQ=yk!DJm5KbTYHcwx^8C-O6(pNoF!pmW zMv(Uc4b&@JZ+E;Cyn(&0ImQ=Qn!Yn`)B(lV(8plhpkW;E#Sx{;yR0)3iWN2LSA(@0E+u{C}C{)M=rQ>sW$t!}BMQB6%Gsv44UOZ>{p|yp*D!`Z=$@ zEV`}F2(tC~1OsYEYo}g7gr@3H0V!K%xarmG?qQ)cRs7bhxp}DJyqQ*>A>%IIeQ!ns zkvoQn96ho;7Wka>fJ?qK$@%5;1|}w(W%JAw!-*uxI|TqD4ZuCjr(BfZ-+~iHZ@lz} z2pq@Fw=ySx#zM6Invy#Kn(T^BrO)%Utw0Szl9Bm$%KSSVG9TRa(XTgtGob%zi^7Yw zF!tXQZO$SbQmg2r^61MIt%9Y4`4|ihAnFnIfnI!m7;813UBXK` zhrL<5E3QMk5RuP0y=?8D>ISAF`1~8bYvNEP?;LsqQn6iEO8003dbIKBV? literal 0 HcmV?d00001 diff --git a/packages/Webkul/Admin/tests/e2e-pw/data/images/8.webp b/packages/Webkul/Admin/tests/e2e-pw/data/images/8.webp new file mode 100644 index 0000000000000000000000000000000000000000..933f80102fe3f48861bdf67ea6c4099e98ef1094 GIT binary patch literal 29098 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 literal 0 HcmV?d00001 diff --git a/packages/Webkul/Admin/tests/e2e-pw/data/images/9.webp b/packages/Webkul/Admin/tests/e2e-pw/data/images/9.webp new file mode 100644 index 0000000000000000000000000000000000000000..767430eaa781fc800f8422842f169365381ed4f2 GIT binary patch literal 27758 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 F007_8wgUhF literal 0 HcmV?d00001 diff --git a/packages/Webkul/Admin/tests/e2e-pw/playwright.config.ts b/packages/Webkul/Admin/tests/e2e-pw/playwright.config.ts new file mode 100644 index 0000000..35d745e --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/playwright.config.ts @@ -0,0 +1,56 @@ +import { defineConfig, devices } from "@playwright/test"; +import dotenv from "dotenv"; +import path from "path"; +import { fileURLToPath } from "url"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +export const TESTS_ROOT_PATH = __dirname; +export const STATE_DIR_PATH = `${ TESTS_ROOT_PATH }/.state/`; +export const ADMIN_AUTH_STATE_PATH = `${ STATE_DIR_PATH }/admin-auth.json`; + +dotenv.config({ path: path.resolve(__dirname, "../../../../../.env") }); + +export default defineConfig({ + testDir: "./tests", + + timeout: 30 * 1000, + + expect: { timeout: 20 * 1000 }, + + outputDir: "./test-results", + + fullyParallel: false, + + workers: 1, + + forbidOnly: !!process.env.CI, + + retries: 0, + + reportSlowTests: null, + + reporter: [ + [ + "html", + { + outputFolder: "./playwright-report", + }, + ], + ], + + use: { + baseURL: `${process.env.APP_URL}/`.replace(/\/+$/, "/"), + screenshot: { mode: "only-on-failure", fullPage: true }, + video: "retain-on-failure", + trace: "retain-on-failure", + }, + + projects: [ + { + name: "chromium", + use: { ...devices["Desktop Chrome"] }, + }, + ], +}); diff --git a/packages/Webkul/Admin/tests/e2e-pw/setup.ts b/packages/Webkul/Admin/tests/e2e-pw/setup.ts new file mode 100644 index 0000000..80a053e --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/setup.ts @@ -0,0 +1,25 @@ +import { test as base, expect, type Page } from "@playwright/test"; + +type AdminFixtures = { + adminPage: Page; +}; + +export const test = base.extend({ + adminPage: async ({ page }, use) => { + const adminCredentials = { + email: "admin@example.com", + password: "admin123", + }; + + await page.goto("admin/login"); + await page.fill('input[name="email"]', adminCredentials.email); + await page.fill('input[name="password"]', adminCredentials.password); + await page.press('input[name="password"]', "Enter"); + + await page.waitForURL("**/admin/dashboard"); + + await use(page); + }, +}); + +export { expect }; diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/auth.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/auth.spec.ts new file mode 100644 index 0000000..80caec0 --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/auth.spec.ts @@ -0,0 +1,36 @@ +import { test, expect } from "../setup"; + +const adminCredentials = { + email: "admin@example.com", + password: "admin123", +}; + +test("should be able to login", async ({ page }) => { + /** + * Login as admin. + */ + await page.goto("admin/login"); + await page.getByPlaceholder("Email Address").click(); + await page.getByPlaceholder("Email Address").fill(adminCredentials.email); + await page.getByPlaceholder("Password").click(); + await page.getByPlaceholder("Password").fill(adminCredentials.password); + await page.getByRole("button", { name: "Sign In" }).click(); + + await expect(page.getByPlaceholder("Mega Search").first()).toBeVisible(); +}); + +test("should be able to logout", async ({ page }) => { + /** + * Login as admin. + */ + await page.goto("admin/login"); + await page.getByPlaceholder("Email Address").click(); + await page.getByPlaceholder("Email Address").fill(adminCredentials.email); + await page.getByPlaceholder("Password").click(); + await page.getByPlaceholder("Password").fill(adminCredentials.password); + await page.getByLabel("Sign In").click(); + await page.getByRole('button', { name: "E" }).click(); + await page.getByRole('link', { name: 'Sign Out' }).click(); + + await expect(page.getByPlaceholder("Password").first()).toBeVisible(); +}); diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/contacts/organization.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/contacts/organization.spec.ts new file mode 100644 index 0000000..0a92153 --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/contacts/organization.spec.ts @@ -0,0 +1,113 @@ +import { test, expect } from '../../setup'; +import {generateCompanyName, createOrganization} from "../../utils/faker" + +test.describe("organization management", () => { + test('should be able to create organization', async ({ adminPage }) => { + /** + * Create Organization. + */ + await createOrganization(adminPage); + }); + + test('should be able to edit detail of organization', async ({ adminPage }) => { + /** + * Create Organization. + */ + const companyName = await createOrganization(adminPage); + + /** + * Edit Organization detail. + */ + await adminPage.locator('div').filter({ hasText: companyName }).locator('span.icon-edit').first().click(); + await adminPage.getByRole('textbox', { name: 'City' }).click(); + await adminPage.getByRole('textbox', { name: 'City' }).fill('Gurugram'); + await adminPage.getByRole('button', { name: 'Save Organization' }).click(); + + /** + * Check detail are Edit + */ + await adminPage.locator('div').filter({ hasText: companyName }).locator('span.icon-edit').first().click(); + await expect(adminPage.getByRole('textbox', { name: 'City' })).toHaveValue('Gurugram'); + }); + + test('should be able to delete organization', async ({ adminPage }) => { + await adminPage.goto('admin/contacts/organizations'); + + /** + * Delete Organization. + */ + await adminPage.locator('div') + .locator('span.icon-delete') + .first() + .click(); + + await adminPage.getByRole('button', { name: 'Agree', exact: true }).click(); + await expect(adminPage.locator('#app')).toContainText('Success'); + }); + + test('should be able to mass delete organization', async ({ adminPage }) => { + /** + * Create Multiple Organizations. + */ + await createOrganization(adminPage); + await createOrganization(adminPage); + await createOrganization(adminPage); + await createOrganization(adminPage); + await createOrganization(adminPage); + + /** + * Check if any organization has value greater than 0. + */ + const organizationCount = await adminPage.locator('#app').getByText('1', { exact: true }).count(); + + /** + * Mass Delete Organization. + */ + await adminPage.locator('.icon-checkbox-outline').first().click(); + await adminPage.getByRole('button', { name: 'Delete' }).click(); + await adminPage.getByRole('button', { name: 'Agree', exact: true }).click(); + + if (organizationCount > 0) { + await expect(adminPage.getByText('Error')).toBeVisible(); + } + else{ + await expect(adminPage.locator('#app')).toContainText('Success'); + } + }); + + + test('should not be able to create same name organization', async ({ adminPage }) => { + /** + * Create Organization. + */ + const companyName = await createOrganization(adminPage); + await adminPage.getByRole('link', { name: 'Create Organization' }).click(); + + /** + * Fill in organization details + */ + await adminPage.getByRole('textbox', { name: 'Name *' }).fill(companyName); + await adminPage.locator('textarea[name="address\\[address\\]"]').fill('ARV Park'); + await adminPage.getByRole('combobox').selectOption('IN'); + await adminPage.locator('select[name="address\\[state\\]"]').selectOption('DL'); + await adminPage.getByRole('textbox', { name: 'City' }).fill('Delhi'); + await adminPage.getByRole('textbox', { name: 'Postcode' }).fill('123456'); + + /** + * Click to add extra details + */ + await adminPage.locator('div').filter({ hasText: /^Click to add$/ }).nth(2).click(); + await adminPage.getByRole('textbox', { name: 'Search...' }).fill('exampl'); + await adminPage.getByRole('listitem').filter({ hasText: 'Example' }).click(); + + /** + * Click on "Save Organization" + */ + await adminPage.getByRole('button', { name: 'Save Organization' }).click(); + + /** + * Expect Error message + */ + await expect(adminPage.locator('#app')).toContainText('The value has already been taken.'); + }); +}); \ No newline at end of file diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/contacts/person.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/contacts/person.spec.ts new file mode 100644 index 0000000..4ea1157 --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/contacts/person.spec.ts @@ -0,0 +1,40 @@ +import { test, expect } from "../../setup"; +import { createPerson, generateCompanyName } from "../../utils/faker"; + +test("should be able to create person", async ({ adminPage }) => { + /** + * Create person. + */ + await adminPage.goto("admin/contacts/persons"); + await createPerson(adminPage); +}); + +test("should be able to assign a company to person", async ({ adminPage }) => { + /** + * Create person. + */ + await adminPage.goto("admin/contacts/persons"); + await createPerson(adminPage); + await adminPage.locator("span.icon-edit").first().click(); + await adminPage + .locator("div") + .filter({ hasText: /^Click to add$/ }) + .nth(2) + .click(); + await adminPage.getByRole("textbox", { name: "Search..." }).click(); + await adminPage + .getByRole("textbox", { name: "Search..." }) + .fill(generateCompanyName()); + await adminPage.getByText("Add as New").click(); + await adminPage.getByRole("button", { name: "Save Person" }).click(); +}); + +test("should be able to delete person", async ({ adminPage }) => { + /** + * Delete person. + */ + await adminPage.goto("admin/contacts/persons"); + await adminPage.locator("span.icon-delete").nth(1).click(); + await adminPage.getByRole("button", { name: "Agree", exact: true }).click(); + await expect(adminPage.locator("#app")).toContainText("Success"); +}); diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/lang/lang.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/lang/lang.spec.ts new file mode 100644 index 0000000..b875870 --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/lang/lang.spec.ts @@ -0,0 +1,81 @@ +import { expect, test } from '@playwright/test'; +import { execSync } from 'child_process'; +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +// Resolve file paths relative to this test file +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +// Absolute path to /lang directory +const LANG_DIR = path.resolve( + __dirname, + '../../../../src/Resources/lang' +); + +const BASE_LANG = 'en'; + +// Helper to extract just the keys from app.php +function getNormalizedKeys(filePath: string): string[] { + // PHP one-liner to output the array as JSON + const phpCode = `echo json_encode(include '${filePath}');`; + const json = execSync(`php -r "${phpCode.replace(/"/g, '\\"')}"`).toString(); + const obj = JSON.parse(json); + + function flattenKeys(obj: any, prefix = ''): string[] { + return Object.keys(obj).flatMap(key => { + const fullKey = prefix ? `${prefix}.${key}` : key; + if (typeof obj[key] === 'object' && obj[key] !== null) { + return flattenKeys(obj[key], fullKey); + } + return [fullKey]; + }); + } + + return flattenKeys(obj); +} +test('All language files must match number of keys and key names with English app.php', () => { + const baseFile = path.join(LANG_DIR, BASE_LANG, 'app.php'); + const baseKeys = getNormalizedKeys(baseFile); +// All locales except the base one + const locales = fs + .readdirSync(LANG_DIR) + .filter(locale => locale !== BASE_LANG && fs.existsSync(path.join(LANG_DIR, locale, 'app.php'))); + +// Array to collect any locales that have issues + let failedLocales: { locale: string; missingKeys: string[]; extraKeys: string[] }[] = []; + + for (const locale of locales) { + const filePath = path.join(LANG_DIR, locale, 'app.php'); + const keys = getNormalizedKeys(filePath); + + const missingKeys = baseKeys.filter(key => !keys.includes(key)); + const extraKeys = keys.filter(key => !baseKeys.includes(key)); + + if (missingKeys.length > 0 || extraKeys.length > 0) { + failedLocales.push({ locale, missingKeys, extraKeys }); + } + } + + if (failedLocales.length > 0) { + for (const { locale, missingKeys, extraKeys } of failedLocales) { + console.error(` ${locale}/app.php has issues:`); + + if (missingKeys.length) { + console.error(` Missing keys (${missingKeys.length}):`); + for (const key of missingKeys) console.error(` - ${key}`); + } + + if (extraKeys.length) { + console.error(` Extra keys (${extraKeys.length}):`); + for (const key of extraKeys) console.error(` + ${key}`); + } + } + + // Fail the test + expect(failedLocales).toEqual([]); + } else { + console.log('All language files have matching keys and counts with en/app.php'); + } +}); diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/lead.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/lead.spec.ts new file mode 100644 index 0000000..6a8a5f6 --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/lead.spec.ts @@ -0,0 +1,235 @@ +import { test, expect } from "../setup"; +import fs from "fs"; +import { generateName, getRandomDateTime, generateDescription, generateDate, generateEmail, generatePhoneNumber,generateEmailSubject } from '../utils/faker'; + +async function generateLead(adminPage) { + /** + * Go to the lead listing page. + */ + await adminPage.goto("admin/leads"); + await adminPage.getByRole('link', { name: 'Create Lead' }).click(); + + /** + * Fill the lead form. + */ + const leadTitle = generateName(); + const leadDescription = generateDescription(); + const leadDate = generateDate(); + const leadEmail = generateEmail(); + const leadPhoneNumber = generatePhoneNumber(); + + await adminPage.fill('input[name="title"]', leadTitle); + await adminPage.fill('textarea[name="description"]', leadDescription); + await adminPage.locator('select[name="lead_source_id"]').selectOption("1"); + await adminPage.fill('input[name="expected_close_date"]', leadDate); + await adminPage.locator('select[name="lead_type_id"]').selectOption("1"); + await adminPage.locator('select[name="user_id"]').selectOption("1"); + await adminPage.fill('input[name="lead_value"]', '1000'); + + /** + * Add a new person. + */ + await adminPage.locator('div').filter({ hasText: /^Click to Add$/ }).nth(1).click(); + await adminPage.getByRole('textbox', { name: 'Search...' }).fill(leadTitle); + await adminPage.getByText('Add as New').click(); + + await adminPage.fill('input[name="person[emails][0][value]"]', leadEmail); + await adminPage.fill('input[name="person[contact_numbers][0][value]"]', leadPhoneNumber); + + /** + * Associate an organization. + */ + await adminPage.locator('div').filter({ hasText: /^Click to add$/ }).nth(2).click(); + await adminPage.getByRole('textbox', { name: 'Search...' }).fill(leadTitle); + await adminPage.getByText('Add as New').click(); + + /** + * Save the lead. + */ + await adminPage.getByRole('button', { name: 'Save' }).click(); + + /** + * Assertion to confirm lead creation. + */ + await expect(adminPage.getByText('Success', { exact: true })).toBeVisible(); + + return { leadTitle, leadDescription, leadDate, leadEmail, leadPhoneNumber }; +} + +function generateFile(fileName, content) { + fs.writeFileSync(fileName, content); + return fileName; +} + +test.describe("lead management", () => { + + test("should create a new lead", async ({ adminPage }) => { + /** + * Create a new lead. + */ + await generateLead(adminPage); + }); + + test("should able to update lead", async ({ adminPage }) => { + /** + * Create a new lead. + */ + const lead = await generateLead(adminPage); + + /** + * Update the lead. + */ + await adminPage.getByRole('link', { name: lead.leadTitle }).click(); + const page1Promise = adminPage.waitForEvent('popup'); + await adminPage.getByRole('link', { name: '' }).first().click(); + const page1 = await page1Promise; + await page1.fill('textarea[name="description"]', generateDescription()); + await page1.fill('input[name="title"]', generateName()); + await page1.getByLabel('Source').selectOption('3'); + await page1.fill('input[name="lead_value"]', '30000'); + await page1.getByRole('button', { name: 'Save' }).click(); + await page1.getByText('Success', { exact: true }).click(); + }); + + test("should able to delete lead", async ({ adminPage }) => { + /** + * Create a new lead. + */ + const lead = await generateLead(adminPage); + + /** + * Delete the lead. + */ + await adminPage.getByRole('link', { name: '' }).click(); + await adminPage.locator('div:nth-child(4) > .flex > span:nth-child(2)').click(); + await adminPage.getByRole('button', { name: 'Agree', exact: true }).click(); + await expect(adminPage.getByText('Success', { exact: true })).toBeVisible(); + await expect(adminPage.locator('#app')).toContainText('Lead deleted successfully.'); + }); + + test("should sent a mail", async ({ adminPage }) => { + /** + * Create a new lead. + */ + const lead = await generateLead(adminPage); + + /** + * fill mail detail. + */ + await adminPage.getByRole('link', { name: lead.leadTitle}).click(); + await adminPage.getByRole('button', { name: ' Mail' }).click(); + await adminPage.fill('input[name="temp-reply_to"]', generateEmail()); + await adminPage.fill('input[name="subject"]', generateEmailSubject()); + await adminPage.fill('textarea[name="reply"]', generateDescription()); + + /** + * Sending mail and closing the modal. + */ + await adminPage.getByRole('button', { name: 'Send' }).click(); + + await expect(adminPage.getByText('Email sent successfully.')).toBeVisible(); + }); + + test("should able to upload file in lead", async ({ adminPage }) => { + /** + * Create a new lead. + */ + const lead = await generateLead(adminPage); + + /** + * fill the file detail or upload a file. + */ + await adminPage.getByRole('link', { name: lead.leadTitle}).click(); + await adminPage.getByRole('button', { name: ' File' }).click(); + await adminPage.locator('input[name="title"]').fill(lead.leadTitle); + await adminPage.locator('textarea[name="comment"]').fill(generateDescription()); + await adminPage.locator('input[name="name"]').fill(generateName()); + await adminPage.locator('#file').setInputFiles(generateFile('example.txt', 'Hello, this is a generated file!')); + await adminPage.getByRole('button', { name: 'Save File' }).click(); + }); + + test("should able to write a note in lead", async ({ adminPage }) => { + /** + * Create a new lead. + */ + const lead = await generateLead(adminPage); + + /** + * write a notes + */ + await adminPage.getByRole('link', { name: lead.leadTitle}).click(); + await adminPage.getByRole('button', { name: ' Note' }).click(); + await adminPage.locator('textarea[name="comment"]').fill(generateDescription()); + await adminPage.getByRole('button', { name: 'Save Note' }).click(); + }); + + test("should able to add call activity in lead", async ({ adminPage }) => { + /** + * Create a new lead. + */ + const lead = await generateLead(adminPage); + + /** + * write a call activity detail + */ + await adminPage.getByRole('link', { name: lead.leadTitle}).click(); + await adminPage.getByRole('button', { name: ' Activity' }).click(); + await adminPage.getByRole('heading', { name: 'Add Activity - Call ' }).locator('span').click(); + await adminPage.getByText('Call', { exact: true }).click(); + await adminPage.locator('input[name="title"]').fill(lead.leadTitle); + await adminPage.locator('textarea[name="comment"]').fill(generateDescription()); + await adminPage.locator('input[name="schedule_from"]').click(); + await adminPage.locator('input[name="schedule_from"]').fill(getRandomDateTime()); + await adminPage.locator('input[name="schedule_to"]').click(); + await adminPage.locator('input[name="schedule_to"]').fill(getRandomDateTime()); + await adminPage.locator('input[name="location"]').fill('call'); + await adminPage.getByRole('button', { name: 'Save Activity' }).click(); + + }); + + test("should able to add meeting activity in lead", async ({ adminPage }) => { + /** + * Create a new lead. + */ + const lead = await generateLead(adminPage); + + /** + * write a call activity detail + */ + await adminPage.getByRole('link', { name: lead.leadTitle}).click(); + await adminPage.getByRole('button', { name: ' Activity' }).click(); + await adminPage.getByRole('heading', { name: 'Add Activity' }).locator('span').click(); + await adminPage.getByText('Meeting', { exact: true }).click(); + await adminPage.locator('input[name="title"]').fill(lead.leadTitle); + await adminPage.locator('textarea[name="comment"]').fill(generateDescription()); + await adminPage.locator('input[name="schedule_from"]').click(); + await adminPage.locator('input[name="schedule_from"]').fill(getRandomDateTime()); + await adminPage.locator('input[name="schedule_to"]').click(); + await adminPage.locator('input[name="schedule_to"]').fill(getRandomDateTime()); + await adminPage.locator('input[name="location"]').fill('Google meet'); + await adminPage.getByRole('button', { name: 'Save Activity' }).click(); + }); + + test("should able to add lunch activity in lead", async ({ adminPage }) => { + /** + * Create a new lead. + */ + const lead = await generateLead(adminPage); + + /** + * write a call activity detail + */ + await adminPage.getByRole('link', { name: lead.leadTitle}).click(); + await adminPage.getByRole('button', { name: ' Activity' }).click(); + await adminPage.getByRole('heading', { name: 'Add Activity' }).locator('span').click(); + await adminPage.getByText('Lunch', { exact: true }).click(); + await adminPage.locator('input[name="title"]').fill(lead.leadTitle); + await adminPage.locator('textarea[name="comment"]').fill(generateDescription()); + await adminPage.locator('input[name="schedule_from"]').click(); + await adminPage.locator('input[name="schedule_from"]').fill(getRandomDateTime()); + await adminPage.locator('input[name="schedule_to"]').click(); + await adminPage.locator('input[name="schedule_to"]').fill(getRandomDateTime()); + await adminPage.locator('input[name="location"]').fill('Restraunt'); + await adminPage.getByRole('button', { name: 'Save Activity' }).click(); + }); +}); \ No newline at end of file diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/mail/draft.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/mail/draft.spec.ts new file mode 100644 index 0000000..c01c9a6 --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/mail/draft.spec.ts @@ -0,0 +1 @@ +import { test, expect } from "../../setup"; diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/mail/inbox.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/mail/inbox.spec.ts new file mode 100644 index 0000000..7cf2b2f --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/mail/inbox.spec.ts @@ -0,0 +1,69 @@ +import { test, expect } from '../../setup'; +import { generateEmail, generateEmailSubject, generateDescription } from '../../utils/faker'; + +async function composeMail(adminPage, ccMail = false, bccMail = false) { + /** + * Reaching to the mail listing page. + */ + await adminPage.goto("admin/mail/inbox"); + + /** + * Opening compose mail in modal. + */ + await adminPage.getByRole('button', { name: 'Compose Mail' }).click(); + await adminPage.fill('input[name="temp-reply_to"]', generateEmail()); + await adminPage.fill('input[name="subject"]', generateEmailSubject()); + const frameElementHandle = await adminPage.waitForSelector( + "iframe.tox-edit-area__iframe" + ); + + const frame = await frameElementHandle.contentFrame(); + + await frame.waitForSelector("body"); + await frame.fill("body", generateDescription()); + + /** + * Sending mail and closing the modal. + */ + await adminPage.getByRole("button", { name: "Send" }).click(); + + await expect(adminPage.getByText("Email sent successfully.")).toBeVisible(); +} + +test.describe("mail management", () => { + /** + * Should be able to compose a mail. + */ + test("should compose a mail", async ({ adminPage }) => { + await composeMail(adminPage); + }); + + /** + * Should be able to compose a mail with CC. + */ + test("should compose a mail with CC", async ({ adminPage }) => { + const ccMail = true; + + await composeMail(adminPage, ccMail); + }); + + /** + * Should be able to compose a mail with BCC. + */ + test("should compose a mail with BCC", async ({ adminPage }) => { + const bccMail = true; + + await composeMail(adminPage, bccMail); + }); + + /** + * Should be able to compose a mail with CC & BCC. + */ + test("should compose a mail with CC & BCC", async ({ adminPage }) => { + const ccMail = true; + + const bccMail = true; + + await composeMail(adminPage, ccMail, bccMail); + }); +}); diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/mail/outbox.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/mail/outbox.spec.ts new file mode 100644 index 0000000..c01c9a6 --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/mail/outbox.spec.ts @@ -0,0 +1 @@ +import { test, expect } from "../../setup"; diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/mail/sent.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/mail/sent.spec.ts new file mode 100644 index 0000000..c01c9a6 --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/mail/sent.spec.ts @@ -0,0 +1 @@ +import { test, expect } from "../../setup"; diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/mail/trash.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/mail/trash.spec.ts new file mode 100644 index 0000000..c01c9a6 --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/mail/trash.spec.ts @@ -0,0 +1 @@ +import { test, expect } from "../../setup"; diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/product.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/product.spec.ts new file mode 100644 index 0000000..f75a5a8 --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/product.spec.ts @@ -0,0 +1,102 @@ +import { test, expect } from "../setup"; +import { generateName, generateSKU, generateDescription } from "../utils/faker"; + +test.describe("product management", () => { + test("should create a product", async ({ adminPage }) => { + /** + * Go to the product listing page. + */ + await adminPage.goto("admin/products"); + + /** + * Create Product. + */ + await adminPage.getByRole("link", { name: "Create Product" }).click(); + + /** + * Fill the product form. + */ + const name = generateName(); + const description = generateDescription(); + await adminPage.waitForSelector('input[name="name"]', { state: 'visible' }); + await adminPage.getByRole('textbox', { name: 'Name *' }).click(); + await adminPage.locator('#name').clear(); + await adminPage.getByRole('textbox', { name: 'Name *' }).fill(name); + await adminPage.locator('textarea[name="description"]').clear(); + await adminPage + .locator('textarea[name="description"]') + .type(description); + await adminPage.fill('input[name="sku"]', generateSKU()); + await adminPage.waitForSelector('input[name="price"]', { + state: "visible", + }); + await adminPage.fill('input[name="price"]', "100"); + + await adminPage.waitForSelector('input[name="quantity"]', { + state: "visible", + }); + await adminPage.fill('input[name="quantity"]', "50"); + + /** + * Save Product. + */ + await adminPage.getByRole("button", { name: "Save Products" }).click(); + + /** + * sucess message appear. + */ + await expect(adminPage.locator("#app")).toContainText( + "Product created successfully." + ); + }); + + test("should edit a product", async ({ adminPage }) => { + /** + * Go to the product listing page. + */ + await adminPage.goto("admin/products"); + await adminPage.waitForSelector("a.primary-button", { + state: "visible", + }); + + /** + * Clicking on the edit icon. + */ + await adminPage.locator("span.icon-edit").first().click(); + await adminPage.waitForSelector('form[action*="/admin/products/edit"]'); + + /** + * Edit the product Detail + */ + await adminPage.fill('input[name="name"]', generateName()); + await adminPage.fill('input[name="price"]', "1000"); + await adminPage.fill('input[name="quantity"]', "500"); + await adminPage.click('button:has-text("Save Products")'); + await expect(adminPage.locator("#app")).toContainText( + "Product updated successfully." ); + }); + + test("should delete a product", async ({ adminPage }) => { + /** + * Go to the product listing page. + */ + await adminPage.goto("admin/products"); + await adminPage.waitForSelector("a.primary-button", { + state: "visible", + }); + + /** + * Clicking on the delete icon. + */ + await adminPage.waitForSelector("span.cursor-pointer.icon-delete", { + state: "visible", + }); + await adminPage.locator("span.icon-delete").first().click(); + await adminPage.click( + "button.transparent-button + button.primary-button:visible" + ); + await expect(adminPage.locator("#app")).toContainText( + "Product deleted successfully." + ); + }); +}); diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/quotes.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/quotes.spec.ts new file mode 100644 index 0000000..bad162f --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/quotes.spec.ts @@ -0,0 +1,103 @@ +import { test, expect } from "../setup"; +import { + generateEmailSubject, + createPerson, + generateDate, + generateName, +} from "../utils/faker"; + +test.describe("quotes management", () => { + test("should create a quotes", async ({ adminPage }) => { + /** + * Create person. + */ + await adminPage.goto("admin/contacts/persons"); + const Person = await createPerson(adminPage); + + /** + * Create quote. + */ + await adminPage.goto("admin/quotes"); + await adminPage.getByRole("link", { name: "Create Quote" }).click(); + await adminPage.getByRole("textbox", { name: "Subject *" }).click(); + await adminPage + .getByRole("textbox", { name: "Subject *" }) + .fill(generateEmailSubject()); + await adminPage.getByRole("textbox", { name: "Description" }).click(); + await adminPage + .getByRole("textbox", { name: "Description" }) + .fill(generateEmailSubject()); + await adminPage.getByLabel("Sales Owner").selectOption("1"); + await adminPage.getByRole("textbox", { name: "Expired At *" }).click(); + await adminPage + .getByRole("textbox", { name: "Expired At *" }) + .fill(generateDate()); + await adminPage.locator(".relative > div > .relative").first().click(); + await adminPage.getByRole("textbox", { name: "Search..." }).click(); + await adminPage + .getByRole("textbox", { name: "Search..." }) + .fill(Person.Name); + await adminPage + .getByRole("listitem") + .filter({ hasText: Person.Name }) + .click(); + + /** + * Fill billing address. + */ + await adminPage + .locator('textarea[name="billing_address\\[address\\]"]') + .click(); + await adminPage + .locator('textarea[name="billing_address\\[address\\]"]') + .fill("ARV Park"); + await adminPage + .locator('select[name="billing_address\\[country\\]"]') + .selectOption("IN"); + await adminPage + .locator('select[name="billing_address\\[state\\]"]') + .selectOption("UP"); + await adminPage + .locator('input[name="billing_address\\[city\\]"]') + .click(); + await adminPage + .locator('input[name="billing_address\\[city\\]"]') + .fill("Noida"); + await adminPage + .locator('input[name="billing_address\\[postcode\\]"]') + .click(); + await adminPage + .locator('input[name="billing_address\\[postcode\\]"]') + .fill("201301"); + + /** + * Fill shipping address. + */ + await adminPage + .locator('textarea[name="shipping_address\\[address\\]"]') + .click(); + await adminPage + .locator('textarea[name="shipping_address\\[address\\]"]') + .fill("ARV Park"); + await adminPage + .locator('select[name="shipping_address\\[country\\]"]') + .selectOption("IN"); + await adminPage + .locator('select[name="shipping_address\\[state\\]"]') + .selectOption("UP"); + await adminPage + .locator('input[name="shipping_address\\[city\\]"]') + .click(); + await adminPage + .locator('input[name="shipping_address\\[city\\]"]') + .fill("Noida"); + await adminPage + .locator('input[name="shipping_address\\[postcode\\]"]') + .click(); + await adminPage + .locator('input[name="shipping_address\\[postcode\\]"]') + .fill("201301"); + await adminPage.getByRole("button", { name: "Save Quote" }).click(); + await expect(adminPage.locator("#app")).toContainText("Success"); + }); +}); diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/settings/automation/events.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/settings/automation/events.spec.ts new file mode 100644 index 0000000..5026aa4 --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/settings/automation/events.spec.ts @@ -0,0 +1,94 @@ +import { test, expect } from "../../../setup"; +import { generateFullName, generateDescription, generateDate } from "../../../utils/faker"; +import { confirmModal } from "../../../utils/components"; + +test.describe("event management", () => { + test("should create a event", async ({ adminPage }) => { + /** + * Reaching to the events listing page. + */ + await adminPage.goto("admin/settings/marketing/events"); + + /** + * Opening create event form in modal. + */ + await adminPage.getByRole("button", { name: "Create Event" }).click(); + + /** + * Filling the form with event details. + */ + await adminPage + .locator('input[name="name"]') + .fill(generateFullName()); + await adminPage + .locator('textarea[name="description"]') + .fill(generateDescription()); + await adminPage + .locator('input[name="date"]') + .fill(generateDate()); + await adminPage.getByRole('textbox', { name: 'Date *' }).press('Enter'); + + /** + * Save event and close the modal. + */ + await adminPage.getByRole('button', { name: 'Save Event' }).click(); + + await expect( + adminPage.getByText("Event created successfully.") + ).toBeVisible(); + }); + + test("should edit a event", async ({ adminPage }) => { + /** + * Reaching to the events listing page. + */ + await adminPage.goto("admin/settings/marketing/events"); + + /** + * Clicking on the edit button for the first event opens the modal. + */ + await adminPage.locator('.row > div:nth-child(6) > a').first().click(); + + /** + * Fill the form with the event details. + */ + await adminPage + .locator('input[name="name"]') + .fill(generateFullName()); + await adminPage + .locator('textarea[name="description"]') + .fill(generateDescription()); + await adminPage + .locator('input[name="date"]') + .fill(generateDate()); + + /** + * Saving event and closing the modal. + */ + await adminPage.getByRole('button', { name: 'Save Event' }).click(); + await expect( + adminPage.getByText("Event updated successfully.") + ).toBeVisible(); + }); + + test("should delete a event", async ({ adminPage }) => { + /** + * Reaching to the event listing page. + */ + await adminPage.goto("admin/settings/marketing/events"); + + /** + * Delete the first event. + */ + await adminPage.locator('div:nth-child(6) > a:nth-child(2)').first().click(); + + /** + * Delete confirmation modal. + */ + await adminPage.getByRole('button', { name: 'Agree', exact: true }).click(); + + await expect( + adminPage.getByText("Event deleted successfully.") + ).toBeVisible(); + }); +}); diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/settings/lead/types.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/settings/lead/types.spec.ts new file mode 100644 index 0000000..2ff2971 --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/settings/lead/types.spec.ts @@ -0,0 +1,90 @@ +import { test, expect } from "../../../setup"; +import { generateFullName } from "../../../utils/faker"; +import { confirmModal } from "../../../utils/components"; + +test.describe("type management", () => { + test("should create a type", async ({ adminPage }) => { + /** + * Reaching to the types listing page. + */ + await adminPage.goto("admin/settings/types"); + + /** + * Opening create type form in modal. + */ + await adminPage.getByRole("button", { name: "Create Type" }).click(); + + /** + * Filling the form with type details. + */ + await adminPage + .locator('input[name="name"]') + .fill(generateFullName()); + + /** + * Save type and close the modal. + */ + await adminPage.getByRole("button", { name: "Save Type" }).click(); + + await expect( + adminPage.getByText("Type created successfully.") + ).toBeVisible(); + }); + + test("should edit a type", async ({ adminPage }) => { + /** + * Generating new name and email for the type. + */ + const updatedName = generateFullName(); + + /** + * Reaching to the types listing page. + */ + await adminPage.goto("admin/settings/types"); + + /** + * Clicking on the edit button for the first type opens the modal. + */ + await adminPage.waitForSelector("span.cursor-pointer.icon-edit", { + state: "visible", + }); + const iconEdit = await adminPage.$$("span.cursor-pointer.icon-edit"); + await iconEdit[0].click(); + + await adminPage.locator('input[name="name"]').fill(updatedName); + + /** + * Saving type and closing the modal. + */ + await adminPage.getByRole("button", { name: "Save Type" }).click(); + + await expect( + adminPage.getByText("Type updated successfully.") + ).toBeVisible(); + }); + + test("should delete a type", async ({ adminPage }) => { + /** + * Reaching to the type listing page. + */ + await adminPage.goto("admin/settings/types"); + + /** + * Delete the first type. + */ + await adminPage.waitForSelector("span.cursor-pointer.icon-delete"); + const iconDelete = await adminPage.$$( + "span.cursor-pointer.icon-delete" + ); + await iconDelete[0].click(); + + /** + * Delete confirmation modal. + */ + await confirmModal("Are you sure", adminPage); + + await expect( + adminPage.getByText("Type deleted successfully.") + ).toBeVisible(); + }); +}); diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/settings/user/groups.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/settings/user/groups.spec.ts new file mode 100644 index 0000000..af8ab0a --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/settings/user/groups.spec.ts @@ -0,0 +1,36 @@ +import { test, expect } from "../../../setup"; +import { generateFullName, generateDescription } from "../../../utils/faker"; + +test.describe("group management", () => { + test("should create a group", async ({ adminPage }) => { + /** + * Reaching to the group listing page. + */ + await adminPage.goto("admin/settings/groups"); + + /** + * Opening create group form in modal. + */ + await adminPage.getByRole("button", { name: "Create group" }).click(); + + + /** + * Filling the form with group details. + */ + await adminPage + .locator('input[name="name"]') + .fill(generateFullName()); + await adminPage + .locator('textarea[name="description"]') + .fill(generateDescription(240)); + + /** + * Save group and close the modal. + */ + await adminPage.getByRole("button", { name: "Save Group" }).click(); + + await expect( + adminPage.getByText("Group created successfully.") + ).toBeVisible(); + }); +}); diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/settings/user/users.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/settings/user/users.spec.ts new file mode 100644 index 0000000..dd38ecd --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/settings/user/users.spec.ts @@ -0,0 +1,227 @@ +import { test, expect } from "../../../setup"; +import { + generateFullName, + generateEmail, + generateDescription, +} from "../../../utils/faker"; +import { confirmModal } from "../../../utils/components"; + +async function createGroup(adminPage) { + /** + * Navigate to the group listing page. + */ + await adminPage.goto("admin/settings/groups"); + + /** + * Open the create group form in modal. + */ + await adminPage.getByRole("button", { name: "Create group" }).click(); + + /** + * Generate group name and fill in the form with group details. + */ + const groupName = generateFullName(); + await adminPage.locator('input[name="name"]').fill(groupName); + await adminPage + .locator('textarea[name="description"]') + .fill(generateDescription(240)); + + /** + * Save the group and close the modal. + */ + await adminPage.getByRole("button", { name: "Save Group" }).click(); + + /** + * Validate successful creation. + */ + await expect( + adminPage.getByText("Group created successfully.") + ).toBeVisible(); + + return { groupName }; +} + +test.describe("user management", () => { + test("should create a user with global permission", async ({ adminPage }) => { + /** + * Reaching to the user listing page. + */ + await adminPage.goto("admin/settings/users"); + + /** + * Opening create user form in modal. + */ + await adminPage.getByRole("button", { name: "Create User" }).click(); + + /** + * Filling the form with user details. + */ + await adminPage.locator('input[name="name"]').fill(generateFullName()); + await adminPage.locator('input[name="email"]').fill(generateEmail()); + await adminPage.locator('input[name="password"]').fill("admin123"); + await adminPage + .locator('input[name="confirm_password"]') + .fill("admin123"); + await adminPage.locator('select[name="role_id"]').selectOption("1"); + await adminPage + .locator('select[name="view_permission"]') + .selectOption("global"); + + /** + * Clicking on the status toggler to make the user active. + */ + await adminPage.click('label[for="status"]'); + + /** + * Save user and close the modal. + */ + await adminPage.getByRole("button", { name: "Save User" }).click(); + + await expect( + adminPage.getByText("User created successfully.") + ).toBeVisible(); + }); + + test("should create a user with group permission", async ({ adminPage }) => { + /** + * Creating a group to assign to the user. + */ + const name = await createGroup(adminPage); + + /** + * Reaching to the user listing page. + */ + await adminPage.goto("admin/settings/users"); + + /** + * Opening create user form in modal. + */ + await adminPage.getByRole("button", { name: "Create User" }).click(); + + /** + * Filling the form with user details. + */ + await adminPage.locator('input[name="name"]').fill(generateFullName()); + await adminPage.locator('input[name="email"]').fill(generateEmail()); + await adminPage.locator('input[name="password"]').fill("admin123"); + await adminPage + .locator('input[name="confirm_password"]') + .fill("admin123"); + await adminPage.locator('select[name="role_id"]').selectOption("1"); + await adminPage + .locator('select[name="view_permission"]') + .selectOption("group"); + await adminPage.getByRole('listbox').selectOption({ label: name.groupName }); + + /** + * Clicking on the status toggler to make the user active. + */ + await adminPage.click('label[for="status"]'); + + /** + * Save user and close the modal. + */ + await adminPage.getByRole("button", { name: "Save User" }).click(); + + await expect( + adminPage.getByText("User created successfully.") + ).toBeVisible(); + }); + + test("should create a user with individual permission", async ({ adminPage }) => { + /** + * Reaching to the user listing page. + */ + await adminPage.goto("admin/settings/users"); + + /** + * Opening create user form in modal. + */ + await adminPage.getByRole("button", { name: "Create User" }).click(); + + /** + * Filling the form with user details. + */ + await adminPage.locator('input[name="name"]').fill(generateFullName()); + await adminPage.locator('input[name="email"]').fill(generateEmail()); + await adminPage.locator('input[name="password"]').fill("admin123"); + await adminPage + .locator('input[name="confirm_password"]') + .fill("admin123"); + await adminPage.locator('select[name="role_id"]').selectOption("1"); + await adminPage + .locator('select[name="view_permission"]') + .selectOption("individual"); + + /** + * Clicking on the status toggler to make the user active. + */ + await adminPage.click('label[for="status"]'); + + /** + * Save user and close the modal. + */ + await adminPage.getByRole("button", { name: "Save User" }).click(); + + await expect( + adminPage.getByText("User created successfully.") + ).toBeVisible(); + }); + + test("should edit a users", async ({ adminPage }) => { + /** + * Generating new name and email for the user. + */ + const updatedName = generateFullName(); + const updatedEmail = generateEmail(); + + /** + * Reaching to the user listing page. + */ + await adminPage.goto("admin/settings/users"); + + /** + * Clicking on the edit button for the first user opens the modal. + */ + await adminPage.waitForSelector("span.cursor-pointer.icon-edit", { + state: "visible", + }); + const iconEdit = await adminPage.$$("span.cursor-pointer.icon-edit"); + await iconEdit[0].click(); + + await adminPage.locator('input[name="name"]').fill(updatedName); + await adminPage.locator('input[name="email"]').fill(updatedEmail); + + /** + * Saving user and closing the modal. + */ + await adminPage.getByRole("button", { name: "Save User" }).click(); + await expect(adminPage.locator('#app')).toContainText("User updated successfully."); + await expect(adminPage.locator("#app")).toContainText(updatedName); + await expect( + adminPage.getByRole("paragraph").filter({ hasText: updatedEmail }) + ).toBeVisible(); + }); + + test("should delete a user", async ({ adminPage }) => { + /** + * Reaching to the user listing page. + */ + await adminPage.goto("admin/settings/users"); + + /** + * Delete the first user. + */ + await adminPage.waitForSelector("span.cursor-pointer.icon-delete"); + const iconDelete = await adminPage.$$( + "span.cursor-pointer.icon-delete" + ); + await iconDelete[0].click(); + + /** + * Delete confirmation modal. + */ + await confirmModal("Are you sure", adminPage); + await expect(adminPage.locator('#app')).toContainText("User deleted successfully."); + }); +}); diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/settings/warehouses/warehouse.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/settings/warehouses/warehouse.spec.ts new file mode 100644 index 0000000..cfad34b --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/settings/warehouses/warehouse.spec.ts @@ -0,0 +1,57 @@ +import { test, expect } from "../../../setup"; +import { confirmModal } from "../../../utils/components"; + +test.describe("warehouse management", () => { + test("should create a warehouse", async ({ adminPage }) => { + /** + * Reaching to the warehouses listing page. + */ + await adminPage.goto("admin/settings/warehouses"); + + // Add code for creating a warehouse. + + }); + + test("should edit a warehouse", async ({ adminPage }) => { + /** + * Reaching to the warehouses listing page. + */ + await adminPage.goto("admin/settings/warehouses"); + + /** + * Clicking on the edit button for the first warehouse opens the modal. + */ + // await adminPage.waitForSelector("span.cursor-pointer.icon-edit", { + // state: "visible", + // }); + // const iconEdit = await adminPage.$$("span.cursor-pointer.icon-edit"); + // await iconEdit[0].click(); + + // Add code to edit the warehouse. + }); + + test("should delete a warehouse", async ({ adminPage }) => { + /** + * Reaching to the warehouse listing page. + */ + await adminPage.goto("admin/settings/warehouses"); + + /** + * Delete the first warehouse. + */ + // await adminPage.waitForSelector("span.cursor-pointer.icon-delete"); + // const iconDelete = await adminPage.$$( + // "span.cursor-pointer.icon-delete" + // ); + // await iconDelete[0].click(); + + // /** + // * Delete confirmation modal. + // */ + // await confirmModal("Are you sure", adminPage); + + // await expect( + // adminPage.getByText("Warehouse deleted successfully.") + // ).toBeVisible(); + }); +}); \ No newline at end of file diff --git a/packages/Webkul/Admin/tests/e2e-pw/utils/components.ts b/packages/Webkul/Admin/tests/e2e-pw/utils/components.ts new file mode 100644 index 0000000..bbae3b3 --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/utils/components.ts @@ -0,0 +1,18 @@ +/** + * Confirm the modal dialog. + */ +export function confirmModal(message, page) { + return new Promise(async (resolve, reject) => { + await page.waitForSelector("text=" + message); + const agreeButton = await page.locator( + 'button.primary-button:has-text("Agree")' + ); + + if (await agreeButton.isVisible()) { + await agreeButton.click(); + resolve(true); + } else { + reject("Agree button not found or not visible."); + } + }); +} \ No newline at end of file diff --git a/packages/Webkul/Admin/tests/e2e-pw/utils/faker.ts b/packages/Webkul/Admin/tests/e2e-pw/utils/faker.ts new file mode 100644 index 0000000..95bd77a --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/utils/faker.ts @@ -0,0 +1,471 @@ +import fs from "fs"; +import path from "path"; +import { fileURLToPath } from "url"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const usedNames = new Set(); +const usedEmails = new Set(); +const usedNumbers = new Set(); +const usedSlugs = new Set(); + +/** + * Generate a random name. + */ +function generateName() { + const adjectives = [ + "Cool", "Smart", "Fast", "Sleek", "Innovative", "Shiny", "Bold", + "Elegant", "Epic", "Mystic", "Brilliant", "Luminous", "Radiant", + "Majestic", "Vivid", "Glowing", "Dynamic", "Fearless", "Silent", + "Electric", "Golden", "Blazing", "Timeless", "Noble", "Eternal" + ]; + + const nouns = [ + "Star", "Vision", "Echo", "Spark", "Horizon", "Nova", "Shadow", + "Wave", "Pulse", "Vortex", "Zenith", "Element", "Flare", "Comet", + "Galaxy", "Ember", "Crystal", "Sky", "Stone", "Blaze", "Eclipse", + "Storm", "Orbit", "Phantom", "Mirage" + ]; + + let name = ""; + + do { + const adj = adjectives[Math.floor(Math.random() * adjectives.length)]; + const noun = nouns[Math.floor(Math.random() * nouns.length)]; + + name = `${adj} ${noun}`; + } while (usedNames.has(name)); + + usedNames.add(name); + + return name; +} + +/** + * Generate the first Name. + */ +function generateFirstName() { + const firstNames = [ + "James", + "Emma", + "Liam", + "Olivia", + "Noah", + "Ava", + "William", + "Sophia", + "Benjamin", + "Isabella", + "Lucas", + "Mia", + ]; + + return firstNames[Math.floor(Math.random() * firstNames.length)]; +} + +/** + * Generate the last name. + */ +function generateLastName() { + const lastNames = [ + "Smith", + "Johnson", + "Brown", + "Williams", + "Jones", + "Garcia", + "Miller", + "Davis", + "Rodriguez", + "Martinez", + "Hernandez", + "Lopez", + ]; + + return lastNames[Math.floor(Math.random() * lastNames.length)]; +} + +/** + * Generate the full name. + */ +function generateFullName() { + return `${generateFirstName()} ${generateLastName()}`; +} + +/** + * Generate the email address. + */ +function generateEmail() { + const adjectives = [ + "Cool", + "Smart", + "Fast", + "Sleek", + "Innovative", + "Shiny", + "Bold", + "Elegant", + "Epic", + "Mystic", + "Brilliant", + "Luminous", + ]; + + const nouns = [ + "Star", + "Vision", + "Echo", + "Spark", + "Horizon", + "Nova", + "Shadow", + "Wave", + "Pulse", + "Vortex", + "Zenith", + "Element", + ]; + + let email = ""; + + do { + const adj = adjectives[Math.floor(Math.random() * adjectives.length)]; + const noun = nouns[Math.floor(Math.random() * nouns.length)]; + const number = Math.floor(1000 + Math.random() * 9000); + + email = `${adj}${noun}${number}@example.com`.toLowerCase(); + } while (usedEmails.has(email)); + + usedEmails.add(email); + + return email; +} + +/** + * Generate the phone number. + */ +function generatePhoneNumber() { + let phoneNumber; + + do { + phoneNumber = Math.floor(6000000000 + Math.random() * 4000000000); + } while (usedNumbers.has(phoneNumber)); + + usedNumbers.add(phoneNumber); + + return `${phoneNumber}`; +} + +/** + * Generate a random SKU. + */ +function generateSKU() { + const letters = Array.from({ length: 3 }, () => + String.fromCharCode(65 + Math.floor(Math.random() * 26)) + ).join(""); + + const numbers = Math.floor(1000 + Math.random() * 9000); + + return `${letters}${numbers}`; +} + +/** + * Generate a random URL. + */ +function generateSlug(delimiter = "-") { + let slug; + + do { + const name = generateName(); + + const randomStr = Math.random().toString(36).substring(2, 8); + + slug = `${name + .toLowerCase() + .replace(/\s+/g, delimiter)}${delimiter}${randomStr}`; + } while (usedSlugs.has(slug)); + + usedSlugs.add(slug); + + return slug; +} + +/** + * Generate a random email subject. + */ +function generateEmailSubject() { + const subjects = [ + "Exciting news just for you!", + "Don't miss out on this opportunity!", + "Limited time offer – act now!", + "An exclusive deal awaits you!", + "Your next big opportunity is here!", + "Something special just for you!", + "Unlock amazing benefits today!", + "Surprise! A special gift inside!", + "This could change everything for you!", + "You're invited to something amazing!", + "Get ready for a game-changing experience!", + "Hurry! This offer won't last long!", + "A deal you simply can’t resist!", + "Exclusive access – only for you!", + "We’ve got something exciting for you!", + "Your perfect opportunity is here!", + "Important update – check this out!", + "Discover what’s waiting for you!", + "A limited-time surprise for you!", + "Special invitation – don’t miss out!", + ]; + + return subjects[Math.floor(Math.random() * subjects.length)]; +} + + +/** + * Generate the description. + */ +function generateDescription(length = 255) { + const phrases = [ + "An innovative and sleek design.", + "Built for speed and efficiency.", + "Experience the future today.", + "A perfect blend of style and power.", + "Engineered to perfection.", + "Designed for those who dream big.", + "Unleash creativity with this masterpiece.", + "A game-changer in every way.", + "Smart, fast, and reliable.", + "The perfect companion for your journey.", + "Crafted with precision and excellence.", + "Innovation that redefines possibilities.", + "Enhancing your experience like never before.", + "Where technology meets elegance.", + "Power, performance, and perfection combined.", + "Redefining the way you experience the world.", + "A masterpiece of engineering and design.", + "Unmatched quality and exceptional performance.", + "Designed to elevate your lifestyle.", + "Beyond expectations, beyond limits.", + ]; + + let description = ""; + + while (length > 0) { + let phrase = phrases[Math.floor(Math.random() * phrases.length)]; + + if (phrase.length <= length) { + description += (description ? " " : "") + phrase; + length -= phrase.length; + } else { + description += " " + phrase.substring(0, length); + break; + } + } + + return description.trim(); +} + +/** + * Generate the host name. + */ +function generateHostname() { + const words = [ + "tech", + "cloud", + "byte", + "stream", + "nexus", + "core", + "pulse", + "data", + "sync", + "wave", + "hub", + "zone", + ]; + + const domains = [".com", ".net", ".io", ".ai", ".xyz", ".co"]; + + const part1 = words[Math.floor(Math.random() * words.length)]; + const part2 = words[Math.floor(Math.random() * words.length)]; + const domain = domains[Math.floor(Math.random() * domains.length)]; + + return `https://${part1}${part2}${domain}`; +} + +/** + * Generate a random element from the array. + */ +function randomElement(array) { + return array[Math.floor(Math.random() * array.length)]; +} + +/** + * Get a random image file from the directory. + */ +function getImageFile( + directory = path.resolve(__dirname, "../data/images/") +) { + if (!fs.existsSync(directory)) { + throw new Error(`Directory does not exist: ${directory}`); + } + + const files = fs.readdirSync(directory); + const imageFiles = files.filter((file) => + /\.(gif|jpeg|jpg|png|svg|webp)$/i.test(file) + ); + + if (!imageFiles.length) { + throw new Error("No image files found in the directory."); + } + + const randomIndex = Math.floor(Math.random() * imageFiles.length); + + return path.join(directory, imageFiles[randomIndex]); +} + +/** + * Generate a random date from today onwards in YYYY-MM-DD format. + */ +function generateDate(): string { + const today = new Date().getTime(); + const futureEnd = new Date(2030, 11, 31).getTime(); + const randomDate = new Date(today + Math.random() * (futureEnd - today)); + + return randomDate.toISOString().split('T')[0]; +} + +/** + * Function to generate a random company name + */ +function generateCompanyName() { + const prefixes = [ + "Tech", "Software", "Innovate", "NextGen", "Cloud", "AI", "Cyber", "Digital", + "Technical", "Product", "Organization", "Vendor", "Rock-on", "Super", "Quantum", + "Neural", "Hyper", "Ultra", "Smart", "Future", "Mega", "Omni", "Virtual", "Dynamic", + "Secure", "Data", "Meta", "Nano", "Robo", "Infinity", "Vision", "Intelli", "Strato", + "Blue", "Green", "Red", "White", "Black", "Deep", "Elite", "Prime", "Titan", "Nova", + "Storm", "Lightning", "Vertex", "Pioneer", "Omnis", "Synergy", "Core", "Nexus" + ]; + const suffixes = [ + "Solutions", "Systems", "Pvt Ltd", "Technologies", "Enterprises", "Labs", "Networks", + "Corporation", "Group", "Ventures", "Holdings", "Consulting", "Industries", "Analytics", + "Innovations", "Services", "Softwares", "Developers", "AI", "Cloud", "Security", "Dynamics", + "Technica", "Data", "Infotech", "Research", "Automation", "Synergy", "Strategies", "Platform", + "Operations", "Logistics", "Infrastructure", "Management", "Digital", "Interactive", + "Vision", "Connect", "Smart", "Solutions Inc", "Partners", "Tech Ltd", "Info Systems", + "Growth", "Intelligence", "RoboCorp", "Edge", "Enterprise", "Global", "Power", "NextGen", + "Creative" + ]; + return `${prefixes[Math.floor(Math.random() * prefixes.length)]} ${suffixes[Math.floor(Math.random() * suffixes.length)]}`; +} + +/** + * Function to automate organization creation + */ +async function createOrganization(page) { + const companyName = generateCompanyName(); + + /** + * Click on "Create Organization" button + */ + await page.goto('admin/contacts/organizations'); + await page.getByRole('link', { name: 'Create Organization' }).click(); + + /** + * Fill in organization details + */ + await page.getByRole('textbox', { name: 'Name *' }).fill(companyName); + await page.locator('textarea[name="address\\[address\\]"]').fill('ARV Park'); + await page.getByRole('combobox').selectOption('IN'); + await page.locator('select[name="address\\[state\\]"]').selectOption('DL'); + await page.getByRole('textbox', { name: 'City' }).fill('Delhi'); + await page.getByRole('textbox', { name: 'Postcode' }).fill('123456'); + + /** + * Click to add extra details + */ + await page.locator('div').filter({ hasText: /^Click to add$/ }).nth(2).click(); + await page.getByRole('textbox', { name: 'Search...' }).fill('exampl'); + await page.getByRole('listitem').filter({ hasText: 'Example' }).click(); + + /** + * Click on "Save Organization" + */ + await page.getByRole('button', { name: 'Save Organization' }).click(); + // await expect(page.getByText(companyName)).toBeVisible(); + return companyName; +} + +function generateJobProfile() { + const jobProfiles = [ + "Playwright Automation Tester", + "Software Engineer", + "Data Analyst", + "Project Manager", + "DevOps Engineer", + "QA Engineer", + "UI/UX Designer", + "Product Manager", + "Cybersecurity Analyst", + "Cloud Architect" + ]; + const randomIndex = Math.floor(Math.random() * jobProfiles.length); + return jobProfiles[randomIndex]; +} + +async function createPerson(page) { + const Name = generateFullName(); + const email = generateEmail(); + const phone = generatePhoneNumber(); + const Job = generateJobProfile(); + + await page.getByRole('link', { name: 'Create Person' }).click(); + + await page.getByRole('textbox', { name: 'Name *' }).fill(Name); + await page.getByRole('textbox', { name: 'Emails *' }).fill(email); + await page.getByRole('textbox', { name: 'Contact Numbers' }).fill(phone); + await page.getByRole('textbox', { name: 'Job Title' }).fill(Job); + + // Select an organization + await page.locator('.relative > div > .relative').first().click(); + await page.getByRole('textbox', { name: 'Search...' }).fill('examp'); + await page.getByRole('listitem').filter({ hasText: 'Example' }).click(); + + // Save person + await page.getByRole('button', { name: 'Save Person' }).click(); + + return { Name, email, phone }; +} +function getRandomDateTime() { + const year = Math.floor(Math.random() * (2030 - 2020 + 1)) + 2020; + const month = String(Math.floor(Math.random() * 12) + 1).padStart(2, '0'); + const day = String(Math.floor(Math.random() * 28) + 1).padStart(2, '0'); + const hours = String(Math.floor(Math.random() * 24)).padStart(2, '0'); + const minutes = String(Math.floor(Math.random() * 60)).padStart(2, '0'); + const seconds = String(Math.floor(Math.random() * 60)).padStart(2, '0'); + + return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; + } + +export { + generateName, + generateFirstName, + generateLastName, + generateFullName, + generateEmail, + generatePhoneNumber, + generateSKU, + generateSlug, + generateEmailSubject, + generateDescription, + generateHostname, + randomElement, + getImageFile, + generateDate, + createOrganization, + generateCompanyName, + createPerson, + getRandomDateTime +}; \ No newline at end of file diff --git a/packages/Webkul/Admin/vite.config.js b/packages/Webkul/Admin/vite.config.js new file mode 100644 index 0000000..23ca05c --- /dev/null +++ b/packages/Webkul/Admin/vite.config.js @@ -0,0 +1,48 @@ +import { defineConfig, loadEnv } from "vite"; +import vue from "@vitejs/plugin-vue"; +import laravel from "laravel-vite-plugin"; +import path from "path"; + +export default defineConfig(({ mode }) => { + const envDir = "../../../"; + + Object.assign(process.env, loadEnv(mode, envDir)); + + return { + build: { + emptyOutDir: true, + }, + + envDir, + + server: { + host: process.env.VITE_HOST || "localhost", + port: process.env.VITE_PORT || 5173, + cors: true, + }, + + plugins: [ + vue(), + + laravel({ + hotFile: "../../../public/admin-vite.hot", + publicDirectory: "../../../public", + buildDirectory: "admin/build", + input: [ + "src/Resources/assets/css/app.css", + "src/Resources/assets/js/app.js", + "src/Resources/assets/js/chart.js", + ], + refresh: true, + }), + ], + + experimental: { + renderBuiltUrl(filename, { hostId, hostType, type }) { + if (hostType === "css") { + return path.basename(filename); + } + }, + }, + }; +}); diff --git a/packages/Webkul/Attribute/composer.json b/packages/Webkul/Attribute/composer.json new file mode 100755 index 0000000..6b4552b --- /dev/null +++ b/packages/Webkul/Attribute/composer.json @@ -0,0 +1,27 @@ +{ + "name": "krayin/laravel-attribute", + "license": "MIT", + "authors": [ + { + "name": "Jitendra Singh", + "email": "jitendra@webkul.com" + } + ], + "require": { + "krayin/laravel-core": "^1.0" + }, + "autoload": { + "psr-4": { + "Webkul\\Attribute\\": "src/" + } + }, + "extra": { + "laravel": { + "providers": [ + "Webkul\\Attribute\\Providers\\AttributeServiceProvider" + ], + "aliases": {} + } + }, + "minimum-stability": "dev" +} \ No newline at end of file diff --git a/packages/Webkul/Attribute/src/Config/attribute_lookups.php b/packages/Webkul/Attribute/src/Config/attribute_lookups.php new file mode 100644 index 0000000..ca5d8ed --- /dev/null +++ b/packages/Webkul/Attribute/src/Config/attribute_lookups.php @@ -0,0 +1,5 @@ +increments('id'); + $table->string('code'); + $table->string('name'); + $table->string('type'); + $table->string('lookup_type')->nullable(); + $table->string('entity_type'); + $table->integer('sort_order')->nullable(); + $table->string('validation')->nullable(); + $table->boolean('is_required')->default(0); + $table->boolean('is_unique')->default(0); + $table->boolean('quick_add')->default(0); + $table->boolean('is_user_defined')->default(1); + $table->unique(['code', 'entity_type']); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('attributes'); + } +}; diff --git a/packages/Webkul/Attribute/src/Database/Migrations/2021_04_02_080837_create_attribute_options_table.php b/packages/Webkul/Attribute/src/Database/Migrations/2021_04_02_080837_create_attribute_options_table.php new file mode 100644 index 0000000..015e07f --- /dev/null +++ b/packages/Webkul/Attribute/src/Database/Migrations/2021_04_02_080837_create_attribute_options_table.php @@ -0,0 +1,34 @@ +increments('id'); + $table->string('name')->nullable(); + $table->integer('sort_order')->nullable(); + $table->integer('attribute_id')->unsigned(); + $table->foreign('attribute_id')->references('id')->on('attributes')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('attribute_options'); + } +}; diff --git a/packages/Webkul/Attribute/src/Database/Migrations/2021_04_06_122751_create_attribute_values_table.php b/packages/Webkul/Attribute/src/Database/Migrations/2021_04_06_122751_create_attribute_values_table.php new file mode 100644 index 0000000..79b4f9d --- /dev/null +++ b/packages/Webkul/Attribute/src/Database/Migrations/2021_04_06_122751_create_attribute_values_table.php @@ -0,0 +1,44 @@ +increments('id'); + $table->string('entity_type')->default('leads'); + $table->text('text_value')->nullable(); + $table->boolean('boolean_value')->nullable(); + $table->integer('integer_value')->nullable(); + $table->double('float_value')->nullable(); + $table->datetime('datetime_value')->nullable(); + $table->date('date_value')->nullable(); + $table->json('json_value')->nullable(); + + $table->integer('entity_id')->unsigned(); + $table->integer('attribute_id')->unsigned(); + + $table->foreign('attribute_id')->references('id')->on('attributes')->onDelete('cascade'); + $table->unique(['entity_type', 'entity_id', 'attribute_id'], 'entity_type_attribute_value_index_unique'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('attribute_values'); + } +}; diff --git a/packages/Webkul/Attribute/src/Database/Migrations/2025_07_02_191710_alter_attribute_values_table.php b/packages/Webkul/Attribute/src/Database/Migrations/2025_07_02_191710_alter_attribute_values_table.php new file mode 100644 index 0000000..b0792b9 --- /dev/null +++ b/packages/Webkul/Attribute/src/Database/Migrations/2025_07_02_191710_alter_attribute_values_table.php @@ -0,0 +1,39 @@ +string('unique_id')->nullable(); + }); + + $tablePrefix = DB::getTablePrefix(); + + DB::statement('UPDATE '.$tablePrefix."attribute_values SET unique_id = CONCAT(entity_id, '|', attribute_id)"); + + Schema::table('attribute_values', function (Blueprint $table) { + $table->unique('unique_id'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('attribute_values', function (Blueprint $table) { + $table->dropUnique(['unique_id']); + + $table->dropColumn('unique_id'); + }); + } +}; diff --git a/packages/Webkul/Attribute/src/Models/Attribute.php b/packages/Webkul/Attribute/src/Models/Attribute.php new file mode 100644 index 0000000..06c901a --- /dev/null +++ b/packages/Webkul/Attribute/src/Models/Attribute.php @@ -0,0 +1,35 @@ +hasMany(AttributeOptionProxy::modelClass()); + } +} diff --git a/packages/Webkul/Attribute/src/Models/AttributeOption.php b/packages/Webkul/Attribute/src/Models/AttributeOption.php new file mode 100644 index 0000000..2ec0622 --- /dev/null +++ b/packages/Webkul/Attribute/src/Models/AttributeOption.php @@ -0,0 +1,30 @@ +belongsTo(AttributeProxy::modelClass()); + } +} diff --git a/packages/Webkul/Attribute/src/Models/AttributeOptionProxy.php b/packages/Webkul/Attribute/src/Models/AttributeOptionProxy.php new file mode 100644 index 0000000..63de852 --- /dev/null +++ b/packages/Webkul/Attribute/src/Models/AttributeOptionProxy.php @@ -0,0 +1,7 @@ + 'array', + ]; + + /** + * The attributes that are fillable for the model. + * + * @var array + */ + protected $fillable = [ + 'attribute_id', + 'text_value', + 'boolean_value', + 'integer_value', + 'float_value', + 'datetime_value', + 'date_value', + 'json_value', + 'entity_id', + 'entity_type', + ]; + + /** + * The attributes that are used for logging activity. + * + * @var array + */ + public static $attributeTypeFields = [ + 'text' => 'text_value', + 'textarea' => 'text_value', + 'price' => 'float_value', + 'boolean' => 'boolean_value', + 'select' => 'integer_value', + 'multiselect' => 'text_value', + 'checkbox' => 'text_value', + 'email' => 'json_value', + 'address' => 'json_value', + 'phone' => 'json_value', + 'lookup' => 'integer_value', + 'datetime' => 'datetime_value', + 'date' => 'date_value', + 'file' => 'text_value', + 'image' => 'text_value', + ]; + + /** + * Get the attribute that owns the attribute value. + */ + public function attribute() + { + return $this->belongsTo(AttributeProxy::modelClass()); + } + + /** + * Get the parent entity model (leads, products, persons or organizations). + */ + public function entity() + { + return $this->morphTo(); + } +} diff --git a/packages/Webkul/Attribute/src/Models/AttributeValueProxy.php b/packages/Webkul/Attribute/src/Models/AttributeValueProxy.php new file mode 100644 index 0000000..777a768 --- /dev/null +++ b/packages/Webkul/Attribute/src/Models/AttributeValueProxy.php @@ -0,0 +1,7 @@ +loadMigrationsFrom(__DIR__.'/../Database/Migrations'); + } + + /** + * Register services. + * + * @return void + */ + public function register() + { + $this->registerConfig(); + } + + /** + * Register package config. + * + * @return void + */ + protected function registerConfig() + { + $this->mergeConfigFrom( + dirname(__DIR__).'/Config/attribute_lookups.php', 'attribute_lookups' + ); + } +} diff --git a/packages/Webkul/Attribute/src/Providers/ModuleServiceProvider.php b/packages/Webkul/Attribute/src/Providers/ModuleServiceProvider.php new file mode 100644 index 0000000..6f363b4 --- /dev/null +++ b/packages/Webkul/Attribute/src/Providers/ModuleServiceProvider.php @@ -0,0 +1,14 @@ +model->create($data); + + if (in_array($attribute->type, ['select', 'multiselect', 'checkbox']) && count($options)) { + $sortOrder = 1; + + foreach ($options as $optionInputs) { + $this->attributeOptionRepository->create(array_merge([ + 'attribute_id' => $attribute->id, + 'sort_order' => $sortOrder++, + ], $optionInputs)); + } + } + + return $attribute; + } + + /** + * @param int $id + * @param string $attribute + * @return \Webkul\Attribute\Contracts\Attribute + */ + public function update(array $data, $id, $attribute = 'id') + { + $attribute = $this->find($id); + + $attribute->update($data); + + if (! in_array($attribute->type, ['select', 'multiselect', 'checkbox'])) { + return $attribute; + } + + if (! isset($data['options'])) { + return $attribute; + } + + foreach ($data['options'] as $optionId => $optionInputs) { + $isNew = $optionInputs['isNew'] == 'true'; + + if ($isNew) { + $this->attributeOptionRepository->create(array_merge([ + 'attribute_id' => $attribute->id, + ], $optionInputs)); + } else { + $isDelete = $optionInputs['isDelete'] == 'true'; + + if ($isDelete) { + $this->attributeOptionRepository->delete($optionId); + } else { + $this->attributeOptionRepository->update($optionInputs, $optionId); + } + } + } + + return $attribute; + } + + /** + * @param string $code + * @return \Webkul\Attribute\Contracts\Attribute + */ + public function getAttributeByCode($code) + { + static $attributes = []; + + if (array_key_exists($code, $attributes)) { + return $attributes[$code]; + } + + return $attributes[$code] = $this->findOneByField('code', $code); + } + + /** + * @param int $lookup + * @param string $query + * @param array $columns + * @return array + */ + public function getLookUpOptions($lookup, $query = '', $columns = []) + { + $lookup = config('attribute_lookups.'.$lookup); + + if (! count($columns)) { + $columns = [($lookup['value_column'] ?? 'id').' as id', ($lookup['label_column'] ?? 'name').' as name']; + } + + if (Str::contains($lookup['repository'], 'UserRepository')) { + $userRepository = app($lookup['repository'])->where('status', 1); + + $currentUser = auth()->guard('user')->user(); + + if ($currentUser?->view_permission === 'group') { + $query = urldecode($query); + + $userIds = bouncer()->getAuthorizedUserIds(); + + return $userRepository + ->when(! empty($userIds), fn ($queryBuilder) => $queryBuilder->whereIn('users.id', $userIds)) + ->when(! empty($query), fn ($queryBuilder) => $queryBuilder->where('users.name', 'like', "%{$query}%")) + ->get(); + } elseif ($currentUser?->view_permission === 'individual') { + return $userRepository->where('users.id', $currentUser->id); + } + + return $userRepository->where('users.name', 'like', '%'.urldecode($query).'%')->get(); + } + + return app($lookup['repository'])->findWhere([ + [$lookup['label_column'] ?? 'name', 'like', '%'.urldecode($query).'%'], + ], $columns); + } + + /** + * @param string $lookup + * @param int|array $entityId + * @param array $columns + * @return mixed + */ + public function getLookUpEntity($lookup, $entityId = null, $columns = []) + { + if (! $entityId) { + return; + } + + $lookup = config('attribute_lookups.'.$lookup); + + if (! count($columns)) { + $columns = [($lookup['value_column'] ?? 'id').' as id', ($lookup['label_column'] ?? 'name').' as name']; + } + + if (is_array($entityId)) { + return app($lookup['repository'])->findWhereIn( + 'id', + $entityId, + $columns + ); + } else { + return app($lookup['repository'])->find($entityId, $columns); + } + } +} diff --git a/packages/Webkul/Attribute/src/Repositories/AttributeValueRepository.php b/packages/Webkul/Attribute/src/Repositories/AttributeValueRepository.php new file mode 100755 index 0000000..ef61128 --- /dev/null +++ b/packages/Webkul/Attribute/src/Repositories/AttributeValueRepository.php @@ -0,0 +1,267 @@ + $data['entity_type']]; + + if (isset($data['quick_add'])) { + $conditions['quick_add'] = 1; + } + + $attributes = $this->attributeRepository->where($conditions)->get(); + } + + foreach ($attributes as $attribute) { + $typeColumn = $this->model::$attributeTypeFields[$attribute->type]; + + if ($attribute->type === 'boolean') { + $data[$attribute->code] = isset($data[$attribute->code]) && $data[$attribute->code] ? 1 : 0; + } + + if (! array_key_exists($attribute->code, $data)) { + continue; + } + + if ($attribute->type === 'price' + && isset($data[$attribute->code]) + && $data[$attribute->code] === '' + ) { + $data[$attribute->code] = null; + } + + if ($attribute->type === 'date' && $data[$attribute->code] === '') { + $data[$attribute->code] = null; + } + + if ($attribute->type === 'multiselect' || $attribute->type === 'checkbox') { + $data[$attribute->code] = implode(',', $data[$attribute->code]); + } + + if ($attribute->type === 'email' || $attribute->type === 'phone') { + $data[$attribute->code] = $this->sanitizeEmailAndPhone($data[$attribute->code]); + } + + if ($attribute->type === 'image' || $attribute->type === 'file') { + $data[$attribute->code] = $data[$attribute->code] instanceof UploadedFile + ? $data[$attribute->code]->store($data['entity_type'].'/'.$data['entity_id']) + : null; + } + + $attributeValue = $this->findOneWhere([ + 'entity_type' => $data['entity_type'], + 'entity_id' => $data['entity_id'], + 'attribute_id' => $attribute->id, + ]); + + if (! $attributeValue) { + $this->create([ + 'entity_type' => $data['entity_type'], + 'entity_id' => $data['entity_id'], + 'attribute_id' => $attribute->id, + $typeColumn => $data[$attribute->code], + ]); + } else { + $this->update([ + $typeColumn => $data[$attribute->code], + ], $attributeValue->id); + + if ($attribute->type == 'image' || $attribute->type == 'file') { + if ($attributeValue->text_value) { + Storage::delete($attributeValue->text_value); + } + } + } + } + } + + /** + * Is value unique. + * + * @param int $entityId + * @param string $entityType + * @param \Webkul\Attribute\Contracts\Attribute $attribute + * @param string $value + * @return bool + */ + public function isValueUnique($entityId, $entityType, $attribute, $value) + { + $query = $this->resetScope()->model + ->where('attribute_id', $attribute->id) + ->where('entity_type', $entityType) + ->where('entity_id', '!=', $entityId); + + /** + * If the attribute type is email or phone, check the JSON value. + */ + if (in_array($attribute->type, ['email', 'phone'])) { + $query->whereJsonContains($this->model::$attributeTypeFields[$attribute->type], [['value' => $value]]); + } else { + $query->where($this->model::$attributeTypeFields[$attribute->type], $value); + } + + return $query->get()->count() ? false : true; + } + + /** + * Removed null values from email and phone fields. + * + * @param array $data + * @return array + */ + public function sanitizeEmailAndPhone($data) + { + foreach ($data as $key => $row) { + if (is_null($row['value'])) { + unset($data[$key]); + } + } + + return $data; + } + + /** + * Replace placeholders with values + */ + public function getAttributeLabel(mixed $value, mixed $attribute) + { + switch ($attribute?->type) { + case 'price': + $label = core()->formatBasePrice($value); + + break; + + case 'boolean': + $label = $value ? 'Yes' : 'No'; + + break; + + case 'select': + case 'radio': + case 'lookup': + if ($attribute->lookup_type) { + $option = $this->attributeRepository->getLookUpEntity($attribute->lookup_type, $value); + } else { + $option = $attribute->options->where('id', $value)->first(); + } + + $label = $option?->name; + + break; + + case 'multiselect': + case 'checkbox': + if ($attribute->lookup_type) { + $options = $this->attributeRepository->getLookUpEntity($attribute->lookup_type, explode(',', $value)); + } else { + $options = $attribute->options->whereIn('id', explode(',', $value)); + } + + $optionsLabels = []; + + foreach ($options as $key => $option) { + $optionsLabels[] = $option->name; + } + + $label = implode(', ', $optionsLabels); + + break; + + case 'email': + case 'phone': + if (! is_array($value)) { + break; + } + + $optionsLabels = []; + + foreach ($value as $item) { + $optionsLabels[] = $item['value'].' ('.$item['label'].')'; + } + + $label = implode(', ', $optionsLabels); + + break; + + case 'address': + if ( + ! $value + || ! count(array_filter($value)) + ) { + break; + } + + $label = $value['address'].'
    ' + .$value['postcode'].' '.$value['city'].'
    ' + .core()->state_name($value['state']).'
    ' + .core()->country_name($value['country']).'
    '; + + break; + + case 'date': + if ($value) { + $label = Carbon::parse($value)->format('D M d, Y'); + } else { + $label = null; + } + + break; + + case 'datetime': + if ($value) { + $label = Carbon::parse($value)->format('D M d, Y H:i A'); + } else { + $label = null; + } + + break; + + default: + if ($value instanceof Carbon) { + $label = $value->format('D M d, Y H:i A'); + } else { + $label = $value; + } + + break; + } + + return $label ?? null; + } +} diff --git a/packages/Webkul/Attribute/src/Traits/CustomAttribute.php b/packages/Webkul/Attribute/src/Traits/CustomAttribute.php new file mode 100644 index 0000000..acb3830 --- /dev/null +++ b/packages/Webkul/Attribute/src/Traits/CustomAttribute.php @@ -0,0 +1,175 @@ + 'text_value', + 'textarea' => 'text_value', + 'price' => 'float_value', + 'boolean' => 'boolean_value', + 'select' => 'integer_value', + 'multiselect' => 'text_value', + 'checkbox' => 'text_value', + 'email' => 'json_value', + 'address' => 'json_value', + 'phone' => 'json_value', + 'lookup' => 'integer_value', + 'datetime' => 'datetime_value', + 'date' => 'date_value', + 'file' => 'text_value', + 'image' => 'text_value', + ]; + + /** + * Get the attribute values that owns the entity. + */ + public function attribute_values() + { + return $this->morphMany(AttributeValueProxy::modelClass(), 'entity'); + } + + /** + * Get an attribute from the model. + * + * @param string $key + * @return mixed + */ + public function getAttribute($key) + { + if (! method_exists(static::class, $key) && ! isset($this->attributes[$key])) { + if (isset($this->id)) { + $this->attributes[$key] = ''; + + $attribute = app(AttributeRepository::class)->getAttributeByCode($key); + + $this->attributes[$key] = $this->getCustomAttributeValue($attribute); + + return $this->getAttributeValue($key); + } + } + + return parent::getAttribute($key); + } + + /** + * @return array + */ + public function attributesToArray() + { + $attributes = parent::attributesToArray(); + + $hiddenAttributes = $this->getHidden(); + + if (isset($this->id)) { + $customAttributes = $this->getCustomAttributes(); + + foreach ($customAttributes as $attribute) { + if (in_array($attribute->code, $hiddenAttributes) && isset($this->attributes[$attribute->code])) { + continue; + } + + $attributes[$attribute->code] = $this->getCustomAttributeValue($attribute); + } + } + + return $attributes; + } + + /** + * Check in loaded family attributes. + * + * @return object + */ + public function getCustomAttributes() + { + static $attributes; + + if ($attributes) { + return $attributes; + } + + return $attributes = app(AttributeRepository::class)->where('entity_type', $this->getTable())->get(); + } + + /** + * Get an product attribute value. + * + * @return mixed + */ + public function getCustomAttributeValue($attribute) + { + if (! $attribute) { + return; + } + + $attributeValue = $this->attribute_values->where('attribute_id', $attribute->id)->first(); + + return $attributeValue[self::$attributeTypeFields[$attribute->type]] ?? null; + } + + /** + * Create a new instance of the given model. + * + * @param array $attributes + * @return Collection + */ + public function getLookUpAttributes($attributes) + { + $attributes = app(AttributeRepository::class)->scopeQuery(function ($query) use ($attributes) { + return $query->distinct() + ->where('type', 'lookup') + ->where('entity_type', request('entity_type')) + ->whereIn('code', array_keys($attributes, '', false)); + })->get(); + + return $attributes; + } + + /** + * Create a new instance of the given model. + * + * @param array $attributes + * @param bool $exists + * @return static + */ + public function newInstance($attributes = [], $exists = false) + { + // $attributes = $this->getLookUpAttributes($attributes); + + // Play with data here + + return parent::newInstance($attributes, $exists); + } + + /** + * Fill the model with an array of attributes. + * + * @return $this + * + * @throws \Illuminate\Database\Eloquent\MassAssignmentException + */ + public function fill(array $attributes) + { + // Play with data here + + return parent::fill($attributes); + } + + // Delete model's attribute values + public static function boot() + { + parent::boot(); + + static::deleting(function ($entity) { + $entity->attribute_values()->delete(); + }); + } +} diff --git a/packages/Webkul/Automation/src/Config/workflows.php b/packages/Webkul/Automation/src/Config/workflows.php new file mode 100644 index 0000000..67fc929 --- /dev/null +++ b/packages/Webkul/Automation/src/Config/workflows.php @@ -0,0 +1,74 @@ + [ + + 'leads' => [ + 'name' => 'Leads', + 'class' => 'Webkul\Automation\Helpers\Entity\Lead', + 'events' => [ + [ + 'event' => 'lead.create.after', + 'name' => 'Created', + ], [ + 'event' => 'lead.update.after', + 'name' => 'Updated', + ], [ + 'event' => 'lead.delete.before', + 'name' => 'Deleted', + ], + ], + ], + + 'activities' => [ + 'name' => 'Activities', + 'class' => 'Webkul\Automation\Helpers\Entity\Activity', + 'events' => [ + [ + 'event' => 'activity.create.after', + 'name' => 'Created', + ], [ + 'event' => 'activity.update.after', + 'name' => 'Updated', + ], [ + 'event' => 'activity.delete.before', + 'name' => 'Deleted', + ], + ], + ], + + 'persons' => [ + 'name' => 'Persons', + 'class' => 'Webkul\Automation\Helpers\Entity\Person', + 'events' => [ + [ + 'event' => 'contacts.person.create.after', + 'name' => 'Created', + ], [ + 'event' => 'contacts.person.update.after', + 'name' => 'Updated', + ], [ + 'event' => 'contacts.person.delete.before', + 'name' => 'Deleted', + ], + ], + ], + + 'quotes' => [ + 'name' => 'Quotes', + 'class' => 'Webkul\Automation\Helpers\Entity\Quote', + 'events' => [ + [ + 'event' => 'quote.create.after', + 'name' => 'Created', + ], [ + 'event' => 'quote.update.after', + 'name' => 'Updated', + ], [ + 'event' => 'quote.delete.before', + 'name' => 'Deleted', + ], + ], + ], + ], +]; diff --git a/packages/Webkul/Automation/src/Contracts/Webhook.php b/packages/Webkul/Automation/src/Contracts/Webhook.php new file mode 100644 index 0000000..ac97275 --- /dev/null +++ b/packages/Webkul/Automation/src/Contracts/Webhook.php @@ -0,0 +1,5 @@ +increments('id'); + $table->string('name'); + $table->string('description')->nullable(); + $table->string('entity_type'); + $table->string('event'); + $table->string('condition_type')->default('and'); + $table->json('conditions')->nullable(); + $table->json('actions')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('workflows'); + } +}; diff --git a/packages/Webkul/Automation/src/Database/Migrations/2024_07_24_150821_create_webhooks_table.php b/packages/Webkul/Automation/src/Database/Migrations/2024_07_24_150821_create_webhooks_table.php new file mode 100644 index 0000000..9554e90 --- /dev/null +++ b/packages/Webkul/Automation/src/Database/Migrations/2024_07_24_150821_create_webhooks_table.php @@ -0,0 +1,37 @@ +id(); + $table->string('name'); + $table->string('entity_type'); + $table->string('description')->nullable(); + $table->string('method'); + $table->string('end_point'); + $table->json('query_params')->nullable(); + $table->json('headers')->nullable(); + $table->string('payload_type'); + $table->string('raw_payload_type'); + $table->json('payload')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('webhooks'); + } +}; diff --git a/packages/Webkul/Automation/src/Helpers/Entity.php b/packages/Webkul/Automation/src/Helpers/Entity.php new file mode 100644 index 0000000..0322648 --- /dev/null +++ b/packages/Webkul/Automation/src/Helpers/Entity.php @@ -0,0 +1,103 @@ + $entity) { + $object = app($entity['class']); + + $events[$key] = [ + 'id' => $key, + 'name' => $entity['name'], + 'events' => $entity['events'], + ]; + } + + return $events; + } + + /** + * Returns conditions to match for the entity + * + * @return array + */ + public function getConditions() + { + $entities = config('workflows.trigger_entities'); + + $conditions = []; + + foreach ($entities as $key => $entity) { + $object = app($entity['class']); + + $conditions[$key] = $object->getConditions(); + } + + return $conditions; + } + + /** + * Returns workflow actions + * + * @return array + */ + public function getActions() + { + $entities = config('workflows.trigger_entities'); + + $conditions = []; + + foreach ($entities as $key => $entity) { + $object = app($entity['class']); + + $conditions[$key] = $object->getActions(); + } + + return $conditions; + } + + /** + * Returns placeholders for email templates + * + * @return array + */ + public function getEmailTemplatePlaceholders() + { + $entities = config('workflows.trigger_entities'); + + $placeholders = []; + + foreach ($entities as $key => $entity) { + $object = app($entity['class']); + + $placeholders[] = $object->getEmailTemplatePlaceholders($entity); + } + + return $placeholders; + } +} diff --git a/packages/Webkul/Automation/src/Helpers/Entity/AbstractEntity.php b/packages/Webkul/Automation/src/Helpers/Entity/AbstractEntity.php new file mode 100644 index 0000000..b9d2dca --- /dev/null +++ b/packages/Webkul/Automation/src/Helpers/Entity/AbstractEntity.php @@ -0,0 +1,232 @@ +getAttributes($this->entityType); + } + + /** + * Get attributes for entity. + */ + public function getAttributes(string $entityType, array $skipAttributes = ['textarea', 'image', 'file', 'address']): array + { + $attributes = []; + + foreach ($this->attributeRepository->findByField('entity_type', $entityType) as $attribute) { + if (in_array($attribute->type, $skipAttributes)) { + continue; + } + + if ($attribute->lookup_type) { + $options = []; + } else { + $options = $attribute->options; + } + + $attributes[] = [ + 'id' => $attribute->code, + 'type' => $attribute->type, + 'name' => $attribute->name, + 'lookup_type' => $attribute->lookup_type, + 'options' => $options, + ]; + } + + return $attributes; + } + + /** + * Returns placeholders for email templates. + */ + public function getEmailTemplatePlaceholders(array $entity): array + { + $menuItems = []; + + foreach ($this->getAttributes($this->entityType) as $attribute) { + $menuItems[] = [ + 'text' => $attribute['name'], + 'value' => '{%'.$this->entityType.'.'.$attribute['id'].'%}', + ]; + } + + return [ + 'text' => $entity['name'], + 'menu' => $menuItems, + ]; + } + + /** + * Replace placeholders with values. + */ + public function replacePlaceholders(mixed $entity, string $content): string + { + foreach ($this->getAttributes($this->entityType, []) as $attribute) { + $value = ''; + + switch ($attribute['type']) { + case 'price': + $value = core()->formatBasePrice($entity->{$attribute['id']}); + + break; + + case 'boolean': + $value = $entity->{$attribute['id']} ? __('admin::app.common.yes') : __('admin::app.common.no'); + + break; + + case 'select': + case 'radio': + case 'lookup': + if ($attribute['lookup_type']) { + $option = $this->attributeRepository->getLookUpEntity($attribute['lookup_type'], $entity->{$attribute['id']}); + } else { + $option = $attribute['options']->where('id', $entity->{$attribute['id']})->first(); + } + + $value = $option ? $option->name : ''; + + break; + + case 'multiselect': + case 'checkbox': + if ($attribute['lookup_type']) { + $options = $this->attributeRepository->getLookUpEntity($attribute['lookup_type'], explode(',', $entity->{$attribute['id']})); + } else { + $options = $attribute['options']->whereIn('id', explode(',', $entity->{$attribute['id']})); + } + + $optionsLabels = []; + + foreach ($options as $key => $option) { + $optionsLabels[] = $option->name; + } + + $value = implode(', ', $optionsLabels); + + break; + + case 'email': + case 'phone': + if (! is_array($entity->{$attribute['id']})) { + break; + } + + $optionsLabels = []; + + foreach ($entity->{$attribute['id']} as $item) { + $optionsLabels[] = $item['value'].' ('.$item['label'].')'; + } + + $value = implode(', ', $optionsLabels); + + break; + + case 'address': + if (! $entity->{$attribute['id']} || ! count(array_filter($entity->{$attribute['id']}))) { + break; + } + + $value = $entity->{$attribute['id']}['address'].'
    ' + .$entity->{$attribute['id']}['postcode'].' '.$entity->{$attribute['id']}['city'].'
    ' + .core()->state_name($entity->{$attribute['id']}['state']).'
    ' + .core()->country_name($entity->{$attribute['id']}['country']).'
    '; + + break; + + case 'date': + if ($entity->{$attribute['id']}) { + $value = ! is_object($entity->{$attribute['id']}) + ? Carbon::parse($entity->{$attribute['id']}) + : $entity->{$attribute['id']}->format('D M d, Y'); + } else { + $value = 'N/A'; + } + + break; + + case 'datetime': + if ($entity->{$attribute['id']}) { + $value = ! is_object($entity->{$attribute['id']}) + ? Carbon::parse($entity->{$attribute['id']}) + : $entity->{$attribute['id']}->format('D M d, Y H:i A'); + } else { + $value = 'N/A'; + } + + break; + + default: + $value = $entity->{$attribute['id']}; + + break; + } + + $content = strtr($content, [ + '{%'.$this->entityType.'.'.$attribute['id'].'%}' => $value, + '{% '.$this->entityType.'.'.$attribute['id'].' %}' => $value, + ]); + } + + return $content; + } + + /** + * Trigger webhook. + * + * @return void + */ + public function triggerWebhook(int $webhookId, mixed $entity) + { + $webhook = $this->webhookRepository->findOrFail($webhookId); + + $payload = [ + 'method' => $webhook->method, + 'query_params' => $this->replacePlaceholders($entity, json_encode($webhook->query_params)), + 'end_point' => $this->replacePlaceholders($entity, $webhook->end_point), + 'payload' => $this->replacePlaceholders($entity, json_encode($webhook->payload)), + 'headers' => $this->replacePlaceholders($entity, json_encode($webhook->headers)), + ]; + + $this->webhookService->triggerWebhook($payload); + } +} diff --git a/packages/Webkul/Automation/src/Helpers/Entity/Activity.php b/packages/Webkul/Automation/src/Helpers/Entity/Activity.php new file mode 100644 index 0000000..41a9ef4 --- /dev/null +++ b/packages/Webkul/Automation/src/Helpers/Entity/Activity.php @@ -0,0 +1,323 @@ + 'title', + 'type' => 'text', + 'name' => 'Title', + 'lookup_type' => null, + 'options' => collect(), + ], [ + 'id' => 'type', + 'type' => 'multiselect', + 'name' => 'Type', + 'lookup_type' => null, + 'options' => collect([ + (object) [ + 'id' => 'note', + 'name' => 'Note', + ], (object) [ + 'id' => 'call', + 'name' => 'Call', + ], (object) [ + 'id' => 'meeting', + 'name' => 'Meeting', + ], (object) [ + 'id' => 'lunch', + 'name' => 'Lunch', + ], (object) [ + 'id' => 'file', + 'name' => 'File', + ], + ]), + ], [ + 'id' => 'location', + 'type' => 'text', + 'name' => 'Location', + 'lookup_type' => null, + 'options' => collect(), + ], [ + 'id' => 'comment', + 'type' => 'textarea', + 'name' => 'Comment', + 'lookup_type' => null, + 'options' => collect(), + ], [ + 'id' => 'schedule_from', + 'type' => 'datetime', + 'name' => 'Schedule From', + 'lookup_type' => null, + 'options' => collect(), + ], [ + 'id' => 'schedule_to', + 'type' => 'datetime', + 'name' => 'Schedule To', + 'lookup_type' => null, + 'options' => collect(), + ], [ + 'id' => 'user_id', + 'type' => 'select', + 'name' => 'User', + 'lookup_type' => 'users', + 'options' => $this->attributeRepository->getLookUpOptions('users'), + ], + ]; + + return $attributes; + } + + /** + * Returns placeholders for email templates. + */ + public function getEmailTemplatePlaceholders(array $entity): array + { + $emailTemplates = parent::getEmailTemplatePlaceholders($entity); + + $emailTemplates['menu'][] = [ + 'text' => 'Participants', + 'value' => '{%activities.participants%}', + ]; + + return $emailTemplates; + } + + /** + * Replace placeholders with values. + */ + public function replacePlaceholders(mixed $entity, string $content): string + { + $content = parent::replacePlaceholders($entity, $content); + + $value = '

    '; + + return strtr($content, [ + '{%'.$this->entityType.'.participants%}' => $value, + '{% '.$this->entityType.'.participants %}' => $value, + ]); + } + + /** + * Listing of the entities. + */ + public function getEntity(mixed $entity): mixed + { + if (! $entity instanceof ContractsActivity) { + $entity = $this->activityRepository->find($entity); + } + + return $entity; + } + + /** + * Returns workflow actions. + */ + public function getActions(): array + { + $emailTemplates = $this->emailTemplateRepository->all(['id', 'name']); + + $webhooksOptions = $this->webhookRepository->all(['id', 'name']); + + return [ + [ + 'id' => 'update_related_leads', + 'name' => trans('admin::app.settings.workflows.helpers.update-related-leads'), + 'attributes' => $this->getAttributes('leads'), + ], [ + 'id' => 'send_email_to_sales_owner', + 'name' => trans('admin::app.settings.workflows.helpers.send-email-to-sales-owner'), + 'options' => $emailTemplates, + ], [ + 'id' => 'send_email_to_participants', + 'name' => trans('admin::app.settings.workflows.helpers.send-email-to-participants'), + 'options' => $emailTemplates, + ], [ + 'id' => 'trigger_webhook', + 'name' => trans('admin::app.settings.workflows.helpers.add-webhook'), + 'options' => $webhooksOptions, + ], + ]; + } + + /** + * Execute workflow actions. + */ + public function executeActions(mixed $workflow, mixed $activity): void + { + foreach ($workflow->actions as $action) { + switch ($action['id']) { + case 'update_related_leads': + $leadIds = $this->activityRepository->getModel() + ->leftJoin('lead_activities', 'activities.id', 'lead_activities.activity_id') + ->leftJoin('leads', 'lead_activities.lead_id', 'leads.id') + ->addSelect('leads.id') + ->where('activities.id', $activity->id) + ->pluck('id'); + + foreach ($leadIds as $leadId) { + $this->leadRepository->update( + [ + 'entity_type' => 'leads', + $action['attribute'] => $action['value'], + ], + $leadId, + [$action['attribute']] + ); + } + + break; + + case 'send_email_to_sales_owner': + $emailTemplate = $this->emailTemplateRepository->find($action['value']); + + if (! $emailTemplate) { + break; + } + + try { + Mail::queue(new Common([ + 'to' => $activity->user->email, + 'subject' => $this->replacePlaceholders($activity, $emailTemplate->subject), + 'body' => $this->replacePlaceholders($activity, $emailTemplate->content), + 'attachments' => [ + [ + 'name' => 'invite.ics', + 'mime' => 'text/calendar', + 'content' => $this->getICSContent($activity), + ], + ], + ])); + } catch (\Exception $e) { + } + + break; + + case 'send_email_to_participants': + $emailTemplate = $this->emailTemplateRepository->find($action['value']); + + if (! $emailTemplate) { + break; + } + + try { + foreach ($activity->participants as $participant) { + Mail::queue(new Common([ + 'to' => $participant->user + ? $participant->user->email + : data_get($participant->person->emails, '*.value'), + 'subject' => $this->replacePlaceholders($activity, $emailTemplate->subject), + 'body' => $this->replacePlaceholders($activity, $emailTemplate->content), + 'attachments' => [ + [ + 'name' => 'invite.ics', + 'mime' => 'text/calendar', + 'content' => $this->getICSContent($activity), + ], + ], + ])); + } + } catch (\Exception $e) { + } + + break; + + case 'trigger_webhook': + try { + $this->triggerWebhook($action['value'], $activity); + } catch (\Exception $e) { + report($e); + } + + break; + } + } + } + + /** + * Returns .ics file for attachments. + */ + public function getICSContent(ContractsActivity $activity): string + { + $content = [ + 'BEGIN:VCALENDAR', + 'VERSION:2.0', + 'PRODID:-//Krayincrm//Krayincrm//EN', + 'BEGIN:VEVENT', + 'UID:'.time().'-'.$activity->id, + 'DTSTAMP:'.Carbon::now()->format('YmdTHis'), + 'CREATED:'.$activity->created_at->format('YmdTHis'), + 'SEQUENCE:1', + 'ORGANIZER;CN='.$activity->user->name.':MAILTO:'.$activity->user->email, + ]; + + foreach ($activity->participants as $participant) { + if ($participant->user) { + $content[] = 'ATTENDEE;ROLE=REQ-PARTICIPANT;CN='.$participant->user->name.';PARTSTAT=NEEDS-ACTION:MAILTO:'.$participant->user->email; + } else { + foreach (data_get($participant->person->emails, '*.value') as $email) { + $content[] = 'ATTENDEE;ROLE=REQ-PARTICIPANT;CN='.$participant->person->name.';PARTSTAT=NEEDS-ACTION:MAILTO:'.$email; + } + } + } + + $content = array_merge($content, [ + 'DTSTART:'.$activity->schedule_from->format('YmdTHis'), + 'DTEND:'.$activity->schedule_to->format('YmdTHis'), + 'SUMMARY:'.$activity->title, + 'LOCATION:'.$activity->location, + 'DESCRIPTION:'.$activity->comment, + 'END:VEVENT', + 'END:VCALENDAR', + ]); + + return implode("\r\n", $content); + } +} diff --git a/packages/Webkul/Automation/src/Helpers/Entity/Lead.php b/packages/Webkul/Automation/src/Helpers/Entity/Lead.php new file mode 100644 index 0000000..bf10a7f --- /dev/null +++ b/packages/Webkul/Automation/src/Helpers/Entity/Lead.php @@ -0,0 +1,210 @@ +leadRepository->find($entity); + } + + return $entity; + } + + /** + * Returns attributes. + */ + public function getAttributes(string $entityType, array $skipAttributes = ['textarea', 'image', 'file', 'address']): array + { + return parent::getAttributes($entityType, $skipAttributes); + } + + /** + * Returns workflow actions. + */ + public function getActions(): array + { + $emailTemplates = $this->emailTemplateRepository->all(['id', 'name']); + + $webhooksOptions = $this->webhookRepository->all(['id', 'name']); + + return [ + [ + 'id' => 'update_lead', + 'name' => trans('admin::app.settings.workflows.helpers.update-lead'), + 'attributes' => $this->getAttributes('leads'), + ], [ + 'id' => 'update_person', + 'name' => trans('admin::app.settings.workflows.helpers.update-person'), + 'attributes' => $this->getAttributes('persons'), + ], [ + 'id' => 'send_email_to_person', + 'name' => trans('admin::app.settings.workflows.helpers.send-email-to-person'), + 'options' => $emailTemplates, + ], [ + 'id' => 'send_email_to_sales_owner', + 'name' => trans('admin::app.settings.workflows.helpers.send-email-to-sales-owner'), + 'options' => $emailTemplates, + ], [ + 'id' => 'add_tag', + 'name' => trans('admin::app.settings.workflows.helpers.add-tag'), + ], [ + 'id' => 'add_note_as_activity', + 'name' => trans('admin::app.settings.workflows.helpers.add-note-as-activity'), + ], [ + 'id' => 'trigger_webhook', + 'name' => trans('admin::app.settings.workflows.helpers.add-webhook'), + 'options' => $webhooksOptions, + ], + ]; + } + + /** + * Execute workflow actions. + */ + public function executeActions(mixed $workflow, mixed $lead): void + { + foreach ($workflow->actions as $action) { + switch ($action['id']) { + case 'update_lead': + $this->leadRepository->update( + [ + 'entity_type' => 'leads', + $action['attribute'] => $action['value'], + ], + $lead->id, + [$action['attribute']] + ); + + break; + + case 'update_person': + $this->personRepository->update([ + 'entity_type' => 'persons', + $action['attribute'] => $action['value'], + ], $lead->person_id); + + break; + + case 'send_email_to_person': + $emailTemplate = $this->emailTemplateRepository->find($action['value']); + + if (! $emailTemplate) { + break; + } + + try { + Mail::queue(new Common([ + 'to' => data_get($lead->person->emails, '*.value'), + 'subject' => $this->replacePlaceholders($lead, $emailTemplate->subject), + 'body' => $this->replacePlaceholders($lead, $emailTemplate->content), + ])); + } catch (\Exception $e) { + } + + break; + + case 'send_email_to_sales_owner': + $emailTemplate = $this->emailTemplateRepository->find($action['value']); + + if (! $emailTemplate) { + break; + } + + try { + Mail::queue(new Common([ + 'to' => $lead->user->email, + 'subject' => $this->replacePlaceholders($lead, $emailTemplate->subject), + 'body' => $this->replacePlaceholders($lead, $emailTemplate->content), + ])); + } catch (\Exception $e) { + } + + break; + + case 'add_tag': + $colors = [ + '#337CFF', + '#FEBF00', + '#E5549F', + '#27B6BB', + '#FB8A3F', + '#43AF52', + ]; + + if (! $tag = $this->tagRepository->findOneByField('name', $action['value'])) { + $tag = $this->tagRepository->create([ + 'name' => $action['value'], + 'color' => $colors[rand(0, 5)], + 'user_id' => auth()->guard('user')->user()->id, + ]); + } + + if (! $lead->tags->contains($tag->id)) { + $lead->tags()->attach($tag->id); + } + + break; + + case 'add_note_as_activity': + $activity = $this->activityRepository->create([ + 'type' => 'note', + 'comment' => $action['value'], + 'is_done' => 1, + 'user_id' => auth()->guard('user')->user()->id, + ]); + + $lead->activities()->attach($activity->id); + + break; + + case 'trigger_webhook': + try { + $this->triggerWebhook($action['value'], $lead); + } catch (\Exception $e) { + report($e); + } + + break; + } + } + } +} diff --git a/packages/Webkul/Automation/src/Helpers/Entity/Person.php b/packages/Webkul/Automation/src/Helpers/Entity/Person.php new file mode 100644 index 0000000..0c81980 --- /dev/null +++ b/packages/Webkul/Automation/src/Helpers/Entity/Person.php @@ -0,0 +1,140 @@ +personRepository->find($entity); + } + + return $entity; + } + + /** + * Returns workflow actions. + */ + public function getActions(): array + { + $emailTemplates = $this->emailTemplateRepository->all(['id', 'name']); + + $webhooksOptions = $this->webhookRepository->all(['id', 'name']); + + return [ + [ + 'id' => 'update_person', + 'name' => trans('admin::app.settings.workflows.helpers.update-person'), + 'attributes' => $this->getAttributes('persons'), + ], [ + 'id' => 'update_related_leads', + 'name' => trans('admin::app.settings.workflows.helpers.update-related-leads'), + 'attributes' => $this->getAttributes('leads'), + ], [ + 'id' => 'send_email_to_person', + 'name' => trans('admin::app.settings.workflows.helpers.send-email-to-person'), + 'options' => $emailTemplates, + ], [ + 'id' => 'trigger_webhook', + 'name' => trans('admin::app.settings.workflows.helpers.add-webhook'), + 'options' => $webhooksOptions, + ], + ]; + } + + /** + * Execute workflow actions. + */ + public function executeActions(mixed $workflow, mixed $person): void + { + foreach ($workflow->actions as $action) { + switch ($action['id']) { + case 'update_person': + $this->personRepository->update([ + 'entity_type' => 'persons', + $action['attribute'] => $action['value'], + ], $person->id); + + break; + + case 'update_related_leads': + $leads = $this->leadRepository->findByField('person_id', $person->id); + + foreach ($leads as $lead) { + $this->leadRepository->update( + [ + 'entity_type' => 'leads', + $action['attribute'] => $action['value'], + ], + $lead->id, + [$action['attribute']] + ); + } + + break; + + case 'send_email_to_person': + $emailTemplate = $this->emailTemplateRepository->find($action['value']); + + if (! $emailTemplate) { + break; + } + + try { + Mail::queue(new Common([ + 'to' => data_get($person->emails, '*.value'), + 'subject' => $this->replacePlaceholders($person, $emailTemplate->subject), + 'body' => $this->replacePlaceholders($person, $emailTemplate->content), + ])); + } catch (\Exception $e) { + report($e); + } + + break; + + case 'trigger_webhook': + try { + $this->triggerWebhook($action['value'], $person); + } catch (\Exception $e) { + report($e); + } + + break; + } + } + } +} diff --git a/packages/Webkul/Automation/src/Helpers/Entity/Quote.php b/packages/Webkul/Automation/src/Helpers/Entity/Quote.php new file mode 100644 index 0000000..699c745 --- /dev/null +++ b/packages/Webkul/Automation/src/Helpers/Entity/Quote.php @@ -0,0 +1,172 @@ +quoteRepository->find($entity); + } + + return $entity; + } + + /** + * Returns workflow actions. + */ + public function getActions(): array + { + $emailTemplates = $this->emailTemplateRepository->all(['id', 'name']); + + $webhookOptions = $this->webhookRepository->all(['id', 'name']); + + return [ + [ + 'id' => 'update_quote', + 'name' => trans('admin::app.settings.workflows.helpers.update-quote'), + 'attributes' => $this->getAttributes('quotes'), + ], [ + 'id' => 'update_person', + 'name' => trans('admin::app.settings.workflows.helpers.update-person'), + 'attributes' => $this->getAttributes('persons'), + ], [ + 'id' => 'update_related_leads', + 'name' => trans('admin::app.settings.workflows.helpers.update-related-leads'), + 'attributes' => $this->getAttributes('leads'), + ], [ + 'id' => 'send_email_to_person', + 'name' => trans('admin::app.settings.workflows.helpers.send-email-to-person'), + 'options' => $emailTemplates, + ], [ + 'id' => 'send_email_to_sales_owner', + 'name' => trans('admin::app.settings.workflows.helpers.send-email-to-sales-owner'), + 'options' => $emailTemplates, + ], [ + 'id' => 'trigger_webhook', + 'name' => trans('admin::app.settings.workflows.helpers.add-webhook'), + 'options' => $webhookOptions, + ], + ]; + } + + /** + * Execute workflow actions. + */ + public function executeActions(mixed $workflow, mixed $quote): void + { + foreach ($workflow->actions as $action) { + switch ($action['id']) { + case 'update_quote': + $this->quoteRepository->update([ + 'entity_type' => 'quotes', + $action['attribute'] => $action['value'], + ], $quote->id); + + break; + + case 'update_person': + $this->personRepository->update([ + 'entity_type' => 'persons', + $action['attribute'] => $action['value'], + ], $quote->person_id); + + break; + + case 'update_related_leads': + foreach ($quote->leads as $lead) { + $this->leadRepository->update( + [ + 'entity_type' => 'leads', + $action['attribute'] => $action['value'], + ], + $lead->id, + [$action['attribute']] + ); + } + + break; + + case 'send_email_to_person': + $emailTemplate = $this->emailTemplateRepository->find($action['value']); + + if (! $emailTemplate) { + break; + } + + try { + Mail::queue(new Common([ + 'to' => data_get($quote->person->emails, '*.value'), + 'subject' => $this->replacePlaceholders($quote, $emailTemplate->subject), + 'body' => $this->replacePlaceholders($quote, $emailTemplate->content), + ])); + } catch (\Exception $e) { + } + + break; + + case 'send_email_to_sales_owner': + $emailTemplate = $this->emailTemplateRepository->find($action['value']); + + if (! $emailTemplate) { + break; + } + + try { + Mail::queue(new Common([ + 'to' => $quote->user->email, + 'subject' => $this->replacePlaceholders($quote, $emailTemplate->subject), + 'body' => $this->replacePlaceholders($quote, $emailTemplate->content), + ])); + } catch (\Exception $e) { + } + + break; + + case 'trigger_webhook': + try { + $this->triggerWebhook($action['value'], $quote); + } catch (\Exception $e) { + report($e); + } + + break; + } + } + } +} diff --git a/packages/Webkul/Automation/src/Helpers/Validator.php b/packages/Webkul/Automation/src/Helpers/Validator.php new file mode 100644 index 0000000..908cf8b --- /dev/null +++ b/packages/Webkul/Automation/src/Helpers/Validator.php @@ -0,0 +1,183 @@ +conditions) { + return true; + } + + $validConditionCount = $totalConditionCount = 0; + + foreach ($workflow->conditions as $condition) { + if (! $condition['attribute'] + || ! isset($condition['value']) + || is_null($condition['value']) + || $condition['value'] == '' + ) { + continue; + } + + $totalConditionCount++; + + if ($workflow->condition_type == 'and') { + if (! $this->validateEntity($condition, $entity)) { + return false; + } else { + $validConditionCount++; + } + } else { + if ($this->validateEntity($condition, $entity)) { + return true; + } + } + } + + return $validConditionCount == $totalConditionCount ? true : false; + } + + /** + * Validate object + * + * @param array $condition + * @param mixed $entity + * @return bool + */ + private function validateEntity($condition, $entity) + { + return $this->validateAttribute( + $condition, + $this->getAttributeValue($condition, $entity) + ); + } + + /** + * Return value for the attribute + * + * @param array $condition + * @param mixed $entity + * @return bool + */ + public function getAttributeValue($condition, $entity) + { + $value = $entity->{$condition['attribute']}; + + if (! in_array($condition['attribute_type'], ['multiselect', 'checkbox'])) { + return $value; + } + + return $value ? explode(',', $value) : []; + } + + /** + * Validate attribute value for condition + * + * @param array $condition + * @param mixed $attributeValue + * @return bool + */ + public function validateAttribute($condition, $attributeValue) + { + switch ($condition['operator']) { + case '==': case '!=': + if (is_array($condition['value'])) { + if (! is_array($attributeValue)) { + return false; + } + + $result = ! empty(array_intersect($condition['value'], $attributeValue)); + } elseif (is_object($attributeValue)) { + $result = $attributeValue->value == $condition['value']; + } else { + if (is_array($attributeValue)) { + $result = count($attributeValue) == 1 && array_shift($attributeValue) == $condition['value']; + } else { + $result = $attributeValue == $condition['value']; + } + } + + break; + + case '<=': case '>': + if (! is_scalar($attributeValue)) { + return false; + } + + $result = $attributeValue <= $condition['value']; + + break; + + case '>=': case '<': + if (! is_scalar($attributeValue)) { + return false; + } + + $result = $attributeValue >= $condition['value']; + + break; + + case '{}': case '!{}': + if (is_scalar($attributeValue) && is_array($condition['value'])) { + foreach ($condition['value'] as $item) { + if (stripos($attributeValue, $item) !== false) { + $result = true; + + break; + } + } + } elseif (is_array($condition['value'])) { + if (! is_array($attributeValue)) { + return false; + } + + $result = ! empty(array_intersect($condition['value'], $attributeValue)); + } else { + if (is_array($attributeValue)) { + $result = self::validateArrayValues($attributeValue, $condition['value']); + } else { + $result = strpos($attributeValue, $condition['value']) !== false; + } + } + + break; + } + + if (in_array($condition['operator'], ['!=', '>', '<', '!{}'])) { + $result = ! $result; + } + + return $result; + } + + /** + * Validate the condition value against a multi dimensional array recursively + */ + private static function validateArrayValues(array $attributeValue, string $conditionValue): bool + { + if (in_array($conditionValue, $attributeValue, true) === true) { + return true; + } + + foreach ($attributeValue as $subValue) { + if (! is_array($subValue)) { + continue; + } + + if (self::validateArrayValues($subValue, $conditionValue) === true) { + return true; + } + } + + return false; + } +} diff --git a/packages/Webkul/Automation/src/Listeners/Entity.php b/packages/Webkul/Automation/src/Listeners/Entity.php new file mode 100644 index 0000000..0ca4f05 --- /dev/null +++ b/packages/Webkul/Automation/src/Listeners/Entity.php @@ -0,0 +1,45 @@ +workflowRepository->findByField('event', $eventName); + + foreach ($workflows as $workflow) { + $workflowEntity = app(config('workflows.trigger_entities.'.$workflow->entity_type.'.class')); + + $entity = $workflowEntity->getEntity($entity); + + if (! $this->validator->validate($workflow, $entity)) { + continue; + } + + try { + $workflowEntity->executeActions($workflow, $entity); + } catch (\Exception $e) { + logger()->error($e->getMessage()); + } + } + } +} diff --git a/packages/Webkul/Automation/src/Models/Webhook.php b/packages/Webkul/Automation/src/Models/Webhook.php new file mode 100644 index 0000000..5c8e9e6 --- /dev/null +++ b/packages/Webkul/Automation/src/Models/Webhook.php @@ -0,0 +1,41 @@ + + */ + protected $fillable = [ + 'name', + 'entity_type', + 'description', + 'method', + 'end_point', + 'query_params', + 'headers', + 'payload_type', + 'raw_payload_type', + 'payload', + ]; + + /** + * The attributes that should be cast to native types. + * + * @var array + */ + protected $casts = [ + 'query_params' => 'array', + 'headers' => 'array', + 'payload' => 'array', + ]; +} diff --git a/packages/Webkul/Automation/src/Models/WebhookProxy.php b/packages/Webkul/Automation/src/Models/WebhookProxy.php new file mode 100644 index 0000000..7e46e10 --- /dev/null +++ b/packages/Webkul/Automation/src/Models/WebhookProxy.php @@ -0,0 +1,7 @@ + 'array', + 'actions' => 'array', + ]; + + protected $fillable = [ + 'name', + 'description', + 'entity_type', + 'event', + 'condition_type', + 'conditions', + 'actions', + ]; +} diff --git a/packages/Webkul/Automation/src/Models/WorkflowProxy.php b/packages/Webkul/Automation/src/Models/WorkflowProxy.php new file mode 100644 index 0000000..36ae76b --- /dev/null +++ b/packages/Webkul/Automation/src/Models/WorkflowProxy.php @@ -0,0 +1,7 @@ +loadMigrationsFrom(__DIR__.'/../Database/Migrations'); + + Event::listen('*', function ($eventName, array $data) { + if (! in_array($eventName, data_get(config('workflows.trigger_entities'), '*.events.*.event'))) { + return; + } + + app(\Webkul\Automation\Listeners\Entity::class)->process($eventName, current($data)); + }); + } + + /** + * Register services. + * + * @return void + */ + public function register() + { + $this->registerConfig(); + } + + /** + * Register package config. + * + * @return void + */ + protected function registerConfig() + { + $this->mergeConfigFrom(dirname(__DIR__).'/Config/workflows.php', 'workflows'); + } +} diff --git a/packages/Webkul/Automation/src/Repositories/WebhookRepository.php b/packages/Webkul/Automation/src/Repositories/WebhookRepository.php new file mode 100644 index 0000000..629f4d7 --- /dev/null +++ b/packages/Webkul/Automation/src/Repositories/WebhookRepository.php @@ -0,0 +1,17 @@ +client = new Client([ + 'timeout' => 30, + 'connect_timeout' => 10, + 'verify' => true, + 'http_errors' => false, + ]); + } + + /** + * Trigger the webhook. + */ + public function triggerWebhook(mixed $data): array + { + if ( + ! isset($data['method']) + || ! isset($data['end_point']) + ) { + return [ + 'status' => 'error', + 'response' => 'Missing required fields: method or end_point', + ]; + } + + $headers = isset($data['headers']) ? $this->parseJsonField($data['headers']) : []; + $payload = isset($data['payload']) ? $data['payload'] : null; + $data['end_point'] = $this->appendQueryParams($data['end_point'], $data['query_params'] ?? ''); + + $formattedHeaders = $this->formatHeaders($headers); + + $options = $this->buildRequestOptions($data['method'], $formattedHeaders, $payload); + + try { + $response = $this->client->request( + strtoupper($data['method']), + $data['end_point'], + $options, + ); + + return [ + 'status' => 'success', + 'response' => $response->getBody()->getContents(), + 'status_code' => $response->getStatusCode(), + 'headers' => $response->getHeaders(), + ]; + } catch (RequestException $e) { + return [ + 'status' => 'error', + 'response' => $e->hasResponse() ? Message::toString($e->getResponse()) : $e->getMessage(), + 'status_code' => $e->hasResponse() ? $e->getResponse()->getStatusCode() : null, + ]; + } + } + + /** + * Parse JSON field safely. + */ + protected function parseJsonField(mixed $field): array + { + if (is_array($field)) { + return $field; + } + + if (is_string($field)) { + $decoded = json_decode($field, true); + + if ( + json_last_error() === JSON_ERROR_NONE + && is_array($decoded) + ) { + return $decoded; + } + } + + return []; + } + + /** + * Build request options based on method and content type. + */ + protected function buildRequestOptions(string $method, array $headers, mixed $payload): array + { + $options = []; + + if (! empty($headers)) { + $options['headers'] = $headers; + } + + if ( + $payload !== null + && ! in_array(strtoupper($method), ['GET', 'HEAD']) + ) { + $contentType = $this->getContentType($headers); + + switch ($contentType) { + case 'application/json': + $options['json'] = $this->prepareJsonPayload($payload); + + break; + + case 'application/x-www-form-urlencoded': + $options['form_params'] = $this->prepareFormPayload($payload); + + break; + + case 'multipart/form-data': + $options['multipart'] = $this->prepareMultipartPayload($payload); + + break; + + case 'text/plain': + case 'text/xml': + case 'application/xml': + $options['body'] = $this->prepareRawPayload($payload); + + break; + + default: + $options = array_merge($options, $this->autoDetectPayloadFormat($payload)); + + break; + } + } + + return $options; + } + + /** + * Prepare JSON payload. + */ + protected function prepareJsonPayload(mixed $payload): mixed + { + if (is_string($payload)) { + $decoded = json_decode($payload, true); + + if (json_last_error() === JSON_ERROR_NONE) { + return $decoded; + } + + return $payload; + } + + if (is_array($payload)) { + return $this->formatPayload($payload); + } + + return $payload; + } + + /** + * Prepare form payload. + */ + protected function prepareFormPayload(mixed $payload): array + { + if (is_string($payload)) { + $decoded = json_decode($payload, true); + + if ( + json_last_error() === JSON_ERROR_NONE + && is_array($decoded) + ) { + return $this->formatPayload($decoded); + } + + parse_str($payload, $parsed); + + return $parsed ?: []; + } + + if (is_array($payload)) { + return $this->formatPayload($payload); + } + + return []; + } + + /** + * Prepare multipart payload. + */ + protected function prepareMultipartPayload(mixed $payload): array + { + $formattedPayload = $this->prepareFormPayload($payload); + + return $this->buildMultipartData($formattedPayload); + } + + /** + * Prepare raw payload. + */ + protected function prepareRawPayload(mixed $payload): string + { + if (is_string($payload)) { + return $payload; + } + + if (is_array($payload)) { + return json_encode($payload); + } + + return (string) $payload; + } + + /** + * Auto-detect payload format when no content-type is specified. + */ + protected function autoDetectPayloadFormat(mixed $payload): array + { + if (is_string($payload)) { + $decoded = json_decode($payload, true); + + if (json_last_error() === JSON_ERROR_NONE) { + return ['json' => $decoded]; + } + + if ( + strpos($payload, '=') !== false + && strpos($payload, '&') !== false + ) { + parse_str($payload, $parsed); + + return ['form_params' => $parsed]; + } + + return ['body' => $payload]; + } + + if (is_array($payload)) { + $formatted = $this->formatPayload($payload); + + return ['json' => $formatted]; + } + + return ['body' => (string) $payload]; + } + + /** + * Get content type from headers. + */ + protected function getContentType(array $headers): string + { + foreach ($headers as $key => $value) { + if (strtolower($key) === 'content-type') { + $contentType = strtolower(trim(explode(';', $value)[0])); + + return $contentType; + } + } + + return ''; + } + + /** + * Build multipart data array. + */ + protected function buildMultipartData(array $payload): array + { + $multipart = []; + + foreach ($payload as $key => $value) { + $multipart[] = [ + 'name' => $key, + 'contents' => is_array($value) ? json_encode($value) : (string) $value, + ]; + } + + return $multipart; + } + + /** + * Format headers array. + */ + protected function formatHeaders(array $headers): array + { + if (empty($headers)) { + return []; + } + + $formattedHeaders = []; + + if ($this->isKeyValuePairArray($headers)) { + foreach ($headers as $header) { + if ( + isset($header['key']) + && array_key_exists('value', $header) + ) { + if ( + isset($header['disabled']) + && $header['disabled'] + ) { + continue; + } + + if ( + isset($header['enabled']) + && ! $header['enabled'] + ) { + continue; + } + + $formattedHeaders[$header['key']] = $header['value']; + } + } + } else { + $formattedHeaders = $headers; + } + + return $formattedHeaders; + } + + /** + * Format any incoming payload into a clean associative array. + */ + protected function formatPayload(mixed $payload): array + { + if (empty($payload)) { + return []; + } + + if ( + is_array($payload) + && isset($payload['key']) + && array_key_exists('value', $payload) + ) { + return [$payload['key'] => $payload['value']]; + } + + if ( + is_array($payload) + && array_is_list($payload) + && $this->isKeyValuePairArray($payload) + ) { + $formatted = []; + + foreach ($payload as $item) { + if ( + isset($item['key']) + && array_key_exists('value', $item) + ) { + if ( + isset($item['disabled']) + && $item['disabled'] + ) { + continue; + } + + if ( + isset($item['enabled']) + && ! $item['enabled'] + ) { + continue; + } + + $formatted[$item['key']] = $item['value']; + } + } + + return $formatted; + } + + return is_array($payload) ? $payload : []; + } + + /** + * Check if array is a key-value pair array. + */ + protected function isKeyValuePairArray(array $array): bool + { + if (empty($array)) { + return false; + } + + if ( + isset($array['key']) + && array_key_exists('value', $array) + ) { + return true; + } + + if (array_is_list($array)) { + return collect($array)->every(fn ($item) => is_array($item) && isset($item['key']) && array_key_exists('value', $item) + ); + } + + return false; + } + + /** + * Append query parameters to the endpoint URL. + */ + protected function appendQueryParams(string $endPoint, string $queryParamsJson): string + { + $queryParams = json_decode($queryParamsJson, true); + + if ( + json_last_error() !== JSON_ERROR_NONE + || ! is_array($queryParams) + ) { + return $endPoint; + } + + $queryArray = []; + + foreach ($queryParams as $param) { + if ( + isset($param['key']) + && array_key_exists('value', $param) + ) { + $queryArray[$param['key']] = $param['value']; + } + } + + $queryString = http_build_query($queryArray); + + $glue = str_contains($endPoint, '?') ? '&' : '?'; + + return $endPoint.($queryString ? $glue.$queryString : ''); + } +} diff --git a/packages/Webkul/Contact/composer.json b/packages/Webkul/Contact/composer.json new file mode 100755 index 0000000..205e43f --- /dev/null +++ b/packages/Webkul/Contact/composer.json @@ -0,0 +1,28 @@ +{ + "name": "krayin/laravel-contact", + "license": "MIT", + "authors": [ + { + "name": "Jitendra Singh", + "email": "jitendra@webkul.com" + } + ], + "require": { + "krayin/laravel-attribute": "^1.0", + "krayin/laravel-core": "^1.0" + }, + "autoload": { + "psr-4": { + "Webkul\\Contact\\": "src/" + } + }, + "extra": { + "laravel": { + "providers": [ + "Webkul\\Contact\\Providers\\ContactServiceProvider" + ], + "aliases": {} + } + }, + "minimum-stability": "dev" +} \ No newline at end of file diff --git a/packages/Webkul/Contact/src/Contracts/Organization.php b/packages/Webkul/Contact/src/Contracts/Organization.php new file mode 100644 index 0000000..50b0e12 --- /dev/null +++ b/packages/Webkul/Contact/src/Contracts/Organization.php @@ -0,0 +1,5 @@ + $this->faker->name(), + 'emails' => [$this->faker->unique()->safeEmail()], + 'contact_numbers' => [$this->faker->randomNumber(9)], + ]; + } +} diff --git a/packages/Webkul/Contact/src/Database/Migrations/2021_04_09_051326_create_organizations_table.php b/packages/Webkul/Contact/src/Database/Migrations/2021_04_09_051326_create_organizations_table.php new file mode 100644 index 0000000..8a2e106 --- /dev/null +++ b/packages/Webkul/Contact/src/Database/Migrations/2021_04_09_051326_create_organizations_table.php @@ -0,0 +1,34 @@ +increments('id'); + $table->string('name'); + $table->json('address')->nullable(); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('organizations'); + } +}; diff --git a/packages/Webkul/Contact/src/Database/Migrations/2021_04_09_065617_create_persons_table.php b/packages/Webkul/Contact/src/Database/Migrations/2021_04_09_065617_create_persons_table.php new file mode 100644 index 0000000..fc98d3b --- /dev/null +++ b/packages/Webkul/Contact/src/Database/Migrations/2021_04_09_065617_create_persons_table.php @@ -0,0 +1,37 @@ +increments('id'); + $table->string('name'); + $table->json('emails'); + $table->json('contact_numbers')->nullable(); + + $table->integer('organization_id')->unsigned()->nullable(); + $table->foreign('organization_id')->references('id')->on('organizations')->onDelete('cascade'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('persons'); + } +}; diff --git a/packages/Webkul/Contact/src/Database/Migrations/2021_09_22_194103_add_unique_index_to_name_in_organizations_table.php b/packages/Webkul/Contact/src/Database/Migrations/2021_09_22_194103_add_unique_index_to_name_in_organizations_table.php new file mode 100644 index 0000000..d383cd1 --- /dev/null +++ b/packages/Webkul/Contact/src/Database/Migrations/2021_09_22_194103_add_unique_index_to_name_in_organizations_table.php @@ -0,0 +1,32 @@ +unique('name'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('organizations', function (Blueprint $table) { + $table->dropUnique('organizations_name_unique'); + }); + } +}; diff --git a/packages/Webkul/Contact/src/Database/Migrations/2024_07_31_092951_add_job_title_in_persons_table.php b/packages/Webkul/Contact/src/Database/Migrations/2024_07_31_092951_add_job_title_in_persons_table.php new file mode 100644 index 0000000..ca4514c --- /dev/null +++ b/packages/Webkul/Contact/src/Database/Migrations/2024_07_31_092951_add_job_title_in_persons_table.php @@ -0,0 +1,28 @@ +string('job_title')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('persons', function (Blueprint $table) { + $table->dropColumn('job_title'); + }); + } +}; diff --git a/packages/Webkul/Contact/src/Database/Migrations/2024_08_06_145943_create_person_tags_table.php b/packages/Webkul/Contact/src/Database/Migrations/2024_08_06_145943_create_person_tags_table.php new file mode 100644 index 0000000..cd7c7dc --- /dev/null +++ b/packages/Webkul/Contact/src/Database/Migrations/2024_08_06_145943_create_person_tags_table.php @@ -0,0 +1,30 @@ +integer('tag_id')->unsigned(); + $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade'); + + $table->integer('person_id')->unsigned(); + $table->foreign('person_id')->references('id')->on('persons')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('person_tags'); + } +}; diff --git a/packages/Webkul/Contact/src/Database/Migrations/2024_08_06_161212_create_person_activities_table.php b/packages/Webkul/Contact/src/Database/Migrations/2024_08_06_161212_create_person_activities_table.php new file mode 100644 index 0000000..90917ef --- /dev/null +++ b/packages/Webkul/Contact/src/Database/Migrations/2024_08_06_161212_create_person_activities_table.php @@ -0,0 +1,30 @@ +integer('activity_id')->unsigned(); + $table->foreign('activity_id')->references('id')->on('activities')->onDelete('cascade'); + + $table->integer('person_id')->unsigned(); + $table->foreign('person_id')->references('id')->on('persons')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('lead_activities'); + } +}; diff --git a/packages/Webkul/Contact/src/Database/Migrations/2024_08_14_102116_add_user_id_column_in_persons_table.php b/packages/Webkul/Contact/src/Database/Migrations/2024_08_14_102116_add_user_id_column_in_persons_table.php new file mode 100644 index 0000000..069e669 --- /dev/null +++ b/packages/Webkul/Contact/src/Database/Migrations/2024_08_14_102116_add_user_id_column_in_persons_table.php @@ -0,0 +1,30 @@ +integer('user_id')->unsigned()->nullable(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('set null'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('persons', function (Blueprint $table) { + $table->dropForeign(['user_id']); + $table->dropColumn('user_id'); + }); + } +}; diff --git a/packages/Webkul/Contact/src/Database/Migrations/2024_08_14_102136_add_user_id_column_in_organizations_table.php b/packages/Webkul/Contact/src/Database/Migrations/2024_08_14_102136_add_user_id_column_in_organizations_table.php new file mode 100644 index 0000000..98f2910 --- /dev/null +++ b/packages/Webkul/Contact/src/Database/Migrations/2024_08_14_102136_add_user_id_column_in_organizations_table.php @@ -0,0 +1,30 @@ +integer('user_id')->unsigned()->nullable(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('set null'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('organizations', function (Blueprint $table) { + $table->dropForeign(['user_id']); + $table->dropColumn('user_id'); + }); + } +}; diff --git a/packages/Webkul/Contact/src/Database/Migrations/2024_09_09_112201_add_unique_id_to_person_table.php b/packages/Webkul/Contact/src/Database/Migrations/2024_09_09_112201_add_unique_id_to_person_table.php new file mode 100644 index 0000000..d6a5b65 --- /dev/null +++ b/packages/Webkul/Contact/src/Database/Migrations/2024_09_09_112201_add_unique_id_to_person_table.php @@ -0,0 +1,41 @@ +string('unique_id')->nullable()->unique(); + }); + + $tableName = DB::getTablePrefix().'persons'; + + DB::statement(" + UPDATE {$tableName} + SET unique_id = CONCAT( + user_id, '|', + organization_id, '|', + JSON_UNQUOTE(JSON_EXTRACT(emails, '$[0].value')), '|', + JSON_UNQUOTE(JSON_EXTRACT(contact_numbers, '$[0].value')) + ) + "); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('persons', function (Blueprint $table) { + $table->dropColumn('unique_id'); + }); + } +}; diff --git a/packages/Webkul/Contact/src/Database/Migrations/2025_03_19_132236_update_organization_id_column_in_persons_table.php b/packages/Webkul/Contact/src/Database/Migrations/2025_03_19_132236_update_organization_id_column_in_persons_table.php new file mode 100644 index 0000000..bb26d4a --- /dev/null +++ b/packages/Webkul/Contact/src/Database/Migrations/2025_03_19_132236_update_organization_id_column_in_persons_table.php @@ -0,0 +1,32 @@ +dropForeign(['organization_id']); + + $table->foreign('organization_id')->references('id')->on('organizations')->onDelete('set null'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('persons', function (Blueprint $table) { + $table->dropForeign(['organization_id']); + + $table->foreign('organization_id')->references('id')->on('organizations')->onDelete('cascade'); + }); + } +}; diff --git a/packages/Webkul/Contact/src/Models/Organization.php b/packages/Webkul/Contact/src/Models/Organization.php new file mode 100644 index 0000000..bf551be --- /dev/null +++ b/packages/Webkul/Contact/src/Models/Organization.php @@ -0,0 +1,46 @@ + 'array', + ]; + + /** + * The attributes that are mass assignable. + * + * @var array + */ + protected $fillable = [ + 'name', + 'address', + 'user_id', + ]; + + /** + * Get persons. + * + * @return \Illuminate\Database\Eloquent\Relations\HasMany + */ + public function persons() + { + return $this->hasMany(PersonProxy::modelClass()); + } + + /** + * Get the user that owns the lead. + */ + public function user() + { + return $this->belongsTo(UserProxy::modelClass()); + } +} diff --git a/packages/Webkul/Contact/src/Models/OrganizationProxy.php b/packages/Webkul/Contact/src/Models/OrganizationProxy.php new file mode 100644 index 0000000..1e6d9c0 --- /dev/null +++ b/packages/Webkul/Contact/src/Models/OrganizationProxy.php @@ -0,0 +1,7 @@ + 'array', + 'contact_numbers' => 'array', + ]; + + /** + * The attributes that are mass assignable. + * + * @var array + */ + protected $fillable = [ + 'name', + 'emails', + 'contact_numbers', + 'job_title', + 'user_id', + 'organization_id', + 'unique_id', + ]; + + /** + * Get the user that owns the lead. + */ + public function user(): BelongsTo + { + return $this->belongsTo(UserProxy::modelClass()); + } + + /** + * Get the organization that owns the person. + */ + public function organization(): BelongsTo + { + return $this->belongsTo(OrganizationProxy::modelClass()); + } + + /** + * Get the activities. + */ + public function activities(): BelongsToMany + { + return $this->belongsToMany(ActivityProxy::modelClass(), 'person_activities'); + } + + /** + * The tags that belong to the person. + */ + public function tags(): BelongsToMany + { + return $this->belongsToMany(TagProxy::modelClass(), 'person_tags'); + } + + /** + * Get the leads for the person. + */ + public function leads(): HasMany + { + return $this->hasMany(LeadProxy::modelClass(), 'person_id'); + } + + /** + * Create a new factory instance for the model. + */ + protected static function newFactory(): PersonFactory + { + return PersonFactory::new(); + } +} diff --git a/packages/Webkul/Contact/src/Models/PersonProxy.php b/packages/Webkul/Contact/src/Models/PersonProxy.php new file mode 100644 index 0000000..f768f47 --- /dev/null +++ b/packages/Webkul/Contact/src/Models/PersonProxy.php @@ -0,0 +1,7 @@ +loadMigrationsFrom(__DIR__.'/../Database/Migrations'); + } + + /** + * Register services. + * + * @return void + */ + public function register() {} +} diff --git a/packages/Webkul/Contact/src/Providers/ModuleServiceProvider.php b/packages/Webkul/Contact/src/Providers/ModuleServiceProvider.php new file mode 100644 index 0000000..8d58e3f --- /dev/null +++ b/packages/Webkul/Contact/src/Providers/ModuleServiceProvider.php @@ -0,0 +1,13 @@ +attributeValueRepository->save(array_merge($data, [ + 'entity_id' => $organization->id, + ])); + + return $organization; + } + + /** + * Update. + * + * @param int $id + * @param array $attribute + * @return \Webkul\Contact\Contracts\Organization + */ + public function update(array $data, $id, $attributes = []) + { + if (isset($data['user_id'])) { + $data['user_id'] = $data['user_id'] ?: null; + } + + $organization = parent::update($data, $id); + + /** + * If attributes are provided then only save the provided attributes and return. + */ + if (! empty($attributes)) { + $conditions = ['entity_type' => $data['entity_type']]; + + if (isset($data['quick_add'])) { + $conditions['quick_add'] = 1; + } + + $attributes = $this->attributeRepository->where($conditions) + ->whereIn('code', $attributes) + ->get(); + + $this->attributeValueRepository->save(array_merge($data, [ + 'entity_id' => $organization->id, + ]), $attributes); + + return $organization; + } + + $this->attributeValueRepository->save(array_merge($data, [ + 'entity_id' => $organization->id, + ])); + + return $organization; + } + + /** + * Delete organization and it's persons. + * + * @param int $id + * @return @void + */ + public function delete($id) + { + $organization = $this->findOrFail($id); + + DB::transaction(function () use ($organization, $id) { + $this->attributeValueRepository->deleteWhere([ + 'entity_id' => $id, + 'entity_type' => 'organizations', + ]); + + $organization->delete(); + }); + } +} diff --git a/packages/Webkul/Contact/src/Repositories/PersonRepository.php b/packages/Webkul/Contact/src/Repositories/PersonRepository.php new file mode 100644 index 0000000..7556b40 --- /dev/null +++ b/packages/Webkul/Contact/src/Repositories/PersonRepository.php @@ -0,0 +1,184 @@ +sanitizeRequestedPersonData($data); + + if (! empty($data['organization_name'])) { + $organization = $this->fetchOrCreateOrganizationByName($data['organization_name']); + + $data['organization_id'] = $organization->id; + } + + if (isset($data['user_id'])) { + $data['user_id'] = $data['user_id'] ?: null; + } + + $person = parent::create($data); + + $this->attributeValueRepository->save(array_merge($data, [ + 'entity_id' => $person->id, + ])); + + return $person; + } + + /** + * Update. + * + * @return \Webkul\Contact\Contracts\Person + */ + public function update(array $data, $id, $attributes = []) + { + $data = $this->sanitizeRequestedPersonData($data); + + $data['user_id'] = empty($data['user_id']) ? null : $data['user_id']; + + if (! empty($data['organization_name'])) { + $organization = $this->fetchOrCreateOrganizationByName($data['organization_name']); + + $data['organization_id'] = $organization->id; + + unset($data['organization_name']); + } + + $person = parent::update($data, $id); + + /** + * If attributes are provided then only save the provided attributes and return. + */ + if (! empty($attributes)) { + $conditions = ['entity_type' => $data['entity_type']]; + + if (isset($data['quick_add'])) { + $conditions['quick_add'] = 1; + } + + $attributes = $this->attributeRepository->where($conditions) + ->whereIn('code', $attributes) + ->get(); + + $this->attributeValueRepository->save(array_merge($data, [ + 'entity_id' => $person->id, + ]), $attributes); + + return $person; + } + + $this->attributeValueRepository->save(array_merge($data, [ + 'entity_id' => $person->id, + ])); + + return $person; + } + + /** + * Retrieves customers count based on date. + * + * @return int + */ + public function getCustomerCount($startDate, $endDate) + { + return $this + ->whereBetween('created_at', [$startDate, $endDate]) + ->get() + ->count(); + } + + /** + * Fetch or create an organization. + */ + public function fetchOrCreateOrganizationByName(string $organizationName) + { + $organization = $this->organizationRepository->findOneWhere([ + 'name' => $organizationName, + ]); + + return $organization ?: $this->organizationRepository->create([ + 'entity_type' => 'organizations', + 'name' => $organizationName, + ]); + } + + /** + * Sanitize requested person data and return the clean array. + */ + private function sanitizeRequestedPersonData(array $data): array + { + if ( + array_key_exists('organization_id', $data) + && empty($data['organization_id']) + ) { + $data['organization_id'] = null; + } + + $uniqueIdParts = array_filter([ + $data['user_id'] ?? null, + $data['organization_id'] ?? null, + $data['emails'][0]['value'] ?? null, + ]); + + $data['unique_id'] = implode('|', $uniqueIdParts); + + if (isset($data['contact_numbers'])) { + $data['contact_numbers'] = collect($data['contact_numbers'])->filter(fn ($number) => ! is_null($number['value']))->toArray(); + + $data['unique_id'] .= '|'.$data['contact_numbers'][0]['value']; + } + + return $data; + } +} diff --git a/packages/Webkul/Core/composer.json b/packages/Webkul/Core/composer.json new file mode 100755 index 0000000..e7efca4 --- /dev/null +++ b/packages/Webkul/Core/composer.json @@ -0,0 +1,26 @@ +{ + "name": "krayin/laravel-core", + "license": "MIT", + "authors": [ + { + "name": "Jitendra Singh", + "email": "jitendra@webkul.com" + } + ], + "require": { + }, + "autoload": { + "psr-4": { + "Webkul\\Core\\": "src/" + } + }, + "extra": { + "laravel": { + "providers": [ + "Webkul\\Core\\Providers\\CoreServiceProvider" + ], + "aliases": {} + } + }, + "minimum-stability": "dev" +} \ No newline at end of file diff --git a/packages/Webkul/Core/src/Acl.php b/packages/Webkul/Core/src/Acl.php new file mode 100644 index 0000000..11e2829 --- /dev/null +++ b/packages/Webkul/Core/src/Acl.php @@ -0,0 +1,125 @@ +items[] = $aclItem; + } + + /** + * Get all acl items. + */ + public function getItems(): Collection + { + if (! $this->items) { + $this->prepareAclItems(); + } + + return collect($this->items) + ->sortBy('sort') + ->values(); + } + + /** + * Acl Config. + */ + private function getAclConfig(): array + { + static $aclConfig; + + if ($aclConfig) { + return $aclConfig; + } + + $aclConfig = config('acl'); + + return $aclConfig; + } + + /** + * Get all roles. + */ + public function getRoles(): Collection + { + static $roles; + + if ($roles) { + return $roles; + } + + $roles = collect($this->getAclConfig()) + ->mapWithKeys(function ($role) { + if (is_array($role['route'])) { + return collect($role['route'])->mapWithKeys(function ($route) use ($role) { + return [$route => $role['key']]; + }); + } else { + return [$role['route'] => $role['key']]; + } + }); + + return $roles; + } + + /** + * Prepare acl items. + */ + private function prepareAclItems(): void + { + $aclWithDotNotation = []; + + foreach ($this->getAclConfig() as $item) { + $aclWithDotNotation[$item['key']] = $item; + } + + $acl = Arr::undot(Arr::dot($aclWithDotNotation)); + + foreach ($acl as $aclItemKey => $aclItem) { + $subAclItems = $this->processSubAclItems($aclItem); + + $this->addItem(new AclItem( + key: $aclItemKey, + name: trans($aclItem['name']), + route: $aclItem['route'], + sort: $aclItem['sort'], + children: $subAclItems, + )); + } + } + + /** + * Process sub acl items. + */ + private function processSubAclItems($aclItem): Collection + { + return collect($aclItem) + ->sortBy('sort') + ->filter(fn ($value, $key) => is_array($value) && $key !== 'route') + ->map(function ($subAclItem) { + $subSubAclItems = $this->processSubAclItems($subAclItem); + + return new AclItem( + key: $subAclItem['key'], + name: trans($subAclItem['name']), + route: $subAclItem['route'], + sort: $subAclItem['sort'], + children: $subSubAclItems, + ); + }); + } +} diff --git a/packages/Webkul/Core/src/Acl/AclItem.php b/packages/Webkul/Core/src/Acl/AclItem.php new file mode 100644 index 0000000..66b50af --- /dev/null +++ b/packages/Webkul/Core/src/Acl/AclItem.php @@ -0,0 +1,19 @@ + [ + \Webkul\Activity\Providers\ModuleServiceProvider::class, + \Webkul\Admin\Providers\ModuleServiceProvider::class, + \Webkul\Attribute\Providers\ModuleServiceProvider::class, + \Webkul\Automation\Providers\ModuleServiceProvider::class, + \Webkul\Contact\Providers\ModuleServiceProvider::class, + \Webkul\Core\Providers\ModuleServiceProvider::class, + \Webkul\DataGrid\Providers\ModuleServiceProvider::class, + \Webkul\EmailTemplate\Providers\ModuleServiceProvider::class, + \Webkul\Email\Providers\ModuleServiceProvider::class, + \Webkul\Lead\Providers\ModuleServiceProvider::class, + \Webkul\Product\Providers\ModuleServiceProvider::class, + \Webkul\Quote\Providers\ModuleServiceProvider::class, + \Webkul\Tag\Providers\ModuleServiceProvider::class, + \Webkul\User\Providers\ModuleServiceProvider::class, + \Webkul\Warehouse\Providers\ModuleServiceProvider::class, + \Webkul\WebForm\Providers\ModuleServiceProvider::class, + \Webkul\DataTransfer\Providers\ModuleServiceProvider::class, + ], + + 'register_route_models' => true, +]; diff --git a/packages/Webkul/Core/src/Config/cors.php b/packages/Webkul/Core/src/Config/cors.php new file mode 100644 index 0000000..4222c11 --- /dev/null +++ b/packages/Webkul/Core/src/Config/cors.php @@ -0,0 +1,62 @@ + [ + 'admin/web-forms/forms/*', + ], + + /* + * Matches the request method. `['*']` allows all methods. + */ + 'allowed_methods' => ['*'], + + /* + * Matches the request origin. `['*']` allows all origins. Wildcards can be used, eg `*.mydomain.com` + */ + 'allowed_origins' => ['*'], + + /* + * Patterns that can be used with `preg_match` to match the origin. + */ + 'allowed_origins_patterns' => [], + + /* + * Sets the Access-Control-Allow-Headers response header. `['*']` allows all headers. + */ + 'allowed_headers' => ['*'], + + /* + * Sets the Access-Control-Expose-Headers response header with these headers. + */ + 'exposed_headers' => [], + + /* + * Sets the Access-Control-Max-Age response header when > 0. + */ + 'max_age' => 0, + + /* + * Sets the Access-Control-Allow-Credentials header. + */ + 'supports_credentials' => false, +]; diff --git a/packages/Webkul/Core/src/Config/sanctum.php b/packages/Webkul/Core/src/Config/sanctum.php new file mode 100644 index 0000000..c6c6045 --- /dev/null +++ b/packages/Webkul/Core/src/Config/sanctum.php @@ -0,0 +1,65 @@ + explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( + '%s%s', + 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1', + env('APP_URL') ? ','.parse_url(env('APP_URL'), PHP_URL_HOST) : '' + ))), + + /* + |-------------------------------------------------------------------------- + | Sanctum Guards + |-------------------------------------------------------------------------- + | + | This array contains the authentication guards that will be checked when + | Sanctum is trying to authenticate a request. If none of these guards + | are able to authenticate the request, Sanctum will use the bearer + | token that's present on an incoming request for authentication. + | + */ + + 'guard' => ['user'], + + /* + |-------------------------------------------------------------------------- + | Expiration Minutes + |-------------------------------------------------------------------------- + | + | This value controls the number of minutes until an issued token will be + | considered expired. If this value is null, personal access tokens do + | not expire. This won't tweak the lifetime of first-party sessions. + | + */ + + 'expiration' => null, + + /* + |-------------------------------------------------------------------------- + | Sanctum Middleware + |-------------------------------------------------------------------------- + | + | When authenticating your first-party SPA with Sanctum you may need to + | customize some of the middleware Sanctum uses while processing the + | request. You may change the middleware listed below as required. + | + */ + + 'middleware' => [ + 'verify_csrf_token' => App\Http\Middleware\VerifyCsrfToken::class, + 'encrypt_cookies' => App\Http\Middleware\EncryptCookies::class, + ], + +]; diff --git a/packages/Webkul/Core/src/Console/Commands/Version.php b/packages/Webkul/Core/src/Console/Commands/Version.php new file mode 100644 index 0000000..5f88378 --- /dev/null +++ b/packages/Webkul/Core/src/Console/Commands/Version.php @@ -0,0 +1,42 @@ +comment('v'.core()->version()); + } +} diff --git a/packages/Webkul/Core/src/Contracts/CoreConfig.php b/packages/Webkul/Core/src/Contracts/CoreConfig.php new file mode 100644 index 0000000..6d89520 --- /dev/null +++ b/packages/Webkul/Core/src/Contracts/CoreConfig.php @@ -0,0 +1,5 @@ + $attribute])); + } + } +} diff --git a/packages/Webkul/Core/src/Core.php b/packages/Webkul/Core/src/Core.php new file mode 100644 index 0000000..e1cb6d7 --- /dev/null +++ b/packages/Webkul/Core/src/Core.php @@ -0,0 +1,243 @@ + $title) { + $options[] = [ + 'title' => $title, + 'value' => $key, + ]; + } + + return $options; + } + + /** + * Retrieve all countries. + * + * @return \Illuminate\Support\Collection + */ + public function countries() + { + return $this->countryRepository->all(); + } + + /** + * Returns country name by code. + */ + public function country_name(string $code): string + { + $country = $this->countryRepository->findOneByField('code', $code); + + return $country ? $country->name : ''; + } + + /** + * Returns state name by code. + */ + public function state_name(string $code): string + { + $state = $this->countryStateRepository->findOneByField('code', $code); + + return $state ? $state->name : $code; + } + + /** + * Retrieve all country states. + * + * @return \Illuminate\Support\Collection + */ + public function states(string $countryCode) + { + return $this->countryStateRepository->findByField('country_code', $countryCode); + } + + /** + * Retrieve all grouped states by country code. + * + * @return \Illuminate\Support\Collection + */ + public function groupedStatesByCountries() + { + $collection = []; + + foreach ($this->countryStateRepository->all() as $state) { + $collection[$state->country_code][] = $state->toArray(); + } + + return $collection; + } + + /** + * Retrieve all grouped states by country code. + * + * @return \Illuminate\Support\Collection + */ + public function findStateByCountryCode($countryCode = null, $stateCode = null) + { + $collection = []; + + $collection = $this->countryStateRepository->findByField([ + 'country_code' => $countryCode, + 'code' => $stateCode, + ]); + + if (count($collection)) { + return $collection->first(); + } else { + return false; + } + } + + /** + * Create singleton object through single facade. + * + * @param string $className + * @return mixed + */ + public function getSingletonInstance($className) + { + static $instances = []; + + if (array_key_exists($className, $instances)) { + return $instances[$className]; + } + + return $instances[$className] = app($className); + } + + /** + * Format date + * + * @return string + */ + public function formatDate($date, $format = 'd M Y h:iA') + { + return Carbon::parse($date)->format($format); + } + + /** + * Week range. + * + * @param string $date + * @param int $day + * @return string + */ + public function xWeekRange($date, $day) + { + $ts = strtotime($date); + + if (! $day) { + $start = (date('D', $ts) == 'Sun') ? $ts : strtotime('last sunday', $ts); + + return date('Y-m-d', $start); + } else { + $end = (date('D', $ts) == 'Sat') ? $ts : strtotime('next saturday', $ts); + + return date('Y-m-d', $end); + } + } + + /** + * Return currency symbol from currency code. + * + * @param float $price + * @return string + */ + public function currencySymbol($code) + { + $formatter = new \NumberFormatter(app()->getLocale().'@currency='.$code, \NumberFormatter::CURRENCY); + + return $formatter->getSymbol(\NumberFormatter::CURRENCY_SYMBOL); + } + + /** + * Format price with base currency symbol. This method also give ability to encode + * the base currency symbol and its optional. + * + * @param float $price + * @return string + */ + public function formatBasePrice($price) + { + if (is_null($price)) { + $price = 0; + } + + $formatter = new \NumberFormatter(app()->getLocale(), \NumberFormatter::CURRENCY); + + return $formatter->formatCurrency($price, config('app.currency')); + } + + /** + * Get the config field. + */ + public function getConfigField(string $fieldName): ?array + { + return system_config()->getConfigField($fieldName); + } + + /** + * Retrieve information for configuration. + */ + public function getConfigData(string $field): mixed + { + return system_config()->getConfigData($field); + } +} diff --git a/packages/Webkul/Core/src/Database/Migrations/2021_03_12_060658_create_core_config_table.php b/packages/Webkul/Core/src/Database/Migrations/2021_03_12_060658_create_core_config_table.php new file mode 100755 index 0000000..9c5f6cc --- /dev/null +++ b/packages/Webkul/Core/src/Database/Migrations/2021_03_12_060658_create_core_config_table.php @@ -0,0 +1,33 @@ +increments('id'); + $table->string('code'); + $table->string('value'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('core_config'); + } +}; diff --git a/packages/Webkul/Core/src/Database/Migrations/2021_04_12_173232_create_countries_table.php b/packages/Webkul/Core/src/Database/Migrations/2021_04_12_173232_create_countries_table.php new file mode 100644 index 0000000..274e574 --- /dev/null +++ b/packages/Webkul/Core/src/Database/Migrations/2021_04_12_173232_create_countries_table.php @@ -0,0 +1,32 @@ +increments('id'); + $table->string('code'); + $table->string('name'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('countries'); + } +}; diff --git a/packages/Webkul/Core/src/Database/Migrations/2021_04_12_173344_create_country_states_table.php b/packages/Webkul/Core/src/Database/Migrations/2021_04_12_173344_create_country_states_table.php new file mode 100644 index 0000000..5939026 --- /dev/null +++ b/packages/Webkul/Core/src/Database/Migrations/2021_04_12_173344_create_country_states_table.php @@ -0,0 +1,36 @@ +increments('id'); + $table->string('country_code'); + $table->string('code'); + $table->string('name'); + + $table->integer('country_id')->unsigned(); + $table->foreign('country_id')->references('id')->on('countries')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('country_states'); + } +}; diff --git a/packages/Webkul/Core/src/Database/Migrations/2025_01_29_133500_update_text_column_type_in_core_config_table.php b/packages/Webkul/Core/src/Database/Migrations/2025_01_29_133500_update_text_column_type_in_core_config_table.php new file mode 100644 index 0000000..2312701 --- /dev/null +++ b/packages/Webkul/Core/src/Database/Migrations/2025_01_29_133500_update_text_column_type_in_core_config_table.php @@ -0,0 +1,28 @@ +text('value')->change(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('core_config', function (Blueprint $table) { + $table->string('value')->change(); + }); + } +}; diff --git a/packages/Webkul/Core/src/Eloquent/Repository.php b/packages/Webkul/Core/src/Eloquent/Repository.php new file mode 100755 index 0000000..fdce1a7 --- /dev/null +++ b/packages/Webkul/Core/src/Eloquent/Repository.php @@ -0,0 +1,146 @@ +findByField($field, $value, $columns = ['*']); + + return $model->first(); + } + + /** + * Find data by field and value + * + * @param string $field + * @param string $value + * @param array $columns + * @return mixed + */ + public function findOneWhere(array $where, $columns = ['*']) + { + $model = $this->findWhere($where, $columns); + + return $model->first(); + } + + /** + * Find data by id + * + * @param int $id + * @param array $columns + * @return mixed + */ + public function find($id, $columns = ['*']) + { + $this->applyCriteria(); + $this->applyScope(); + $model = $this->model->find($id, $columns); + $this->resetModel(); + + return $this->parserResult($model); + } + + /** + * Find data by id + * + * @param int $id + * @param array $columns + * @return mixed + */ + public function findOrFail($id, $columns = ['*']) + { + $this->applyCriteria(); + $this->applyScope(); + $model = $this->model->findOrFail($id, $columns); + $this->resetModel(); + + return $this->parserResult($model); + } + + /** + * Count results of repository + * + * @param string $columns + * @return int + */ + public function count(array $where = [], $columns = '*') + { + $this->applyCriteria(); + $this->applyScope(); + + if ($where) { + $this->applyConditions($where); + } + + $result = $this->model->count($columns); + $this->resetModel(); + $this->resetScope(); + + return $result; + } + + /** + * @param string $columns + * @return mixed + */ + public function sum($columns) + { + $this->applyCriteria(); + $this->applyScope(); + + $sum = $this->model->sum($columns); + $this->resetModel(); + + return $sum; + } + + /** + * @param string $columns + * @return mixed + */ + public function avg($columns) + { + $this->applyCriteria(); + $this->applyScope(); + + $avg = $this->model->avg($columns); + $this->resetModel(); + + return $avg; + } + + /** + * @return mixed + */ + public function getModel($data = []) + { + return $this->model; + } + + /** + * @throws RepositoryException + */ + public function resetModel() + { + $this->makeModel(); + + return $this; + } +} diff --git a/packages/Webkul/Core/src/Eloquent/TranslatableModel.php b/packages/Webkul/Core/src/Eloquent/TranslatableModel.php new file mode 100755 index 0000000..8d824c7 --- /dev/null +++ b/packages/Webkul/Core/src/Eloquent/TranslatableModel.php @@ -0,0 +1,23 @@ +defaultLocale) { + return $this->defaultLocale; + } + + return config('translatable.locale') ?: app()->make('translator')->getLocale(); + } +} diff --git a/packages/Webkul/Core/src/Exceptions/ViterNotFound.php b/packages/Webkul/Core/src/Exceptions/ViterNotFound.php new file mode 100755 index 0000000..5a7071a --- /dev/null +++ b/packages/Webkul/Core/src/Exceptions/ViterNotFound.php @@ -0,0 +1,17 @@ +getLocale(); + + $path = __DIR__."/../../../$packageName/src/Resources/lang/$currentLocale/app.php"; + + if (is_string($path) && is_readable($path)) { + return include $path; + } else { + $currentLocale = 'en'; + + $path = __DIR__."/../../../$packageName/src/Resources/lang/$currentLocale/app.php"; + + return include $path; + } + } +} diff --git a/packages/Webkul/Core/src/Http/Controllers/CoreController.php b/packages/Webkul/Core/src/Http/Controllers/CoreController.php new file mode 100644 index 0000000..6741e03 --- /dev/null +++ b/packages/Webkul/Core/src/Http/Controllers/CoreController.php @@ -0,0 +1,40 @@ +_config = request('_config'); + } + + /** + * Display a listing of the resource. + * + * @return \Illuminate\Http\Response + */ + public function index() + { + return view($this->_config['view'], $this->_config); + } +} diff --git a/packages/Webkul/Core/src/Http/helpers.php b/packages/Webkul/Core/src/Http/helpers.php new file mode 100755 index 0000000..9ab57a1 --- /dev/null +++ b/packages/Webkul/Core/src/Http/helpers.php @@ -0,0 +1,74 @@ +singleton(ViewRenderEventManager::class); + + $viewEventManager = app()->make(ViewRenderEventManager::class); + + $viewEventManager->handleRenderEvent($eventName, $params); + + return $viewEventManager->render(); + } +} + +if (! function_exists('vite')) { + /** + * Vite helper. + */ + function vite(): Vite + { + return app(Vite::class); + } +} diff --git a/packages/Webkul/Core/src/Menu.php b/packages/Webkul/Core/src/Menu.php new file mode 100644 index 0000000..101e705 --- /dev/null +++ b/packages/Webkul/Core/src/Menu.php @@ -0,0 +1,188 @@ +items[] = $menuItem; + } + + /** + * Get all menu items. + */ + public function getItems(?string $area = null, string $key = ''): Collection + { + if (! $area) { + throw new \Exception('Area must be provided to get menu items.'); + } + + static $items; + + if ($items) { + return $items; + } + + $configMenu = collect(config("menu.$area"))->map(function ($item) { + return Arr::except([ + ...$item, + 'url' => route($item['route'], $item['params'] ?? []), + ], ['params']); + }); + + switch ($area) { + case self::ADMIN: + $this->configMenu = $configMenu + ->filter(fn ($item) => bouncer()->hasPermission($item['key'])) + ->toArray(); + break; + + default: + $this->configMenu = $configMenu->toArray(); + + break; + } + + if (! $this->items) { + $this->prepareMenuItems(); + } + + $items = collect($this->items)->sortBy(fn ($item) => $item->getPosition()); + + return $items; + } + + /** + * Get admin menu by key or keys. + */ + public function getAdminMenuByKey(array|string $keys): mixed + { + $items = $this->getItems('admin'); + + $keysArray = (array) $keys; + + $filteredItems = $items->filter(fn ($item) => in_array($item->getKey(), $keysArray)); + + return is_array($keys) ? $filteredItems : $filteredItems->first(); + } + + /** + * Prepare menu items. + */ + private function prepareMenuItems(): void + { + $menuWithDotNotation = []; + + foreach ($this->configMenu as $item) { + if (strpos(request()->url(), route($item['route'])) !== false) { + $this->currentKey = $item['key']; + } + + $menuWithDotNotation[$item['key']] = $item; + } + + $menu = Arr::undot(Arr::dot($menuWithDotNotation)); + + foreach ($menu as $menuItemKey => $menuItem) { + $this->addItem(new MenuItem( + key: $menuItemKey, + name: trans($menuItem['name']), + route: $menuItem['route'], + url: $menuItem['url'], + sort: $menuItem['sort'], + icon: $menuItem['icon-class'], + info: trans($menuItem['info'] ?? ''), + children: $this->processSubMenuItems($menuItem), + )); + } + } + + /** + * Process sub menu items. + */ + private function processSubMenuItems($menuItem): Collection + { + return collect($menuItem) + ->sortBy('sort') + ->filter(fn ($value) => is_array($value)) + ->map(function ($subMenuItem) { + $subSubMenuItems = $this->processSubMenuItems($subMenuItem); + + return new MenuItem( + key: $subMenuItem['key'], + name: trans($subMenuItem['name']), + route: $subMenuItem['route'], + url: $subMenuItem['url'], + sort: $subMenuItem['sort'], + icon: $subMenuItem['icon-class'], + info: trans($subMenuItem['info'] ?? ''), + children: $subSubMenuItems, + ); + }); + } + + /** + * Get current active menu. + */ + public function getCurrentActiveMenu(?string $area = null): ?MenuItem + { + $currentKey = implode('.', array_slice(explode('.', $this->currentKey), 0, 2)); + + return $this->findMatchingItem($this->getItems($area), $currentKey); + } + + /** + * Finding the matching item. + */ + private function findMatchingItem($items, $currentKey): ?MenuItem + { + foreach ($items as $item) { + if ($item->key == $currentKey) { + return $item; + } + + if ($item->haveChildren()) { + $matchingChild = $this->findMatchingItem($item->getChildren(), $currentKey); + + if ($matchingChild) { + return $matchingChild; + } + } + } + + return null; + } +} diff --git a/packages/Webkul/Core/src/Menu/MenuItem.php b/packages/Webkul/Core/src/Menu/MenuItem.php new file mode 100644 index 0000000..c185488 --- /dev/null +++ b/packages/Webkul/Core/src/Menu/MenuItem.php @@ -0,0 +1,200 @@ +name = $name; + + return $this; + } + + /** + * Get name of menu item. + */ + public function getName(): string + { + return $this->name; + } + + /** + * Set position of menu item. + */ + public function setPosition(int $sort): self + { + $this->sort = $sort; + + return $this; + } + + /** + * Get position of menu item. + */ + public function getPosition() + { + return $this->sort; + } + + /** + * Set icon of menu item. + */ + public function setIcon(string $icon): self + { + $this->icon = $icon; + + return $this; + } + + /** + * Get the icon of menu item. + */ + public function getIcon(): string + { + return $this->icon; + } + + /** + * Set info of menu item. + */ + public function setInfo(string $info): self + { + $this->info = $info; + + return $this; + } + + /** + * Get info of menu item. + */ + public function getInfo(): string + { + return $this->info; + } + + /** + * Set route of menu item. + */ + public function setRoute(string $route): self + { + $this->route = $route; + + return $this; + } + + /** + * Get current route. + */ + public function getRoute(): string + { + return $this->route; + } + + /** + * Set url of menu item. + */ + public function setUrl(string $url): self + { + $this->url = $url; + + return $this; + } + + /** + * Get the url of the menu item. + */ + public function getUrl(): string + { + return $this->url; + } + + /** + * Set the key of the menu item. + */ + public function setKey(string $key): self + { + $this->key = $key; + + return $this; + } + + /** + * Get the key of the menu item. + */ + public function getKey(): string + { + return $this->key; + } + + /** + * Set children of menu item. + */ + public function setChildren(Collection $children): self + { + $this->children = $children; + + return $this; + } + + /** + * Check weather menu item have children or not. + */ + public function haveChildren(): bool + { + return $this->children->isNotEmpty(); + } + + /** + * Get children of menu item. + */ + public function getChildren(): Collection + { + if (! $this->haveChildren()) { + return collect(); + } + + return $this->children; + } + + /** + * Check weather menu item is active or not. + */ + public function isActive(): bool + { + if (request()->fullUrlIs($this->getUrl().'*')) { + return true; + } + + if ($this->haveChildren()) { + foreach ($this->getChildren() as $child) { + if ($child->isActive()) { + return true; + } + } + } + + return false; + } +} diff --git a/packages/Webkul/Core/src/Models/CoreConfig.php b/packages/Webkul/Core/src/Models/CoreConfig.php new file mode 100755 index 0000000..dca3c85 --- /dev/null +++ b/packages/Webkul/Core/src/Models/CoreConfig.php @@ -0,0 +1,24 @@ +areMigrationsEnabled()) { + $this->registerMigrations(); + } + + if ($this->areModelsEnabled()) { + $this->registerModels(); + $this->registerEnums(); + $this->registerRequestTypes(); + } + + if ($this->areViewsEnabled()) { + $this->registerViews(); + } + + if ($routes = $this->config('routes', true)) { + $this->registerRoutes($routes); + } + } +} diff --git a/packages/Webkul/Core/src/Providers/CoreServiceProvider.php b/packages/Webkul/Core/src/Providers/CoreServiceProvider.php new file mode 100644 index 0000000..0eaaa5a --- /dev/null +++ b/packages/Webkul/Core/src/Providers/CoreServiceProvider.php @@ -0,0 +1,90 @@ +loadMigrationsFrom(__DIR__.'/../Database/Migrations'); + + $this->loadTranslationsFrom(__DIR__.'/../Resources/lang', 'core'); + + $this->publishes([ + dirname(__DIR__).'/Config/concord.php' => config_path('concord.php'), + dirname(__DIR__).'/Config/cors.php' => config_path('cors.php'), + dirname(__DIR__).'/Config/sanctum.php' => config_path('sanctum.php'), + ]); + } + + /** + * Register services. + * + * @return void + */ + public function register() + { + $this->registerCommands(); + + $this->registerFacades(); + } + + /** + * Register Bouncer as a singleton. + * + * @return void + */ + protected function registerFacades() + { + $loader = AliasLoader::getInstance(); + + $loader->alias('acl', AclFacade::class); + + $loader->alias('core', CoreFacade::class); + + $loader->alias('system_config', SystemConfigFacade::class); + + $loader->alias('menu', MenuFacade::class); + + $this->app->singleton('acl', fn () => app(Acl::class)); + + $this->app->singleton('core', fn () => app(Core::class)); + + $this->app->singleton('system_config', fn () => app()->make(SystemConfig::class)); + + $this->app->singleton('menu', fn () => app()->make(Menu::class)); + } + + /** + * Register the console commands of this package. + */ + protected function registerCommands(): void + { + if ($this->app->runningInConsole()) { + $this->commands([ + Version::class, + ]); + } + } +} diff --git a/packages/Webkul/Core/src/Providers/ModuleServiceProvider.php b/packages/Webkul/Core/src/Providers/ModuleServiceProvider.php new file mode 100644 index 0000000..fb94d3f --- /dev/null +++ b/packages/Webkul/Core/src/Providers/ModuleServiceProvider.php @@ -0,0 +1,12 @@ +getTitle()) + ) { + return trans($configuration->getTitle()); + } + + if ( + method_exists($configuration, 'getName') + && ! is_null($configuration->getName()) + ) { + return trans($configuration->getName()); + } + + return ''; + } + + /** + * Get children and fields. + */ + protected function getChildrenAndFields(mixed $configuration, string $searchTerm, array $path, array &$results): void + { + if ( + method_exists($configuration, 'getChildren') + || method_exists($configuration, 'getFields') + ) { + $children = $configuration->haveChildren() + ? $configuration->getChildren() + : $configuration->getFields(); + + $tempPath = array_merge($path, [[ + 'key' => $configuration->getKey() ?? null, + 'title' => $this->getTranslatedTitle($configuration), + ]]); + + $results = array_merge($results, $this->search($children, $searchTerm, $tempPath)); + } + } + + /** + * Search configuration. + * + * @param array $items + */ + public function search(Collection $items, string $searchTerm, array $path = []): array + { + $results = []; + + foreach ($items as $configuration) { + $title = $this->getTranslatedTitle($configuration); + + if ( + stripos($title, $searchTerm) !== false + && count($path) + ) { + $queryParam = $path[1]['key'] ?? $configuration->getKey(); + + $results[] = [ + 'title' => implode(' > ', [...Arr::pluck($path, 'title'), $title]), + 'url' => route('admin.configuration.index', Str::replace('.', '/', $queryParam)), + ]; + } + + $this->getChildrenAndFields($configuration, $searchTerm, $path, $results); + } + + return $results; + } + + /** + * Create core configuration. + */ + public function create(array $data): void + { + unset($data['_token']); + + $preparedData = []; + + foreach ($data as $method => $fieldData) { + $recursiveData = $this->recursiveArray($fieldData, $method); + + foreach ($recursiveData as $fieldName => $value) { + if ( + is_array($value) + && isset($value['delete']) + ) { + $coreConfigValues = $this->model->where('code', $fieldName)->get(); + + if ($coreConfigValues->isNotEmpty()) { + foreach ($coreConfigValues as $coreConfig) { + if (! empty($coreConfig['value'])) { + Storage::delete($coreConfig['value']); + } + + parent::delete($coreConfig['id']); + } + } + + continue; + } + } + + foreach ($recursiveData as $fieldName => $value) { + if (is_array($value)) { + foreach ($value as $key => $val) { + $fieldNameWithKey = $fieldName.'.'.$key; + + $coreConfigValues = $this->model->where('code', $fieldNameWithKey)->get(); + + if (request()->hasFile($fieldNameWithKey)) { + $val = request()->file($fieldNameWithKey)->store('configuration'); + } + + if ($coreConfigValues->isNotEmpty()) { + foreach ($coreConfigValues as $coreConfig) { + if (request()->hasFile($fieldNameWithKey)) { + Storage::delete($coreConfig['value']); + } + + parent::update(['code' => $fieldNameWithKey, 'value' => $val], $coreConfig->id); + } + } else { + parent::create(['code' => $fieldNameWithKey, 'value' => $val]); + } + } + } else { + if (request()->hasFile($fieldName)) { + $value = request()->file($fieldName)->store('configuration'); + } + + $preparedData[] = [ + 'code' => $fieldName, + 'value' => $value, + ]; + } + } + } + + if (! empty($preparedData)) { + foreach ($preparedData as $dataItem) { + $coreConfigValues = $this->model->where('code', $dataItem['code'])->get(); + + if ($coreConfigValues->isNotEmpty()) { + foreach ($coreConfigValues as $coreConfig) { + parent::update($dataItem, $coreConfig->id); + } + } else { + parent::create($dataItem); + } + } + } + + Event::dispatch('core.configuration.save.after'); + } + + /** + * Recursive array. + */ + public function recursiveArray(array $formData, string $method): array + { + static $data = []; + + static $recursiveArrayData = []; + + foreach ($formData as $form => $formValue) { + $value = $method.'.'.$form; + + if (is_array($formValue)) { + $dim = $this->countDim($formValue); + + if ($dim > 1) { + $this->recursiveArray($formValue, $value); + } elseif ($dim == 1) { + $data[$value] = $formValue; + } + } + } + + foreach ($data as $key => $value) { + $field = core()->getConfigField($key); + + if ($field) { + $recursiveArrayData[$key] = $value; + } else { + foreach ($value as $key1 => $val) { + $recursiveArrayData[$key.'.'.$key1] = $val; + } + } + } + + return $recursiveArrayData; + } + + /** + * Return dimension of the array. + */ + public function countDim(array|string $array): int + { + if (is_array(reset($array))) { + $return = $this->countDim(reset($array)) + 1; + } else { + $return = 1; + } + + return $return; + } +} diff --git a/packages/Webkul/Core/src/Repositories/CountryRepository.php b/packages/Webkul/Core/src/Repositories/CountryRepository.php new file mode 100755 index 0000000..17b52c3 --- /dev/null +++ b/packages/Webkul/Core/src/Repositories/CountryRepository.php @@ -0,0 +1,21 @@ + [ + 'code' => 'يجب أن يكون الحقل رمزًا صالحًا.', + 'decimal' => 'يجب أن يكون الحقل رقمًا عشريًا.', + ], +]; diff --git a/packages/Webkul/Core/src/Resources/lang/en/app.php b/packages/Webkul/Core/src/Resources/lang/en/app.php new file mode 100644 index 0000000..5ee31a3 --- /dev/null +++ b/packages/Webkul/Core/src/Resources/lang/en/app.php @@ -0,0 +1,8 @@ + [ + 'code' => 'The field must be a valid code.', + 'decimal' => 'The field must be a decimal number.', + ], +]; diff --git a/packages/Webkul/Core/src/Resources/lang/es/app.php b/packages/Webkul/Core/src/Resources/lang/es/app.php new file mode 100644 index 0000000..712979d --- /dev/null +++ b/packages/Webkul/Core/src/Resources/lang/es/app.php @@ -0,0 +1,8 @@ + [ + 'code' => 'El campo debe ser un código válido.', + 'decimal' => 'El campo debe ser un número decimal.', + ], +]; diff --git a/packages/Webkul/Core/src/Resources/lang/fa/app.php b/packages/Webkul/Core/src/Resources/lang/fa/app.php new file mode 100644 index 0000000..a0e8ed0 --- /dev/null +++ b/packages/Webkul/Core/src/Resources/lang/fa/app.php @@ -0,0 +1,8 @@ + [ + 'code' => 'این فیلد باید یک کد معتبر باشد.', + 'decimal' => 'این فیلد باید یک عدد اعشاری باشد.', + ], +]; diff --git a/packages/Webkul/Core/src/Resources/lang/pt_BR/app.php b/packages/Webkul/Core/src/Resources/lang/pt_BR/app.php new file mode 100644 index 0000000..b0b0248 --- /dev/null +++ b/packages/Webkul/Core/src/Resources/lang/pt_BR/app.php @@ -0,0 +1,8 @@ + [ + 'code' => 'O campo deve ser um código válido.', + 'decimal' => 'O campo deve ser um número decimal.', + ], +]; diff --git a/packages/Webkul/Core/src/Resources/lang/tr/app.php b/packages/Webkul/Core/src/Resources/lang/tr/app.php new file mode 100644 index 0000000..e02290c --- /dev/null +++ b/packages/Webkul/Core/src/Resources/lang/tr/app.php @@ -0,0 +1,8 @@ + [ + 'code' => 'Alan geçerli bir kod olmalıdır.', + 'decimal' => 'Alan ondalık bir sayı olmalıdır.', + ], +]; diff --git a/packages/Webkul/Core/src/Resources/lang/vi/app.php b/packages/Webkul/Core/src/Resources/lang/vi/app.php new file mode 100644 index 0000000..9948b25 --- /dev/null +++ b/packages/Webkul/Core/src/Resources/lang/vi/app.php @@ -0,0 +1,8 @@ + [ + 'code' => 'Trường phải là một mã hợp lệ.', + 'decimal' => 'Trường phải là một số thập phân.', + ], +]; diff --git a/packages/Webkul/Core/src/SystemConfig.php b/packages/Webkul/Core/src/SystemConfig.php new file mode 100644 index 0000000..f13f663 --- /dev/null +++ b/packages/Webkul/Core/src/SystemConfig.php @@ -0,0 +1,188 @@ +items[] = $item; + } + + /** + * Get all configuration items. + */ + public function getItems(): Collection + { + if (! $this->items) { + $this->prepareConfigurationItems(); + } + + return collect($this->items) + ->sortBy('sort'); + } + + /** + * Retrieve Core Config + */ + private function retrieveCoreConfig(): array + { + static $items; + + if ($items) { + return $items; + } + + return $items = config('core_config'); + } + + /** + * Prepare configuration items. + */ + public function prepareConfigurationItems() + { + $configWithDotNotation = []; + + foreach ($this->retrieveCoreConfig() as $item) { + $configWithDotNotation[$item['key']] = $item; + } + + $configs = Arr::undot(Arr::dot($configWithDotNotation)); + + foreach ($configs as $configItem) { + $subConfigItems = $this->processSubConfigItems($configItem); + + $this->addItem(new Item( + children: $subConfigItems, + fields: $configItem['fields'] ?? null, + icon: $configItem['icon'] ?? null, + key: $configItem['key'], + name: trans($configItem['name']), + route: $configItem['route'] ?? null, + info: trans($configItem['info']) ?? null, + sort: $configItem['sort'], + )); + } + } + + /** + * Process sub config items. + */ + private function processSubConfigItems($configItem): Collection + { + return collect($configItem) + ->sortBy('sort') + ->filter(fn ($value) => is_array($value) && isset($value['name'])) + ->map(function ($subConfigItem) { + $configItemChildren = $this->processSubConfigItems($subConfigItem); + + return new Item( + children: $configItemChildren, + fields: $subConfigItem['fields'] ?? null, + icon: $subConfigItem['icon'] ?? null, + key: $subConfigItem['key'], + name: trans($subConfigItem['name']), + info: trans($subConfigItem['info']) ?? null, + route: $subConfigItem['route'] ?? null, + sort: $subConfigItem['sort'] ?? null, + ); + }); + } + + /** + * Get active configuration item. + */ + public function getActiveConfigurationItem(): ?Item + { + if (! $slug = request()->route('slug')) { + return null; + } + + $activeItem = $this->getItems()->where('key', $slug)->first() ?? null; + + if (! $activeItem) { + return null; + } + + if ($slug2 = request()->route('slug2')) { + $activeItem = $activeItem->getChildren()[$slug2]; + } + + return $activeItem; + } + + /** + * Get config field. + */ + public function getConfigField(string $fieldName): ?array + { + foreach ($this->retrieveCoreConfig() as $coreData) { + if (! isset($coreData['fields'])) { + continue; + } + + foreach ($coreData['fields'] as $field) { + $name = $coreData['key'].'.'.$field['name']; + + if ($name == $fieldName) { + return $field; + } + } + } + + return null; + } + + /** + * Get default config. + */ + private function getDefaultConfig(string $field): mixed + { + $configFieldInfo = $this->getConfigField($field); + + $fields = explode('.', $field); + + array_shift($fields); + + $field = implode('.', $fields); + + return Config::get($field, $configFieldInfo['default'] ?? null); + } + + /** + * Retrieve information for configuration + */ + public function getConfigData(string $field): mixed + { + $coreConfigValue = $this->coreConfigRepository->findOneWhere([ + 'code' => $field, + ]); + + if (! $coreConfigValue) { + return $this->getDefaultConfig($field); + } + + return $coreConfigValue->value; + } +} diff --git a/packages/Webkul/Core/src/SystemConfig/Item.php b/packages/Webkul/Core/src/SystemConfig/Item.php new file mode 100644 index 0000000..5cc096c --- /dev/null +++ b/packages/Webkul/Core/src/SystemConfig/Item.php @@ -0,0 +1,123 @@ +name ?? ''; + } + + /** + * Format options. + */ + private function formatOptions($options) + { + return is_array($options) ? $options : (is_string($options) ? $options : []); + } + + /** + * Get fields of config item. + */ + public function getFields(): Collection + { + return collect($this->fields)->map(function ($field) { + return new ItemField( + item_key: $this->key, + name: $field['name'], + title: $field['title'], + info: $field['info'] ?? null, + type: $field['type'], + depends: $field['depends'] ?? null, + path: $field['path'] ?? null, + validation: $field['validation'] ?? null, + default: $field['default'] ?? null, + channel_based: $field['channel_based'] ?? null, + locale_based: $field['locale_based'] ?? null, + options: $this->formatOptions($field['options'] ?? null), + tinymce: $field['tinymce'] ?? false, + is_visible: true, + ); + }); + } + + /** + * Get name of config item. + */ + public function getInfo(): ?string + { + return $this->info; + } + + /** + * Get current route. + */ + public function getRoute(): string + { + return $this->route; + } + + /** + * Get the url of the config item. + */ + public function getUrl(): string + { + return route($this->getRoute()); + } + + /** + * Get the key of the config item. + */ + public function getKey(): string + { + return $this->key; + } + + /** + * Get Icon. + */ + public function getIcon(): ?string + { + return $this->icon; + } + + /** + * Check weather config item have children or not. + */ + public function haveChildren(): bool + { + return $this->children->isNotEmpty(); + } + + /** + * Get children of config item. + */ + public function getChildren(): Collection + { + if (! $this->haveChildren()) { + return collect(); + } + + return $this->children; + } +} diff --git a/packages/Webkul/Core/src/SystemConfig/ItemField.php b/packages/Webkul/Core/src/SystemConfig/ItemField.php new file mode 100644 index 0000000..0b33460 --- /dev/null +++ b/packages/Webkul/Core/src/SystemConfig/ItemField.php @@ -0,0 +1,244 @@ + 'min_value', + ]; + + /** + * Create a new ItemField instance. + */ + public function __construct( + public string $item_key, + public string $name, + public string $title, + public ?string $info, + public string $type, + public ?string $path, + public ?string $validation, + public ?string $depends, + public ?string $default, + public ?bool $channel_based, + public ?bool $locale_based, + public array|string $options, + public bool $is_visible = true, + public bool $tinymce = false, + ) { + $this->options = $this->getOptions(); + } + + /** + * Get name of config item. + */ + public function getName(): ?string + { + return $this->name; + } + + /** + * Get info of config item. + */ + public function getInfo(): ?string + { + return $this->info ?? ''; + } + + /** + * Get title of config item. + */ + public function getTitle(): ?string + { + return $this->title ?? ''; + } + + /** + * Determine if the field should use TinyMCE. + */ + public function getTinymce(): bool + { + return $this->tinymce; + } + + /** + * Get type of config item. + */ + public function getType(): string + { + return $this->type; + } + + /** + * Get path of config item. + */ + public function getPath(): ?string + { + return $this->path; + } + + /** + * Get item key of config item. + */ + public function getItemKey(): string + { + return $this->item_key; + } + + /** + * Get validation of config item. + */ + public function getValidations(): ?string + { + if (empty($this->validation)) { + return ''; + } + + foreach ($this->veeValidateMappings as $laravelRule => $veeValidateRule) { + $this->validation = str_replace($laravelRule, $veeValidateRule, $this->validation); + } + + return $this->validation; + } + + /** + * Get depends of config item. + */ + public function getDepends(): ?string + { + return $this->depends; + } + + /** + * Get default value of config item. + */ + public function getDefault(): ?string + { + return $this->default; + } + + /** + * Get channel based of config item. + */ + public function getChannelBased(): ?bool + { + return $this->channel_based; + } + + /** + * Get locale based of config item. + */ + public function getLocaleBased(): ?bool + { + return $this->locale_based; + } + + /** + * Get name field for forms in configuration page. + */ + public function getNameKey(): string + { + return $this->item_key.'.'.$this->name; + } + + /** + * Check if the field is required. + */ + public function isRequired(): string + { + return Str::contains($this->getValidations(), 'required') ? 'required' : ''; + } + + /** + * Get options of config item. + */ + public function getOptions(): array + { + if (is_array($this->options)) { + return collect($this->options)->map(fn ($option) => [ + 'title' => trans($option['title']), + 'value' => $option['value'], + ])->toArray(); + } + + return collect($this->getFieldOptions($this->options))->map(fn ($option) => [ + 'title' => trans($option['title']), + 'value' => $option['value'], + ])->toArray(); + } + + /** + * Convert the field to an array. + */ + public function toArray() + { + return [ + 'name' => $this->getName(), + 'title' => $this->getTitle(), + 'info' => $this->getInfo(), + 'type' => $this->getType(), + 'path' => $this->getPath(), + 'depends' => $this->getDepends(), + 'validation' => $this->getValidations(), + 'default' => $this->getDefault(), + 'channel_based' => $this->getChannelBased(), + 'locale_based' => $this->getLocaleBased(), + 'options' => $this->getOptions(), + 'item_key' => $this->getItemKey(), + 'tinymce' => $this->getTinymce(), + ]; + } + + /** + * Get name field for forms in configuration page. + * + * @param string $key + * @return string + */ + public function getNameField($key = null) + { + if (! $key) { + $key = $this->item_key.'.'.$this->name; + } + + $nameField = ''; + + foreach (explode('.', $key) as $key => $field) { + $nameField .= $key === 0 ? $field : '['.$field.']'; + } + + return $nameField; + } + + /** + * Get depend the field name. + */ + public function getDependFieldName(): string + { + if (empty($depends = $this->getDepends())) { + return ''; + } + + $dependNameKey = $this->getItemKey().'.'.collect(explode(':', $depends))->first(); + + return $this->getNameField($dependNameKey); + } + + /** + * Returns the select options for the field. + */ + protected function getFieldOptions(string $options): array + { + [$class, $method] = Str::parseCallback($options); + + return app($class)->$method(); + } +} diff --git a/packages/Webkul/Core/src/Traits/PDFHandler.php b/packages/Webkul/Core/src/Traits/PDFHandler.php new file mode 100644 index 0000000..ad0709a --- /dev/null +++ b/packages/Webkul/Core/src/Traits/PDFHandler.php @@ -0,0 +1,65 @@ +getLocale(), ['ar', 'he'])) { + $mPDF = new Mpdf([ + 'margin_left' => 0, + 'margin_right' => 0, + 'margin_top' => 0, + 'margin_bottom'=> 0, + ]); + + $mPDF->SetDirectionality($direction); + + $mPDF->SetDisplayMode('fullpage'); + + $mPDF->WriteHTML($this->adjustArabicAndPersianContent($html)); + + return response()->streamDownload(fn () => print ($mPDF->Output('', 'S')), $fileName.'.pdf'); + } + + return PDF::loadHTML($this->adjustArabicAndPersianContent($html)) + ->setPaper('A4', 'portrait') + ->set_option('defaultFont', 'Courier') + ->download($fileName.'.pdf'); + } + + /** + * Adjust arabic and persian content. + * + * @return string + */ + protected function adjustArabicAndPersianContent(string $html) + { + $arabic = new \ArPHP\I18N\Arabic; + + $p = $arabic->arIdentify($html); + + for ($i = count($p) - 1; $i >= 0; $i -= 2) { + $utf8ar = $arabic->utf8Glyphs(substr($html, $p[$i - 1], $p[$i] - $p[$i - 1])); + $html = substr_replace($html, $utf8ar, $p[$i - 1], $p[$i] - $p[$i - 1]); + } + + return $html; + } +} diff --git a/packages/Webkul/Core/src/Traits/Sanitizer.php b/packages/Webkul/Core/src/Traits/Sanitizer.php new file mode 100644 index 0000000..4c0d445 --- /dev/null +++ b/packages/Webkul/Core/src/Traits/Sanitizer.php @@ -0,0 +1,81 @@ +isSvgFile($file)) { + return; + } + + try { + $svgContent = Storage::get($path); + + if (! $svgContent) { + return; + } + + $sanitizer = new MainSanitizer; + $sanitizer->setAllowedAttrs(new AllowedAttributes); + $sanitizer->setAllowedTags(new AllowedTags); + + $sanitizer->minify(true); + $sanitizer->removeRemoteReferences(true); + $sanitizer->removeXMLTag(true); + + $sanitizer->setXMLOptions(LIBXML_NONET | LIBXML_NOBLANKS); + + $sanitizedContent = $sanitizer->sanitize($svgContent); + + if ($sanitizedContent === false) { + $patterns = [ + '/]*>(.*?)<\/script>/is', + '/\bon\w+\s*=\s*["\'][^"\']*["\']/i', + '/javascript\s*:/i', + '/data\s*:[^,]*base64/i', + ]; + + $sanitizedContent = $svgContent; + + foreach ($patterns as $pattern) { + $sanitizedContent = preg_replace($pattern, '', $sanitizedContent); + } + + Storage::put($path, $sanitizedContent); + + return; + } + + $sanitizedContent = preg_replace('/(.*?<\/script>)|(\son\w+\s*=\s*["\'][^"\']*["\'])/is', '', $sanitizedContent); + + Storage::put($path, $sanitizedContent); + } catch (Exception $e) { + report($e->getMessage()); + + Storage::delete($path); + } + } + + /** + * Check if the uploaded file is an SVG based on both extension and mime type. + */ + public function isSvgFile(UploadedFile $file): bool + { + return str_contains(strtolower($file->getClientOriginalExtension()), 'svg'); + } +} diff --git a/packages/Webkul/Core/src/ViewRenderEventManager.php b/packages/Webkul/Core/src/ViewRenderEventManager.php new file mode 100755 index 0000000..4c646b6 --- /dev/null +++ b/packages/Webkul/Core/src/ViewRenderEventManager.php @@ -0,0 +1,89 @@ +params = $params ?? []; + + Event::dispatch($eventName, $this); + + return $this->templates; + } + + /** + * get params + * + * @return array + */ + public function getParams() + { + return $this->params; + } + + /** + * get param + * + * @return mixed + */ + public function getParam($name) + { + return optional($this->params)[$name]; + } + + /** + * Add templates for render + * + * @param string $template + * @return void + */ + public function addTemplate($template) + { + array_push($this->templates, $template); + } + + /** + * Renders templates + * + * @return string + */ + public function render() + { + $string = ''; + + foreach ($this->templates as $template) { + if (view()->exists($template)) { + $string .= view($template, $this->params)->render(); + } elseif (is_string($template)) { + $string .= $template; + } + } + + return $string; + } +} diff --git a/packages/Webkul/Core/src/Vite.php b/packages/Webkul/Core/src/Vite.php new file mode 100644 index 0000000..9df887a --- /dev/null +++ b/packages/Webkul/Core/src/Vite.php @@ -0,0 +1,49 @@ +useBuildDirectory($viters[$namespace]['build_directory']) + ->asset($viteUrl); + } + + /** + * Set krayin vite. + * + * @return mixed + */ + public function set(mixed $entryPoints, string $namespace = 'admin') + { + $viters = config('krayin-vite.viters'); + + if (empty($viters[$namespace])) { + throw new ViterNotFound($namespace); + } + + return BaseVite::useHotFile($viters[$namespace]['hot_file']) + ->useBuildDirectory($viters[$namespace]['build_directory']) + ->withEntryPoints($entryPoints); + } +} diff --git a/packages/Webkul/DataGrid/src/Action.php b/packages/Webkul/DataGrid/src/Action.php new file mode 100644 index 0000000..b0cda2b --- /dev/null +++ b/packages/Webkul/DataGrid/src/Action.php @@ -0,0 +1,34 @@ + $this->index, + 'icon' => $this->icon, + 'title' => $this->title, + 'method' => $this->method, + 'url' => $this->url, + ]; + } +} diff --git a/packages/Webkul/DataGrid/src/Column.php b/packages/Webkul/DataGrid/src/Column.php new file mode 100644 index 0000000..1a43872 --- /dev/null +++ b/packages/Webkul/DataGrid/src/Column.php @@ -0,0 +1,374 @@ +init($column); + } + + /** + * Initialize all necessary settings for the columns. + */ + public function init(array $column): void + { + $this->setIndex($column['index']); + + $this->setLabel($column['label']); + + $this->setType($column['type']); + + $this->setSearchable($column['searchable'] ?? $this->searchable); + + $this->setFilterable($column['filterable'] ?? $this->filterable); + + $this->setFilterableType($column['filterable_type'] ?? $this->filterableType); + + $this->setFilterableOptions($column['filterable_options'] ?? $this->filterableOptions); + + $this->setAllowMultipleValues($column['allow_multiple_values'] ?? $this->allowMultipleValues); + + $this->setSortable($column['sortable'] ?? $this->sortable); + + $this->setVisibility($column['visibility'] ?? $this->visibility); + + $this->setClosure($column['closure'] ?? $this->closure); + + $this->setColumnName($this->index); + } + + /** + * Set index. + */ + public function setIndex(string $index): void + { + $this->index = $index; + } + + /** + * Get index. + */ + public function getIndex(): string + { + return $this->index; + } + + /** + * Set label. + */ + public function setLabel(string $label): void + { + $this->label = $label; + } + + /** + * Get label. + */ + public function getLabel(): string + { + return $this->label; + } + + /** + * Set type. + */ + public function setType(string $type): void + { + $this->type = $type; + } + + /** + * Get type. + */ + public function getType(): string + { + return $this->type; + } + + /** + * Set searchable. + */ + public function setSearchable(bool $searchable): void + { + $this->searchable = $searchable; + } + + /** + * Get searchable. + */ + public function getSearchable(): bool + { + return $this->searchable; + } + + /** + * Set filterable. + */ + public function setFilterable(bool $filterable): void + { + $this->filterable = $filterable; + } + + /** + * Get filterable. + */ + public function getFilterable(): bool + { + return $this->filterable; + } + + /** + * Set filterable type. + */ + public function setFilterableType(?string $filterableType): void + { + $this->filterableType = $filterableType; + } + + /** + * Get filterable type. + */ + public function getFilterableType(): ?string + { + return $this->filterableType; + } + + /** + * Set filterable options. + */ + public function setFilterableOptions(mixed $filterableOptions): void + { + if ($filterableOptions instanceof \Closure) { + $filterableOptions = $filterableOptions(); + } + + $this->filterableOptions = $filterableOptions; + } + + /** + * Get filterable options. + */ + public function getFilterableOptions(): array + { + return $this->filterableOptions; + } + + /** + * Set allow multiple values. + */ + public function setAllowMultipleValues(bool $allowMultipleValues): void + { + $this->allowMultipleValues = $allowMultipleValues; + } + + /** + * Get allow multiple values. + */ + public function getAllowMultipleValues(): bool + { + return $this->allowMultipleValues; + } + + /** + * Set sortable. + */ + public function setSortable(?bool $sortable = null): void + { + $this->sortable = $sortable; + } + + /** + * Get sortable. + */ + public function getSortable(): bool + { + return $this->sortable; + } + + /** + * Set exportable. + */ + public function setExportable(bool $exportable): void + { + $this->exportable = $exportable; + } + + /** + * Get exportable. + */ + public function getExportable(): bool + { + return $this->exportable; + } + + /** + * Set visibility. + */ + public function setVisibility(bool $visibility): void + { + $this->visibility = $visibility; + } + + /** + * Get visibility. + */ + public function getVisibility(): bool + { + return $this->visibility; + } + + /** + * Set closure. + */ + public function setClosure(mixed $closure): void + { + $this->closure = $closure; + } + + /** + * Get closure. + */ + public function getClosure(): mixed + { + return $this->closure; + } + + /** + * Define the table's column name. Initially, it will match the index. However, after adding an alias, + * the column name may change. + */ + public function setColumnName(mixed $columnName): void + { + $this->columnName = $columnName; + } + + /** + * Get the table's column name. + */ + public function getColumnName(): mixed + { + return $this->columnName; + } + + /** + * To array. + */ + public function toArray(): array + { + return [ + 'index' => $this->index, + 'label' => $this->label, + 'type' => $this->type, + 'searchable' => $this->searchable, + 'filterable' => $this->filterable, + 'filterable_type' => $this->filterableType, + 'filterable_options' => $this->filterableOptions, + 'allow_multiple_values' => $this->allowMultipleValues, + 'sortable' => $this->sortable, + 'visibility' => $this->visibility, + ]; + } + + /** + * Validate the column. + */ + public static function validate(array $column): void + { + if (empty($column['index'])) { + throw new InvalidColumnException('The `index` key is required. Ensure that the `index` key is present in all calls to the `addColumn` method.'); + } + + if (empty($column['label'])) { + throw new InvalidColumnException('The `label` key is required. Ensure that the `label` key is present in all calls to the `addColumn` method.'); + } + + if (empty($column['type'])) { + throw new InvalidColumnException('The `type` key is required. Ensure that the `type` key is present in all calls to the `addColumn` method.'); + } + } + + /** + * Resolve the column type class. + */ + public static function resolveType(array $column): self + { + self::validate($column); + + $columnTypeClass = ColumnTypeEnum::getClassName($column['type']); + + return new $columnTypeClass($column); + } +} diff --git a/packages/Webkul/DataGrid/src/ColumnTypes/Aggregate.php b/packages/Webkul/DataGrid/src/ColumnTypes/Aggregate.php new file mode 100644 index 0000000..9ceb9c0 --- /dev/null +++ b/packages/Webkul/DataGrid/src/ColumnTypes/Aggregate.php @@ -0,0 +1,41 @@ +filterableType === FilterTypeEnum::DROPDOWN->value) { + return $queryBuilder->having(function ($scopeQueryBuilder) use ($requestedValues) { + if (is_string($requestedValues)) { + $scopeQueryBuilder->orHaving($this->columnName, $requestedValues); + + return; + } + + foreach ($requestedValues as $value) { + $scopeQueryBuilder->orHaving($this->columnName, $value); + } + }); + } + + return $queryBuilder->having(function ($scopeQueryBuilder) use ($requestedValues) { + if (is_string($requestedValues)) { + $scopeQueryBuilder->orHaving($this->columnName, 'LIKE', '%'.$requestedValues.'%'); + + return; + } + + foreach ($requestedValues as $value) { + $scopeQueryBuilder->orHaving($this->columnName, 'LIKE', '%'.$value.'%'); + } + }); + } +} diff --git a/packages/Webkul/DataGrid/src/ColumnTypes/Boolean.php b/packages/Webkul/DataGrid/src/ColumnTypes/Boolean.php new file mode 100644 index 0000000..f48dba6 --- /dev/null +++ b/packages/Webkul/DataGrid/src/ColumnTypes/Boolean.php @@ -0,0 +1,68 @@ +value) + ) { + throw new InvalidColumnException('Boolean filters will only work with `dropdown` type. Either remove the `filterable_type` or set it to `dropdown`.'); + } + + if (! $filterableType) { + $filterableType = FilterTypeEnum::DROPDOWN->value; + } + + parent::setFilterableType($filterableType); + } + + /** + * Set filterable options. + */ + public function setFilterableOptions(mixed $filterableOptions): void + { + if (empty($filterableOptions)) { + $filterableOptions = [ + [ + 'label' => trans('admin::app.components.datagrid.filters.boolean-options.true'), + 'value' => 1, + ], + [ + 'label' => trans('admin::app.components.datagrid.filters.boolean-options.false'), + 'value' => 0, + ], + ]; + } + + parent::setFilterableOptions($filterableOptions); + } + + /** + * Process filter. + */ + public function processFilter($queryBuilder, $requestedValues): mixed + { + return $queryBuilder->where(function ($scopeQueryBuilder) use ($requestedValues) { + if (is_string($requestedValues)) { + $scopeQueryBuilder->orWhere($this->columnName, $requestedValues); + + return; + } + + foreach ($requestedValues as $value) { + $scopeQueryBuilder->orWhere($this->columnName, $value); + } + }); + } +} diff --git a/packages/Webkul/DataGrid/src/ColumnTypes/Date.php b/packages/Webkul/DataGrid/src/ColumnTypes/Date.php new file mode 100644 index 0000000..07cbf2a --- /dev/null +++ b/packages/Webkul/DataGrid/src/ColumnTypes/Date.php @@ -0,0 +1,61 @@ +value) + ) { + throw new InvalidColumnException('Date filters will only work with `date_range` type. Either remove the `filterable_type` or set it to `date_range`.'); + } + + parent::setFilterableType($filterableType); + } + + /** + * Set filterable options. + */ + public function setFilterableOptions(mixed $filterableOptions): void + { + if (empty($filterableOptions)) { + $filterableOptions = DateRangeOptionEnum::options(); + } + + parent::setFilterableOptions($filterableOptions); + } + + /** + * Process filter. + */ + public function processFilter($queryBuilder, $requestedDates) + { + return $queryBuilder->where(function ($scopeQueryBuilder) use ($requestedDates) { + if (is_string($requestedDates)) { + $rangeOption = collect($this->filterableOptions)->firstWhere('name', $requestedDates); + + $requestedDates = ! $rangeOption + ? [[$requestedDates, $requestedDates]] + : [[$rangeOption['from'], $rangeOption['to']]]; + } + + foreach ($requestedDates as $value) { + $scopeQueryBuilder->whereBetween($this->columnName, [ + ($value[0] ?? '').' 00:00:01', + ($value[1] ?? '').' 23:59:59', + ]); + } + }); + } +} diff --git a/packages/Webkul/DataGrid/src/ColumnTypes/Datetime.php b/packages/Webkul/DataGrid/src/ColumnTypes/Datetime.php new file mode 100644 index 0000000..cb4c271 --- /dev/null +++ b/packages/Webkul/DataGrid/src/ColumnTypes/Datetime.php @@ -0,0 +1,58 @@ +value) + ) { + throw new InvalidColumnException('Datetime filters will only work with `datetime_range` type. Either remove the `filterable_type` or set it to `datetime_range`.'); + } + + parent::setFilterableType($filterableType); + } + + /** + * Set filterable options. + */ + public function setFilterableOptions(mixed $filterableOptions): void + { + if (empty($filterableOptions)) { + $filterableOptions = DateRangeOptionEnum::options(); + } + + parent::setFilterableOptions($filterableOptions); + } + + /** + * Process filter. + */ + public function processFilter($queryBuilder, $requestedDates) + { + return $queryBuilder->where(function ($scopeQueryBuilder) use ($requestedDates) { + if (is_string($requestedDates)) { + $rangeOption = collect($this->filterableOptions)->firstWhere('name', $requestedDates); + + $requestedDates = ! $rangeOption + ? [[$requestedDates, $requestedDates]] + : [[$rangeOption['from'], $rangeOption['to']]]; + } + + foreach ($requestedDates as $value) { + $scopeQueryBuilder->whereBetween($this->columnName, [$value[0] ?? '', $value[1] ?? '']); + } + }); + } +} diff --git a/packages/Webkul/DataGrid/src/ColumnTypes/Decimal.php b/packages/Webkul/DataGrid/src/ColumnTypes/Decimal.php new file mode 100644 index 0000000..d55deb0 --- /dev/null +++ b/packages/Webkul/DataGrid/src/ColumnTypes/Decimal.php @@ -0,0 +1,26 @@ +where(function ($scopeQueryBuilder) use ($requestedValues) { + if (is_string($requestedValues)) { + $scopeQueryBuilder->orWhere($this->columnName, $requestedValues); + + return; + } + + foreach ($requestedValues as $value) { + $scopeQueryBuilder->orWhere($this->columnName, $value); + } + }); + } +} diff --git a/packages/Webkul/DataGrid/src/ColumnTypes/Integer.php b/packages/Webkul/DataGrid/src/ColumnTypes/Integer.php new file mode 100644 index 0000000..f615445 --- /dev/null +++ b/packages/Webkul/DataGrid/src/ColumnTypes/Integer.php @@ -0,0 +1,26 @@ +where(function ($scopeQueryBuilder) use ($requestedValues) { + if (is_string($requestedValues)) { + $scopeQueryBuilder->orWhere($this->columnName, $requestedValues); + + return; + } + + foreach ($requestedValues as $value) { + $scopeQueryBuilder->orWhere($this->columnName, $value); + } + }); + } +} diff --git a/packages/Webkul/DataGrid/src/ColumnTypes/Text.php b/packages/Webkul/DataGrid/src/ColumnTypes/Text.php new file mode 100644 index 0000000..e413cdb --- /dev/null +++ b/packages/Webkul/DataGrid/src/ColumnTypes/Text.php @@ -0,0 +1,41 @@ +filterableType === FilterTypeEnum::DROPDOWN->value) { + return $queryBuilder->where(function ($scopeQueryBuilder) use ($requestedValues) { + if (is_string($requestedValues)) { + $scopeQueryBuilder->orWhere($this->columnName, $requestedValues); + + return; + } + + foreach ($requestedValues as $value) { + $scopeQueryBuilder->orWhere($this->columnName, $value); + } + }); + } + + return $queryBuilder->where(function ($scopeQueryBuilder) use ($requestedValues) { + if (is_string($requestedValues)) { + $scopeQueryBuilder->orWhere($this->columnName, 'LIKE', '%'.$requestedValues.'%'); + + return; + } + + foreach ($requestedValues as $value) { + $scopeQueryBuilder->orWhere($this->columnName, 'LIKE', '%'.$value.'%'); + } + }); + } +} diff --git a/packages/Webkul/DataGrid/src/Contracts/SavedFilter.php b/packages/Webkul/DataGrid/src/Contracts/SavedFilter.php new file mode 100644 index 0000000..9c4c4f8 --- /dev/null +++ b/packages/Webkul/DataGrid/src/Contracts/SavedFilter.php @@ -0,0 +1,5 @@ +columns; + } + + /** + * Get actions. + */ + public function getActions(): array + { + return $this->actions; + } + + /** + * Get mass actions. + */ + public function getMassActions(): array + { + return $this->massActions; + } + + /** + * Add column. + */ + public function addColumn(array $column): void + { + $this->dispatchEvent('columns.add.before', [$this, $column]); + + $this->columns[] = Column::resolveType($column); + + $this->dispatchEvent('columns.add.after', [$this, $this->columns[count($this->columns) - 1]]); + } + + /** + * Add action. + */ + public function addAction(array $action): void + { + $this->dispatchEvent('actions.add.before', [$this, $action]); + + $this->actions[] = new Action( + index: $action['index'] ?? '', + icon: $action['icon'] ?? '', + title: $action['title'], + method: $action['method'], + url: $action['url'], + ); + + $this->dispatchEvent('actions.add.after', [$this, $this->actions[count($this->actions) - 1]]); + } + + /** + * Add mass action. + */ + public function addMassAction(array $massAction): void + { + $this->dispatchEvent('mass_actions.add.before', [$this, $massAction]); + + $this->massActions[] = new MassAction( + icon: $massAction['icon'] ?? '', + title: $massAction['title'], + method: $massAction['method'], + url: $massAction['url'], + options: $massAction['options'] ?? [], + ); + + $this->dispatchEvent('mass_actions.add.after', [$this, $this->massActions[count($this->massActions) - 1]]); + } + + /** + * Set query builder. + * + * @param mixed $queryBuilder + */ + public function setQueryBuilder($queryBuilder = null): void + { + $this->dispatchEvent('query_builder.set.before', [$this, $queryBuilder]); + + $this->queryBuilder = $queryBuilder ?: $this->prepareQueryBuilder(); + + $this->dispatchEvent('query_builder.set.after', $this); + } + + /** + * Get query builder. + */ + public function getQueryBuilder(): mixed + { + return $this->queryBuilder; + } + + /** + * Map your filter. + */ + public function addFilter(string $datagridColumn, mixed $queryColumn): void + { + $this->dispatchEvent('filters.add.before', [$this, $datagridColumn, $queryColumn]); + + foreach ($this->columns as $column) { + if ($column->getIndex() === $datagridColumn) { + $column->setColumnName($queryColumn); + + break; + } + } + + $this->dispatchEvent('filters.add.after', [$this, $datagridColumn, $queryColumn]); + } + + /** + * Set exportable. + */ + public function setExportable(bool $exportable): void + { + $this->dispatchEvent('exportable.set.before', [$this, $exportable]); + + $this->exportable = $exportable; + + $this->dispatchEvent('exportable.set.after', $this); + } + + /** + * Get exportable. + */ + public function getExportable(): bool + { + return $this->exportable; + } + + /** + * Set export file. + * + * @param string $format + * @return void + */ + public function setExportFile($format = 'csv') + { + $this->dispatchEvent('export_file.set.before', [$this, $format]); + + $this->setExportable(true); + + $this->exportFile = Excel::download(new DataGridExport($this), Str::random(36).'.'.$format); + + $this->dispatchEvent('export_file.set.after', $this); + } + + /** + * Download export file. + * + * @return \Symfony\Component\HttpFoundation\BinaryFileResponse + */ + public function downloadExportFile() + { + return $this->exportFile; + } + + /** + * Process the datagrid. + * + * @return \Symfony\Component\HttpFoundation\BinaryFileResponse|\Illuminate\Http\JsonResponse + */ + public function process() + { + $this->prepare(); + + if ($this->getExportable()) { + return $this->downloadExportFile(); + } + + return response()->json($this->formatData()); + } + + /** + * To json. The reason for deprecation is that it is not an action returning JSON; instead, + * it is a process method which returns a download as well as a JSON response. + * + * @deprecated + * + * @return \Symfony\Component\HttpFoundation\BinaryFileResponse|\Illuminate\Http\JsonResponse + */ + public function toJson() + { + $this->prepare(); + + if ($this->getExportable()) { + return $this->downloadExportFile(); + } + + return response()->json($this->formatData()); + } + + /** + * Validated request. + */ + protected function validatedRequest(): array + { + request()->validate([ + 'filters' => ['sometimes', 'required', 'array'], + 'sort' => ['sometimes', 'required', 'array'], + 'pagination' => ['sometimes', 'required', 'array'], + 'export' => ['sometimes', 'required', 'boolean'], + 'format' => ['sometimes', 'required', 'in:csv,xls,xlsx'], + ]); + + return request()->only(['filters', 'sort', 'pagination', 'export', 'format']); + } + + /** + * Process all requested filters. + * + * @return \Illuminate\Database\Query\Builder + */ + protected function processRequestedFilters(array $requestedFilters) + { + foreach ($requestedFilters as $requestedColumn => $requestedValues) { + if ($requestedColumn === 'all') { + $this->queryBuilder->where(function ($scopeQueryBuilder) use ($requestedValues) { + foreach ($requestedValues as $value) { + collect($this->columns) + ->filter(fn ($column) => $column->getSearchable() && ! in_array($column->getType(), [ + ColumnTypeEnum::BOOLEAN->value, + ColumnTypeEnum::AGGREGATE->value, + ])) + ->each(fn ($column) => $scopeQueryBuilder->orWhere($column->getColumnName(), 'LIKE', '%'.$value.'%')); + } + }); + } else { + collect($this->columns) + ->first(fn ($column) => $column->getIndex() === $requestedColumn) + ->processFilter($this->queryBuilder, $requestedValues); + } + } + + return $this->queryBuilder; + } + + /** + * Process requested sorting. + * + * @return \Illuminate\Database\Query\Builder + */ + protected function processRequestedSorting($requestedSort) + { + if (! $this->sortColumn) { + $this->sortColumn = $this->primaryColumn; + } + + return $this->queryBuilder->orderBy($requestedSort['column'] ?? $this->sortColumn, $requestedSort['order'] ?? $this->sortOrder); + } + + /** + * Process requested pagination. + */ + protected function processRequestedPagination($requestedPagination): LengthAwarePaginator + { + return $this->queryBuilder->paginate( + $requestedPagination['per_page'] ?? $this->itemsPerPage, + ['*'], + 'page', + $requestedPagination['page'] ?? 1 + ); + } + + /** + * Process paginated request. + */ + protected function processPaginatedRequest(array $requestedParams): void + { + $this->dispatchEvent('process_request.paginated.before', $this); + + $this->paginator = $this->processRequestedPagination($requestedParams['pagination'] ?? []); + + $this->dispatchEvent('process_request.paginated.after', $this); + } + + /** + * Process export request. + */ + protected function processExportRequest(array $requestedParams): void + { + $this->dispatchEvent('process_request.export.before', $this); + + $this->setExportFile($requestedParams['format']); + + $this->dispatchEvent('process_request.export.after', $this); + } + + /** + * Process request. + */ + protected function processRequest(): void + { + $this->dispatchEvent('process_request.before', $this); + + /** + * Store all request parameters in this variable; avoid using direct request helpers afterward. + */ + $requestedParams = $this->validatedRequest(); + + $this->queryBuilder = $this->processRequestedFilters($requestedParams['filters'] ?? []); + + $this->queryBuilder = $this->processRequestedSorting($requestedParams['sort'] ?? []); + + /** + * The `export` parameter is validated as a boolean in the `validatedRequest`. An `empty` function will not work, + * as it will always be treated as true because of "0" and "1". + */ + isset($requestedParams['export']) && (bool) $requestedParams['export'] + ? $this->processExportRequest($requestedParams) + : $this->processPaginatedRequest($requestedParams); + + $this->dispatchEvent('process_request.after', $this); + } + + /** + * Prepare all the setup for datagrid. + */ + protected function sanitizeRow($row): \stdClass + { + /** + * Convert stdClass to array. + */ + $tempRow = json_decode(json_encode($row), true); + + foreach ($tempRow as $column => $value) { + if (! is_string($tempRow[$column])) { + continue; + } + + if (is_array($value)) { + return $this->sanitizeRow($tempRow[$column]); + } else { + $row->{$column} = strip_tags($value); + } + } + + return $row; + } + + /** + * Format columns. + */ + protected function formatColumns(): array + { + return collect($this->columns) + ->map(fn ($column) => $column->toArray()) + ->toArray(); + } + + /** + * Format actions. + */ + protected function formatActions(): array + { + return collect($this->actions) + ->map(fn ($action) => $action->toArray()) + ->toArray(); + } + + /** + * Format mass actions. + */ + protected function formatMassActions(): array + { + return collect($this->massActions) + ->map(fn ($massAction) => $massAction->toArray()) + ->toArray(); + } + + /** + * Format records. + */ + protected function formatRecords($records): mixed + { + foreach ($records as $record) { + $record = $this->sanitizeRow($record); + + foreach ($this->columns as $column) { + if ($closure = $column->getClosure()) { + $record->{$column->getIndex()} = $closure($record); + } + } + + $record->actions = []; + + foreach ($this->actions as $index => $action) { + $getUrl = $action->url; + + $record->actions[] = [ + 'index' => ! empty($action->index) ? $action->index : 'action_'.$index + 1, + 'icon' => $action->icon, + 'title' => $action->title, + 'method' => $action->method, + 'url' => $getUrl($record), + ]; + } + } + + return $records; + } + + /** + * Format data. + */ + protected function formatData(): array + { + $paginator = $this->paginator->toArray(); + + return [ + 'id' => Crypt::encryptString(get_called_class()), + 'columns' => $this->formatColumns(), + 'actions' => $this->formatActions(), + 'mass_actions' => $this->formatMassActions(), + 'records' => $this->formatRecords($paginator['data']), + 'meta' => [ + 'primary_column' => $this->primaryColumn, + 'from' => $paginator['from'], + 'to' => $paginator['to'], + 'total' => $paginator['total'], + 'per_page_options' => $this->perPageOptions, + 'per_page' => $paginator['per_page'], + 'current_page' => $paginator['current_page'], + 'last_page' => $paginator['last_page'], + ], + ]; + } + + /** + * Dispatch event. + */ + protected function dispatchEvent(string $eventName, mixed $payload): void + { + $reflection = new \ReflectionClass($this); + + $datagridName = Str::snake($reflection->getShortName()); + + Event::dispatch("datagrid.{$datagridName}.{$eventName}", $payload); + } + + /** + * Prepare all the setup for datagrid. + */ + protected function prepare(): void + { + $this->dispatchEvent('prepare.before', $this); + + $this->prepareColumns(); + + $this->dispatchEvent('columns.prepare.after', $this); + + $this->prepareActions(); + + $this->dispatchEvent('actions.prepare.after', $this); + + $this->prepareMassActions(); + + $this->dispatchEvent('mass_actions.prepare.after', $this); + + $this->setQueryBuilder(); + + $this->dispatchEvent('query_builder.prepare.after', $this); + + $this->processRequest(); + + $this->dispatchEvent('prepare.after', $this); + } +} diff --git a/packages/Webkul/DataGrid/src/Database/Migrations/2024_05_10_152848_create_saved_filters_table.php b/packages/Webkul/DataGrid/src/Database/Migrations/2024_05_10_152848_create_saved_filters_table.php new file mode 100644 index 0000000..de5d20b --- /dev/null +++ b/packages/Webkul/DataGrid/src/Database/Migrations/2024_05_10_152848_create_saved_filters_table.php @@ -0,0 +1,33 @@ +id(); + $table->integer('user_id')->unsigned(); + $table->string('name'); + $table->string('src'); + $table->json('applied'); + $table->timestamps(); + + $table->unique(['user_id', 'name', 'src']); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('datagrid_saved_filters'); + } +}; diff --git a/packages/Webkul/DataGrid/src/Enums/ColumnTypeEnum.php b/packages/Webkul/DataGrid/src/Enums/ColumnTypeEnum.php new file mode 100644 index 0000000..b96bb12 --- /dev/null +++ b/packages/Webkul/DataGrid/src/Enums/ColumnTypeEnum.php @@ -0,0 +1,67 @@ +value => Text::class, + self::INTEGER->value => Integer::class, + self::FLOAT->value => Decimal::class, + self::BOOLEAN->value => Boolean::class, + self::DATE->value => Date::class, + self::DATETIME->value => Datetime::class, + self::AGGREGATE->value => Aggregate::class, + default => throw new InvalidColumnTypeException("Invalid column type: {$type}"), + }; + } +} diff --git a/packages/Webkul/DataGrid/src/Enums/DateRangeOptionEnum.php b/packages/Webkul/DataGrid/src/Enums/DateRangeOptionEnum.php new file mode 100644 index 0000000..feae627 --- /dev/null +++ b/packages/Webkul/DataGrid/src/Enums/DateRangeOptionEnum.php @@ -0,0 +1,103 @@ + self::TODAY->value, + 'label' => trans('admin::app.components.datagrid.filters.date-options.today'), + 'from' => now()->today()->format($format), + 'to' => now()->endOfDay()->format($format), + ], + [ + 'name' => self::YESTERDAY->value, + 'label' => trans('admin::app.components.datagrid.filters.date-options.yesterday'), + 'from' => now()->yesterday()->format($format), + 'to' => now()->today()->subSecond(1)->format($format), + ], + [ + 'name' => self::THIS_WEEK->value, + 'label' => trans('admin::app.components.datagrid.filters.date-options.this-week'), + 'from' => now()->startOfWeek()->format($format), + 'to' => now()->endOfWeek()->format($format), + ], + [ + 'name' => self::THIS_MONTH->value, + 'label' => trans('admin::app.components.datagrid.filters.date-options.this-month'), + 'from' => now()->startOfMonth()->format($format), + 'to' => now()->endOfMonth()->format($format), + ], + [ + 'name' => self::LAST_MONTH->value, + 'label' => trans('admin::app.components.datagrid.filters.date-options.last-month'), + 'from' => now()->subMonth(1)->startOfMonth()->format($format), + 'to' => now()->subMonth(1)->endOfMonth()->format($format), + ], + [ + 'name' => self::LAST_THREE_MONTHS->value, + 'label' => trans('admin::app.components.datagrid.filters.date-options.last-three-months'), + 'from' => now()->subMonth(3)->startOfMonth()->format($format), + 'to' => now()->subMonth(1)->endOfMonth()->format($format), + ], + [ + 'name' => self::LAST_SIX_MONTHS->value, + 'label' => trans('admin::app.components.datagrid.filters.date-options.last-six-months'), + 'from' => now()->subMonth(6)->startOfMonth()->format($format), + 'to' => now()->subMonth(1)->endOfMonth()->format($format), + ], + [ + 'name' => self::THIS_YEAR->value, + 'label' => trans('admin::app.components.datagrid.filters.date-options.this-year'), + 'from' => now()->startOfYear()->format($format), + 'to' => now()->endOfYear()->format($format), + ], + ]; + } +} diff --git a/packages/Webkul/DataGrid/src/Enums/FilterTypeEnum.php b/packages/Webkul/DataGrid/src/Enums/FilterTypeEnum.php new file mode 100644 index 0000000..df38a94 --- /dev/null +++ b/packages/Webkul/DataGrid/src/Enums/FilterTypeEnum.php @@ -0,0 +1,21 @@ +datagrid->getQueryBuilder(); + } + + /** + * Headings. + */ + public function headings(): array + { + return collect($this->datagrid->getColumns()) + ->filter(fn ($column) => $column->getExportable()) + ->map(fn ($column) => $column->getLabel()) + ->toArray(); + } + + /** + * Map each row for export. + */ + public function map(mixed $record): array + { + return collect($this->datagrid->getColumns()) + ->filter(fn ($column) => $column->getExportable()) + ->map(function ($column) use ($record) { + $index = $column->getIndex(); + $value = $record->{$index}; + + if ( + in_array($index, ['emails', 'contact_numbers']) + && is_string($value) + ) { + return $this->extractValuesFromJson($value); + } + + return $value; + }) + ->toArray(); + } + + /** + * Extract 'value' fields from a JSON string. + */ + protected function extractValuesFromJson(string $json): string + { + $items = json_decode($json, true); + + if ( + json_last_error() === JSON_ERROR_NONE + && is_array($items) + ) { + return collect($items)->map(fn ($item) => "{$item['value']} ({$item['label']})")->implode(', '); + } + + return $json; + } +} diff --git a/packages/Webkul/DataGrid/src/Http/helpers.php b/packages/Webkul/DataGrid/src/Http/helpers.php new file mode 100644 index 0000000..b174f1c --- /dev/null +++ b/packages/Webkul/DataGrid/src/Http/helpers.php @@ -0,0 +1,18 @@ + $this->icon, + 'title' => $this->title, + 'method' => $this->method, + 'url' => $this->url, + 'options' => $this->options, + ]; + } +} diff --git a/packages/Webkul/DataGrid/src/Models/SavedFilter.php b/packages/Webkul/DataGrid/src/Models/SavedFilter.php new file mode 100755 index 0000000..4eebe64 --- /dev/null +++ b/packages/Webkul/DataGrid/src/Models/SavedFilter.php @@ -0,0 +1,40 @@ + 'json', + ]; +} diff --git a/packages/Webkul/DataGrid/src/Models/SavedFilterProxy.php b/packages/Webkul/DataGrid/src/Models/SavedFilterProxy.php new file mode 100644 index 0000000..226823c --- /dev/null +++ b/packages/Webkul/DataGrid/src/Models/SavedFilterProxy.php @@ -0,0 +1,7 @@ +loadMigrationsFrom(__DIR__.'/../Database/Migrations'); + } + + /** + * Register any application services. + */ + public function register(): void {} +} diff --git a/packages/Webkul/DataGrid/src/Providers/ModuleServiceProvider.php b/packages/Webkul/DataGrid/src/Providers/ModuleServiceProvider.php new file mode 100644 index 0000000..f8e41ea --- /dev/null +++ b/packages/Webkul/DataGrid/src/Providers/ModuleServiceProvider.php @@ -0,0 +1,12 @@ + [ + 'title' => 'data_transfer::app.importers.persons.title', + 'importer' => 'Webkul\DataTransfer\Helpers\Importers\Persons\Importer', + 'sample_path' => 'data-transfer/samples/persons.csv', + ], + + 'products' => [ + 'title' => 'data_transfer::app.importers.products.title', + 'importer' => 'Webkul\DataTransfer\Helpers\Importers\Products\Importer', + 'sample_path' => 'data-transfer/samples/products.csv', + ], + + 'leads' => [ + 'title' => 'data_transfer::app.importers.leads.title', + 'importer' => 'Webkul\DataTransfer\Helpers\Importers\Leads\Importer', + 'sample_path' => 'data-transfer/samples/leads.csv', + ], +]; diff --git a/packages/Webkul/DataTransfer/src/Contracts/Import.php b/packages/Webkul/DataTransfer/src/Contracts/Import.php new file mode 100644 index 0000000..d9f02b8 --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Contracts/Import.php @@ -0,0 +1,5 @@ +increments('id'); + $table->string('state')->default('pending'); + $table->boolean('process_in_queue')->default(1); + $table->string('type'); + $table->string('action'); + $table->string('validation_strategy'); + $table->integer('allowed_errors')->default(0); + $table->integer('processed_rows_count')->default(0); + $table->integer('invalid_rows_count')->default(0); + $table->integer('errors_count')->default(0); + $table->json('errors')->nullable(); + $table->string('field_separator'); + $table->string('file_path'); + $table->string('error_file_path')->nullable(); + $table->json('summary')->nullable(); + + $table->datetime('started_at')->nullable(); + $table->datetime('completed_at')->nullable(); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('imports'); + } +}; diff --git a/packages/Webkul/DataTransfer/src/Database/Migrations/2024_01_11_154741_create_import_batches_table.php b/packages/Webkul/DataTransfer/src/Database/Migrations/2024_01_11_154741_create_import_batches_table.php new file mode 100644 index 0000000..0139541 --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Database/Migrations/2024_01_11_154741_create_import_batches_table.php @@ -0,0 +1,32 @@ +increments('id'); + $table->string('state')->default('pending'); + $table->json('data'); + $table->json('summary')->nullable(); + $table->integer('import_id')->unsigned(); + + $table->foreign('import_id')->references('id')->on('imports')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('import_batches'); + } +}; diff --git a/packages/Webkul/DataTransfer/src/Helpers/Error.php b/packages/Webkul/DataTransfer/src/Helpers/Error.php new file mode 100644 index 0000000..3683d39 --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Helpers/Error.php @@ -0,0 +1,186 @@ +messageTemplate[$code] = $template; + + return $this; + } + + /** + * Add error message. + */ + public function addError(string $code, ?int $rowNumber = null, ?string $columnName = null, ?string $message = null): self + { + if ($this->isErrorAlreadyAdded($rowNumber, $code, $columnName)) { + return $this; + } + + $this->addRowToInvalid($rowNumber); + + $message = $this->getErrorMessage($code, $message, $columnName); + + $this->items[$rowNumber][] = [ + 'code' => $code, + 'column' => $columnName, + 'message' => $message, + ]; + + $this->errorsCount++; + + return $this; + } + + /** + * Check if error is already added for the row, code and column. + */ + public function isErrorAlreadyAdded(?int $rowNumber, string $code, ?string $columnName): bool + { + return collect($this->items[$rowNumber] ?? []) + ->where('code', $code) + ->where('column', $columnName) + ->isNotEmpty(); + } + + /** + * Add specific row to invalid list via row number. + */ + protected function addRowToInvalid(?int $rowNumber): self + { + if (is_null($rowNumber)) { + return $this; + } + + if (! in_array($rowNumber, $this->invalidRows)) { + $this->invalidRows[] = $rowNumber; + } + + return $this; + } + + /** + * Add specific row to invalid list via row number. + */ + public function addRowToSkip(?int $rowNumber): self + { + if (is_null($rowNumber)) { + return $this; + } + + if (! in_array($rowNumber, $this->skippedRows)) { + $this->skippedRows[] = $rowNumber; + } + + return $this; + } + + /** + * Check if row is invalid by row number. + */ + public function isRowInvalid(int $rowNumber): bool + { + return in_array($rowNumber, array_merge($this->invalidRows, $this->skippedRows)); + } + + /** + * Build an error message via code, message and column name. + */ + protected function getErrorMessage(?string $code, ?string $message, ?string $columnName): string + { + if ( + empty($message) + && isset($this->messageTemplate[$code]) + ) { + $message = (string) $this->messageTemplate[$code]; + } + + if ( + $columnName + && $message + ) { + $message = sprintf($message, $columnName); + } + + if (! $message) { + $message = $code; + } + + return $message; + } + + /** + * Get number of invalid rows. + */ + public function getInvalidRowsCount(): int + { + return count($this->invalidRows); + } + + /** + * Get current error count. + */ + public function getErrorsCount(): int + { + return $this->errorsCount; + } + + /** + * Get all errors from an import process. + */ + public function getAllErrors(): array + { + return $this->items; + } + + /** + * Return all errors grouped by code. + */ + public function getAllErrorsGroupedByCode(): array + { + $errors = []; + + foreach ($this->items as $rowNumber => $rowErrors) { + foreach ($rowErrors as $error) { + if ($rowNumber === '') { + $errors[$error['code']][$error['message']] = null; + } else { + $errors[$error['code']][$error['message']][] = $rowNumber; + } + } + } + + return $errors; + } +} diff --git a/packages/Webkul/DataTransfer/src/Helpers/Import.php b/packages/Webkul/DataTransfer/src/Helpers/Import.php new file mode 100644 index 0000000..aad39cb --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Helpers/Import.php @@ -0,0 +1,573 @@ +import = $import; + + return $this; + } + + /** + * Returns import instance. + */ + public function getImport(): ImportContract + { + return $this->import; + } + + /** + * Returns error helper instance. + * + * @return \Webkul\DataTransfer\Helpers\Error + */ + public function getErrorHelper() + { + return $this->errorHelper; + } + + /** + * Returns source helper instance. + */ + public function getSource(): AbstractSource + { + if (Str::contains($this->import->file_path, '.csv')) { + $source = new CSVSource( + $this->import->file_path, + $this->import->field_separator, + ); + } else { + $source = new ExcelSource( + $this->import->file_path, + $this->import->field_separator, + ); + } + + return $source; + } + + /** + * Validates import and returns validation result. + */ + public function validate(): bool + { + try { + $source = $this->getSource(); + + $typeImporter = $this->getTypeImporter()->setSource($source); + + $typeImporter->validateData(); + } catch (\Exception $e) { + $this->errorHelper->addError( + AbstractImporter::ERROR_CODE_SYSTEM_EXCEPTION, + null, + null, + $e->getMessage() + ); + } + + $import = $this->importRepository->update([ + 'state' => self::STATE_VALIDATED, + 'processed_rows_count' => $this->getProcessedRowsCount(), + 'invalid_rows_count' => $this->errorHelper->getInvalidRowsCount(), + 'errors_count' => $this->errorHelper->getErrorsCount(), + 'errors' => $this->getFormattedErrors(), + 'error_file_path' => $this->uploadErrorReport(), + ], $this->import->id); + + $this->setImport($import); + + return $this->isValid(); + } + + /** + * Starts import process. + */ + public function isValid(): bool + { + if ($this->isErrorLimitExceeded()) { + return false; + } + + if ($this->import->processed_rows_count <= $this->import->invalid_rows_count) { + return false; + } + + return true; + } + + /** + * Check if error limit has been exceeded. + */ + public function isErrorLimitExceeded(): bool + { + if ( + $this->import->validation_strategy == self::VALIDATION_STRATEGY_STOP_ON_ERROR + && $this->import->errors_count > $this->import->allowed_errors + ) { + return true; + } + + return false; + } + + /** + * Starts import process. + */ + public function start(?ImportBatchContract $importBatch = null): bool + { + DB::beginTransaction(); + + try { + $typeImporter = $this->getTypeImporter(); + + $typeImporter->importData($importBatch); + } catch (\Exception $e) { + /** + * Rollback transaction. + */ + DB::rollBack(); + + throw $e; + } finally { + /** + * Commit transaction. + */ + DB::commit(); + } + + return true; + } + + /** + * Link import resources. + */ + public function link(ImportBatchContract $importBatch): bool + { + DB::beginTransaction(); + + try { + $typeImporter = $this->getTypeImporter(); + + $typeImporter->linkData($importBatch); + } catch (\Exception $e) { + /** + * Rollback transaction. + */ + DB::rollBack(); + + throw $e; + } finally { + /** + * Commit transaction. + */ + DB::commit(); + } + + return true; + } + + /** + * Index import resources. + */ + public function index(ImportBatchContract $importBatch): bool + { + DB::beginTransaction(); + + try { + $typeImporter = $this->getTypeImporter(); + + $typeImporter->indexData($importBatch); + } catch (\Exception $e) { + /** + * Rollback transaction. + */ + DB::rollBack(); + + throw $e; + } finally { + /** + * Commit transaction. + */ + DB::commit(); + } + + return true; + } + + /** + * Started the import process. + */ + public function started(): void + { + $import = $this->importRepository->update([ + 'state' => self::STATE_PROCESSING, + 'started_at' => now(), + 'summary' => [], + ], $this->import->id); + + $this->setImport($import); + + Event::dispatch('data_transfer.imports.started', $import); + } + + /** + * Started the import linking process. + */ + public function linking(): void + { + $import = $this->importRepository->update([ + 'state' => self::STATE_LINKING, + ], $this->import->id); + + $this->setImport($import); + + Event::dispatch('data_transfer.imports.linking', $import); + } + + /** + * Started the import indexing process. + */ + public function indexing(): void + { + $import = $this->importRepository->update([ + 'state' => self::STATE_INDEXING, + ], $this->import->id); + + $this->setImport($import); + + Event::dispatch('data_transfer.imports.indexing', $import); + } + + /** + * Start the import process. + */ + public function completed(): void + { + $summary = $this->importBatchRepository + ->select( + DB::raw('SUM(json_unquote(json_extract(summary, \'$."created"\'))) AS created'), + DB::raw('SUM(json_unquote(json_extract(summary, \'$."updated"\'))) AS updated'), + DB::raw('SUM(json_unquote(json_extract(summary, \'$."deleted"\'))) AS deleted'), + ) + ->where('import_id', $this->import->id) + ->groupBy('import_id') + ->first() + ->toArray(); + + $import = $this->importRepository->update([ + 'state' => self::STATE_COMPLETED, + 'summary' => $summary, + 'completed_at' => now(), + ], $this->import->id); + + $this->setImport($import); + + Event::dispatch('data_transfer.imports.completed', $import); + } + + /** + * Returns import stats. + */ + public function stats(string $state): array + { + $total = $this->import->batches->count(); + + $completed = $this->import->batches->where('state', $state)->count(); + + $progress = $total + ? round($completed / $total * 100) + : 0; + + $summary = $this->importBatchRepository + ->select( + DB::raw('SUM(json_unquote(json_extract(summary, \'$."created"\'))) AS created'), + DB::raw('SUM(json_unquote(json_extract(summary, \'$."updated"\'))) AS updated'), + DB::raw('SUM(json_unquote(json_extract(summary, \'$."deleted"\'))) AS deleted'), + ) + ->where('import_id', $this->import->id) + ->where('state', $state) + ->groupBy('import_id') + ->first() + ?->toArray(); + + return [ + 'batches' => [ + 'total' => $total, + 'completed' => $completed, + 'remaining' => $total - $completed, + ], + 'progress' => $progress, + 'summary' => $summary ?? [ + 'created' => 0, + 'updated' => 0, + 'deleted' => 0, + ], + ]; + } + + /** + * Return all error grouped by error code. + */ + public function getFormattedErrors(): array + { + $errors = []; + + foreach ($this->errorHelper->getAllErrorsGroupedByCode() as $groupedErrors) { + foreach ($groupedErrors as $errorMessage => $rowNumbers) { + if (! empty($rowNumbers)) { + $errors[] = 'Row(s) '.implode(', ', $rowNumbers).': '.$errorMessage; + } else { + $errors[] = $errorMessage; + } + } + } + + return $errors; + } + + /** + * Uploads error report and save the path to the database. + */ + public function uploadErrorReport(): ?string + { + /** + * Return null if there are no errors. + */ + if (! $this->errorHelper->getErrorsCount()) { + return null; + } + + /** + * Return null if there are no invalid rows. + */ + if (! $this->errorHelper->getInvalidRowsCount()) { + return null; + } + + $errors = $this->errorHelper->getAllErrors(); + + $source = $this->getTypeImporter()->getSource(); + + $source->rewind(); + + $spreadsheet = new Spreadsheet; + + $sheet = $spreadsheet->getActiveSheet(); + + /** + * Add headers with extra error column. + */ + $sheet->fromArray( + [array_merge($source->getColumnNames(), [ + 'error', + ])], + null, + 'A1' + ); + + $rowNumber = 2; + + while ($source->valid()) { + try { + $rowData = $source->current(); + } catch (\InvalidArgumentException $e) { + $source->next(); + + continue; + } + + $rowErrors = $errors[$source->getCurrentRowNumber()] ?? []; + + if (! empty($rowErrors)) { + $rowErrors = Arr::pluck($rowErrors, 'message'); + } + + $rowData[] = implode('|', $rowErrors); + + $sheet->fromArray([$rowData], null, 'A'.$rowNumber++); + + $source->next(); + } + + $fileType = pathinfo($this->import->file_path, PATHINFO_EXTENSION); + + switch ($fileType) { + case 'csv': + $writer = new Csv($spreadsheet); + + $writer->setDelimiter($this->import->field_separator); + + break; + + case 'xls': + $writer = new Xls($spreadsheet); + + case 'xlsx': + $writer = new Xlsx($spreadsheet); + + break; + + default: + throw new \InvalidArgumentException("Unsupported file type: $fileType"); + } + + $errorFilePath = 'imports/'.time().'-error-report.'.$fileType; + + $writer->save(Storage::disk('public')->path($errorFilePath)); + + return $errorFilePath; + } + + /** + * Validates source file and returns validation result. + */ + public function getTypeImporter(): AbstractImporter + { + if (! $this->typeImporter) { + $importerConfig = config('importers.'.$this->import->type); + + $this->typeImporter = app()->make($importerConfig['importer']) + ->setImport($this->import) + ->setErrorHelper($this->errorHelper); + } + + return $this->typeImporter; + } + + /** + * Returns number of checked rows. + */ + public function getProcessedRowsCount(): int + { + return $this->getTypeImporter()->getProcessedRowsCount(); + } + + /** + * Is linking resource required for the import operation. + */ + public function isLinkingRequired(): bool + { + return $this->getTypeImporter()->isLinkingRequired(); + } + + /** + * Is indexing resource required for the import operation. + */ + public function isIndexingRequired(): bool + { + return $this->getTypeImporter()->isIndexingRequired(); + } +} diff --git a/packages/Webkul/DataTransfer/src/Helpers/Importers/AbstractImporter.php b/packages/Webkul/DataTransfer/src/Helpers/Importers/AbstractImporter.php new file mode 100644 index 0000000..bb38b4f --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Helpers/Importers/AbstractImporter.php @@ -0,0 +1,551 @@ + 'data_transfer::app.validation.errors.system', + self::ERROR_CODE_COLUMN_NOT_FOUND => 'data_transfer::app.validation.errors.column-not-found', + self::ERROR_CODE_COLUMN_EMPTY_HEADER => 'data_transfer::app.validation.errors.column-empty-headers', + self::ERROR_CODE_COLUMN_NAME_INVALID => 'data_transfer::app.validation.errors.column-name-invalid', + self::ERROR_CODE_INVALID_ATTRIBUTE => 'data_transfer::app.validation.errors.invalid-attribute', + self::ERROR_CODE_WRONG_QUOTES => 'data_transfer::app.validation.errors.wrong-quotes', + self::ERROR_CODE_COLUMNS_NUMBER => 'data_transfer::app.validation.errors.column-numbers', + ]; + + public const BATCH_SIZE = 100; + + /** + * Is linking required. + */ + protected bool $linkingRequired = false; + + /** + * Is indexing required. + */ + protected bool $indexingRequired = false; + + /** + * Error helper instance. + * + * @var \Webkul\DataTransfer\Helpers\Error + */ + protected $errorHelper; + + /** + * Import instance. + */ + protected ImportContract $import; + + /** + * Source instance. + * + * @var \Webkul\DataTransfer\Helpers\Source + */ + protected $source; + + /** + * Valid column names. + */ + protected array $validColumnNames = []; + + /** + * Array of numbers of validated rows as keys and boolean TRUE as values. + */ + protected array $validatedRows = []; + + /** + * Number of rows processed by validation. + */ + protected int $processedRowsCount = 0; + + /** + * Number of created items. + */ + protected int $createdItemsCount = 0; + + /** + * Number of updated items. + */ + protected int $updatedItemsCount = 0; + + /** + * Number of deleted items. + */ + protected int $deletedItemsCount = 0; + + /** + * Create a new helper instance. + * + * @return void + */ + public function __construct( + protected ImportBatchRepository $importBatchRepository, + protected AttributeRepository $attributeRepository, + protected AttributeValueRepository $attributeValueRepository + ) {} + + /** + * Validate data row. + */ + abstract public function validateRow(array $rowData, int $rowNumber): bool; + + /** + * Import data rows. + */ + abstract public function importBatch(ImportBatchContract $importBatchContract): bool; + + /** + * Initialize Product error messages. + */ + protected function initErrorMessages(): void + { + foreach ($this->errorMessages as $errorCode => $message) { + $this->errorHelper->addErrorMessage($errorCode, trans($message)); + } + } + + /** + * Import instance. + */ + public function setImport(ImportContract $import): self + { + $this->import = $import; + + return $this; + } + + /** + * Import instance. + * + * @param \Webkul\DataTransfer\Helpers\Source $errorHelper + */ + public function setSource($source) + { + $this->source = $source; + + return $this; + } + + /** + * Import instance. + * + * @param \Webkul\DataTransfer\Helpers\Error $errorHelper + */ + public function setErrorHelper($errorHelper): self + { + $this->errorHelper = $errorHelper; + + $this->initErrorMessages(); + + return $this; + } + + /** + * Import instance. + * + * @return \Webkul\DataTransfer\Helpers\Source + */ + public function getSource() + { + return $this->source; + } + + /** + * Retrieve valid column names. + */ + public function getValidColumnNames(): array + { + return $this->validColumnNames; + } + + /** + * Validate data. + */ + public function validateData(): void + { + Event::dispatch('data_transfer.imports.validate.before', $this->import); + + $errors = []; + + $absentColumns = array_diff($this->permanentAttributes, $columns = $this->getSource()->getColumnNames()); + + if (! empty($absentColumns)) { + $errors[self::ERROR_CODE_COLUMN_NOT_FOUND] = $absentColumns; + } + + foreach ($columns as $columnNumber => $columnName) { + if (empty($columnName)) { + $errors[self::ERROR_CODE_COLUMN_EMPTY_HEADER][] = $columnNumber + 1; + } elseif (! preg_match('/^[a-z][a-z0-9_]*$/', $columnName)) { + $errors[self::ERROR_CODE_COLUMN_NAME_INVALID][] = $columnName; + } elseif (! in_array($columnName, $this->getValidColumnNames())) { + $errors[self::ERROR_CODE_INVALID_ATTRIBUTE][] = $columnName; + } + } + + /** + * Add Columns Errors. + */ + foreach ($errors as $errorCode => $error) { + $this->addErrors($errorCode, $error); + } + + if (! $this->errorHelper->getErrorsCount()) { + $this->saveValidatedBatches(); + } + + Event::dispatch('data_transfer.imports.validate.after', $this->import); + } + + /** + * Save validated batches. + */ + protected function saveValidatedBatches(): self + { + $source = $this->getSource(); + + $batchRows = []; + + $source->rewind(); + + /** + * Clean previous saved batches. + */ + $this->importBatchRepository->deleteWhere([ + 'import_id' => $this->import->id, + ]); + + while ( + $source->valid() + || count($batchRows) + ) { + if ( + count($batchRows) == self::BATCH_SIZE + || ! $source->valid() + ) { + $this->importBatchRepository->create([ + 'import_id' => $this->import->id, + 'data' => $batchRows, + ]); + + $batchRows = []; + } + + if ($source->valid()) { + $rowData = $source->current(); + + if ($this->validateRow($rowData, $source->getCurrentRowNumber())) { + $batchRows[] = $this->prepareRowForDb($rowData); + } + + $this->processedRowsCount++; + + $source->next(); + } + } + + return $this; + } + + /** + * Prepare validation rules. + */ + public function getValidationRules(string $entityType, array $rowData): array + { + if (empty($entityType)) { + return []; + } + + $rules = []; + + $attributes = $this->attributeRepository->scopeQuery(fn ($query) => $query->whereIn('code', array_keys($rowData))->where('entity_type', $entityType))->get(); + + foreach ($attributes as $attribute) { + $validations = []; + + if ($attribute->type == 'boolean') { + continue; + } elseif ($attribute->type == 'address') { + if (! $attribute->is_required) { + continue; + } + + $validations = [ + $attribute->code.'.address' => 'required', + $attribute->code.'.country' => 'required', + $attribute->code.'.state' => 'required', + $attribute->code.'.city' => 'required', + $attribute->code.'.postcode' => 'required', + ]; + } elseif ($attribute->type == 'email') { + $validations = [ + $attribute->code => [$attribute->is_required ? 'required' : 'nullable'], + $attribute->code.'.*.value' => [$attribute->is_required ? 'required' : 'nullable', 'email'], + $attribute->code.'.*.label' => $attribute->is_required ? 'required' : 'nullable', + ]; + } elseif ($attribute->type == 'phone') { + $validations = [ + $attribute->code => [$attribute->is_required ? 'required' : 'nullable'], + $attribute->code.'.*.value' => [$attribute->is_required ? 'required' : 'nullable'], + $attribute->code.'.*.label' => $attribute->is_required ? 'required' : 'nullable', + ]; + } else { + $validations[$attribute->code] = [$attribute->is_required ? 'required' : 'nullable']; + + if ($attribute->type == 'text' && $attribute->validation) { + array_push($validations[$attribute->code], + $attribute->validation == 'decimal' + ? new Decimal + : $attribute->validation + ); + } + + if ($attribute->type == 'price') { + array_push($validations[$attribute->code], new Decimal); + } + } + + if ($attribute->is_unique) { + array_push($validations[in_array($attribute->type, ['email', 'phone']) + ? $attribute->code.'.*.value' + : $attribute->code + ], function ($field, $value, $fail) use ($attribute) { + if (! $this->attributeValueRepository->isValueUnique(null, $attribute->entity_type, $attribute, $field)) { + $fail(trans('data_transfer::app.validation.errors.already-exists', ['attribute' => $attribute->name])); + } + }); + } + + $rules = [ + ...$rules, + ...$validations, + ]; + } + + return $rules; + } + + /** + * Start the import process. + */ + public function importData(?ImportBatchContract $importBatch = null): bool + { + if ($importBatch) { + $this->importBatch($importBatch); + + return true; + } + + $typeBatches = []; + + foreach ($this->import->batches as $batch) { + $typeBatches['import'][] = new ImportBatchJob($batch); + + if ($this->isLinkingRequired()) { + $typeBatches['link'][] = new LinkBatchJob($batch); + } + + if ($this->isIndexingRequired()) { + $typeBatches['index'][] = new IndexBatchJob($batch); + } + } + + $chain[] = Bus::batch($typeBatches['import']); + + if (! empty($typeBatches['link'])) { + $chain[] = new LinkingJob($this->import); + + $chain[] = Bus::batch($typeBatches['link']); + } + + if (! empty($typeBatches['index'])) { + $chain[] = new IndexingJob($this->import); + + $chain[] = Bus::batch($typeBatches['index']); + } + + $chain[] = new CompletedJob($this->import); + + Bus::chain($chain)->dispatch(); + + return true; + } + + /** + * Link resource data. + */ + public function linkData(ImportBatchContract $importBatch): bool + { + $this->linkBatch($importBatch); + + return true; + } + + /** + * Index resource data. + */ + public function indexData(ImportBatchContract $importBatch): bool + { + $this->indexBatch($importBatch); + + return true; + } + + /** + * Add errors to error aggregator. + */ + protected function addErrors(string $code, mixed $errors): void + { + $this->errorHelper->addError( + $code, + null, + implode('", "', $errors) + ); + } + + /** + * Add row as skipped. + * + * @param int|null $rowNumber + * @param string|null $columnName + * @param string|null $errorMessage + * @return $this + */ + protected function skipRow($rowNumber, string $errorCode, $columnName = null, $errorMessage = null): self + { + $this->errorHelper->addError( + $errorCode, + $rowNumber, + $columnName, + $errorMessage + ); + + $this->errorHelper->addRowToSkip($rowNumber); + + return $this; + } + + /** + * Prepare row data to save into the database. + */ + protected function prepareRowForDb(array $rowData): array + { + $rowData = array_map(function ($value) { + return $value === '' ? null : $value; + }, $rowData); + + return $rowData; + } + + /** + * Returns number of checked rows. + */ + public function getProcessedRowsCount(): int + { + return $this->processedRowsCount; + } + + /** + * Returns number of created items count. + */ + public function getCreatedItemsCount(): int + { + return $this->createdItemsCount; + } + + /** + * Returns number of updated items count. + */ + public function getUpdatedItemsCount(): int + { + return $this->updatedItemsCount; + } + + /** + * Returns number of deleted items count. + */ + public function getDeletedItemsCount(): int + { + return $this->deletedItemsCount; + } + + /** + * Is linking resource required for the import operation. + */ + public function isLinkingRequired(): bool + { + if ($this->import->action == Import::ACTION_DELETE) { + return false; + } + + return $this->linkingRequired; + } + + /** + * Is indexing resource required for the import operation. + */ + public function isIndexingRequired(): bool + { + if ($this->import->action == Import::ACTION_DELETE) { + return false; + } + + return $this->indexingRequired; + } +} diff --git a/packages/Webkul/DataTransfer/src/Helpers/Importers/Leads/Importer.php b/packages/Webkul/DataTransfer/src/Helpers/Importers/Leads/Importer.php new file mode 100644 index 0000000..15e4121 --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Helpers/Importers/Leads/Importer.php @@ -0,0 +1,515 @@ + 'data_transfer::app.importers.leads.validation.errors.id-not-found', + ]; + + /** + * Permanent entity columns. + * + * @var string[] + */ + protected $permanentAttributes = ['title']; + + /** + * Permanent entity column. + */ + protected string $masterAttributeCode = 'id'; + + /** + * Is linking required + */ + protected bool $linkingRequired = true; + + /** + * Create a new helper instance. + * + * @return void + */ + public function __construct( + protected ImportBatchRepository $importBatchRepository, + protected LeadRepository $leadRepository, + protected LeadProductRepository $leadProductRepository, + protected AttributeRepository $attributeRepository, + protected AttributeValueRepository $attributeValueRepository, + protected Storage $leadsStorage, + ) { + parent::__construct( + $importBatchRepository, + $attributeRepository, + $attributeValueRepository, + ); + } + + /** + * Initialize leads error templates. + */ + protected function initErrorMessages(): void + { + foreach ($this->messages as $errorCode => $message) { + $this->errorHelper->addErrorMessage($errorCode, trans($message)); + } + + parent::initErrorMessages(); + } + + /** + * Validate data. + */ + public function validateData(): void + { + $this->leadsStorage->init(); + + parent::validateData(); + } + + /** + * Validates row. + */ + public function validateRow(array $rowData, int $rowNumber): bool + { + /** + * If row is already validated than no need for further validation. + */ + if (isset($this->validatedRows[$rowNumber])) { + return ! $this->errorHelper->isRowInvalid($rowNumber); + } + + $this->validatedRows[$rowNumber] = true; + + /** + * If import action is delete than no need for further validation. + */ + if ($this->import->action == Import::ACTION_DELETE) { + if (! $this->isTitleExist($rowData['title'])) { + $this->skipRow($rowNumber, self::ERROR_ID_NOT_FOUND_FOR_DELETE, 'id'); + + return false; + } + + return true; + } + + if (! empty($rowData['product'])) { + $product = $this->parseProducts($rowData['product']); + + $validator = Validator::make($product, [ + 'id' => 'required|exists:products,id', + 'price' => 'required', + 'quantity' => 'required', + ]); + + if ($validator->fails()) { + $failedAttributes = $validator->failed(); + + foreach ($validator->errors()->getMessages() as $attributeCode => $message) { + $errorCode = array_key_first($failedAttributes[$attributeCode] ?? []); + + $this->skipRow($rowNumber, $errorCode, $attributeCode, current($message)); + } + } + } + + /** + * Validate leads attributes. + */ + $validator = Validator::make($rowData, [ + ...$this->getValidationRules('leads|persons', $rowData), + 'id' => 'numeric', + 'status' => 'sometimes|required|in:0,1', + 'user_id' => 'required|exists:users,id', + 'person_id' => 'required|exists:persons,id', + 'lead_source_id' => 'required|exists:lead_sources,id', + 'lead_type_id' => 'required|exists:lead_types,id', + 'lead_pipeline_id' => 'required|exists:lead_pipelines,id', + 'lead_pipeline_stage_id' => 'required|exists:lead_pipeline_stages,id', + ]); + + if ($validator->fails()) { + $failedAttributes = $validator->failed(); + + foreach ($validator->errors()->getMessages() as $attributeCode => $message) { + $errorCode = array_key_first($failedAttributes[$attributeCode] ?? []); + + $this->skipRow($rowNumber, $errorCode, $attributeCode, current($message)); + } + } + + return ! $this->errorHelper->isRowInvalid($rowNumber); + } + + /** + * Prepare row data for lead product. + */ + protected function parseProducts(?string $products): array + { + $productData = []; + + $productArray = explode(',', $products); + + foreach ($productArray as $product) { + if (empty($product)) { + continue; + } + + [$key, $value] = explode('=', $product); + + $productData[$key] = $value; + } + + if ( + isset($productData['price']) + && isset($productData['quantity']) + ) { + $productData['amount'] = $productData['price'] * $productData['quantity']; + } + + return $productData; + } + + /** + * Get validation rules. + */ + public function getValidationRules(string $entityTypes, array $rowData): array + { + $rules = []; + + foreach (explode('|', $entityTypes) as $entityType) { + $attributes = $this->attributeRepository->scopeQuery(fn ($query) => $query->whereIn('code', array_keys($rowData))->where('entity_type', $entityType))->get(); + + foreach ($attributes as $attribute) { + if ($entityType == 'persons') { + $attribute->code = 'person.'.$attribute->code; + } + + $validations = []; + + if ($attribute->type == 'boolean') { + continue; + } elseif ($attribute->type == 'address') { + if (! $attribute->is_required) { + continue; + } + + $validations = [ + $attribute->code.'.address' => 'required', + $attribute->code.'.country' => 'required', + $attribute->code.'.state' => 'required', + $attribute->code.'.city' => 'required', + $attribute->code.'.postcode' => 'required', + ]; + } elseif ($attribute->type == 'email') { + $validations = [ + $attribute->code => [$attribute->is_required ? 'required' : 'nullable'], + $attribute->code.'.*.value' => [$attribute->is_required ? 'required' : 'nullable', 'email'], + $attribute->code.'.*.label' => $attribute->is_required ? 'required' : 'nullable', + ]; + } elseif ($attribute->type == 'phone') { + $validations = [ + $attribute->code => [$attribute->is_required ? 'required' : 'nullable'], + $attribute->code.'.*.value' => [$attribute->is_required ? 'required' : 'nullable'], + $attribute->code.'.*.label' => $attribute->is_required ? 'required' : 'nullable', + ]; + } else { + $validations[$attribute->code] = [$attribute->is_required ? 'required' : 'nullable']; + + if ($attribute->type == 'text' && $attribute->validation) { + array_push($validations[$attribute->code], + $attribute->validation == 'decimal' + ? new Decimal + : $attribute->validation + ); + } + + if ($attribute->type == 'price') { + array_push($validations[$attribute->code], new Decimal); + } + } + + if ($attribute->is_unique) { + array_push($validations[in_array($attribute->type, ['email', 'phone']) + ? $attribute->code.'.*.value' + : $attribute->code + ], function ($field, $value, $fail) use ($attribute) { + if (! $this->attributeValueRepository->isValueUnique( + null, + $attribute->entity_type, + $attribute, + request($field) + ) + ) { + $fail(trans('data_transfer::app.validation.errors.already-exists', ['attribute' => $attribute->name])); + } + }); + } + + $rules = [ + ...$rules, + ...$validations, + ]; + } + } + + return $rules; + } + + /** + * Start the import process. + */ + public function importBatch(ImportBatchContract $batch): bool + { + Event::dispatch('data_transfer.imports.batch.import.before', $batch); + + if ($batch->import->action == Import::ACTION_DELETE) { + $this->deleteLeads($batch); + } else { + $this->saveLeads($batch); + } + + /** + * Update import batch summary. + */ + $batch = $this->importBatchRepository->update([ + 'state' => Import::STATE_PROCESSED, + + 'summary' => [ + 'created' => $this->getCreatedItemsCount(), + 'updated' => $this->getUpdatedItemsCount(), + 'deleted' => $this->getDeletedItemsCount(), + ], + ], $batch->id); + + Event::dispatch('data_transfer.imports.batch.import.after', $batch); + + return true; + } + + /** + * Start the products linking process + */ + public function linkBatch(ImportBatchContract $batch): bool + { + Event::dispatch('data_transfer.imports.batch.linking.before', $batch); + + /** + * Load leads storage with batch ids. + */ + $this->leadsStorage->load(Arr::pluck($batch->data, 'title')); + + $products = []; + + foreach ($batch->data as $rowData) { + /** + * Prepare products. + */ + $this->prepareProducts($rowData, $products); + } + + $this->saveProducts($products); + + /** + * Update import batch summary + */ + $this->importBatchRepository->update([ + 'state' => Import::STATE_LINKED, + ], $batch->id); + + Event::dispatch('data_transfer.imports.batch.linking.after', $batch); + + return true; + } + + /** + * Prepare products. + */ + public function prepareProducts($rowData, &$product): void + { + if (! empty($rowData['product'])) { + $product[$rowData['title']] = $this->parseProducts($rowData['product']); + } + } + + /** + * Save products. + */ + public function saveProducts(array $products): void + { + $leadProducts = []; + + foreach ($products as $title => $product) { + $lead = $this->leadsStorage->get($title); + + $leadProducts['insert'][] = [ + 'lead_id' => $lead['id'], + 'product_id' => $product['id'], + 'price' => $product['price'], + 'quantity' => $product['quantity'], + 'amount' => $product['amount'], + ]; + } + + foreach ($leadProducts['insert'] as $key => $leadProduct) { + $this->leadProductRepository->deleteWhere([ + 'lead_id' => $leadProduct['lead_id'], + 'product_id' => $leadProduct['product_id'], + ]); + } + + $this->leadProductRepository->upsert($leadProducts['insert'], ['lead_id', 'product_id']); + } + + /** + * Delete leads from current batch. + */ + protected function deleteLeads(ImportBatchContract $batch): bool + { + /** + * Load leads storage with batch ids. + */ + $this->leadsStorage->load(Arr::pluck($batch->data, 'title')); + + $idsToDelete = []; + + foreach ($batch->data as $rowData) { + if (! $this->isTitleExist($rowData['title'])) { + continue; + } + + $idsToDelete[] = $this->leadsStorage->get($rowData['title']); + } + + $idsToDelete = array_unique($idsToDelete); + + $this->deletedItemsCount = count($idsToDelete); + + $this->leadRepository->deleteWhere([['id', 'IN', $idsToDelete]]); + + return true; + } + + /** + * Save leads from current batch. + */ + protected function saveLeads(ImportBatchContract $batch): bool + { + /** + * Load lead storage with batch unique title. + */ + $this->leadsStorage->load(Arr::pluck($batch->data, 'title')); + + $leads = []; + + /** + * Prepare leads for import. + */ + foreach ($batch->data as $rowData) { + if (isset($rowData['id'])) { + $leads['update'][$rowData['id']] = Arr::except($rowData, ['product']); + } else { + $leads['insert'][$rowData['title']] = [ + ...Arr::except($rowData, ['id', 'product']), + 'created_at' => $rowData['created_at'] ?? now(), + 'updated_at' => $rowData['updated_at'] ?? now(), + ]; + } + } + + if (! empty($leads['update'])) { + $this->updatedItemsCount += count($leads['update']); + + $this->leadRepository->upsert( + $leads['update'], + $this->masterAttributeCode + ); + } + + if (! empty($leads['insert'])) { + $this->createdItemsCount += count($leads['insert']); + + $this->leadRepository->insert($leads['insert']); + + /** + * Update the sku storage with newly created products + */ + $newLeads = $this->leadRepository->findWhereIn( + 'title', + array_keys($leads['insert']), + [ + 'id', + 'title', + ] + ); + + foreach ($newLeads as $lead) { + $this->leadsStorage->set($lead->title, [ + 'id' => $lead->id, + 'title' => $lead->title, + ]); + } + } + + return true; + } + + /** + * Check if title exists. + */ + public function isTitleExist(string $title): bool + { + return $this->leadsStorage->has($title); + } + + /** + * Prepare row data to save into the database. + */ + protected function prepareRowForDb(array $rowData): array + { + return parent::prepareRowForDb($rowData); + } +} diff --git a/packages/Webkul/DataTransfer/src/Helpers/Importers/Leads/Storage.php b/packages/Webkul/DataTransfer/src/Helpers/Importers/Leads/Storage.php new file mode 100644 index 0000000..f9d657d --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Helpers/Importers/Leads/Storage.php @@ -0,0 +1,97 @@ +items = []; + + $this->load(); + } + + /** + * Load the leads. + */ + public function load(array $titles = []): void + { + if (empty($titles)) { + $leads = $this->leadRepository->all($this->selectColumns); + } else { + $leads = $this->leadRepository->findWhereIn('title', $titles, $this->selectColumns); + } + + foreach ($leads as $lead) { + $this->set($lead->title, [ + 'id' => $lead->id, + 'title' => $lead->title, + ]); + } + } + + /** + * Get Ids and Unique Id. + */ + public function set(string $title, array $data): self + { + $this->items[$title] = $data; + + return $this; + } + + /** + * Check if unique id exists. + */ + public function has(string $title): bool + { + return isset($this->items[$title]); + } + + /** + * Get unique id information. + */ + public function get(string $title): ?array + { + if (! $this->has($title)) { + return null; + } + + return $this->items[$title]; + } + + public function getItems(): array + { + return $this->items; + } + + /** + * Is storage is empty. + */ + public function isEmpty(): bool + { + return empty($this->items); + } +} diff --git a/packages/Webkul/DataTransfer/src/Helpers/Importers/Persons/Importer.php b/packages/Webkul/DataTransfer/src/Helpers/Importers/Persons/Importer.php new file mode 100644 index 0000000..0c9ebe9 --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Helpers/Importers/Persons/Importer.php @@ -0,0 +1,492 @@ + 'data_transfer::app.importers.persons.validation.errors.email-not-found', + self::ERROR_DUPLICATE_EMAIL => 'data_transfer::app.importers.persons.validation.errors.duplicate-email', + self::ERROR_DUPLICATE_PHONE => 'data_transfer::app.importers.persons.validation.errors.duplicate-phone', + ]; + + /** + * Permanent entity columns. + * + * @var string[] + */ + protected $permanentAttributes = ['emails']; + + /** + * Permanent entity column. + */ + protected string $masterAttributeCode = 'unique_id'; + + /** + * Emails storage. + */ + protected array $emails = []; + + /** + * Phones storage. + */ + protected array $phones = []; + + /** + * Create a new helper instance. + * + * @return void + */ + public function __construct( + protected ImportBatchRepository $importBatchRepository, + protected PersonRepository $personRepository, + protected AttributeRepository $attributeRepository, + protected AttributeValueRepository $attributeValueRepository, + protected Storage $personStorage, + ) { + parent::__construct( + $importBatchRepository, + $attributeRepository, + $attributeValueRepository, + ); + } + + /** + * Initialize Product error templates. + */ + protected function initErrorMessages(): void + { + foreach ($this->messages as $errorCode => $message) { + $this->errorHelper->addErrorMessage($errorCode, trans($message)); + } + + parent::initErrorMessages(); + } + + /** + * Validate data. + */ + public function validateData(): void + { + $this->personStorage->init(); + + parent::validateData(); + } + + /** + * Validates row. + */ + public function validateRow(array $rowData, int $rowNumber): bool + { + $rowData = $this->parsedRowData($rowData); + + /** + * If row is already validated than no need for further validation. + */ + if (isset($this->validatedRows[$rowNumber])) { + return ! $this->errorHelper->isRowInvalid($rowNumber); + } + + $this->validatedRows[$rowNumber] = true; + + /** + * If import action is delete than no need for further validation. + */ + if ($this->import->action == Import::ACTION_DELETE) { + foreach ($rowData['emails'] as $email) { + if (! $this->isEmailExist($email['value'])) { + $this->skipRow($rowNumber, self::ERROR_EMAIL_NOT_FOUND_FOR_DELETE, 'email'); + + return false; + } + + return true; + } + } + + /** + * Validate row data. + */ + $validator = Validator::make($rowData, [ + ...$this->getValidationRules('persons', $rowData), + 'organization_id' => 'required|exists:organizations,id', + 'user_id' => 'required|exists:users,id', + 'contact_numbers' => 'required|array', + 'contact_numbers.*.value' => 'required|numeric', + 'contact_numbers.*.label' => 'required|in:home,work', + 'emails' => 'required|array', + 'emails.*.value' => 'required|email', + 'emails.*.label' => 'required|in:home,work', + ]); + + if ($validator->fails()) { + $failedAttributes = $validator->failed(); + + foreach ($validator->errors()->getMessages() as $attributeCode => $message) { + $errorCode = array_key_first($failedAttributes[$attributeCode] ?? []); + + $this->skipRow($rowNumber, $errorCode, $attributeCode, current($message)); + } + } + + /** + * Check if email is unique. + */ + if (! empty($emails = $rowData['emails'])) { + foreach ($emails as $email) { + if (! in_array($email['value'], $this->emails)) { + $this->emails[] = $email['value']; + } else { + $message = sprintf( + trans($this->messages[self::ERROR_DUPLICATE_EMAIL]), + $email['value'] + ); + + $this->skipRow($rowNumber, self::ERROR_DUPLICATE_EMAIL, 'email', $message); + } + } + } + + /** + * Check if phone(s) are unique. + */ + if (! empty($rowData['contact_numbers'])) { + foreach ($rowData['contact_numbers'] as $phone) { + if (! in_array($phone['value'], $this->phones)) { + if (! empty($phone['value'])) { + $this->phones[] = $phone['value']; + } + } else { + $message = sprintf( + trans($this->messages[self::ERROR_DUPLICATE_PHONE]), + $phone['value'] + ); + + $this->skipRow($rowNumber, self::ERROR_DUPLICATE_PHONE, 'phone', $message); + } + } + } + + return ! $this->errorHelper->isRowInvalid($rowNumber); + } + + /** + * Start the import process. + */ + public function importBatch(ImportBatchContract $batch): bool + { + Event::dispatch('data_transfer.imports.batch.import.before', $batch); + + if ($batch->import->action == Import::ACTION_DELETE) { + $this->deletePersons($batch); + } else { + $this->savePersonData($batch); + } + + /** + * Update import batch summary. + */ + $batch = $this->importBatchRepository->update([ + 'state' => Import::STATE_PROCESSED, + + 'summary' => [ + 'created' => $this->getCreatedItemsCount(), + 'updated' => $this->getUpdatedItemsCount(), + 'deleted' => $this->getDeletedItemsCount(), + ], + ], $batch->id); + + Event::dispatch('data_transfer.imports.batch.import.after', $batch); + + return true; + } + + /** + * Delete persons from current batch. + */ + protected function deletePersons(ImportBatchContract $batch): bool + { + /** + * Load person storage with batch emails. + */ + $emails = collect(Arr::pluck($batch->data, 'emails')) + ->map(function ($emails) { + $emails = json_decode($emails, true); + + foreach ($emails as $email) { + return $email['value']; + } + }); + + $this->personStorage->load($emails->toArray()); + + $idsToDelete = []; + + foreach ($batch->data as $rowData) { + $rowData = $this->parsedRowData($rowData); + + foreach ($rowData['emails'] as $email) { + if (! $this->isEmailExist($email['value'])) { + continue; + } + + $idsToDelete[] = $this->personStorage->get($email['value']); + } + } + + $idsToDelete = array_unique($idsToDelete); + + $this->deletedItemsCount = count($idsToDelete); + + $this->personRepository->deleteWhere([['id', 'IN', $idsToDelete]]); + + return true; + } + + /** + * Save person from current batch. + */ + protected function savePersonData(ImportBatchContract $batch): bool + { + /** + * Load person storage with batch email. + */ + $emails = collect(Arr::pluck($batch->data, 'emails')) + ->map(function ($emails) { + $emails = json_decode($emails, true); + + foreach ($emails as $email) { + return $email['value']; + } + }); + + $this->personStorage->load($emails->toArray()); + + $persons = []; + + $attributeValues = []; + + /** + * Prepare persons for import. + */ + foreach ($batch->data as $rowData) { + $this->preparePersons($rowData, $persons); + + $this->prepareAttributeValues($rowData, $attributeValues); + } + + $this->savePersons($persons); + + $this->saveAttributeValues($attributeValues); + + return true; + } + + /** + * Prepare persons from current batch. + */ + public function preparePersons(array $rowData, array &$persons): void + { + $emails = $this->prepareEmail($rowData['emails']); + + foreach ($emails as $email) { + $contactNumber = json_decode($rowData['contact_numbers'], true); + + $rowData['unique_id'] = "{$rowData['user_id']}|{$rowData['organization_id']}|{$email}|{$contactNumber[0]['value']}"; + + if ($this->isEmailExist($email)) { + $persons['update'][$email] = $rowData; + } else { + $persons['insert'][$email] = [ + ...$rowData, + 'created_at' => $rowData['created_at'] ?? now(), + 'updated_at' => $rowData['updated_at'] ?? now(), + ]; + } + } + } + + /** + * Save persons from current batch. + */ + public function savePersons(array $persons): void + { + if (! empty($persons['update'])) { + $this->updatedItemsCount += count($persons['update']); + + $this->personRepository->upsert( + $persons['update'], + $this->masterAttributeCode, + ); + } + + if (! empty($persons['insert'])) { + $this->createdItemsCount += count($persons['insert']); + + $this->personRepository->insert($persons['insert']); + + /** + * Update the sku storage with newly created products + */ + $emails = array_keys($persons['insert']); + + $newPersons = $this->personRepository->where(function ($query) use ($emails) { + foreach ($emails as $email) { + $query->orWhereJsonContains('emails', [['value' => $email]]); + } + })->get(); + + foreach ($newPersons as $person) { + $this->personStorage->set($person->emails[0]['value'], $person->id); + } + } + } + + /** + * Save attribute values for the person. + */ + public function saveAttributeValues(array $attributeValues): void + { + $personAttributeValues = []; + + foreach ($attributeValues as $email => $attributeValue) { + foreach ($attributeValue as $attribute) { + $attribute['entity_id'] = (int) $this->personStorage->get($email); + + $attribute['unique_id'] = implode('|', array_filter([ + $attribute['entity_id'], + $attribute['attribute_id'], + ])); + + $attribute['entity_type'] = 'persons'; + + $personAttributeValues[$attribute['unique_id']] = $attribute; + } + } + + $this->attributeValueRepository->upsert($personAttributeValues, 'unique_id'); + } + + /** + * Check if email exists. + */ + public function isEmailExist(string $email): bool + { + return $this->personStorage->has($email); + } + + /** + * Prepare attribute values for the person. + */ + public function prepareAttributeValues(array $rowData, array &$attributeValues): void + { + foreach ($rowData as $code => $value) { + if (is_null($value)) { + continue; + } + + $where = ['code' => $code]; + + if ($code === 'name') { + $where['entity_type'] = 'persons'; + } + + $attribute = $this->attributeRepository->findOneWhere($where); + + if (! $attribute) { + continue; + } + + $typeFields = $this->personRepository->getModel()::$attributeTypeFields; + + $attributeTypeValues = array_fill_keys(array_values($typeFields), null); + + $emails = $this->prepareEmail($rowData['emails']); + + foreach ($emails as $email) { + $attributeValues[$email][] = array_merge($attributeTypeValues, [ + 'attribute_id' => $attribute->id, + $typeFields[$attribute->type] => $value, + ]); + } + } + } + + /** + * Get parsed email and phone. + */ + private function parsedRowData(array $rowData): array + { + $rowData['emails'] = json_decode($rowData['emails'], true); + + $rowData['contact_numbers'] = json_decode($rowData['contact_numbers'], true); + + return $rowData; + } + + /** + * Prepare email from row data. + */ + private function prepareEmail(array|string $emails): Collection + { + static $cache = []; + + return collect($emails) + ->map(function ($emailString) use (&$cache) { + if (isset($cache[$emailString])) { + return $cache[$emailString]; + } + + $decoded = json_decode($emailString, true); + + $emailValue = is_array($decoded) + && isset($decoded[0]['value']) + ? $decoded[0]['value'] + : null; + + return $cache[$emailString] = $emailValue; + }); + } +} diff --git a/packages/Webkul/DataTransfer/src/Helpers/Importers/Persons/Storage.php b/packages/Webkul/DataTransfer/src/Helpers/Importers/Persons/Storage.php new file mode 100644 index 0000000..f18761b --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Helpers/Importers/Persons/Storage.php @@ -0,0 +1,99 @@ +items = []; + + $this->load(); + } + + /** + * Load the Emails. + */ + public function load(array $emails = []): void + { + if (empty($emails)) { + $persons = $this->personRepository->all($this->selectColumns); + } else { + $persons = $this->personRepository->scopeQuery(function ($query) use ($emails) { + return $query->where(function ($subQuery) use ($emails) { + foreach ($emails as $email) { + $subQuery->orWhereJsonContains('emails', ['value' => $email]); + } + }); + })->all($this->selectColumns); + } + + $persons->each(function ($person) { + collect($person->emails) + ->each(fn ($email) => $this->set($email['value'], $person->id)); + }); + } + + /** + * Get email information. + */ + public function set(string $email, int $id): self + { + $this->items[$email] = $id; + + return $this; + } + + /** + * Check if email exists. + */ + public function has(string $email): bool + { + return isset($this->items[$email]); + } + + /** + * Get email information. + */ + public function get(string $email): ?int + { + if (! $this->has($email)) { + return null; + } + + return $this->items[$email]; + } + + /** + * Is storage is empty. + */ + public function isEmpty(): int + { + return empty($this->items); + } +} diff --git a/packages/Webkul/DataTransfer/src/Helpers/Importers/Products/Importer.php b/packages/Webkul/DataTransfer/src/Helpers/Importers/Products/Importer.php new file mode 100644 index 0000000..9048bea --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Helpers/Importers/Products/Importer.php @@ -0,0 +1,369 @@ + 'data_transfer::app.importers.products.validation.errors.sku-not-found', + ]; + + /** + * Permanent entity columns. + */ + protected array $permanentAttributes = ['sku']; + + /** + * Permanent entity column. + */ + protected string $masterAttributeCode = 'sku'; + + /** + * Cached attributes. + */ + protected mixed $attributes = []; + + /** + * Valid csv columns. + */ + protected array $validColumnNames = [ + 'sku', + 'name', + 'description', + 'quantity', + 'price', + ]; + + /** + * Create a new helper instance. + * + * @return void + */ + public function __construct( + protected ImportBatchRepository $importBatchRepository, + protected AttributeRepository $attributeRepository, + protected AttributeOptionRepository $attributeOptionRepository, + protected ProductRepository $productRepository, + protected ProductInventoryRepository $productInventoryRepository, + protected AttributeValueRepository $attributeValueRepository, + protected SKUStorage $skuStorage + ) { + parent::__construct( + $importBatchRepository, + $attributeRepository, + $attributeValueRepository + ); + + $this->initAttributes(); + } + + /** + * Load all attributes and families to use later. + */ + protected function initAttributes(): void + { + $this->attributes = $this->attributeRepository->all(); + + foreach ($this->attributes as $attribute) { + $this->validColumnNames[] = $attribute->code; + } + } + + /** + * Initialize Product error templates. + */ + protected function initErrorMessages(): void + { + foreach ($this->messages as $errorCode => $message) { + $this->errorHelper->addErrorMessage($errorCode, trans($message)); + } + + parent::initErrorMessages(); + } + + /** + * Save validated batches. + */ + protected function saveValidatedBatches(): self + { + $source = $this->getSource(); + + $source->rewind(); + + $this->skuStorage->init(); + + while ($source->valid()) { + try { + $rowData = $source->current(); + } catch (\InvalidArgumentException $e) { + $source->next(); + + continue; + } + + $this->validateRow($rowData, $source->getCurrentRowNumber()); + + $source->next(); + } + + parent::saveValidatedBatches(); + + return $this; + } + + /** + * Validates row. + */ + public function validateRow(array $rowData, int $rowNumber): bool + { + /** + * If row is already validated than no need for further validation. + */ + if (isset($this->validatedRows[$rowNumber])) { + return ! $this->errorHelper->isRowInvalid($rowNumber); + } + + $this->validatedRows[$rowNumber] = true; + + /** + * If import action is delete than no need for further validation. + */ + if ($this->import->action == Import::ACTION_DELETE) { + if (! $this->isSKUExist($rowData['sku'])) { + $this->skipRow($rowNumber, self::ERROR_SKU_NOT_FOUND_FOR_DELETE, 'sku'); + + return false; + } + + return true; + } + + /** + * Validate product attributes + */ + $validator = Validator::make($rowData, $this->getValidationRules('products', $rowData)); + + if ($validator->fails()) { + foreach ($validator->errors()->getMessages() as $attributeCode => $message) { + $failedAttributes = $validator->failed(); + + $errorCode = array_key_first($failedAttributes[$attributeCode] ?? []); + + $this->skipRow($rowNumber, $errorCode, $attributeCode, current($message)); + } + } + + return ! $this->errorHelper->isRowInvalid($rowNumber); + } + + /** + * Start the import process. + */ + public function importBatch(ImportBatchContract $batch): bool + { + Event::dispatch('data_transfer.imports.batch.import.before', $batch); + + if ($batch->import->action == Import::ACTION_DELETE) { + $this->deleteProducts($batch); + } else { + $this->saveProductsData($batch); + } + + /** + * Update import batch summary. + */ + $batch = $this->importBatchRepository->update([ + 'state' => Import::STATE_PROCESSED, + + 'summary' => [ + 'created' => $this->getCreatedItemsCount(), + 'updated' => $this->getUpdatedItemsCount(), + 'deleted' => $this->getDeletedItemsCount(), + ], + ], $batch->id); + + Event::dispatch('data_transfer.imports.batch.import.after', $batch); + + return true; + } + + /** + * Delete products from current batch. + */ + protected function deleteProducts(ImportBatchContract $batch): bool + { + /** + * Load SKU storage with batch skus. + */ + $this->skuStorage->load(Arr::pluck($batch->data, 'sku')); + + $idsToDelete = []; + + foreach ($batch->data as $rowData) { + if (! $this->isSKUExist($rowData['sku'])) { + continue; + } + + $product = $this->skuStorage->get($rowData['sku']); + + $idsToDelete[] = $product['id']; + } + + $idsToDelete = array_unique($idsToDelete); + + $this->deletedItemsCount = count($idsToDelete); + + $this->productRepository->deleteWhere([['id', 'IN', $idsToDelete]]); + + return true; + } + + /** + * Save products from current batch. + */ + protected function saveProductsData(ImportBatchContract $batch): bool + { + /** + * Load SKU storage with batch skus. + */ + $this->skuStorage->load(Arr::pluck($batch->data, 'sku')); + + $products = []; + + /** + * Prepare products for import. + */ + foreach ($batch->data as $rowData) { + $this->prepareProducts($rowData, $products); + } + + $this->saveProducts($products); + + return true; + } + + /** + * Prepare products from current batch. + */ + public function prepareProducts(array $rowData, array &$products): void + { + if ($this->isSKUExist($rowData['sku'])) { + $products['update'][$rowData['sku']] = $rowData; + } else { + $products['insert'][$rowData['sku']] = [ + ...$rowData, + 'created_at' => $rowData['created_at'] ?? now(), + 'updated_at' => $rowData['updated_at'] ?? now(), + ]; + } + } + + /** + * Save products from current batch. + */ + public function saveProducts(array $products): void + { + if (! empty($products['update'])) { + $this->updatedItemsCount += count($products['update']); + + $this->productRepository->upsert( + $products['update'], + $this->masterAttributeCode + ); + } + + if (! empty($products['insert'])) { + $this->createdItemsCount += count($products['insert']); + + $this->productRepository->insert($products['insert']); + } + } + + /** + * Save channels from current batch. + */ + public function saveChannels(array $channels): void + { + $productChannels = []; + + foreach ($channels as $sku => $channelIds) { + $product = $this->skuStorage->get($sku); + + foreach (array_unique($channelIds) as $channelId) { + $productChannels[] = [ + 'product_id' => $product['id'], + 'channel_id' => $channelId, + ]; + } + } + + DB::table('product_channels')->upsert( + $productChannels, + [ + 'product_id', + 'channel_id', + ], + ); + } + + /** + * Save links. + */ + public function loadUnloadedSKUs(array $skus): void + { + $notLoadedSkus = []; + + foreach ($skus as $sku) { + if ($this->skuStorage->has($sku)) { + continue; + } + + $notLoadedSkus[] = $sku; + } + + /** + * Load not loaded SKUs to the sku storage. + */ + if (! empty($notLoadedSkus)) { + $this->skuStorage->load($notLoadedSkus); + } + } + + /** + * Check if SKU exists. + */ + public function isSKUExist(string $sku): bool + { + return $this->skuStorage->has($sku); + } + + /** + * Prepare row data to save into the database. + */ + protected function prepareRowForDb(array $rowData): array + { + return parent::prepareRowForDb($rowData); + } +} diff --git a/packages/Webkul/DataTransfer/src/Helpers/Importers/Products/SKUStorage.php b/packages/Webkul/DataTransfer/src/Helpers/Importers/Products/SKUStorage.php new file mode 100644 index 0000000..792d0c0 --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Helpers/Importers/Products/SKUStorage.php @@ -0,0 +1,107 @@ +items = []; + + $this->load(); + } + + /** + * Load the SKU. + */ + public function load(array $skus = []): void + { + if (empty($skus)) { + $products = $this->productRepository->all($this->selectColumns); + } else { + $products = $this->productRepository->findWhereIn('sku', $skus, $this->selectColumns); + } + + foreach ($products as $product) { + $this->set($product->sku, [ + 'id' => $product->id, + 'sku' => $product->sku, + ]); + } + } + + /** + * Get SKU information. + */ + public function set(string $sku, array $data): self + { + $this->items[$sku] = implode(self::DELIMITER, [ + $data['id'], + $data['sku'], + ]); + + return $this; + } + + /** + * Check if SKU exists. + */ + public function has(string $sku): bool + { + return isset($this->items[$sku]); + } + + /** + * Get SKU information. + */ + public function get(string $sku): ?array + { + if (! $this->has($sku)) { + return null; + } + + $data = explode(self::DELIMITER, $this->items[$sku]); + + return [ + 'id' => $data[0], + ]; + } + + /** + * Is storage is empty. + */ + public function isEmpty(): int + { + return empty($this->items); + } +} diff --git a/packages/Webkul/DataTransfer/src/Helpers/Sources/AbstractSource.php b/packages/Webkul/DataTransfer/src/Helpers/Sources/AbstractSource.php new file mode 100644 index 0000000..6d4689d --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Helpers/Sources/AbstractSource.php @@ -0,0 +1,120 @@ +currentRowNumber; + } + + /** + * Checks if current position is valid. + */ + public function valid(): bool + { + return $this->currentRowNumber !== -1; + } + + /** + * Read next line from source. + */ + public function current(): array + { + $row = $this->currentRowData; + + if (count($row) != $this->totalColumns) { + if ($this->foundWrongQuoteFlag) { + throw new \InvalidArgumentException(AbstractImporter::ERROR_CODE_WRONG_QUOTES); + } else { + throw new \InvalidArgumentException(AbstractImporter::ERROR_CODE_COLUMNS_NUMBER); + } + } + + return array_combine($this->columnNames, $row); + } + + /** + * Read next line from source. + */ + public function next(): void + { + $this->currentRowNumber++; + + $row = $this->getNextRow(); + + if ($row === false || $row === []) { + $this->currentRowData = []; + + $this->currentRowNumber = -1; + } else { + $this->currentRowData = $row; + } + } + + /** + * Rewind the iterator to the first row. + */ + public function rewind(): void + { + $this->currentRowNumber = 0; + + $this->currentRowData = []; + + $this->getNextRow(); + + $this->next(); + } + + /** + * Column names getter. + */ + public function getColumnNames(): array + { + return $this->columnNames; + } + + /** + * Column names getter. + */ + public function getTotalColumns(): int + { + return count($this->columnNames); + } +} diff --git a/packages/Webkul/DataTransfer/src/Helpers/Sources/CSV.php b/packages/Webkul/DataTransfer/src/Helpers/Sources/CSV.php new file mode 100644 index 0000000..eee5e88 --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Helpers/Sources/CSV.php @@ -0,0 +1,79 @@ +reader = fopen(Storage::disk('public')->path($filePath), 'r'); + + $this->columnNames = fgetcsv($this->reader, 4096, $delimiter); + + $this->totalColumns = count($this->columnNames); + } catch (\Exception $e) { + throw new \LogicException("Unable to open file: '{$filePath}'"); + } + } + + /** + * Close file handle. + * + * @return void + */ + public function __destruct() + { + if (! is_object($this->reader)) { + return; + } + + $this->reader->close(); + } + + /** + * Read next line from csv. + */ + protected function getNextRow(): array + { + $parsed = fgetcsv($this->reader, 4096, $this->delimiter); + + if (is_array($parsed) && count($parsed) != $this->totalColumns) { + foreach ($parsed as $element) { + if ($element && strpos($element, "'") !== false) { + $this->foundWrongQuoteFlag = true; + + break; + } + } + } else { + $this->foundWrongQuoteFlag = false; + } + + return is_array($parsed) ? $parsed : []; + } + + /** + * Rewind the iterator to the first row. + */ + public function rewind(): void + { + rewind($this->reader); + + parent::rewind(); + } +} diff --git a/packages/Webkul/DataTransfer/src/Helpers/Sources/Excel.php b/packages/Webkul/DataTransfer/src/Helpers/Sources/Excel.php new file mode 100644 index 0000000..1d9e66a --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Helpers/Sources/Excel.php @@ -0,0 +1,70 @@ +path($filePath)); + + $this->reader = $factory->getActiveSheet(); + + $highestColumn = $this->reader->getHighestColumn(); + + $this->totalColumns = Coordinate::columnIndexFromString($highestColumn); + + $this->columnNames = $this->getNextRow(); + } catch (\Exception $e) { + throw new \LogicException("Unable to open file: '{$filePath}'"); + } + } + + /** + * Read next line from csv. + */ + protected function getNextRow(): array|bool + { + for ($column = 1; $column <= $this->totalColumns; $column++) { + $rowData[] = $this->reader->getCellByColumnAndRow($column, $this->currentRowNumber)->getValue(); + } + + $filteredRowData = array_filter($rowData); + + if (empty($filteredRowData)) { + return false; + } + + return $rowData; + } + + /** + * Rewind the iterator to the first row. + */ + public function rewind(): void + { + $this->currentRowNumber = 1; + + $this->next(); + } +} diff --git a/packages/Webkul/DataTransfer/src/Jobs/Import/Completed.php b/packages/Webkul/DataTransfer/src/Jobs/Import/Completed.php new file mode 100644 index 0000000..75f466d --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Jobs/Import/Completed.php @@ -0,0 +1,38 @@ +import = $import; + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + app(ImportHelper::class) + ->setImport($this->import) + ->completed(); + } +} diff --git a/packages/Webkul/DataTransfer/src/Jobs/Import/ImportBatch.php b/packages/Webkul/DataTransfer/src/Jobs/Import/ImportBatch.php new file mode 100644 index 0000000..595dcc7 --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Jobs/Import/ImportBatch.php @@ -0,0 +1,41 @@ +importBatch = $importBatch; + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + $typeImported = app(ImportHelper::class) + ->setImport($this->importBatch->import) + ->getTypeImporter(); + + $typeImported->importBatch($this->importBatch); + } +} diff --git a/packages/Webkul/DataTransfer/src/Jobs/Import/IndexBatch.php b/packages/Webkul/DataTransfer/src/Jobs/Import/IndexBatch.php new file mode 100644 index 0000000..971893b --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Jobs/Import/IndexBatch.php @@ -0,0 +1,41 @@ +importBatch = $importBatch; + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + $typeImported = app(ImportHelper::class) + ->setImport($this->importBatch->import) + ->getTypeImporter(); + + $typeImported->indexBatch($this->importBatch); + } +} diff --git a/packages/Webkul/DataTransfer/src/Jobs/Import/Indexing.php b/packages/Webkul/DataTransfer/src/Jobs/Import/Indexing.php new file mode 100644 index 0000000..b4ed9aa --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Jobs/Import/Indexing.php @@ -0,0 +1,38 @@ +import = $import; + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + app(ImportHelper::class) + ->setImport($this->import) + ->indexing(); + } +} diff --git a/packages/Webkul/DataTransfer/src/Jobs/Import/LinkBatch.php b/packages/Webkul/DataTransfer/src/Jobs/Import/LinkBatch.php new file mode 100644 index 0000000..c02f2cd --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Jobs/Import/LinkBatch.php @@ -0,0 +1,41 @@ +importBatch = $importBatch; + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + $typeImported = app(ImportHelper::class) + ->setImport($this->importBatch->import) + ->getTypeImporter(); + + $typeImported->linkBatch($this->importBatch); + } +} diff --git a/packages/Webkul/DataTransfer/src/Jobs/Import/Linking.php b/packages/Webkul/DataTransfer/src/Jobs/Import/Linking.php new file mode 100644 index 0000000..e826cf2 --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Jobs/Import/Linking.php @@ -0,0 +1,38 @@ +import = $import; + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + app(ImportHelper::class) + ->setImport($this->import) + ->linking(); + } +} diff --git a/packages/Webkul/DataTransfer/src/Models/Import.php b/packages/Webkul/DataTransfer/src/Models/Import.php new file mode 100755 index 0000000..8aa52ab --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Models/Import.php @@ -0,0 +1,63 @@ + 'array', + 'errors' => 'array', + 'started_at' => 'datetime', + 'completed_at' => 'datetime', + ]; + + /** + * Get the options. + */ + public function batches(): HasMany + { + return $this->hasMany(ImportBatchProxy::modelClass()); + } + + /** + * Get the file name. + */ + public function getFileNameAttribute(): string + { + return preg_replace('/^.*?\/\d+-/', '', $this->file_path); + } +} diff --git a/packages/Webkul/DataTransfer/src/Models/ImportBatch.php b/packages/Webkul/DataTransfer/src/Models/ImportBatch.php new file mode 100755 index 0000000..da31c34 --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Models/ImportBatch.php @@ -0,0 +1,48 @@ + 'array', + 'data' => 'array', + ]; + + /** + * Get the import that owns the import batch. + * + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ + public function import() + { + return $this->belongsTo(ImportProxy::modelClass()); + } +} diff --git a/packages/Webkul/DataTransfer/src/Models/ImportBatchProxy.php b/packages/Webkul/DataTransfer/src/Models/ImportBatchProxy.php new file mode 100644 index 0000000..47b0988 --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Models/ImportBatchProxy.php @@ -0,0 +1,7 @@ +loadTranslationsFrom(__DIR__.'/../Resources/lang', 'data_transfer'); + + $this->loadMigrationsFrom(__DIR__.'/../Database/Migrations'); + } + + /** + * Register any application services. + */ + public function register(): void + { + $this->mergeConfigFrom(dirname(__DIR__).'/Config/importers.php', 'importers'); + } +} diff --git a/packages/Webkul/DataTransfer/src/Providers/ModuleServiceProvider.php b/packages/Webkul/DataTransfer/src/Providers/ModuleServiceProvider.php new file mode 100644 index 0000000..0219650 --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Providers/ModuleServiceProvider.php @@ -0,0 +1,18 @@ + [ + 'persons' => [ + 'title' => 'الأشخاص', + + 'validation' => [ + 'errors' => [ + 'duplicate-email' => 'البريد الإلكتروني: \'%s\' تم العثور عليه أكثر من مرة في ملف الاستيراد.', + 'duplicate-phone' => 'الهاتف: \'%s\' تم العثور عليه أكثر من مرة في ملف الاستيراد.', + 'email-not-found' => 'البريد الإلكتروني: \'%s\' لم يتم العثور عليه في النظام.', + ], + ], + ], + + 'products' => [ + 'title' => 'المنتجات', + + 'validation' => [ + 'errors' => [ + 'sku-not-found' => 'المنتج ذو الكود المحدد لم يتم العثور عليه.', + ], + ], + ], + + 'leads' => [ + 'title' => 'العملاء المحتملون', + + 'validation' => [ + 'errors' => [ + 'id-not-found' => 'المعرف: \'%s\' غير موجود في النظام.', + ], + ], + ], + ], + + 'validation' => [ + 'errors' => [ + 'column-empty-headers' => 'الأعمدة رقم "%s" تحتوي على رؤوس فارغة.', + 'column-name-invalid' => 'أسماء الأعمدة غير صالحة: "%s".', + 'column-not-found' => 'الأعمدة المطلوبة غير موجودة: %s.', + 'column-numbers' => 'عدد الأعمدة لا يتوافق مع عدد الصفوف في الرأس.', + 'invalid-attribute' => 'الرأس يحتوي على سمة غير صالحة: "%s".', + 'system' => 'حدث خطأ غير متوقع في النظام.', + 'wrong-quotes' => 'تم استخدام علامات الاقتباس الملتوية بدلاً من الاقتباسات المستقيمة.', + ], + ], +]; diff --git a/packages/Webkul/DataTransfer/src/Resources/lang/en/app.php b/packages/Webkul/DataTransfer/src/Resources/lang/en/app.php new file mode 100644 index 0000000..d226d05 --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Resources/lang/en/app.php @@ -0,0 +1,50 @@ + [ + 'persons' => [ + 'title' => 'Persons', + + 'validation' => [ + 'errors' => [ + 'duplicate-email' => 'Email : \'%s\' is found more than once in the import file.', + 'duplicate-phone' => 'Phone : \'%s\' is found more than once in the import file.', + 'email-not-found' => 'Email : \'%s\' not found in the system.', + ], + ], + ], + + 'products' => [ + 'title' => 'Products', + + 'validation' => [ + 'errors' => [ + 'sku-not-found' => 'Product with specified SKU not found', + ], + ], + ], + + 'leads' => [ + 'title' => 'Leads', + + 'validation' => [ + 'errors' => [ + 'id-not-found' => 'ID : \'%s\' not found in the system.', + ], + ], + ], + ], + + 'validation' => [ + 'errors' => [ + 'column-empty-headers' => 'Columns number "%s" have empty headers.', + 'column-name-invalid' => 'Invalid column names: "%s".', + 'column-not-found' => 'Required columns not found: %s.', + 'column-numbers' => 'Number of columns does not correspond to the number of rows in the header.', + 'invalid-attribute' => 'Header contains invalid attribute(s): "%s".', + 'system' => 'An unexpected system error occurred.', + 'wrong-quotes' => 'Curly quotes used instead of straight quotes.', + 'already-exists' => 'The :attribute already exists.', + ], + ], +]; diff --git a/packages/Webkul/DataTransfer/src/Resources/lang/es/app.php b/packages/Webkul/DataTransfer/src/Resources/lang/es/app.php new file mode 100644 index 0000000..c4453b5 --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Resources/lang/es/app.php @@ -0,0 +1,49 @@ + [ + 'persons' => [ + 'title' => 'Personas', + + 'validation' => [ + 'errors' => [ + 'duplicate-email' => 'Correo electrónico: \'%s\' se encontró más de una vez en el archivo de importación.', + 'duplicate-phone' => 'Teléfono: \'%s\' se encontró más de una vez en el archivo de importación.', + 'email-not-found' => 'Correo electrónico: \'%s\' no se encontró en el sistema.', + ], + ], + ], + + 'products' => [ + 'title' => 'Productos', + + 'validation' => [ + 'errors' => [ + 'sku-not-found' => 'Producto con el SKU especificado no encontrado.', + ], + ], + ], + + 'leads' => [ + 'title' => 'Clientes Potenciales', + + 'validation' => [ + 'errors' => [ + 'id-not-found' => 'ID: \'%s\' no se encuentra en el sistema.', + ], + ], + ], + ], + + 'validation' => [ + 'errors' => [ + 'column-empty-headers' => 'Las columnas número "%s" tienen encabezados vacíos.', + 'column-name-invalid' => 'Nombres de columnas no válidos: "%s".', + 'column-not-found' => 'No se encontraron las columnas requeridas: %s.', + 'column-numbers' => 'El número de columnas no corresponde al número de filas en el encabezado.', + 'invalid-attribute' => 'El encabezado contiene atributos no válidos: "%s".', + 'system' => 'Ocurrió un error inesperado en el sistema.', + 'wrong-quotes' => 'Se usaron comillas curvas en lugar de comillas rectas.', + ], + ], +]; diff --git a/packages/Webkul/DataTransfer/src/Resources/lang/fa/app.php b/packages/Webkul/DataTransfer/src/Resources/lang/fa/app.php new file mode 100644 index 0000000..a3f8562 --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Resources/lang/fa/app.php @@ -0,0 +1,49 @@ + [ + 'persons' => [ + 'title' => 'افراد', + + 'validation' => [ + 'errors' => [ + 'duplicate-email' => 'ایمیل: \'%s\' بیش از یک بار در فایل واردات یافت شد.', + 'duplicate-phone' => 'تلفن: \'%s\' بیش از یک بار در فایل واردات یافت شد.', + 'email-not-found' => 'ایمیل: \'%s\' در سیستم یافت نشد.', + ], + ], + ], + + 'products' => [ + 'title' => 'محصولات', + + 'validation' => [ + 'errors' => [ + 'sku-not-found' => 'محصول با کد SKU مشخص شده یافت نشد.', + ], + ], + ], + + 'leads' => [ + 'title' => 'سرنخ‌ها', + + 'validation' => [ + 'errors' => [ + 'id-not-found' => 'شناسه: \'%s\' در سیستم یافت نشد.', + ], + ], + ], + ], + + 'validation' => [ + 'errors' => [ + 'column-empty-headers' => 'ستون‌های شماره "%s" دارای سرصفحه‌های خالی هستند.', + 'column-name-invalid' => 'نام‌های ستون نامعتبر: "%s".', + 'column-not-found' => 'ستون‌های مورد نیاز یافت نشد: %s.', + 'column-numbers' => 'تعداد ستون‌ها با تعداد سطرهای سرصفحه مطابقت ندارد.', + 'invalid-attribute' => 'سرصفحه شامل ویژگی‌های نامعتبر است: "%s".', + 'system' => 'خطای غیرمنتظره‌ای در سیستم رخ داد.', + 'wrong-quotes' => 'به جای گیومه‌های مستقیم از گیومه‌های خمیده استفاده شده است.', + ], + ], +]; diff --git a/packages/Webkul/DataTransfer/src/Resources/lang/pt_BR/app.php b/packages/Webkul/DataTransfer/src/Resources/lang/pt_BR/app.php new file mode 100644 index 0000000..8107725 --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Resources/lang/pt_BR/app.php @@ -0,0 +1,50 @@ + [ + 'persons' => [ + 'title' => 'Pessoas', + + 'validation' => [ + 'errors' => [ + 'duplicate-email' => 'E-mail : \'%s\' é encontrado mais de uma vez no arquivo de importação.', + 'duplicate-phone' => 'Telefone : \'%s\' é encontrado mais de uma vez no arquivo de importação.', + 'email-not-found' => 'E-mail : \'%s\' não foi encontrado no sistema.', + ], + ], + ], + + 'products' => [ + 'title' => 'Produtos', + + 'validation' => [ + 'errors' => [ + 'sku-not-found' => 'Produto com este código não foi encontrado', + ], + ], + ], + + 'leads' => [ + 'title' => 'Oportunidades', + + 'validation' => [ + 'errors' => [ + 'id-not-found' => 'ID : \'%s\' não foi encontrado no sistema.', + ], + ], + ], + ], + + 'validation' => [ + 'errors' => [ + 'column-empty-headers' => 'As colunas de número "%s" têm cabeçalhos vazios.', + 'column-name-invalid' => 'Nomes de colunas inválidos: "%s".', + 'column-not-found' => 'Colunas obrigatórias não encontradas: %s.', + 'column-numbers' => 'O número de colunas não corresponde ao número de linhas no cabeçalho.', + 'invalid-attribute' => 'O cabeçalho contém atributo(s) inválido(s): "%s".', + 'system' => 'Ocorreu um erro inesperado no sistema.', + 'wrong-quotes' => 'Aspas curvas usadas em vez de aspas retas.', + 'already-exists' => 'O :attribute já existe.', + ], + ], +]; diff --git a/packages/Webkul/DataTransfer/src/Resources/lang/tr/app.php b/packages/Webkul/DataTransfer/src/Resources/lang/tr/app.php new file mode 100644 index 0000000..31430b4 --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Resources/lang/tr/app.php @@ -0,0 +1,49 @@ + [ + 'persons' => [ + 'title' => 'Kişiler', + + 'validation' => [ + 'errors' => [ + 'duplicate-email' => 'E-posta: \'%s\' içe aktarma dosyasında birden fazla kez bulundu.', + 'duplicate-phone' => 'Telefon: \'%s\' içe aktarma dosyasında birden fazla kez bulundu.', + 'email-not-found' => 'E-posta: \'%s\' sistemde bulunamadı.', + ], + ], + ], + + 'products' => [ + 'title' => 'Ürünler', + + 'validation' => [ + 'errors' => [ + 'sku-not-found' => 'Belirtilen SKU\'ya sahip ürün bulunamadı.', + ], + ], + ], + + 'leads' => [ + 'title' => 'Müşteri Adayları', + + 'validation' => [ + 'errors' => [ + 'id-not-found' => 'ID: \'%s\' sistemde bulunamadı.', + ], + ], + ], + ], + + 'validation' => [ + 'errors' => [ + 'column-empty-headers' => '"%s" numaralı sütunların başlıkları boş.', + 'column-name-invalid' => 'Geçersiz sütun adları: "%s".', + 'column-not-found' => 'Gerekli sütunlar bulunamadı: %s.', + 'column-numbers' => 'Sütun sayısı başlıktaki satır sayısına karşılık gelmiyor.', + 'invalid-attribute' => 'Başlık geçersiz öznitelikler içeriyor: "%s".', + 'system' => 'Beklenmeyen bir sistem hatası oluştu.', + 'wrong-quotes' => 'Doğru olmayan tırnak işaretleri kullanıldı.', + ], + ], +]; diff --git a/packages/Webkul/Email/composer.json b/packages/Webkul/Email/composer.json new file mode 100755 index 0000000..3f314f1 --- /dev/null +++ b/packages/Webkul/Email/composer.json @@ -0,0 +1,28 @@ +{ + "name": "krayin/laravel-email", + "license": "MIT", + "authors": [ + { + "name": "Jitendra Singh", + "email": "jitendra@webkul.com" + } + ], + "require": { + "krayin/laravel-contact": "^1.0", + "krayin/laravel-core": "^1.0" + }, + "autoload": { + "psr-4": { + "Webkul\\Email\\": "src/" + } + }, + "extra": { + "laravel": { + "providers": [ + "Webkul\\Email\\Providers\\EmailServiceProvider" + ], + "aliases": {} + } + }, + "minimum-stability": "dev" +} \ No newline at end of file diff --git a/packages/Webkul/Email/src/Console/Commands/ProcessInboundEmails.php b/packages/Webkul/Email/src/Console/Commands/ProcessInboundEmails.php new file mode 100644 index 0000000..a0361ac --- /dev/null +++ b/packages/Webkul/Email/src/Console/Commands/ProcessInboundEmails.php @@ -0,0 +1,48 @@ +info('Processing the incoming emails.'); + + $this->inboundEmailProcessor->processMessagesFromAllFolders(); + + $this->info('Incoming emails processed successfully.'); + } +} diff --git a/packages/Webkul/Email/src/Contracts/Attachment.php b/packages/Webkul/Email/src/Contracts/Attachment.php new file mode 100644 index 0000000..7aa97f7 --- /dev/null +++ b/packages/Webkul/Email/src/Contracts/Attachment.php @@ -0,0 +1,5 @@ +increments('id'); + $table->string('subject')->nullable(); + $table->string('source'); + $table->string('user_type'); + $table->string('name')->nullable(); + $table->text('reply')->nullable(); + $table->boolean('is_read')->default(0); + $table->json('folders')->nullable(); + $table->json('from')->nullable(); + $table->json('sender')->nullable(); + $table->json('reply_to')->nullable(); + $table->json('cc')->nullable(); + $table->json('bcc')->nullable(); + $table->string('unique_id')->nullable()->unique(); + $table->string('message_id')->unique(); + $table->json('reference_ids')->nullable(); + + $table->integer('person_id')->unsigned()->nullable(); + $table->foreign('person_id')->references('id')->on('persons')->onDelete('set null'); + + $table->integer('lead_id')->unsigned()->nullable(); + $table->foreign('lead_id')->references('id')->on('leads')->onDelete('set null'); + + $table->timestamps(); + }); + + Schema::table('emails', function (Blueprint $table) { + $table->integer('parent_id')->unsigned()->nullable(); + $table->foreign('parent_id')->references('id')->on('emails')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('emails'); + } +}; diff --git a/packages/Webkul/Email/src/Database/Migrations/2021_05_25_072700_create_email_attachments_table.php b/packages/Webkul/Email/src/Database/Migrations/2021_05_25_072700_create_email_attachments_table.php new file mode 100644 index 0000000..93f2251 --- /dev/null +++ b/packages/Webkul/Email/src/Database/Migrations/2021_05_25_072700_create_email_attachments_table.php @@ -0,0 +1,40 @@ +increments('id'); + $table->string('name')->nullable(); + $table->string('path'); + $table->integer('size')->nullable(); + $table->string('content_type')->nullable(); + $table->string('content_id')->nullable(); + + $table->integer('email_id')->unsigned(); + $table->foreign('email_id')->references('id')->on('emails')->onDelete('cascade'); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('email_attachments'); + } +}; diff --git a/packages/Webkul/Email/src/Database/Migrations/2024_08_27_091619_create_email_tags_table.php b/packages/Webkul/Email/src/Database/Migrations/2024_08_27_091619_create_email_tags_table.php new file mode 100644 index 0000000..45fd477 --- /dev/null +++ b/packages/Webkul/Email/src/Database/Migrations/2024_08_27_091619_create_email_tags_table.php @@ -0,0 +1,30 @@ +integer('tag_id')->unsigned(); + $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade'); + + $table->integer('email_id')->unsigned(); + $table->foreign('email_id')->references('id')->on('emails')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('email_tags'); + } +}; diff --git a/packages/Webkul/Email/src/Enums/SupportedFolderEnum.php b/packages/Webkul/Email/src/Enums/SupportedFolderEnum.php new file mode 100644 index 0000000..cf88a85 --- /dev/null +++ b/packages/Webkul/Email/src/Enums/SupportedFolderEnum.php @@ -0,0 +1,46 @@ +filename; + } + + /** + * Retrieve the attachment content type. + * + * @return string + */ + public function getContentType() + { + return $this->contentType; + } + + /** + * Retrieve the attachment content disposition. + * + * @return string + */ + public function getContentDisposition() + { + return $this->contentDisposition; + } + + /** + * Retrieve the attachment content ID. + * + * @return string + */ + public function getContentID() + { + return $this->contentId; + } + + /** + * Retrieve the attachment headers. + * + * @return string + */ + public function getHeaders() + { + return $this->headers; + } + + /** + * Read the contents a few bytes at a time until completed. + * + * Once read to completion, it always returns false. + * + * @param int $bytes + * @return string + */ + public function read($bytes = 2082) + { + return feof($this->stream) ? false : fread($this->stream, $bytes); + } + + /** + * Retrieve the file content in one go. + * + * Once you retrieve the content you cannot use MimeMailParser_attachment::read(). + * + * @return string + */ + public function getContent() + { + if ($this->content === null) { + fseek($this->stream, 0); + + while (($buf = $this->read()) !== false) { + $this->content .= $buf; + } + } + + return $this->content; + } +} diff --git a/packages/Webkul/Email/src/Helpers/Charset.php b/packages/Webkul/Email/src/Helpers/Charset.php new file mode 100644 index 0000000..331d0da --- /dev/null +++ b/packages/Webkul/Email/src/Helpers/Charset.php @@ -0,0 +1,353 @@ + 'us-ascii', + 'us-ascii' => 'us-ascii', + 'ansi_x3.4-1968' => 'us-ascii', + '646' => 'us-ascii', + 'iso-8859-1' => 'ISO-8859-1', + 'iso-8859-2' => 'ISO-8859-2', + 'iso-8859-3' => 'ISO-8859-3', + 'iso-8859-4' => 'ISO-8859-4', + 'iso-8859-5' => 'ISO-8859-5', + 'iso-8859-6' => 'ISO-8859-6', + 'iso-8859-6-i' => 'ISO-8859-6-I', + 'iso-8859-6-e' => 'ISO-8859-6-E', + 'iso-8859-7' => 'ISO-8859-7', + 'iso-8859-8' => 'ISO-8859-8', + 'iso-8859-8-i' => 'ISO-8859-8-I', + 'iso-8859-8-e' => 'ISO-8859-8-E', + 'iso-8859-9' => 'ISO-8859-9', + 'iso-8859-10' => 'ISO-8859-10', + 'iso-8859-11' => 'ISO-8859-11', + 'iso-8859-13' => 'ISO-8859-13', + 'iso-8859-14' => 'ISO-8859-14', + 'iso-8859-15' => 'ISO-8859-15', + 'iso-8859-16' => 'ISO-8859-16', + 'iso-ir-111' => 'ISO-IR-111', + 'iso-2022-cn' => 'ISO-2022-CN', + 'iso-2022-cn-ext' => 'ISO-2022-CN', + 'iso-2022-kr' => 'ISO-2022-KR', + 'iso-2022-jp' => 'ISO-2022-JP', + 'utf-16be' => 'UTF-16BE', + 'utf-16le' => 'UTF-16LE', + 'utf-16' => 'UTF-16', + 'windows-1250' => 'windows-1250', + 'windows-1251' => 'windows-1251', + 'windows-1252' => 'windows-1252', + 'windows-1253' => 'windows-1253', + 'windows-1254' => 'windows-1254', + 'windows-1255' => 'windows-1255', + 'windows-1256' => 'windows-1256', + 'windows-1257' => 'windows-1257', + 'windows-1258' => 'windows-1258', + 'ibm866' => 'IBM866', + 'ibm850' => 'IBM850', + 'ibm852' => 'IBM852', + 'ibm855' => 'IBM855', + 'ibm857' => 'IBM857', + 'ibm862' => 'IBM862', + 'ibm864' => 'IBM864', + 'utf-8' => 'UTF-8', + 'utf-7' => 'UTF-7', + 'shift_jis' => 'Shift_JIS', + 'big5' => 'Big5', + 'euc-jp' => 'EUC-JP', + 'euc-kr' => 'EUC-KR', + 'gb2312' => 'GB2312', + 'gb18030' => 'gb18030', + 'viscii' => 'VISCII', + 'koi8-r' => 'KOI8-R', + 'koi8_r' => 'KOI8-R', + 'cskoi8r' => 'KOI8-R', + 'koi' => 'KOI8-R', + 'koi8' => 'KOI8-R', + 'koi8-u' => 'KOI8-U', + 'tis-620' => 'TIS-620', + 't.61-8bit' => 'T.61-8bit', + 'hz-gb-2312' => 'HZ-GB-2312', + 'big5-hkscs' => 'Big5-HKSCS', + 'gbk' => 'gbk', + 'cns11643' => 'x-euc-tw', + 'x-imap4-modified-utf7' => 'x-imap4-modified-utf7', + 'x-euc-tw' => 'x-euc-tw', + 'x-mac-ce' => 'x-mac-ce', + 'x-mac-turkish' => 'x-mac-turkish', + 'x-mac-greek' => 'x-mac-greek', + 'x-mac-icelandic' => 'x-mac-icelandic', + 'x-mac-croatian' => 'x-mac-croatian', + 'x-mac-romanian' => 'x-mac-romanian', + 'x-mac-cyrillic' => 'x-mac-cyrillic', + 'x-mac-ukrainian' => 'x-mac-cyrillic', + 'x-mac-hebrew' => 'x-mac-hebrew', + 'x-mac-arabic' => 'x-mac-arabic', + 'x-mac-farsi' => 'x-mac-farsi', + 'x-mac-devanagari' => 'x-mac-devanagari', + 'x-mac-gujarati' => 'x-mac-gujarati', + 'x-mac-gurmukhi' => 'x-mac-gurmukhi', + 'armscii-8' => 'armscii-8', + 'x-viet-tcvn5712' => 'x-viet-tcvn5712', + 'x-viet-vps' => 'x-viet-vps', + 'iso-10646-ucs-2' => 'UTF-16BE', + 'x-iso-10646-ucs-2-be' => 'UTF-16BE', + 'x-iso-10646-ucs-2-le' => 'UTF-16LE', + 'x-user-defined' => 'x-user-defined', + 'x-johab' => 'x-johab', + 'latin1' => 'ISO-8859-1', + 'iso_8859-1' => 'ISO-8859-1', + 'iso8859-1' => 'ISO-8859-1', + 'iso8859-2' => 'ISO-8859-2', + 'iso8859-3' => 'ISO-8859-3', + 'iso8859-4' => 'ISO-8859-4', + 'iso8859-5' => 'ISO-8859-5', + 'iso8859-6' => 'ISO-8859-6', + 'iso8859-7' => 'ISO-8859-7', + 'iso8859-8' => 'ISO-8859-8', + 'iso8859-9' => 'ISO-8859-9', + 'iso8859-10' => 'ISO-8859-10', + 'iso8859-11' => 'ISO-8859-11', + 'iso8859-13' => 'ISO-8859-13', + 'iso8859-14' => 'ISO-8859-14', + 'iso8859-15' => 'ISO-8859-15', + 'iso_8859-1:1987' => 'ISO-8859-1', + 'iso-ir-100' => 'ISO-8859-1', + 'l1' => 'ISO-8859-1', + 'ibm819' => 'ISO-8859-1', + 'cp819' => 'ISO-8859-1', + 'csisolatin1' => 'ISO-8859-1', + 'latin2' => 'ISO-8859-2', + 'iso_8859-2' => 'ISO-8859-2', + 'iso_8859-2:1987' => 'ISO-8859-2', + 'iso-ir-101' => 'ISO-8859-2', + 'l2' => 'ISO-8859-2', + 'csisolatin2' => 'ISO-8859-2', + 'latin3' => 'ISO-8859-3', + 'iso_8859-3' => 'ISO-8859-3', + 'iso_8859-3:1988' => 'ISO-8859-3', + 'iso-ir-109' => 'ISO-8859-3', + 'l3' => 'ISO-8859-3', + 'csisolatin3' => 'ISO-8859-3', + 'latin4' => 'ISO-8859-4', + 'iso_8859-4' => 'ISO-8859-4', + 'iso_8859-4:1988' => 'ISO-8859-4', + 'iso-ir-110' => 'ISO-8859-4', + 'l4' => 'ISO-8859-4', + 'csisolatin4' => 'ISO-8859-4', + 'cyrillic' => 'ISO-8859-5', + 'iso_8859-5' => 'ISO-8859-5', + 'iso_8859-5:1988' => 'ISO-8859-5', + 'iso-ir-144' => 'ISO-8859-5', + 'csisolatincyrillic' => 'ISO-8859-5', + 'arabic' => 'ISO-8859-6', + 'iso_8859-6' => 'ISO-8859-6', + 'iso_8859-6:1987' => 'ISO-8859-6', + 'iso-ir-127' => 'ISO-8859-6', + 'ecma-114' => 'ISO-8859-6', + 'asmo-708' => 'ISO-8859-6', + 'csisolatinarabic' => 'ISO-8859-6', + 'csiso88596i' => 'ISO-8859-6-I', + 'csiso88596e' => 'ISO-8859-6-E', + 'greek' => 'ISO-8859-7', + 'greek8' => 'ISO-8859-7', + 'sun_eu_greek' => 'ISO-8859-7', + 'iso_8859-7' => 'ISO-8859-7', + 'iso_8859-7:1987' => 'ISO-8859-7', + 'iso-ir-126' => 'ISO-8859-7', + 'elot_928' => 'ISO-8859-7', + 'ecma-118' => 'ISO-8859-7', + 'csisolatingreek' => 'ISO-8859-7', + 'hebrew' => 'ISO-8859-8', + 'iso_8859-8' => 'ISO-8859-8', + 'visual' => 'ISO-8859-8', + 'iso_8859-8:1988' => 'ISO-8859-8', + 'iso-ir-138' => 'ISO-8859-8', + 'csisolatinhebrew' => 'ISO-8859-8', + 'csiso88598i' => 'ISO-8859-8-I', + 'iso-8859-8i' => 'ISO-8859-8-I', + 'logical' => 'ISO-8859-8-I', + 'csiso88598e' => 'ISO-8859-8-E', + 'latin5' => 'ISO-8859-9', + 'iso_8859-9' => 'ISO-8859-9', + 'iso_8859-9:1989' => 'ISO-8859-9', + 'iso-ir-148' => 'ISO-8859-9', + 'l5' => 'ISO-8859-9', + 'csisolatin5' => 'ISO-8859-9', + 'unicode-1-1-utf-8' => 'UTF-8', + 'utf8' => 'UTF-8', + 'x-sjis' => 'Shift_JIS', + 'shift-jis' => 'Shift_JIS', + 'ms_kanji' => 'Shift_JIS', + 'csshiftjis' => 'Shift_JIS', + 'windows-31j' => 'Shift_JIS', + 'cp932' => 'Shift_JIS', + 'sjis' => 'Shift_JIS', + 'cseucpkdfmtjapanese' => 'EUC-JP', + 'x-euc-jp' => 'EUC-JP', + 'csiso2022jp' => 'ISO-2022-JP', + 'iso-2022-jp-2' => 'ISO-2022-JP', + 'csiso2022jp2' => 'ISO-2022-JP', + 'csbig5' => 'Big5', + 'cn-big5' => 'Big5', + 'x-x-big5' => 'Big5', + 'zh_tw-big5' => 'Big5', + 'cseuckr' => 'EUC-KR', + 'ks_c_5601-1987' => 'EUC-KR', + 'iso-ir-149' => 'EUC-KR', + 'ks_c_5601-1989' => 'EUC-KR', + 'ksc_5601' => 'EUC-KR', + 'ksc5601' => 'EUC-KR', + 'korean' => 'EUC-KR', + 'csksc56011987' => 'EUC-KR', + '5601' => 'EUC-KR', + 'windows-949' => 'EUC-KR', + 'gb_2312-80' => 'GB2312', + 'iso-ir-58' => 'GB2312', + 'chinese' => 'GB2312', + 'csiso58gb231280' => 'GB2312', + 'csgb2312' => 'GB2312', + 'zh_cn.euc' => 'GB2312', + 'gb_2312' => 'GB2312', + 'x-cp1250' => 'windows-1250', + 'x-cp1251' => 'windows-1251', + 'x-cp1252' => 'windows-1252', + 'x-cp1253' => 'windows-1253', + 'x-cp1254' => 'windows-1254', + 'x-cp1255' => 'windows-1255', + 'x-cp1256' => 'windows-1256', + 'x-cp1257' => 'windows-1257', + 'x-cp1258' => 'windows-1258', + 'windows-874' => 'windows-874', + 'ibm874' => 'windows-874', + 'dos-874' => 'windows-874', + 'macintosh' => 'macintosh', + 'x-mac-roman' => 'macintosh', + 'mac' => 'macintosh', + 'csmacintosh' => 'macintosh', + 'cp866' => 'IBM866', + 'cp-866' => 'IBM866', + '866' => 'IBM866', + 'csibm866' => 'IBM866', + 'cp850' => 'IBM850', + '850' => 'IBM850', + 'csibm850' => 'IBM850', + 'cp852' => 'IBM852', + '852' => 'IBM852', + 'csibm852' => 'IBM852', + 'cp855' => 'IBM855', + '855' => 'IBM855', + 'csibm855' => 'IBM855', + 'cp857' => 'IBM857', + '857' => 'IBM857', + 'csibm857' => 'IBM857', + 'cp862' => 'IBM862', + '862' => 'IBM862', + 'csibm862' => 'IBM862', + 'cp864' => 'IBM864', + '864' => 'IBM864', + 'csibm864' => 'IBM864', + 'ibm-864' => 'IBM864', + 't.61' => 'T.61-8bit', + 'iso-ir-103' => 'T.61-8bit', + 'csiso103t618bit' => 'T.61-8bit', + 'x-unicode-2-0-utf-7' => 'UTF-7', + 'unicode-2-0-utf-7' => 'UTF-7', + 'unicode-1-1-utf-7' => 'UTF-7', + 'csunicode11utf7' => 'UTF-7', + 'csunicode' => 'UTF-16BE', + 'csunicode11' => 'UTF-16BE', + 'iso-10646-ucs-basic' => 'UTF-16BE', + 'csunicodeascii' => 'UTF-16BE', + 'iso-10646-unicode-latin1' => 'UTF-16BE', + 'csunicodelatin1' => 'UTF-16BE', + 'iso-10646' => 'UTF-16BE', + 'iso-10646-j-1' => 'UTF-16BE', + 'latin6' => 'ISO-8859-10', + 'iso-ir-157' => 'ISO-8859-10', + 'l6' => 'ISO-8859-10', + 'csisolatin6' => 'ISO-8859-10', + 'iso_8859-15' => 'ISO-8859-15', + 'csisolatin9' => 'ISO-8859-15', + 'l9' => 'ISO-8859-15', + 'ecma-cyrillic' => 'ISO-IR-111', + 'csiso111ecmacyrillic' => 'ISO-IR-111', + 'csiso2022kr' => 'ISO-2022-KR', + 'csviscii' => 'VISCII', + 'zh_tw-euc' => 'x-euc-tw', + 'iso88591' => 'ISO-8859-1', + 'iso88592' => 'ISO-8859-2', + 'iso88593' => 'ISO-8859-3', + 'iso88594' => 'ISO-8859-4', + 'iso88595' => 'ISO-8859-5', + 'iso88596' => 'ISO-8859-6', + 'iso88597' => 'ISO-8859-7', + 'iso88598' => 'ISO-8859-8', + 'iso88599' => 'ISO-8859-9', + 'iso885910' => 'ISO-8859-10', + 'iso885911' => 'ISO-8859-11', + 'iso885912' => 'ISO-8859-12', + 'iso885913' => 'ISO-8859-13', + 'iso885914' => 'ISO-8859-14', + 'iso885915' => 'ISO-8859-15', + 'tis620' => 'TIS-620', + 'cp1250' => 'windows-1250', + 'cp1251' => 'windows-1251', + 'cp1252' => 'windows-1252', + 'cp1253' => 'windows-1253', + 'cp1254' => 'windows-1254', + 'cp1255' => 'windows-1255', + 'cp1256' => 'windows-1256', + 'cp1257' => 'windows-1257', + 'cp1258' => 'windows-1258', + 'x-gbk' => 'gbk', + 'windows-936' => 'gbk', + 'ansi-1251' => 'windows-1251', + ]; + + /** + * Decode the string from charset. + * + * @param string $encodedString + * @param string $charset + * @return string + */ + public function decodeCharset($encodedString, $charset) + { + if (strtolower($charset) == 'utf-8' || strtolower($charset) == 'us-ascii') { + return $encodedString; + } + + try { + return iconv($this->getCharsetAlias($charset), 'UTF-8//TRANSLIT', $encodedString); + } catch (\Exception $e) { + return iconv($this->getCharsetAlias($charset), 'UTF-8//IGNORE', $encodedString); + } + } + + /** + * Get charset alias. + * + * @param string $charset. + * @return string + */ + public function getCharsetAlias($charset) + { + $charset = strtolower($charset); + + if (array_key_exists($charset, $this->charsetAlias)) { + return $this->charsetAlias[$charset]; + } + + return null; + } +} diff --git a/packages/Webkul/Email/src/Helpers/Contracts/CharsetManager.php b/packages/Webkul/Email/src/Helpers/Contracts/CharsetManager.php new file mode 100644 index 0000000..5fc1b3d --- /dev/null +++ b/packages/Webkul/Email/src/Helpers/Contracts/CharsetManager.php @@ -0,0 +1,20 @@ +'; + } else { + $fulltag = '<'.$tagname; + + if (is_array($attary) && count($attary)) { + $atts = []; + + foreach ($attary as $attname => $attvalue) { + array_push($atts, "$attname=$attvalue"); + } + + $fulltag .= ' '.implode(' ', $atts); + } + + if ($tagtype == 3) { + $fulltag .= ' /'; + } + + $fulltag .= '>'; + } + + return $fulltag; + } + + /** + * A small helper function to use with array_walk. Modifies a by-ref + * value and makes it lowercase. + * + * @param string $val + * @return void + */ + public function tln_casenormalize(&$val) + { + $val = strtolower($val); + } + + /** + * This function skips any whitespace from the current position within + * a string and to the next non-whitespace value. + * + * @param string $body + * @param int $offset + * @return int + */ + public function tln_skipspace($body, $offset) + { + preg_match('/^(\s*)/s', substr($body, $offset), $matches); + + try { + if (! empty($matches[1])) { + $count = strlen($matches[1]); + $offset += $count; + } + } catch (\Exception $e) { + } + + return $offset; + } + + /** + * This function looks for the next character within a string. It's + * really just a glorified "strpos", except it catches the failures + * nicely. + * + * @param string $body + * @param int $offset + * @param string $needle + * @return int + */ + public function tln_findnxstr($body, $offset, $needle) + { + $pos = strpos($body, $needle, $offset); + + if ($pos === false) { + $pos = strlen($body); + } + + return $pos; + } + + /** + * This function takes a PCRE-style regexp and tries to match it + * within the string. + * + * @param string $body + * @param int $offset + * @param string $reg + * @return array|bool + */ + public function tln_findnxreg($body, $offset, $reg) + { + $matches = $retarr = []; + + $preg_rule = '%^(.*?)('.$reg.')%s'; + + preg_match($preg_rule, substr($body, $offset), $matches); + + if (! isset($matches[0]) || ! $matches[0]) { + $retarr = false; + } else { + $retarr[0] = $offset + strlen($matches[1]); + + $retarr[1] = $matches[1]; + + $retarr[2] = $matches[2]; + } + + return $retarr; + } + + /** + * This function looks for the next tag. + * + * @param string $body + * @param int $offset + * @return array|bool + */ + public function tln_getnxtag($body, $offset) + { + if ($offset > strlen($body)) { + return false; + } + + $lt = $this->tln_findnxstr($body, $offset, '<'); + + if ($lt == strlen($body)) { + return false; + } + + /** + * We are here: + * blah blah + * \---------^ + */ + $pos = $this->tln_skipspace($body, $lt + 1); + + if ($pos >= strlen($body)) { + return [false, false, false, $lt, strlen($body)]; + } + + /** + * There are 3 kinds of tags: + * 1. Opening tag, e.g.: + * + * 2. Closing tag, e.g.: + * + * 3. XHTML-style content-less tag, e.g.: + * + */ + switch (substr($body, $pos, 1)) { + case '/': + $tagtype = 2; + + $pos++; + break; + + case '!': + /** + * A comment or an SGML declaration. + */ + if (substr($body, $pos + 1, 2) == '--') { + $gt = strpos($body, '-->', $pos); + + if ($gt === false) { + $gt = strlen($body); + } else { + $gt += 2; + } + + return [false, false, false, $lt, $gt]; + } else { + $gt = $this->tln_findnxstr($body, $pos, '>'); + + return [false, false, false, $lt, $gt]; + } + break; + + default: + $tagtype = 1; + break; + + } + + /** + * Look for next [\W-_], which will indicate the end of the tag name. + */ + $regary = $this->tln_findnxreg($body, $pos, '[^\w\-_]'); + + if ($regary == false) { + return [false, false, false, $lt, strlen($body)]; + } + + [$pos, $tagname, $match] = $regary; + + $tagname = strtolower($tagname); + + /** + * $match can be either of these: + * '>' indicating the end of the tag entirely. + * '\s' indicating the end of the tag name. + * '/' indicating that this is type-3 xhtml tag. + * + * Whatever else we find there indicates an invalid tag. + */ + switch ($match) { + case '/': + /** + * This is an xhtml-style tag with a closing / at the + * end, like so: . Check if it's followed + * by the closing bracket. If not, then this tag is invalid + */ + if (substr($body, $pos, 2) == '/>') { + $pos++; + + $tagtype = 3; + } else { + $gt = $this->tln_findnxstr($body, $pos, '>'); + + $retary = [false, false, false, $lt, $gt]; + + return $retary; + } + + // intentional fall-through + case '>': + return [$tagname, false, $tagtype, $lt, $pos]; + + default: + /** + * Check if it's whitespace. + */ + if (! preg_match('/\s/', $match)) { + /** + * This is an invalid tag! Look for the next closing ">". + */ + $gt = $this->tln_findnxstr($body, $lt, '>'); + + return [false, false, false, $lt, $gt]; + } + + break; + } + + /** + * At this point we're here: + * + * \-------^ + * + * At this point we loop in order to find all attributes. + */ + $attary = []; + + while ($pos <= strlen($body)) { + $pos = $this->tln_skipspace($body, $pos); + + if ($pos == strlen($body)) { + /** + * Non-closed tag. + */ + return [false, false, false, $lt, $pos]; + } + + /** + * See if we arrived at a ">" or "/>", which means that we reached + * the end of the tag. + */ + $matches = []; + + if (preg_match('%^(\s*)(>|/>)%s', substr($body, $pos), $matches)) { + /** + * Yep. So we did. + */ + $pos += strlen($matches[1]); + + if ($matches[2] == '/>') { + $tagtype = 3; + + $pos++; + } + + return [$tagname, $attary, $tagtype, $lt, $pos]; + } + + /** + * There are several types of attributes, with optional + * [:space:] between members. + * Type 1: + * attrname[:space:]=[:space:]'CDATA' + * Type 2: + * attrname[:space:]=[:space:]"CDATA" + * Type 3: + * attr[:space:]=[:space:]CDATA + * Type 4: + * attrname + * + * We leave types 1 and 2 the same, type 3 we check for + * '"' and convert to """ if needed, then wrap in + * double quotes. Type 4 we convert into: + * attrname="yes". + */ + $regary = $this->tln_findnxreg($body, $pos, '[^\w\-_]'); + + if ($regary == false) { + /** + * Looks like body ended before the end of tag. + */ + return [false, false, false, $lt, strlen($body)]; + } + + [$pos, $attname, $match] = $regary; + + $attname = strtolower($attname); + + /** + * We arrived at the end of attribute name. Several things possible + * here: + * '>' means the end of the tag and this is attribute type 4 + * '/' if followed by '>' means the same thing as above + * '\s' means a lot of things -- look what it's followed by. + * anything else means the attribute is invalid. + */ + switch ($match) { + case '/': + /** + * This is an xhtml-style tag with a closing / at the + * end, like so: . Check if it's followed + * by the closing bracket. If not, then this tag is invalid + */ + if (substr($body, $pos, 2) == '/>') { + $pos++; + $tagtype = 3; + } else { + $gt = $this->tln_findnxstr($body, $pos, '>'); + $retary = [false, false, false, $lt, $gt]; + + return $retary; + } + + // intentional fall-through + case '>': + $attary[$attname] = '"yes"'; + + return [$tagname, $attary, $tagtype, $lt, $pos]; + break; + + default: + /** + * Skip whitespace and see what we arrive at. + */ + $pos = $this->tln_skipspace($body, $pos); + + $char = substr($body, $pos, 1); + /** + * Two things are valid here: + * '=' means this is attribute type 1 2 or 3. + * \w means this was attribute type 4. + * anything else we ignore and re-loop. End of tag and + * invalid stuff will be caught by our checks at the beginning + * of the loop. + */ + if ($char == '=') { + $pos++; + + $pos = $this->tln_skipspace($body, $pos); + /** + * Here are 3 possibilities: + * "'" attribute type 1 + * '"' attribute type 2 + * everything else is the content of tag type 3 + */ + $quot = substr($body, $pos, 1); + + if ($quot == '\'') { + $regary = $this->tln_findnxreg($body, $pos + 1, '\''); + + if ($regary == false) { + return [false, false, false, $lt, strlen($body)]; + } + + [$pos, $attval, $match] = $regary; + + $pos++; + + $attary[$attname] = '\''.$attval.'\''; + } elseif ($quot == '"') { + $regary = $this->tln_findnxreg($body, $pos + 1, '\"'); + + if ($regary == false) { + return [false, false, false, $lt, strlen($body)]; + } + + [$pos, $attval, $match] = $regary; + + $pos++; + + $attary[$attname] = '"'.$attval.'"'; + } else { + /** + * These are hateful. Look for \s, or >. + */ + $regary = $this->tln_findnxreg($body, $pos, '[\s>]'); + + if ($regary == false) { + return [false, false, false, $lt, strlen($body)]; + } + + [$pos, $attval, $match] = $regary; + + $attval = preg_replace('/\"/s', '"', $attval); + + $attary[$attname] = '"'.$attval.'"'; + } + } elseif (preg_match('|[\w/>]|', $char)) { + $attary[$attname] = '"yes"'; + } else { + $gt = $this->tln_findnxstr($body, $pos, '>'); + + return [false, false, false, $lt, $gt]; + } + break; + } + } + + /** + * The fact that we got here indicates that the tag end was never + * found. Return invalid tag indication so it gets stripped. + */ + return [false, false, false, $lt, strlen($body)]; + } + + /** + * Translates entities into literal values so they can be checked. + * + * @param string $attvalue + * @param string $regex + * @param bool $hex + * @return bool + */ + public function tln_deent(&$attvalue, $regex, $hex = false) + { + preg_match_all($regex, $attvalue, $matches); + + if (is_array($matches) && count($matches[0]) > 0) { + $repl = []; + + for ($i = 0; $i < count($matches[0]); $i++) { + $numval = $matches[1][$i]; + + if ($hex) { + $numval = hexdec($numval); + } + + $repl[$matches[0][$i]] = chr($numval); + } + + $attvalue = strtr($attvalue, $repl); + + return true; + } else { + return false; + } + } + + /** + * This function checks attribute values for entity-encoded values + * and returns them translated into 8-bit strings so we can run + * checks on them. + * + * @param string $attvalue + * @return void + */ + public function tln_defang(&$attvalue) + { + /** + * Skip this if there aren't ampersands or backslashes. + */ + if (strpos($attvalue, '&') === false + && strpos($attvalue, '\\') === false + ) { + return; + } + + do { + $m = false; + $m = $m || $this->tln_deent($attvalue, '/\�*(\d+);*/s'); + $m = $m || $this->tln_deent($attvalue, '/\�*((\d|[a-f])+);*/si', true); + $m = $m || $this->tln_deent($attvalue, '/\\\\(\d+)/s', true); + } while ($m == true); + + $attvalue = stripslashes($attvalue); + } + + /** + * Kill any tabs, newlines, or carriage returns. Our friends the + * makers of the browser with 95% market value decided that it'd + * be funny to make "java[tab]script" be just as good as "javascript". + * + * @param string $attvalue + * @return void + */ + public function tln_unspace(&$attvalue) + { + if (strcspn($attvalue, "\t\r\n\0 ") != strlen($attvalue)) { + $attvalue = str_replace( + ["\t", "\r", "\n", "\0", ' '], + ['', '', '', '', ''], + $attvalue + ); + } + } + + /** + * This function runs various checks against the attributes. + * + * @param string $tagname + * @param array $attary + * @param array $rm_attnames + * @param array $bad_attvals + * @param array $add_attr_to_tag + * @param string $trans_image_path + * @param bool $block_external_images + * @return array with modified attributes. + */ + public function tln_fixatts( + $tagname, + $attary, + $rm_attnames, + $bad_attvals, + $add_attr_to_tag, + $trans_image_path, + $block_external_images + ) { + /** + * Convert to array if is not. + */ + $attary = is_array($attary) ? $attary : []; + + foreach ($attary as $attname => $attvalue) { + /** + * See if this attribute should be removed. + */ + foreach ($rm_attnames as $matchtag => $matchattrs) { + if (preg_match($matchtag, $tagname)) { + foreach ($matchattrs as $matchattr) { + if (preg_match($matchattr, $attname)) { + unset($attary[$attname]); + + continue 2; + } + } + } + } + + $this->tln_defang($attvalue); + + $this->tln_unspace($attvalue); + + /** + * Now let's run checks on the attvalues. + * I don't expect anyone to comprehend this. If you do, + * get in touch with me so I can drive to where you live and + * shake your hand personally. :) + */ + foreach ($bad_attvals as $matchtag => $matchattrs) { + if (preg_match($matchtag, $tagname)) { + foreach ($matchattrs as $matchattr => $valary) { + if (preg_match($matchattr, $attname)) { + [$valmatch, $valrepl] = $valary; + + $newvalue = preg_replace($valmatch, $valrepl, $attvalue); + + if ($newvalue != $attvalue) { + $attary[$attname] = $newvalue; + $attvalue = $newvalue; + } + } + } + } + } + } + + /** + * See if we need to append any attributes to this tag. + */ + foreach ($add_attr_to_tag as $matchtag => $addattary) { + if (preg_match($matchtag, $tagname)) { + $attary = array_merge($attary, $addattary); + } + } + + return $attary; + } + + /** + * Fix url. + * + * @return void + */ + public function tln_fixurl($attname, &$attvalue, $trans_image_path, $block_external_images) + { + $sQuote = '"'; + + $attvalue = trim($attvalue); + + if ($attvalue && ($attvalue[0] == '"' || $attvalue[0] == "'")) { + // remove the double quotes + $sQuote = $attvalue[0]; + + $attvalue = trim(substr($attvalue, 1, -1)); + } + + /** + * Replace empty src tags with the blank image. src is only used + * for frames, images, and image inputs. Doing a replace should + * not affect them working as should be, however it will stop + * IE from being kicked off when src for img tags are not set. + */ + if ($attvalue == '') { + $attvalue = $sQuote.$trans_image_path.$sQuote; + } else { + // first, disallow 8 bit characters and control characters + if (preg_match('/[\0-\37\200-\377]+/', $attvalue)) { + switch ($attname) { + case 'href': + $attvalue = $sQuote.'http://invalid-stuff-detected.example.com'.$sQuote; + break; + + default: + $attvalue = $sQuote.$trans_image_path.$sQuote; + break; + + } + } else { + $aUrl = parse_url($attvalue); + + if (isset($aUrl['scheme'])) { + switch (strtolower($aUrl['scheme'])) { + case 'mailto': + case 'http': + case 'https': + case 'ftp': + if ($attname != 'href') { + if ($block_external_images == true) { + $attvalue = $sQuote.$trans_image_path.$sQuote; + } else { + if (! isset($aUrl['path'])) { + $attvalue = $sQuote.$trans_image_path.$sQuote; + } + } + } else { + $attvalue = $sQuote.$attvalue.$sQuote; + } + break; + + case 'outbind': + $attvalue = $sQuote.$attvalue.$sQuote; + break; + + case 'cid': + $attvalue = $sQuote.$attvalue.$sQuote; + break; + + default: + $attvalue = $sQuote.$trans_image_path.$sQuote; + break; + } + } else { + if (! isset($aUrl['path']) || $aUrl['path'] != $trans_image_path) { + $$attvalue = $sQuote.$trans_image_path.$sQuote; + } + } + } + } + } + + /** + * Fix style. + * + * @return void + */ + public function tln_fixstyle($body, $pos, $trans_image_path, $block_external_images) + { + $me = 'tln_fixstyle'; + + $content = ''; + + $sToken = ''; + + $bSucces = false; + + $bEndTag = false; + + for ($i = $pos,$iCount = strlen($body); $i < $iCount; $i++) { + $char = $body[$i]; + + switch ($char) { + case '<': + $sToken = $char; + break; + case '/': + if ($sToken == '<') { + $sToken .= $char; + + $bEndTag = true; + } else { + $content .= $char; + } + + break; + + case '>': + if ($bEndTag) { + $sToken .= $char; + + if (preg_match('/\<\/\s*style\s*\>/i', $sToken, $aMatch)) { + $newpos = $i + 1; + + $bSucces = true; + + break 2; + + } else { + $content .= $sToken; + } + + $bEndTag = false; + } else { + $content .= $char; + } + break; + case '!': + if ($sToken == '<') { + if (isset($body[$i + 2]) && substr($body, $i, 3) == '!--') { + $i = strpos($body, '-->', $i + 3); + + if (! $i) { + $i = strlen($body); + } + + $sToken = ''; + } + } else { + $content .= $char; + } + break; + default: + if ($bEndTag) { + $sToken .= $char; + } else { + $content .= $char; + } + break; + } + } + + if (! $bSucces) { + return [false, strlen($body)]; + } + + /** + * First look for general BODY style declaration, which would be + * like so: + * body {background: blah-blah} + * and change it to .bodyclass so we can just assign it to a
    + */ + $content = preg_replace("|body(\s*\{.*?\})|si", '.bodyclass\\1', $content); + + $trans_image_path = $trans_image_path; + + // first check for 8bit sequences and disallowed control characters + if (preg_match('/[\16-\37\200-\377]+/', $content)) { + $content = ''; + + return [$content, $newpos]; + } + + // remove @import line + $content = preg_replace("/^\s*(@import.*)$/mi", "\n\n", $content); + + $content = preg_replace('/(\\\\)?u(\\\\)?r(\\\\)?l(\\\\)?/i', 'url', $content); + + preg_match_all("/url\s*\((.+)\)/si", $content, $aMatch); + + if (count($aMatch)) { + $aValue = $aReplace = []; + + foreach ($aMatch[1] as $sMatch) { + $urlvalue = $sMatch; + $this->tln_fixurl('style', $urlvalue, $trans_image_path, $block_external_images); + $aValue[] = $sMatch; + $aReplace[] = $urlvalue; + } + + $content = str_replace($aValue, $aReplace, $content); + } + + /** + * Remove any backslashes, entities, and extraneous whitespace. + */ + $contentTemp = $content; + $this->tln_defang($contentTemp); + $this->tln_unspace($contentTemp); + + $match = ['/\/\*.*\*\//', + '/expression/i', + '/behaviou*r/i', + '/binding/i', + '/include-source/i', + '/javascript/i', + '/script/i', + '/position/i']; + + $replace = ['', 'idiocy', 'idiocy', 'idiocy', 'idiocy', 'idiocy', 'idiocy', '']; + + $contentNew = preg_replace($match, $replace, $contentTemp); + + if ($contentNew !== $contentTemp) { + $content = $contentNew; + } + + return [$content, $newpos]; + } + + /** + * Body to div. + * + * @return void + */ + public function tln_body2div($attary, $trans_image_path) + { + $me = 'tln_body2div'; + + $divattary = ['class' => "'bodyclass'"]; + + $has_bgc_stl = $has_txt_stl = false; + + $styledef = ''; + + if (is_array($attary) && count($attary) > 0) { + foreach ($attary as $attname=>$attvalue) { + $quotchar = substr($attvalue, 0, 1); + + $attvalue = str_replace($quotchar, '', $attvalue); + + switch ($attname) { + case 'background': + $styledef .= "background-image: url('$trans_image_path'); "; + break; + + case 'bgcolor': + $has_bgc_stl = true; + + $styledef .= "background-color: $attvalue; "; + break; + + case 'text': + $has_txt_stl = true; + + $styledef .= "color: $attvalue; "; + break; + + } + } + + // Outlook defines a white bgcolor and no text color. This can lead to white text on a white bg with certain themes. + if ($has_bgc_stl && ! $has_txt_stl) { + $styledef .= 'color: #000000; '; + } + + if (strlen($styledef) > 0) { + $divattary['style'] = "\"$styledef\""; + } + } + + return $divattary; + } + + /** + * Sanitize. + * + * @param string $body + * @param array $tag_list + * @param array $rm_tags_with_content + * @param array $self_closing_tags + * @param bool $force_tag_closing + * @param array $rm_attnames + * @param array $bad_attvals + * @param array $add_attr_to_tag + * @param string $trans_image_path + * @param bool $block_external_images + * @return string + */ + public function tln_sanitize( + $body, + $tag_list, + $rm_tags_with_content, + $self_closing_tags, + $force_tag_closing, + $rm_attnames, + $bad_attvals, + $add_attr_to_tag, + $trans_image_path, + $block_external_images + ) { + /** + * Normalize rm_tags and rm_tags_with_content. + */ + $rm_tags = array_shift($tag_list); + + @array_walk($tag_list, [$this, 'tln_casenormalize']); + + @array_walk($rm_tags_with_content, [$this, 'tln_casenormalize']); + + @array_walk($self_closing_tags, [$this, 'tln_casenormalize']); + + /** + * See if tag_list is of tags to remove or tags to allow. + * false means remove these tags + * true means allow these tags + */ + $curpos = 0; + $open_tags = []; + $trusted = ''; + $skip_content = false; + + /** + * Take care of netscape's stupid javascript entities like + * &{alert('boo')}; + */ + $body = preg_replace('/&(\{.*?\};)/si', '&\\1', $body); + + while (($curtag = $this->tln_getnxtag($body, $curpos)) != false) { + [$tagname, $attary, $tagtype, $lt, $gt] = $curtag; + $free_content = substr($body, $curpos, $lt - $curpos); + + /** + * Take care of + + {!! view_render_event('webform.layout.head') !!} + + + + {!! view_render_event('webform.layout.body.before') !!} + +
    + + + + {!! view_render_event('webform.layout.content.before') !!} + + + {{ $slot }} + + {!! view_render_event('webform.layout.content.after') !!} +
    + + {!! view_render_event('webform.layout.body.after') !!} + + @stack('scripts') + + {!! view_render_event('webform.layout.vue-app-mount.before') !!} + + + + {!! view_render_event('webform.layout.vue-app-mount.after') !!} + + + + + diff --git a/packages/Webkul/WebForm/src/Resources/views/components/spinner/index.blade.php b/packages/Webkul/WebForm/src/Resources/views/components/spinner/index.blade.php new file mode 100644 index 0000000..e195748 --- /dev/null +++ b/packages/Webkul/WebForm/src/Resources/views/components/spinner/index.blade.php @@ -0,0 +1,27 @@ + +@props(['color' => 'currentColor']) + + \ No newline at end of file diff --git a/packages/Webkul/WebForm/src/Resources/views/settings/web-forms/controls.blade.php b/packages/Webkul/WebForm/src/Resources/views/settings/web-forms/controls.blade.php new file mode 100644 index 0000000..603eedf --- /dev/null +++ b/packages/Webkul/WebForm/src/Resources/views/settings/web-forms/controls.blade.php @@ -0,0 +1,257 @@ +@foreach ($webForm->attributes as $attribute) + @php + $parentAttribute = $attribute->attribute; + + $fieldName = $parentAttribute->entity_type . '[' . $parentAttribute->code . ']'; + + $validations = $attribute->is_required ? 'required' : ''; + @endphp + + + + {{ $attribute->name ?? $parentAttribute->name }} + + + @switch($parentAttribute->type) + @case('text') + + + + + @break + + @case('price') + + + + + @break + + @case('email') + + + + + + + @break + + @case('checkbox') + @php + $options = $parentAttribute->lookup_type + ? app('Webkul\Attribute\Repositories\AttributeRepository')->getLookUpOptions($parentAttribute->lookup_type) + : $parentAttribute->options()->orderBy('sort_order')->get(); + @endphp + + @foreach ($options as $option) + + + + + + @endforeach + + @case('file') + @case('image') + + + + + @break; + + @case('phone') + + + + + + + @break + + @case('date') + + + + + @break + + @case('datetime') + + + + + @break + + @case('select') + @case('lookup') + @php + $options = $parentAttribute->lookup_type + ? app('Webkul\Attribute\Repositories\AttributeRepository')->getLookUpOptions($parentAttribute->lookup_type) + : $parentAttribute->options()->orderBy('sort_order')->get(); + @endphp + + + @foreach ($options as $option) + + @endforeach + + + + + @break + + @case('multiselect') + @php + $options = $parentAttribute->lookup_type + ? app('Webkul\Attribute\Repositories\AttributeRepository')->getLookUpOptions($parentAttribute->lookup_type) + : $parentAttribute->options()->orderBy('sort_order')->get(); + @endphp + + + @foreach ($options as $option) + + @endforeach + + + + + @break + + @case('checkbox') +
    + @php + $options = $parentAttribute->lookup_type + ? app('Webkul\Attribute\Repositories\AttributeRepository')->getLookUpOptions($parentAttribute->lookup_type) + : $parentAttribute->options()->orderBy('sort_order')->get(); + @endphp + + @foreach ($options as $option) + + + + + {{ $option->name }} + + @endforeach +
    + +

    + + @break + + @case('boolean') + + + + + + + + @break + @endswitch +
    +@endforeach diff --git a/packages/Webkul/WebForm/src/Resources/views/settings/web-forms/embed.blade.php b/packages/Webkul/WebForm/src/Resources/views/settings/web-forms/embed.blade.php new file mode 100644 index 0000000..26ad197 --- /dev/null +++ b/packages/Webkul/WebForm/src/Resources/views/settings/web-forms/embed.blade.php @@ -0,0 +1,3 @@ +(function() { + document.write(`{!! view('web_form::settings.web-forms.preview', compact('webForm'))->render() !!}`.replaceAll('$', '\$')); +})(); \ No newline at end of file diff --git a/packages/Webkul/WebForm/src/Resources/views/settings/web-forms/preview.blade.php b/packages/Webkul/WebForm/src/Resources/views/settings/web-forms/preview.blade.php new file mode 100644 index 0000000..4d9728c --- /dev/null +++ b/packages/Webkul/WebForm/src/Resources/views/settings/web-forms/preview.blade.php @@ -0,0 +1,156 @@ + + + {{ $webForm->title }} + + + + +
    +
    + +
    +
    +
    + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/WebForm/src/Routes/routes.php b/packages/Webkul/WebForm/src/Routes/routes.php new file mode 100644 index 0000000..668f0bd --- /dev/null +++ b/packages/Webkul/WebForm/src/Routes/routes.php @@ -0,0 +1,16 @@ +middleware(['web', 'admin_locale'])->prefix('web-forms')->group(function () { + Route::get('forms/{id}/form.js', 'formJS')->name('admin.settings.web_forms.form_js'); + + Route::get('forms/{id}/form.html', 'preview')->name('admin.settings.web_forms.preview'); + + Route::post('forms/{id}', 'formStore')->name('admin.settings.web_forms.form_store'); + + Route::group(['middleware' => ['user']], function () { + Route::get('form/{id}/form.html', 'view')->name('admin.settings.web_forms.view'); + }); +}); diff --git a/packages/Webkul/WebForm/src/Rules/PhoneNumber.php b/packages/Webkul/WebForm/src/Rules/PhoneNumber.php new file mode 100644 index 0000000..271208a --- /dev/null +++ b/packages/Webkul/WebForm/src/Rules/PhoneNumber.php @@ -0,0 +1,33 @@ + { + const envDir = "../../../"; + + Object.assign(process.env, loadEnv(mode, envDir)); + + return { + build: { + emptyOutDir: true, + }, + + envDir, + + server: { + host: process.env.VITE_HOST || "localhost", + port: process.env.VITE_PORT || 5174, + }, + + plugins: [ + vue(), + + laravel({ + hotFile: "../../../public/webform-vite.hot", + publicDirectory: "../../../public", + buildDirectory: "webform/build", + input: [ + "src/Resources/assets/css/app.css", + "src/Resources/assets/js/app.js", + ], + refresh: true, + }), + ], + + experimental: { + renderBuiltUrl(filename, { hostId, hostType, type }) { + if (hostType === "css") { + return path.basename(filename); + } + }, + }, + }; +}); \ No newline at end of file diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..5bc9705 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,34 @@ + + + + + ./tests/Unit + + + + ./tests/Feature + + + + + + ./app + + + + + + + + + + + + + diff --git a/pint.json b/pint.json new file mode 100644 index 0000000..d4b5683 --- /dev/null +++ b/pint.json @@ -0,0 +1,10 @@ +{ + "preset": "laravel", + "rules": { + "binary_operator_spaces": { + "operators": { + "=>": "align" + } + } + } +} \ No newline at end of file diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 0000000..b9db6a7 --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,22 @@ +# Rewrite Module + + + Options -MultiViews -Indexes + + + RewriteEngine On + + # Handle Authorization Header + RewriteCond %{HTTP:Authorization} . + RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] + + # Redirect Trailing Slashes If Not A Folder... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_URI} (.+)/$ + RewriteRule ^ %1 [L,R=301] + + # Handle Front Controller... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^ index.php [L] + diff --git a/public/admin/build/assets/activities-DpB2XKqX.svg b/public/admin/build/assets/activities-DpB2XKqX.svg new file mode 100644 index 0000000..890d0ea --- /dev/null +++ b/public/admin/build/assets/activities-DpB2XKqX.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/admin/build/assets/app-B6AvubOR.css b/public/admin/build/assets/app-B6AvubOR.css new file mode 100644 index 0000000..e3ca4e8 --- /dev/null +++ b/public/admin/build/assets/app-B6AvubOR.css @@ -0,0 +1 @@ +*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%;margin-right:auto;margin-left:auto;padding-right:16px;padding-left:16px}@media (min-width: 1920px){.container{max-width:1920px}}.icon-image:before{content:""}.icon-bookmark:before{content:""}.icon-bookmark-active:before{content:""}.icon-error:before{content:""}.icon-info:before{content:""}.icon-success:before{content:""}.icon-warning:before{content:""}.icon-stats-down:before{content:""}.icon-stats-up:before{content:""}.icon-attribute:before{content:""}.icon-download:before{content:""}.icon-settings-warehouse:before{content:""}.icon-move:before{content:""}.icon-organization:before{content:""}.icon-role:before{content:""}.icon-user:before{content:""}.icon-system-generate:before{content:""}.icon-settings-attributes:before{content:""}.icon-settings-flow:before{content:""}.icon-settings-group:before{content:""}.icon-settings-mail:before{content:""}.icon-settings-pipeline:before{content:""}.icon-settings-roles:before{content:""}.icon-settings-sources:before{content:""}.icon-settings-tag:before{content:""}.icon-settings-type:before{content:""}.icon-settings-user:before{content:""}.icon-settings-webforms:before{content:""}.icon-settings-webhooks:before{content:""}.icon-attached-file:before{content:""}.icon-forward:before{content:""}.icon-location:before{content:""}.icon-pin:before{content:""}.icon-print:before{content:""}.icon-reply-all:before{content:""}.icon-reply:before{content:""}.icon-rotten:before{content:""}.icon-tag:before{content:""}.icon-list:before{content:""}.icon-enter:before{content:""}.icon-kanban:before{content:""}.icon-tick:before{content:""}.icon-eye-hide:before{content:""}.icon-percentage:before{content:""}.icon-dollar:before{content:""}.icon-radio-selected:before{content:""}.icon-radio-normal:before{content:""}.icon-folder:before{content:""}.icon-file:before{content:""}.icon-eye:before{content:""}.icon-notification:before{content:""}.icon-configuration:before{content:""}.icon-note:before{content:""}.icon-edit:before{content:""}.icon-menu:before{content:""}.icon-calendar:before{content:""}.icon-delete:before{content:""}.icon-more:before{content:""}.icon-checkbox-multiple:before{content:""}.icon-checkbox-select:before{content:""}.icon-checkbox-outline:before{content:""}.icon-message:before{content:""}.icon-video:before{content:""}.icon-attachment:before{content:""}.icon-sent:before{content:""}.icon-call:before{content:""}.icon-meeting:before{content:""}.icon-light:before{content:""}.icon-dark:before{content:""}.icon-mail:before{content:""}.icon-leads:before{content:""}.icon-filter:before{content:""}.icon-setting:before{content:""}.icon-product:before{content:""}.icon-contact:before{content:""}.icon-activity:before{content:""}.icon-perosnal:before{content:""}.icon-quote:before{content:""}.icon-dashboard:before{content:""}.icon-cross-large:before{content:""}.icon-left-arrow:before{content:""}.icon-right-arrow:before{content:""}.icon-up-arrow:before{content:""}.icon-down-arrow:before{content:""}.icon-search:before{content:""}.icon-add:before{content:""}.icon-add-2:before{content:""}.label-active{max-width:-moz-max-content;max-width:max-content;border-radius:.375rem;--tw-bg-opacity: 1;background-color:rgb(167 243 208 / var(--tw-bg-opacity, 1));padding:.375rem .75rem;font-size:.75rem;line-height:1rem;font-weight:500;--tw-text-opacity: 1;color:rgb(6 78 59 / var(--tw-text-opacity, 1))}.label-inactive{max-width:-moz-max-content;max-width:max-content;border-radius:.375rem;--tw-bg-opacity: 1;background-color:rgb(254 202 202 / var(--tw-bg-opacity, 1));padding:.375rem .75rem;font-size:.75rem;line-height:1rem;font-weight:500;--tw-text-opacity: 1;color:rgb(153 27 27 / var(--tw-text-opacity, 1))}[dir=ltr] .sidebar-rounded:after{pointer-events:none;position:absolute;top:0;right:-30px;height:30px;width:30px;background-image:url(corner-clip-CRLTKrCT.svg);background-repeat:no-repeat;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;--tw-content: "";content:var(--tw-content)}[dir=rtl] .sidebar-rounded:before{pointer-events:none;position:absolute;top:0;left:-30px;height:30px;width:30px;--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));background-image:url(corner-clip-CRLTKrCT.svg);background-repeat:no-repeat;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;--tw-content: "";content:var(--tw-content)}.dark .sidebar-rounded:after{background-image:url(dark-corner-clip-Deux0RQO.svg)}.dark .sidebar-rounded:before{background-image:url(dark-corner-clip-Deux0RQO.svg)}.stage:after{content:"";position:absolute;top:50%;right:-10px;width:24px;height:24px;z-index:1;border-radius:0 0 0 25px;transform:translateY(-50%) rotate(45deg);border-right:4px solid #f3f4f6;border-top:4px solid #f3f4f6}.dark .stage:after{content:"";position:absolute;top:50%;right:-10px;width:24px;height:24px;z-index:1;border-radius:0 0 0 25px;transform:translateY(-50%) rotate(45deg);border-right:4px solid #030712;border-top:4px solid #030712}[dir=rtl] .stage:before{content:"";position:absolute;top:50%;left:-10px;width:24px;height:24px;z-index:1;border-radius:0 0 0 25px;transform:translateY(-50%) rotate(225deg);border-right:4px solid #f3f4f6;border-top:4px solid #f3f4f6}[dir=rtl] .stage:after{display:none}.dark\:bg-gray-400:is(.dark *){--tw-bg-opacity: 1 !important;background-color:#1f2937!important;border:#111827 solid!important;color:#e5e7eb!important}.dark\:bg-gray-800:is(.dark *){--tw-bg-opacity: 1;background-color:#101827}.shimmer{animation-duration:2.2s;animation-fill-mode:forwards;animation-iteration-count:infinite;animation-name:skeleton;animation-timing-function:linear;background:linear-gradient(to right,#f6f6f6 8%,#f0f0f0 18%,#f6f6f6 33%);background-size:1250px 100%}.light-shimmer-bg{background:linear-gradient(to right,#fafafa 8%,#f5f5f5 18%,#fafafa 33%);background-size:1250px 100%}.dark .shimmer{background:linear-gradient(to right,#1f2937 8%,#1a2232 18%,#1f2937 33%)}.primary-button{display:flex;cursor:pointer;place-content:center;align-items:center;-moz-column-gap:.25rem;column-gap:.25rem;border-radius:.375rem;border-width:1px;border-color:var(--brand-color);background-color:var(--brand-color);padding:.375rem .75rem;font-weight:600;--tw-text-opacity: 1;color:rgb(249 250 251 / var(--tw-text-opacity, 1));transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.primary-button:hover{opacity:.9}.primary-button:focus{opacity:.9}.secondary-button{display:flex;cursor:pointer;place-content:center;align-items:center;-moz-column-gap:.25rem;column-gap:.25rem;white-space:nowrap;border-radius:.375rem;border-width:2px;border-color:var(--brand-color);--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:.375rem .75rem;font-weight:600;color:var(--brand-color);transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.secondary-button:hover{background-color:#eff6ff61}.secondary-button:focus{background-color:#eff6ff61}.secondary-button:is(.dark *){--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.secondary-button:hover:is(.dark *){opacity:.8}.transparent-button{display:flex;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;place-content:center;align-items:center;-moz-column-gap:.25rem;column-gap:.25rem;white-space:nowrap;border-radius:.375rem;border-width:2px;border-color:transparent;padding:.375rem .75rem;font-weight:600;--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1));transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transparent-button *::marker{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.transparent-button::marker{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.transparent-button:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.transparent-button:focus{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.transparent-button:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(3 7 18 / var(--tw-bg-opacity, 1))}.transparent-button:focus:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(3 7 18 / var(--tw-bg-opacity, 1))}::-webkit-scrollbar{width:12px}::-webkit-scrollbar-track{background:#f1f1f1}::-webkit-scrollbar-thumb{background:#888;border-radius:6px}::-webkit-scrollbar-thumb:hover{background:#555}*{scrollbar-width:thin;scrollbar-color:#888 #f1f1f1}::-moz-selection{background-color:#0044f233}::selection{background-color:#0044f233}body{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1));font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}button:disabled{cursor:not-allowed;opacity:.5}button:disabled:hover{cursor:not-allowed;opacity:.5}.draggable-ghost{opacity:.5;background:#e0e7ff}html.dark [class^=icon-],html.dark [class*=" icon-"]{color:#d1d5db}p{font-size:14px;line-height:17px!important}input,textarea,select{outline:2px solid transparent;outline-offset:2px}.journal-scroll::-webkit-scrollbar{width:14px;cursor:pointer;display:none}.journal-scroll::-webkit-scrollbar-track{background-color:#fff;cursor:pointer;border-radius:12px;border:1px solid #e9e9e9}.journal-scroll::-webkit-scrollbar-thumb{cursor:pointer;background-color:#e9e9e9;border-radius:12px;border:3px solid transparent;background-clip:content-box}.custom-select{-webkit-appearance:none;-moz-appearance:none;background:transparent;background-image:url("data:image/svg+xml;utf8,");background-repeat:no-repeat;background-position-x:calc(100% - 10px);background-position-y:50%}.dark .custom-select{background-image:url("data:image/svg+xml;utf8,")}[dir=rtl] .custom-select{background-position-x:calc(100% - (100% - 10px))}.draggable-ghost{border-width:1px;border-style:dashed;--tw-border-opacity: 1 !important;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))!important}@keyframes skeleton{0%{background-position:-1250px 0}to{background-position:1250px 0}}.required:after{--tw-content: "*";content:var(--tw-content)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.\!static{position:static!important}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{left:0;right:0}.inset-y-0{top:0;bottom:0}.\!bottom-12{bottom:3rem!important}.\!top-7{top:1.75rem!important}.\!top-\[30px\]{top:30px!important}.\!top-auto{top:auto!important}.-bottom-0\.5{bottom:-.125rem}.-right-1{right:-.25rem}.-top-1{top:-.25rem}.bottom-0{bottom:0}.bottom-10{bottom:2.5rem}.bottom-4{bottom:1rem}.bottom-5{bottom:1.25rem}.bottom-full{bottom:100%}.left-0{left:0}.left-1\/2{left:50%}.left-4{left:1rem}.left-\[6px\]{left:6px}.right-0{right:0}.right-1{right:.25rem}.right-1\.5{right:.375rem}.right-2{right:.5rem}.right-3{right:.75rem}.right-4{right:1rem}.right-7{right:1.75rem}.right-8{right:2rem}.right-\[6px\]{right:6px}.top-0{top:0}.top-1\.5{top:.375rem}.top-1\/2{top:50%}.top-10{top:2.5rem}.top-11{top:2.75rem}.top-2{top:.5rem}.top-3{top:.75rem}.top-4{top:1rem}.top-5{top:1.25rem}.top-\[60px\]{top:60px}.top-\[6px\]{top:6px}.top-\[9px\]{top:9px}.top-full{top:100%}.z-10{z-index:10}.z-20{z-index:20}.z-\[10001\]{z-index:10001}.z-\[10002\]{z-index:10002}.z-\[10003\]{z-index:10003}.z-\[10004\]{z-index:10004}.z-\[1000\]{z-index:1000}.z-\[999\]{z-index:999}.float-right{float:right}.m-2{margin:.5rem}.m-3{margin:.75rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-2\.5{margin-top:.625rem;margin-bottom:.625rem}.my-4{margin-top:1rem;margin-bottom:1rem}.\!mb-0{margin-bottom:0!important}.\!mb-2{margin-bottom:.5rem!important}.\!mt-6{margin-top:1.5rem!important}.-mb-px{margin-bottom:-1px}.-mt-2{margin-top:-.5rem}.-mt-px{margin-top:-1px}.mb-0{margin-bottom:0}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-2\.5{margin-bottom:.625rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-7{margin-bottom:1.75rem}.ml-1{margin-left:.25rem}.ml-4{margin-left:1rem}.mr-1{margin-right:.25rem}.ms-2{margin-inline-start:.5rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-3\.5{margin-top:.875rem}.mt-4{margin-top:1rem}.mt-auto{margin-top:auto}.line-clamp-1{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.\!flex{display:flex!important}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.aspect-\[3\.23\/1\]{aspect-ratio:3.23/1}.\!h-10{height:2.5rem!important}.\!h-\[34px\]{height:34px!important}.h-0{height:0px}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-20{height:5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-40{height:10rem}.h-5{height:1.25rem}.h-56{height:14rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-9{height:2.25rem}.h-\[100vh\]{height:100vh}.h-\[120px\]{height:120px}.h-\[15px\]{height:15px}.h-\[17px\]{height:17px}.h-\[18px\]{height:18px}.h-\[19px\]{height:19px}.h-\[21px\]{height:21px}.h-\[223px\]{height:223px}.h-\[26px\]{height:26px}.h-\[271px\]{height:271px}.h-\[280px\]{height:280px}.h-\[28px\]{height:28px}.h-\[33px\]{height:33px}.h-\[34px\]{height:34px}.h-\[380px\]{height:380px}.h-\[38px\]{height:38px}.h-\[39px\]{height:39px}.h-\[40px\]{height:40px}.h-\[42px\]{height:42px}.h-\[44px\]{height:44px}.h-\[49px\]{height:49px}.h-\[59px\]{height:59px}.h-\[74px\]{height:74px}.h-\[calc\(100vh-100px\)\]{height:calc(100vh - 100px)}.h-\[calc\(100vh-317px\)\]{height:calc(100vh - 317px)}.h-fit{height:-moz-fit-content;height:fit-content}.h-full{height:100%}.max-h-0{max-height:0px}.max-h-40{max-height:10rem}.max-h-80{max-height:20rem}.max-h-9{max-height:2.25rem}.max-h-\[120px\]{max-height:120px}.max-h-\[200px\]{max-height:200px}.max-h-\[400px\]{max-height:400px}.max-h-\[500px\]{max-height:500px}.max-h-\[80vh\]{max-height:80vh}.min-h-0{min-height:0px}.min-h-9{min-height:2.25rem}.min-h-\[110px\]{min-height:110px}.min-h-\[38px\]{min-height:38px}.min-h-\[39px\]{min-height:39px}.min-h-\[400px\]{min-height:400px}.min-h-\[47px\]{min-height:47px}.min-h-\[calc\(100vh-62px\)\]{min-height:calc(100vh - 62px)}.min-h-full{min-height:100%}.\!w-1\/2{width:50%!important}.\!w-1\/3{width:33.333333%!important}.\!w-1\/4{width:25%!important}.\!w-1\/6{width:16.666667%!important}.\!w-12{width:3rem!important}.\!w-24{width:6rem!important}.\!w-56{width:14rem!important}.\!w-\[140px\]{width:140px!important}.\!w-\[150px\]{width:150px!important}.\!w-full{width:100%!important}.w-0{width:0px}.w-1\.5{width:.375rem}.w-1\/2{width:50%}.w-1\/3{width:33.333333%}.w-1\/5{width:20%}.w-10{width:2.5rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-3\/4{width:75%}.w-32{width:8rem}.w-36{width:9rem}.w-4{width:1rem}.w-40{width:10rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-52{width:13rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-80{width:20rem}.w-9{width:2.25rem}.w-\[100px\]{width:100px}.w-\[101px\]{width:101px}.w-\[105px\]{width:105px}.w-\[110px\]{width:110px}.w-\[120px\]{width:120px}.w-\[125px\]{width:125px}.w-\[136px\]{width:136px}.w-\[140px\]{width:140px}.w-\[141px\]{width:141px}.w-\[150px\]{width:150px}.w-\[172px\]{width:172px}.w-\[200px\]{width:200px}.w-\[210px\]{width:210px}.w-\[250px\]{width:250px}.w-\[254px\]{width:254px}.w-\[264px\]{width:264px}.w-\[26px\]{width:26px}.w-\[280px\]{width:280px}.w-\[28px\]{width:28px}.w-\[33px\]{width:33px}.w-\[348px\]{width:348px}.w-\[350px\]{width:350px}.w-\[360px\]{width:360px}.w-\[378px\]{width:378px}.w-\[38px\]{width:38px}.w-\[39px\]{width:39px}.w-\[50px\]{width:50px}.w-\[525px\]{width:525px}.w-\[52px\]{width:52px}.w-\[550px\]{width:550px}.w-\[60px\]{width:60px}.w-\[62px\]{width:62px}.w-\[650px\]{width:650px}.w-\[66px\]{width:66px}.w-\[68px\]{width:68px}.w-\[70px\]{width:70px}.w-\[72px\]{width:72px}.w-\[75px\]{width:75px}.w-\[76px\]{width:76px}.w-\[80px\]{width:80px}.w-\[84px\]{width:84px}.w-\[926px\]{width:926px}.w-\[94px\]{width:94px}.w-\[calc\(100\%-62px\)\]{width:calc(100% - 62px)}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.\!min-w-40{min-width:10rem!important}.\!min-w-\[600px\]{min-width:600px!important}.min-w-0{min-width:0px}.min-w-24{min-width:6rem}.min-w-9{min-width:2.25rem}.min-w-\[110px\]{min-width:110px}.min-w-\[120px\]{min-width:120px}.min-w-\[140px\]{min-width:140px}.min-w-\[177px\]{min-width:177px}.min-w-\[210px\]{min-width:210px}.min-w-\[275px\]{min-width:275px}.min-w-\[300px\]{min-width:300px}.min-w-\[394px\]{min-width:394px}.min-w-\[800px\]{min-width:800px}.min-w-\[80px\]{min-width:80px}.max-w-9{max-width:2.25rem}.max-w-\[110px\]{max-width:110px}.max-w-\[120px\]{max-width:120px}.max-w-\[210px\]{max-width:210px}.max-w-\[250px\]{max-width:250px}.max-w-\[275px\]{max-width:275px}.max-w-\[360px\]{max-width:360px}.max-w-\[394px\]{max-width:394px}.max-w-\[400px\]{max-width:400px}.max-w-\[445px\]{max-width:445px}.max-w-\[525px\]{max-width:525px}.max-w-\[550px\]{max-width:550px}.max-w-\[745px\]{max-width:745px}.max-w-\[768px\]{max-width:768px}.max-w-\[950px\]{max-width:950px}.max-w-full{max-width:100%}.max-w-max{max-width:-moz-max-content;max-width:max-content}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.\!table-auto{table-layout:auto!important}.table-fixed{table-layout:fixed}.border-collapse{border-collapse:collapse}.origin-top{transform-origin:top}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2,.-translate-y-2\/4{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-4{--tw-translate-y: -1rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-full{--tw-translate-y: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-0{--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-4{--tw-translate-y: 1rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-full{--tw-translate-y: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-rotate-90{--tw-rotate: -90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-45{--tw-rotate: 45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-100{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-95{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.animate-\[on-fade_0\.5s_ease-in-out\]{animation:on-fade .5s ease-in-out}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.resize{resize:both}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid-cols-\[\.1fr_\.2fr_\.2fr_\.2fr_\.2fr_\.2fr\]{grid-template-columns:.1fr .2fr .2fr .2fr .2fr .2fr}.grid-cols-\[\.3fr_\.1fr_\.3fr_\.5fr\]{grid-template-columns:.3fr .1fr .3fr .5fr}.grid-cols-\[1fr_2fr\]{grid-template-columns:1fr 2fr}.grid-cols-\[2fr_1fr_1fr\]{grid-template-columns:2fr 1fr 1fr}.grid-cols-\[2fr_7fr_\.0\.3fr\]{grid-template-columns:2fr 7fr 0.3fr}.grid-cols-\[2fr_7fr_\.1fr\]{grid-template-columns:2fr 7fr .1fr}.grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-content-center{place-content:center}.place-content-start{place-content:start}.place-content-between{place-content:space-between}.place-items-start{place-items:start}.content-start{align-content:flex-start}.content-end{align-content:flex-end}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-items-end{justify-items:end}.justify-items-center{justify-items:center}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-10{gap:2.5rem}.gap-11{gap:2.75rem}.gap-16{gap:4rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-3\.5{gap:.875rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-\[100px\]{gap:100px}.gap-\[124px\]{gap:124px}.gap-x-1{-moz-column-gap:.25rem;column-gap:.25rem}.gap-x-1\.5{-moz-column-gap:.375rem;column-gap:.375rem}.gap-x-12{-moz-column-gap:3rem;column-gap:3rem}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-x-2\.5{-moz-column-gap:.625rem;column-gap:.625rem}.gap-x-3\.5{-moz-column-gap:.875rem;column-gap:.875rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-x-5{-moz-column-gap:1.25rem;column-gap:1.25rem}.gap-y-2\.5{row-gap:.625rem}.gap-y-6{row-gap:1.5rem}.gap-y-8{row-gap:2rem}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.25rem * var(--tw-space-x-reverse));margin-left:calc(.25rem * calc(1 - var(--tw-space-x-reverse)))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(243 244 246 / var(--tw-divide-opacity, 1))}.divide-slate-200>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(226 232 240 / var(--tw-divide-opacity, 1))}.place-self-start{place-self:start}.place-self-end{place-self:end}.self-start{align-self:flex-start}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.text-wrap{text-wrap:wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.\!rounded-lg{border-radius:.5rem!important}.\!rounded-none{border-radius:0!important}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-none{border-radius:0}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.\!rounded-l-none{border-top-left-radius:0!important;border-bottom-left-radius:0!important}.\!rounded-r-none{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.border{border-width:1px}.border-x-0{border-left-width:0px;border-right-width:0px}.border-y{border-top-width:1px;border-bottom-width:1px}.\!border-b-0{border-bottom-width:0px!important}.border-b{border-bottom-width:1px}.border-b-0{border-bottom-width:0px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-t{border-top-width:1px}.border-t-0{border-top-width:0px}.border-t-2{border-top-width:2px}.border-solid{border-style:solid}.border-dashed{border-style:dashed}.\!border-none{border-style:none!important}.\!border-red-600{--tw-border-opacity: 1 !important;border-color:rgb(220 38 38 / var(--tw-border-opacity, 1))!important}.border-blue-200{--tw-border-opacity: 1;border-color:rgb(191 219 254 / var(--tw-border-opacity, 1))}.border-blue-600{--tw-border-opacity: 1;border-color:rgb(37 99 235 / var(--tw-border-opacity, 1))}.border-brandColor{border-color:var(--brand-color)}.border-gray-100{--tw-border-opacity: 1;border-color:rgb(243 244 246 / var(--tw-border-opacity, 1))}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.border-gray-400{--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1))}.border-gray-500{--tw-border-opacity: 1;border-color:rgb(107 114 128 / var(--tw-border-opacity, 1))}.border-gray-800{--tw-border-opacity: 1;border-color:rgb(31 41 55 / var(--tw-border-opacity, 1))}.border-green-200{--tw-border-opacity: 1;border-color:rgb(187 247 208 / var(--tw-border-opacity, 1))}.border-orange-200{--tw-border-opacity: 1;border-color:rgb(254 215 170 / var(--tw-border-opacity, 1))}.border-red-200{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.border-red-500{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity, 1))}.border-slate-300{--tw-border-opacity: 1;border-color:rgb(203 213 225 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.border-b-gray-300{--tw-border-opacity: 1;border-bottom-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.border-l-brandColor{border-left-color:var(--brand-color)}.\!bg-green-500{--tw-bg-opacity: 1 !important;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))!important}.\!bg-red-500{--tw-bg-opacity: 1 !important;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))!important}.bg-\[\#63CFE5\]{--tw-bg-opacity: 1;background-color:rgb(99 207 229 / var(--tw-bg-opacity, 1))}.bg-\[\#8979FF\]{--tw-bg-opacity: 1;background-color:rgb(137 121 255 / var(--tw-bg-opacity, 1))}.bg-\[\#FFA8A1\]{--tw-bg-opacity: 1;background-color:rgb(255 168 161 / var(--tw-bg-opacity, 1))}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.bg-blue-200{--tw-bg-opacity: 1;background-color:rgb(191 219 254 / var(--tw-bg-opacity, 1))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-brandColor{background-color:var(--brand-color)}.bg-cyan-200{--tw-bg-opacity: 1;background-color:rgb(165 243 252 / var(--tw-bg-opacity, 1))}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-gray-200{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.bg-gray-300{--tw-bg-opacity: 1;background-color:rgb(209 213 219 / var(--tw-bg-opacity, 1))}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.bg-gray-500{--tw-bg-opacity: 1;background-color:rgb(107 114 128 / var(--tw-bg-opacity, 1))}.bg-gray-600{--tw-bg-opacity: 1;background-color:rgb(75 85 99 / var(--tw-bg-opacity, 1))}.bg-gray-800{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.bg-gray-900{--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.bg-gray-950{--tw-bg-opacity: 1;background-color:rgb(3 7 18 / var(--tw-bg-opacity, 1))}.bg-green-100{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.bg-green-200{--tw-bg-opacity: 1;background-color:rgb(187 247 208 / var(--tw-bg-opacity, 1))}.bg-green-50{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-green-600{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.bg-lime-200{--tw-bg-opacity: 1;background-color:rgb(217 249 157 / var(--tw-bg-opacity, 1))}.bg-neutral-100{--tw-bg-opacity: 1;background-color:rgb(245 245 245 / var(--tw-bg-opacity, 1))}.bg-orange-100{--tw-bg-opacity: 1;background-color:rgb(255 237 213 / var(--tw-bg-opacity, 1))}.bg-orange-200{--tw-bg-opacity: 1;background-color:rgb(254 215 170 / var(--tw-bg-opacity, 1))}.bg-orange-50{--tw-bg-opacity: 1;background-color:rgb(255 247 237 / var(--tw-bg-opacity, 1))}.bg-pink-200{--tw-bg-opacity: 1;background-color:rgb(251 207 232 / var(--tw-bg-opacity, 1))}.bg-pink-400{--tw-bg-opacity: 1;background-color:rgb(244 114 182 / var(--tw-bg-opacity, 1))}.bg-purple-100{--tw-bg-opacity: 1;background-color:rgb(243 232 255 / var(--tw-bg-opacity, 1))}.bg-red-100{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.bg-red-200{--tw-bg-opacity: 1;background-color:rgb(254 202 202 / var(--tw-bg-opacity, 1))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-rose-100{--tw-bg-opacity: 1;background-color:rgb(255 228 230 / var(--tw-bg-opacity, 1))}.bg-sky-100{--tw-bg-opacity: 1;background-color:rgb(224 242 254 / var(--tw-bg-opacity, 1))}.bg-sky-600{--tw-bg-opacity: 1;background-color:rgb(2 132 199 / var(--tw-bg-opacity, 1))}.bg-slate-100{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.bg-slate-200{--tw-bg-opacity: 1;background-color:rgb(226 232 240 / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-yellow-200{--tw-bg-opacity: 1;background-color:rgb(254 240 138 / var(--tw-bg-opacity, 1))}.bg-yellow-400{--tw-bg-opacity: 1;background-color:rgb(250 204 21 / var(--tw-bg-opacity, 1))}.bg-opacity-50{--tw-bg-opacity: .5}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-transparent{--tw-gradient-from: transparent var(--tw-gradient-from-position);--tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.via-gray-50{--tw-gradient-to: rgb(249 250 251 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), #f9fafb var(--tw-gradient-via-position), var(--tw-gradient-to)}.to-gray-100{--tw-gradient-to: #f3f4f6 var(--tw-gradient-to-position)}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.\!p-0{padding:0!important}.\!p-2{padding:.5rem!important}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-3\.5{padding:.875rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.\!px-0{padding-left:0!important;padding-right:0!important}.\!px-2{padding-left:.5rem!important;padding-right:.5rem!important}.\!px-4{padding-left:1rem!important;padding-right:1rem!important}.\!py-0{padding-top:0!important;padding-bottom:0!important}.\!py-\[22px\]{padding-top:22px!important;padding-bottom:22px!important}.px-1{padding-left:.25rem;padding-right:.25rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.px-12{padding-left:3rem;padding-right:3rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-\[11px\]{padding-top:11px;padding-bottom:11px}.py-\[7px\]{padding-top:7px;padding-bottom:7px}.py-\[9px\]{padding-top:9px;padding-bottom:9px}.py-px{padding-top:1px;padding-bottom:1px}.\!pb-0{padding-bottom:0!important}.\!pb-3{padding-bottom:.75rem!important}.pb-2\.5{padding-bottom:.625rem}.pb-3\.5{padding-bottom:.875rem}.pb-4{padding-bottom:1rem}.pb-6{padding-bottom:1.5rem}.pb-8{padding-bottom:2rem}.pb-\[9px\]{padding-bottom:9px}.pl-10{padding-left:2.5rem}.pl-2{padding-left:.5rem}.pl-2\.5{padding-left:.625rem}.pl-4{padding-left:1rem}.pl-7{padding-left:1.75rem}.pl-8{padding-left:2rem}.pl-\[2px\]{padding-left:2px}.pr-10{padding-right:2.5rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pr-6{padding-right:1.5rem}.pt-2{padding-top:.5rem}.pt-2\.5{padding-top:.625rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.pt-8{padding-top:2rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-end{text-align:end}.align-top{vertical-align:top}.align-text-bottom{vertical-align:text-bottom}.font-inter{font-family:Inter}.\!text-base{font-size:1rem!important;line-height:1.5rem!important}.\!text-sm{font-size:.875rem!important;line-height:1.25rem!important}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\[10px\]{font-size:10px}.text-\[26px\]{font-size:26px}.text-\[38px\]{font-size:38px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.\!font-bold{font-weight:700!important}.\!font-normal{font-weight:400!important}.\!font-semibold{font-weight:600!important}.font-bold{font-weight:700}.font-light{font-weight:300}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-8{line-height:2rem}.leading-\[140\%\]{line-height:140%}.leading-none{line-height:1}.leading-normal{line-height:1.5}.leading-snug{line-height:1.375}.\!text-brandColor{color:var(--brand-color)!important}.\!text-gray-500{--tw-text-opacity: 1 !important;color:rgb(107 114 128 / var(--tw-text-opacity, 1))!important}.\!text-gray-600{--tw-text-opacity: 1 !important;color:rgb(75 85 99 / var(--tw-text-opacity, 1))!important}.text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity, 1))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-blue-800{--tw-text-opacity: 1;color:rgb(30 64 175 / var(--tw-text-opacity, 1))}.text-blue-900{--tw-text-opacity: 1;color:rgb(30 58 138 / var(--tw-text-opacity, 1))}.text-brandColor{color:var(--brand-color)}.text-cyan-800{--tw-text-opacity: 1;color:rgb(21 94 117 / var(--tw-text-opacity, 1))}.text-cyan-900{--tw-text-opacity: 1;color:rgb(22 78 99 / var(--tw-text-opacity, 1))}.text-gray-200{--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity, 1))}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-green-800{--tw-text-opacity: 1;color:rgb(22 101 52 / var(--tw-text-opacity, 1))}.text-green-900{--tw-text-opacity: 1;color:rgb(20 83 45 / var(--tw-text-opacity, 1))}.text-lime-900{--tw-text-opacity: 1;color:rgb(54 83 20 / var(--tw-text-opacity, 1))}.text-orange-600{--tw-text-opacity: 1;color:rgb(234 88 12 / var(--tw-text-opacity, 1))}.text-orange-800{--tw-text-opacity: 1;color:rgb(154 52 18 / var(--tw-text-opacity, 1))}.text-orange-900{--tw-text-opacity: 1;color:rgb(124 45 18 / var(--tw-text-opacity, 1))}.text-pink-900{--tw-text-opacity: 1;color:rgb(131 24 67 / var(--tw-text-opacity, 1))}.text-purple-800{--tw-text-opacity: 1;color:rgb(107 33 168 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-red-800{--tw-text-opacity: 1;color:rgb(153 27 27 / var(--tw-text-opacity, 1))}.text-red-900{--tw-text-opacity: 1;color:rgb(127 29 29 / var(--tw-text-opacity, 1))}.text-rose-600{--tw-text-opacity: 1;color:rgb(225 29 72 / var(--tw-text-opacity, 1))}.text-sky-600{--tw-text-opacity: 1;color:rgb(2 132 199 / var(--tw-text-opacity, 1))}.text-slate-600{--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.text-slate-800{--tw-text-opacity: 1;color:rgb(30 41 59 / var(--tw-text-opacity, 1))}.text-slate-900{--tw-text-opacity: 1;color:rgb(15 23 42 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-900{--tw-text-opacity: 1;color:rgb(113 63 18 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.\!shadow-none{--tw-shadow: 0 0 #0000 !important;--tw-shadow-colored: 0 0 #0000 !important;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)!important}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_5px_20px_rgba\(0\,0\,0\,0\.15\)\]{--tw-shadow: 0 5px 20px rgba(0,0,0,.15);--tw-shadow-colored: 0 5px 20px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0px_0px_0px_0px_rgba\(0\,0\,0\,0\.10\)\,0px_1px_3px_0px_rgba\(0\,0\,0\,0\.10\)\,0px_5px_5px_0px_rgba\(0\,0\,0\,0\.09\)\,0px_12px_7px_0px_rgba\(0\,0\,0\,0\.05\)\,0px_22px_9px_0px_rgba\(0\,0\,0\,0\.01\)\,0px_34px_9px_0px_rgba\(0\,0\,0\,0\.00\)\]{--tw-shadow: 0px 0px 0px 0px rgba(0,0,0,.1),0px 1px 3px 0px rgba(0,0,0,.1),0px 5px 5px 0px rgba(0,0,0,.09),0px 12px 7px 0px rgba(0,0,0,.05),0px 22px 9px 0px rgba(0,0,0,.01),0px 34px 9px 0px rgba(0,0,0,0);--tw-shadow-colored: 0px 0px 0px 0px var(--tw-shadow-color), 0px 1px 3px 0px var(--tw-shadow-color), 0px 5px 5px 0px var(--tw-shadow-color), 0px 12px 7px 0px var(--tw-shadow-color), 0px 22px 9px 0px var(--tw-shadow-color), 0px 34px 9px 0px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0px_10px_20px_0px_\#0000001F\]{--tw-shadow: 0px 10px 20px 0px #0000001F;--tw-shadow-colored: 0px 10px 20px 0px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0px_10px_20px_0px_rgba\(0\,0\,0\,0\.12\)\]{--tw-shadow: 0px 10px 20px 0px rgba(0,0,0,.12);--tw-shadow-colored: 0px 10px 20px 0px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-100{transition-duration:.1s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-75{transition-duration:75ms}.ease-\[cubic-bezier\(\.4\,0\,\.2\,1\)\]{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}@font-face{font-family:icomoon;src:url(icomoon-BbY1GX-d.woff?w2trdd) format("woff");font-weight:400;font-style:normal;font-display:block}[class^=icon-],[class*=" icon-"]{font-family:icomoon!important;speak:never;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.tox .tox-toolbar__group:last-child button{padding:6px 8px;background:#eff6ff;color:#2563eb}.tox .tox-toolbar__group:last-child button:hover{background:#dbeafe}.tox .tox-toolbar__group:last-child button[aria-disabled=true]{cursor:not-allowed;opacity:.5}.tox .tox-toolbar__group:last-child button{background-color:transparent!important}.tox .tox-toolbar__group:last-child button:hover{border-width:0px;--tw-bg-opacity: 1 !important;background-color:rgb(51 137 236 / var(--tw-bg-opacity, 1))!important;--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1));--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.tox.tox-silver-sink.tox-tinymce-aux{z-index:99999}.peer:checked~.peer-checked\:icon-radio-selected:before{content:""}.peer:checked~.peer-checked\:icon-checkbox-multiple:before{content:""}.peer:checked~.peer-checked\:icon-checkbox-select:before{content:""}.dark\:shimmer:is(.dark *){animation-duration:2.2s;animation-fill-mode:forwards;animation-iteration-count:infinite;animation-name:skeleton;animation-timing-function:linear;background:linear-gradient(to right,#f6f6f6 8%,#f0f0f0 18%,#f6f6f6 33%);background-size:1250px 100%}.dark .dark\:shimmer:is(.dark *){background:linear-gradient(to right,#1f2937 8%,#1a2232 18%,#1f2937 33%)}.rtl\:icon-left-arrow:where([dir=rtl],[dir=rtl] *):before{content:""}.rtl\:icon-right-arrow:where([dir=rtl],[dir=rtl] *):before{content:""}.marker\:shadow *::marker{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.marker\:shadow::marker{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:-right-\[30px\]:after{content:var(--tw-content);right:-30px}.after\:top-0\.5:after{content:var(--tw-content);top:.125rem}.after\:h-4:after{content:var(--tw-content);height:1rem}.after\:w-4:after{content:var(--tw-content);width:1rem}.after\:rounded-full:after{content:var(--tw-content);border-radius:9999px}.after\:border:after{content:var(--tw-content);border-width:1px}.after\:border-gray-300:after{content:var(--tw-content);--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.after\:bg-green-500:after{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.after\:bg-red-500:after{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.after\:bg-white:after{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.after\:transition-all:after{content:var(--tw-content);transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.after\:content-\[\'\'\]:after{--tw-content: "";content:var(--tw-content)}.after\:content-\[\'\,_\'\]:after{--tw-content: ", ";content:var(--tw-content)}.after\:content-\[\'\/\'\]:after{--tw-content: "/";content:var(--tw-content)}.first\:rounded-l-lg:first-child{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.last\:\!mb-0:last-child{margin-bottom:0!important}.last\:mb-0:last-child{margin-bottom:0}.last\:cursor-default:last-child{cursor:default}.last\:border-b-0:last-child{border-bottom-width:0px}.last\:border-none:last-child{border-style:none}.after\:last\:hidden:last-child:after{content:var(--tw-content);display:none}.last\:after\:content-\[\'\'\]:last-child:after{--tw-content: "";content:var(--tw-content)}.focus-within\:border-gray-400:focus-within{--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1))}.hover\:rounded-lg:hover{border-radius:.5rem}.hover\:rounded-md:hover{border-radius:.375rem}.hover\:rounded-sm:hover{border-radius:.125rem}.hover\:border-blue-400:hover{--tw-border-opacity: 1;border-color:rgb(96 165 250 / var(--tw-border-opacity, 1))}.hover\:border-cyan-400:hover{--tw-border-opacity: 1;border-color:rgb(34 211 238 / var(--tw-border-opacity, 1))}.hover\:border-gray-400:hover{--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1))}.hover\:border-green-400:hover{--tw-border-opacity: 1;border-color:rgb(74 222 128 / var(--tw-border-opacity, 1))}.hover\:border-orange-400:hover{--tw-border-opacity: 1;border-color:rgb(251 146 60 / var(--tw-border-opacity, 1))}.hover\:border-red-600:hover{--tw-border-opacity: 1;border-color:rgb(220 38 38 / var(--tw-border-opacity, 1))}.hover\:bg-blue-100:hover{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.hover\:bg-brandColor:hover{background-color:var(--brand-color)}.hover\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-200:hover{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-50:hover{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.hover\:bg-green-200:hover{--tw-bg-opacity: 1;background-color:rgb(187 247 208 / var(--tw-bg-opacity, 1))}.hover\:bg-red-200:hover{--tw-bg-opacity: 1;background-color:rgb(254 202 202 / var(--tw-bg-opacity, 1))}.hover\:text-brandColor:hover{color:var(--brand-color)}.hover\:text-gray-800:hover{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.hover\:text-sky-600:hover{--tw-text-opacity: 1;color:rgb(2 132 199 / var(--tw-text-opacity, 1))}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-80:hover{opacity:.8}.focus\:border-gray-400:focus{--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1))}.focus\:opacity-80:focus{opacity:.8}.focus\:ring-black:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(0 0 0 / var(--tw-ring-opacity, 1))}.active\:border-gray-300:active{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.group\/item:hover .group-hover\/item\:visible,.group:hover .group-hover\:visible{visibility:visible}.group:hover .group-hover\:flex{display:flex}.group:hover .group-hover\:text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:opacity-100{opacity:1}.group\/container.sidebar-collapsed .group-\[\.sidebar-collapsed\]\/container\:hidden{display:none}.group\/container.sidebar-collapsed .group-\[\.sidebar-collapsed\]\/container\:w-\[70px\]{width:70px}.group\/container.sidebar-collapsed .group-\[\.sidebar-collapsed\]\/container\:overflow-visible{overflow:visible}.peer:checked~.peer-checked\:border-2{border-width:2px}.peer:checked~.peer-checked\:border-4{border-width:4px}.peer:checked~.peer-checked\:border-solid{border-style:solid}.peer:checked~.peer-checked\:border-brandColor{border-color:var(--brand-color)}.peer:checked~.peer-checked\:border-white{--tw-border-opacity: 1;border-color:rgb(255 255 255 / var(--tw-border-opacity, 1))}.peer:checked~.peer-checked\:bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.peer:checked~.peer-checked\:bg-brandColor{background-color:var(--brand-color)}.peer:checked~.peer-checked\:\!text-brandColor{color:var(--brand-color)!important}.peer:checked~.peer-checked\:text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.peer:checked~.peer-checked\:text-brandColor{color:var(--brand-color)}.peer:checked~.peer-checked\:after\:border-white:after{content:var(--tw-content);--tw-border-opacity: 1;border-color:rgb(255 255 255 / var(--tw-border-opacity, 1))}.peer:focus~.peer-focus\:outline-none{outline:2px solid transparent;outline-offset:2px}.peer:focus~.peer-focus\:ring-blue-300{--tw-ring-opacity: 1;--tw-ring-color: rgb(147 197 253 / var(--tw-ring-opacity, 1))}.dark\:divide-gray-700:is(.dark *)>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(55 65 81 / var(--tw-divide-opacity, 1))}.dark\:divide-gray-800:is(.dark *)>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(31 41 55 / var(--tw-divide-opacity, 1))}.dark\:border-gray-300:is(.dark *){--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.dark\:border-gray-400:is(.dark *){--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1))}.dark\:border-gray-600:is(.dark *){--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity, 1))}.dark\:border-gray-700:is(.dark *){--tw-border-opacity: 1;border-color:rgb(55 65 81 / var(--tw-border-opacity, 1))}.dark\:border-gray-800:is(.dark *){--tw-border-opacity: 1;border-color:rgb(31 41 55 / var(--tw-border-opacity, 1))}.dark\:border-gray-900:is(.dark *){--tw-border-opacity: 1;border-color:rgb(17 24 39 / var(--tw-border-opacity, 1))}.dark\:\!bg-gray-900:is(.dark *){--tw-bg-opacity: 1 !important;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))!important}.dark\:bg-brandColor:is(.dark *){background-color:var(--brand-color)}.dark\:bg-gray-400:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(156 163 175 / var(--tw-bg-opacity, 1))}.dark\:bg-gray-700:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.dark\:bg-gray-800:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.dark\:bg-gray-900:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.dark\:bg-gray-950:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(3 7 18 / var(--tw-bg-opacity, 1))}.dark\:bg-green-700:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(21 128 61 / var(--tw-bg-opacity, 1))}.dark\:bg-slate-950:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(2 6 23 / var(--tw-bg-opacity, 1))}.dark\:bg-white:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.dark\:via-gray-900:is(.dark *){--tw-gradient-to: rgb(17 24 39 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), #111827 var(--tw-gradient-via-position), var(--tw-gradient-to)}.dark\:to-gray-900:is(.dark *){--tw-gradient-to: #111827 var(--tw-gradient-to-position)}.dark\:\!text-blue-600:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(37 99 235 / var(--tw-text-opacity, 1))!important}.dark\:\!text-blue-800:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(30 64 175 / var(--tw-text-opacity, 1))!important}.dark\:\!text-cyan-800:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(21 94 117 / var(--tw-text-opacity, 1))!important}.dark\:\!text-cyan-900:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(22 78 99 / var(--tw-text-opacity, 1))!important}.dark\:\!text-gray-300:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(209 213 219 / var(--tw-text-opacity, 1))!important}.dark\:\!text-green-500:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(34 197 94 / var(--tw-text-opacity, 1))!important}.dark\:\!text-green-600:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(22 163 74 / var(--tw-text-opacity, 1))!important}.dark\:\!text-green-900:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(20 83 45 / var(--tw-text-opacity, 1))!important}.dark\:\!text-orange-600:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(234 88 12 / var(--tw-text-opacity, 1))!important}.dark\:\!text-orange-800:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(154 52 18 / var(--tw-text-opacity, 1))!important}.dark\:\!text-red-500:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(239 68 68 / var(--tw-text-opacity, 1))!important}.dark\:\!text-red-600:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(220 38 38 / var(--tw-text-opacity, 1))!important}.dark\:\!text-yellow-900:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(113 63 18 / var(--tw-text-opacity, 1))!important}.dark\:text-brandColor:is(.dark *){color:var(--brand-color)}.dark\:text-gray-100:is(.dark *){--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1))}.dark\:text-gray-300:is(.dark *){--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.dark\:text-gray-400:is(.dark *){--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.dark\:text-gray-600:is(.dark *){--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.dark\:text-gray-800:is(.dark *){--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.dark\:text-gray-900:is(.dark *){--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.dark\:text-white:is(.dark *){--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.dark\:mix-blend-exclusion:is(.dark *){mix-blend-mode:exclusion}.dark\:ring-offset-gray-800:is(.dark *){--tw-ring-offset-color: #1f2937}.dark\:invert:is(.dark *){--tw-invert: invert(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.dark\:file\:bg-gray-800:is(.dark *)::file-selector-button{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.dark\:file\:dark\:text-white:is(.dark *):is(.dark *)::file-selector-button{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.dark\:after\:border-white:is(.dark *):after{content:var(--tw-content);--tw-border-opacity: 1;border-color:rgb(255 255 255 / var(--tw-border-opacity, 1))}.dark\:after\:bg-white:is(.dark *):after{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.dark\:hover\:border-gray-400:hover:is(.dark *){--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1))}.dark\:hover\:bg-gray-800:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-gray-900:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-gray-950:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(3 7 18 / var(--tw-bg-opacity, 1))}.hover\:dark\:bg-gray-950:is(.dark *):hover{--tw-bg-opacity: 1;background-color:rgb(3 7 18 / var(--tw-bg-opacity, 1))}.dark\:hover\:text-white:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.dark\:focus\:border-gray-400:focus:is(.dark *){--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1))}.dark\:focus\:bg-gray-800:focus:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.peer:checked~.dark\:peer-checked\:bg-gray-950:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(3 7 18 / var(--tw-bg-opacity, 1))}@media not all and (min-width: 1240px){.max-xl\:w-full{width:100%}.max-xl\:flex-auto{flex:1 1 auto}.max-xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.max-xl\:flex-wrap{flex-wrap:wrap}.max-xl\:flex-wrap-reverse{flex-wrap:wrap-reverse}}@media not all and (min-width: 1024px){.max-lg\:mt-6{margin-top:1.5rem}.max-lg\:block{display:block}.max-lg\:hidden{display:none}.max-lg\:w-\[400px\]{width:400px}.max-lg\:min-w-full{min-width:100%}.max-lg\:max-w-full{max-width:100%}.max-lg\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.max-lg\:flex-wrap{flex-wrap:wrap}.max-lg\:gap-4{gap:1rem}.max-lg\:gap-y-4{row-gap:1rem}}@media not all and (min-width: 768px){.max-md\:hidden{display:none}.max-md\:w-\[90\%\]{width:90%}.max-md\:w-full{width:100%}.max-md\:max-w-full{max-width:100%}.max-md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.max-md\:flex-wrap{flex-wrap:wrap}.max-md\:\!justify-between{justify-content:space-between!important}.max-md\:justify-between{justify-content:space-between}.max-md\:p-4{padding:1rem}.max-md\:py-3{padding-top:.75rem;padding-bottom:.75rem}}@media not all and (min-width: 525px){.max-sm\:hidden{display:none}.max-sm\:\!w-\[calc\(100\%-24px\)\]{width:calc(100% - 24px)!important}.max-sm\:w-full{width:100%}.max-sm\:max-w-full{max-width:100%}.max-sm\:flex-1{flex:1 1 0%}.max-sm\:flex-auto{flex:1 1 auto}.max-sm\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.max-sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.max-sm\:flex-wrap{flex-wrap:wrap}.max-sm\:gap-2\.5{gap:.625rem}.max-sm\:place-self-center{place-self:center}.max-sm\:px-4{padding-left:1rem;padding-right:1rem}}@media (min-width: 525px){.sm\:absolute{position:absolute}.sm\:mt-0{margin-top:0}.sm\:hidden{display:none}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:p-0{padding:0}.sm\:px-4{padding-left:1rem;padding-right:1rem}.sm\:py-3{padding-top:.75rem;padding-bottom:.75rem}.sm\:text-right{text-align:right}.sm\:text-base{font-size:1rem;line-height:1.5rem}}@media (min-width: 768px){.md\:hidden{display:none}.md\:translate-y-0{--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.md\:scale-100{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.md\:scale-95{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.md\:flex-col{flex-direction:column}}@media (min-width: 1024px){.lg\:sticky{position:sticky}.lg\:top-\[73px\]{top:73px}.lg\:mt-6{margin-top:1.5rem}.lg\:hidden{display:none}}.ltr\:left-0:where([dir=ltr],[dir=ltr] *){left:0}.ltr\:left-3:where([dir=ltr],[dir=ltr] *){left:.75rem}.ltr\:left-4:where([dir=ltr],[dir=ltr] *){left:1rem}.ltr\:left-\[200px\]:where([dir=ltr],[dir=ltr] *){left:200px}.ltr\:right-0:where([dir=ltr],[dir=ltr] *){right:0}.ltr\:right-1\.5:where([dir=ltr],[dir=ltr] *){right:.375rem}.ltr\:right-2:where([dir=ltr],[dir=ltr] *){right:.5rem}.ltr\:right-3:where([dir=ltr],[dir=ltr] *){right:.75rem}.ltr\:right-4:where([dir=ltr],[dir=ltr] *){right:1rem}.ltr\:ml-1\.5:where([dir=ltr],[dir=ltr] *){margin-left:.375rem}.ltr\:ml-11:where([dir=ltr],[dir=ltr] *){margin-left:2.75rem}.ltr\:ml-2\.5:where([dir=ltr],[dir=ltr] *){margin-left:.625rem}.ltr\:mr-1:where([dir=ltr],[dir=ltr] *){margin-right:.25rem}.ltr\:mr-11:where([dir=ltr],[dir=ltr] *){margin-right:2.75rem}.ltr\:mr-5:where([dir=ltr],[dir=ltr] *){margin-right:1.25rem}.ltr\:mr-6:where([dir=ltr],[dir=ltr] *){margin-right:1.5rem}.ltr\:-translate-x-full:where([dir=ltr],[dir=ltr] *){--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.ltr\:translate-x-full:where([dir=ltr],[dir=ltr] *){--tw-translate-x: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.ltr\:translate-y-0:where([dir=ltr],[dir=ltr] *){--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.ltr\:translate-y-full:where([dir=ltr],[dir=ltr] *){--tw-translate-y: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.ltr\:rounded-l-md:where([dir=ltr],[dir=ltr] *){border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.ltr\:rounded-r-md:where([dir=ltr],[dir=ltr] *){border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.ltr\:border-r:where([dir=ltr],[dir=ltr] *){border-right-width:1px}.ltr\:\!pl-14:where([dir=ltr],[dir=ltr] *){padding-left:3.5rem!important}.ltr\:\!pl-5:where([dir=ltr],[dir=ltr] *){padding-left:1.25rem!important}.ltr\:pl-10:where([dir=ltr],[dir=ltr] *){padding-left:2.5rem}.ltr\:pl-2:where([dir=ltr],[dir=ltr] *){padding-left:.5rem}.ltr\:pl-2\.5:where([dir=ltr],[dir=ltr] *){padding-left:.625rem}.ltr\:pl-4:where([dir=ltr],[dir=ltr] *){padding-left:1rem}.ltr\:pr-1\.5:where([dir=ltr],[dir=ltr] *){padding-right:.375rem}.ltr\:pr-10:where([dir=ltr],[dir=ltr] *){padding-right:2.5rem}.ltr\:pr-14:where([dir=ltr],[dir=ltr] *){padding-right:3.5rem}.ltr\:pr-16:where([dir=ltr],[dir=ltr] *){padding-right:4rem}.ltr\:pr-20:where([dir=ltr],[dir=ltr] *){padding-right:5rem}.ltr\:pr-3:where([dir=ltr],[dir=ltr] *){padding-right:.75rem}.ltr\:pr-8:where([dir=ltr],[dir=ltr] *){padding-right:2rem}.ltr\:text-left:where([dir=ltr],[dir=ltr] *){text-align:left}.ltr\:text-right:where([dir=ltr],[dir=ltr] *){text-align:right}.after\:ltr\:left-0\.5:where([dir=ltr],[dir=ltr] *):after{content:var(--tw-content);left:.125rem}.ltr\:after\:bg-green-500:where([dir=ltr],[dir=ltr] *):after{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.ltr\:after\:bg-red-500:where([dir=ltr],[dir=ltr] *):after{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.ltr\:first\:rounded-l-lg:first-child:where([dir=ltr],[dir=ltr] *){border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.peer:checked~.peer-checked\:after\:ltr\:translate-x-full:where([dir=ltr],[dir=ltr] *):after{content:var(--tw-content);--tw-translate-x: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@media (min-width: 1024px){.ltr\:lg\:pl-\[85px\]:where([dir=ltr],[dir=ltr] *){padding-left:85px}}.rtl\:left-0:where([dir=rtl],[dir=rtl] *){left:0}.rtl\:left-1\.5:where([dir=rtl],[dir=rtl] *){left:.375rem}.rtl\:left-2:where([dir=rtl],[dir=rtl] *){left:.5rem}.rtl\:left-3:where([dir=rtl],[dir=rtl] *){left:.75rem}.rtl\:left-4:where([dir=rtl],[dir=rtl] *){left:1rem}.rtl\:right-0:where([dir=rtl],[dir=rtl] *){right:0}.rtl\:right-3:where([dir=rtl],[dir=rtl] *){right:.75rem}.rtl\:right-4:where([dir=rtl],[dir=rtl] *){right:1rem}.rtl\:right-\[199px\]:where([dir=rtl],[dir=rtl] *){right:199px}.rtl\:ml-1:where([dir=rtl],[dir=rtl] *){margin-left:.25rem}.rtl\:ml-11:where([dir=rtl],[dir=rtl] *){margin-left:2.75rem}.rtl\:ml-5:where([dir=rtl],[dir=rtl] *){margin-left:1.25rem}.rtl\:ml-6:where([dir=rtl],[dir=rtl] *){margin-left:1.5rem}.rtl\:mr-1\.5:where([dir=rtl],[dir=rtl] *){margin-right:.375rem}.rtl\:mr-11:where([dir=rtl],[dir=rtl] *){margin-right:2.75rem}.rtl\:mr-2\.5:where([dir=rtl],[dir=rtl] *){margin-right:.625rem}.rtl\:-translate-x-full:where([dir=rtl],[dir=rtl] *){--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\:-translate-y-0:where([dir=rtl],[dir=rtl] *){--tw-translate-y: -0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\:-translate-y-full:where([dir=rtl],[dir=rtl] *){--tw-translate-y: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\:translate-x-full:where([dir=rtl],[dir=rtl] *){--tw-translate-x: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\:rounded-l-md:where([dir=rtl],[dir=rtl] *){border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.rtl\:rounded-r-md:where([dir=rtl],[dir=rtl] *){border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.rtl\:border-x:where([dir=rtl],[dir=rtl] *){border-left-width:1px;border-right-width:1px}.rtl\:border-l:where([dir=rtl],[dir=rtl] *){border-left-width:1px}.rtl\:\!pr-14:where([dir=rtl],[dir=rtl] *){padding-right:3.5rem!important}.rtl\:\!pr-5:where([dir=rtl],[dir=rtl] *){padding-right:1.25rem!important}.rtl\:pl-1\.5:where([dir=rtl],[dir=rtl] *){padding-left:.375rem}.rtl\:pl-10:where([dir=rtl],[dir=rtl] *){padding-left:2.5rem}.rtl\:pl-14:where([dir=rtl],[dir=rtl] *){padding-left:3.5rem}.rtl\:pl-16:where([dir=rtl],[dir=rtl] *){padding-left:4rem}.rtl\:pl-20:where([dir=rtl],[dir=rtl] *){padding-left:5rem}.rtl\:pl-3:where([dir=rtl],[dir=rtl] *){padding-left:.75rem}.rtl\:pl-8:where([dir=rtl],[dir=rtl] *){padding-left:2rem}.rtl\:pr-10:where([dir=rtl],[dir=rtl] *){padding-right:2.5rem}.rtl\:pr-2:where([dir=rtl],[dir=rtl] *){padding-right:.5rem}.rtl\:pr-2\.5:where([dir=rtl],[dir=rtl] *){padding-right:.625rem}.rtl\:pr-4:where([dir=rtl],[dir=rtl] *){padding-right:1rem}.rtl\:text-left:where([dir=rtl],[dir=rtl] *){text-align:left}.rtl\:text-right:where([dir=rtl],[dir=rtl] *){text-align:right}.rtl\:before\:bg-green-500:where([dir=rtl],[dir=rtl] *):before{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.rtl\:before\:bg-red-500:where([dir=rtl],[dir=rtl] *):before{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.after\:rtl\:right-0\.5:where([dir=rtl],[dir=rtl] *):after{content:var(--tw-content);right:.125rem}.rtl\:first\:rounded-r-lg:first-child:where([dir=rtl],[dir=rtl] *){border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.peer:checked~.peer-checked\:after\:rtl\:-translate-x-full:where([dir=rtl],[dir=rtl] *):after{content:var(--tw-content);--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@media (min-width: 1024px){.rtl\:lg\:pr-\[85px\]:where([dir=rtl],[dir=rtl] *){padding-right:85px}}.\[\&\.active\>\.v-tree-item\]\:block.active>.v-tree-item{display:block}@media not all and (min-width: 1024px){.\[\&\>\*\>\*\:nth-child\(1\)\]\:max-lg\:\!flex-wrap>*>*:nth-child(1){flex-wrap:wrap!important}.\[\&\>\*\>\*\>\*\.toolbarRight\]\:max-lg\:w-full>*>*>*.toolbarRight{width:100%}.\[\&\>\*\>\*\>\*\.toolbarRight\]\:max-lg\:justify-between>*>*>*.toolbarRight{justify-content:space-between}}@media not all and (min-width: 768px){.\[\&\>\*\>\*\>\*\.toolbarRight\]\:max-md\:flex-wrap>*>*>*.toolbarRight{flex-wrap:wrap}.\[\&\>\*\>\*\>\*\.toolbarRight\]\:max-md\:gap-y-2>*>*>*.toolbarRight{row-gap:.5rem}}.\[\&\>\*\]\:after\:content-\[\'_\/_\'\]>*:after{--tw-content: " / ";content:var(--tw-content)}.\[\&\>\.v-tree-item\]\:hidden>.v-tree-item{display:none}.\[\&\>\.v-tree-item\]\:ltr\:pl-6:where([dir=ltr],[dir=ltr] *)>.v-tree-item{padding-left:1.5rem}.\[\&\>\.v-tree-item\]\:rtl\:pr-6:where([dir=rtl],[dir=rtl] *)>.v-tree-item{padding-right:1.5rem}.\[\&\>\:nth-child\(3\)\]\:\!m-0>:nth-child(3){margin:0!important}.\[\&\>\:nth-child\(3\)\]\:\!rounded-l-none>:nth-child(3){border-top-left-radius:0!important;border-bottom-left-radius:0!important}@media not all and (min-width: 525px){.\[\&\>\:nth-child\(3\)\]\:max-sm\:\!w-\[80\%\]>:nth-child(3){width:80%!important}}.\[\&\>div\:last-child\]\:border-b-0>div:last-child{border-bottom-width:0px}.ltr\:\[\&\>span\>i\]\:right-14>span>i:where([dir=ltr],[dir=ltr] *){right:3.5rem}.rtl\:\[\&\>span\>i\]\:left-14>span>i:where([dir=rtl],[dir=rtl] *){left:3.5rem} diff --git a/public/admin/build/assets/app-C2Wq9G4i.css b/public/admin/build/assets/app-C2Wq9G4i.css new file mode 100644 index 0000000..8414cd3 --- /dev/null +++ b/public/admin/build/assets/app-C2Wq9G4i.css @@ -0,0 +1 @@ +.flatpickr-calendar{background:transparent;opacity:0;display:none;text-align:center;visibility:hidden;padding:0;-webkit-animation:none;animation:none;direction:ltr;border:0;font-size:14px;line-height:24px;border-radius:5px;position:absolute;width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-touch-action:manipulation;touch-action:manipulation;background:#fff;-webkit-box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,.08);box-shadow:1px 0 #e6e6e6,-1px 0 #e6e6e6,0 1px #e6e6e6,0 -1px #e6e6e6,0 3px 13px #00000014}.flatpickr-calendar.open,.flatpickr-calendar.inline{opacity:1;max-height:640px;visibility:visible}.flatpickr-calendar.open{display:inline-block;z-index:99999}.flatpickr-calendar.animate.open{-webkit-animation:fpFadeInDown .3s cubic-bezier(.23,1,.32,1);animation:fpFadeInDown .3s cubic-bezier(.23,1,.32,1)}.flatpickr-calendar.inline{display:block;position:relative;top:2px}.flatpickr-calendar.static{position:absolute;top:calc(100% + 2px)}.flatpickr-calendar.static.open{z-index:999;display:block}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+1) .flatpickr-day.inRange:nth-child(7n+7){-webkit-box-shadow:none!important;box-shadow:none!important}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+2) .flatpickr-day.inRange:nth-child(7n+1){-webkit-box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-2px 0 #e6e6e6,5px 0 #e6e6e6}.flatpickr-calendar .hasWeeks .dayContainer,.flatpickr-calendar .hasTime .dayContainer{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.flatpickr-calendar .hasWeeks .dayContainer{border-left:0}.flatpickr-calendar.hasTime .flatpickr-time{height:40px;border-top:1px solid #e6e6e6}.flatpickr-calendar.noCalendar.hasTime .flatpickr-time{height:auto}.flatpickr-calendar:before,.flatpickr-calendar:after{position:absolute;display:block;pointer-events:none;border:solid transparent;content:"";height:0;width:0;left:22px}.flatpickr-calendar.rightMost:before,.flatpickr-calendar.arrowRight:before,.flatpickr-calendar.rightMost:after,.flatpickr-calendar.arrowRight:after{left:auto;right:22px}.flatpickr-calendar.arrowCenter:before,.flatpickr-calendar.arrowCenter:after{left:50%;right:50%}.flatpickr-calendar:before{border-width:5px;margin:0 -5px}.flatpickr-calendar:after{border-width:4px;margin:0 -4px}.flatpickr-calendar.arrowTop:before,.flatpickr-calendar.arrowTop:after{bottom:100%}.flatpickr-calendar.arrowTop:before{border-bottom-color:#e6e6e6}.flatpickr-calendar.arrowTop:after{border-bottom-color:#fff}.flatpickr-calendar.arrowBottom:before,.flatpickr-calendar.arrowBottom:after{top:100%}.flatpickr-calendar.arrowBottom:before{border-top-color:#e6e6e6}.flatpickr-calendar.arrowBottom:after{border-top-color:#fff}.flatpickr-calendar:focus{outline:0}.flatpickr-wrapper{position:relative;display:inline-block}.flatpickr-months{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-months .flatpickr-month{background:transparent;color:#000000e6;fill:#000000e6;height:34px;line-height:1;text-align:center;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.flatpickr-months .flatpickr-prev-month,.flatpickr-months .flatpickr-next-month{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;cursor:pointer;position:absolute;top:0;height:34px;padding:10px;z-index:3;color:#000000e6;fill:#000000e6}.flatpickr-months .flatpickr-prev-month.flatpickr-disabled,.flatpickr-months .flatpickr-next-month.flatpickr-disabled{display:none}.flatpickr-months .flatpickr-prev-month i,.flatpickr-months .flatpickr-next-month i{position:relative}.flatpickr-months .flatpickr-prev-month.flatpickr-prev-month,.flatpickr-months .flatpickr-next-month.flatpickr-prev-month{left:0}.flatpickr-months .flatpickr-prev-month.flatpickr-next-month,.flatpickr-months .flatpickr-next-month.flatpickr-next-month{right:0}.flatpickr-months .flatpickr-prev-month:hover,.flatpickr-months .flatpickr-next-month:hover{color:#959ea9}.flatpickr-months .flatpickr-prev-month:hover svg,.flatpickr-months .flatpickr-next-month:hover svg{fill:#f64747}.flatpickr-months .flatpickr-prev-month svg,.flatpickr-months .flatpickr-next-month svg{width:14px;height:14px}.flatpickr-months .flatpickr-prev-month svg path,.flatpickr-months .flatpickr-next-month svg path{-webkit-transition:fill .1s;transition:fill .1s;fill:inherit}.numInputWrapper{position:relative;height:auto}.numInputWrapper input,.numInputWrapper span{display:inline-block}.numInputWrapper input{width:100%}.numInputWrapper input::-ms-clear{display:none}.numInputWrapper input::-webkit-outer-spin-button,.numInputWrapper input::-webkit-inner-spin-button{margin:0;-webkit-appearance:none}.numInputWrapper span{position:absolute;right:0;width:14px;padding:0 4px 0 2px;height:50%;line-height:50%;opacity:0;cursor:pointer;border:1px solid rgba(57,57,57,.15);-webkit-box-sizing:border-box;box-sizing:border-box}.numInputWrapper span:hover{background:#0000001a}.numInputWrapper span:active{background:#0003}.numInputWrapper span:after{display:block;content:"";position:absolute}.numInputWrapper span.arrowUp{top:0;border-bottom:0}.numInputWrapper span.arrowUp:after{border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:4px solid rgba(57,57,57,.6);top:26%}.numInputWrapper span.arrowDown{top:50%}.numInputWrapper span.arrowDown:after{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(57,57,57,.6);top:40%}.numInputWrapper span svg{width:inherit;height:auto}.numInputWrapper span svg path{fill:#00000080}.numInputWrapper:hover{background:#0000000d}.numInputWrapper:hover span{opacity:1}.flatpickr-current-month{font-size:135%;line-height:inherit;font-weight:300;color:inherit;position:absolute;width:75%;left:12.5%;padding:7.48px 0 0;line-height:1;height:34px;display:inline-block;text-align:center;-webkit-transform:translate3d(0px,0px,0px);transform:translateZ(0)}.flatpickr-current-month span.cur-month{font-family:inherit;font-weight:700;color:inherit;display:inline-block;margin-left:.5ch;padding:0}.flatpickr-current-month span.cur-month:hover{background:#0000000d}.flatpickr-current-month .numInputWrapper{width:6ch;width:7ch�;display:inline-block}.flatpickr-current-month .numInputWrapper span.arrowUp:after{border-bottom-color:#000000e6}.flatpickr-current-month .numInputWrapper span.arrowDown:after{border-top-color:#000000e6}.flatpickr-current-month input.cur-year{background:transparent;-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;cursor:text;padding:0 0 0 .5ch;margin:0;display:inline-block;font-size:inherit;font-family:inherit;font-weight:300;line-height:inherit;height:auto;border:0;border-radius:0;vertical-align:initial;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-current-month input.cur-year:focus{outline:0}.flatpickr-current-month input.cur-year[disabled],.flatpickr-current-month input.cur-year[disabled]:hover{font-size:100%;color:#00000080;background:transparent;pointer-events:none}.flatpickr-current-month .flatpickr-monthDropdown-months{appearance:menulist;background:transparent;border:none;border-radius:0;box-sizing:border-box;color:inherit;cursor:pointer;font-size:inherit;font-family:inherit;font-weight:300;height:auto;line-height:inherit;margin:-1px 0 0;outline:none;padding:0 0 0 .5ch;position:relative;vertical-align:initial;-webkit-box-sizing:border-box;-webkit-appearance:menulist;-moz-appearance:menulist;width:auto}.flatpickr-current-month .flatpickr-monthDropdown-months:focus,.flatpickr-current-month .flatpickr-monthDropdown-months:active{outline:none}.flatpickr-current-month .flatpickr-monthDropdown-months:hover{background:#0000000d}.flatpickr-current-month .flatpickr-monthDropdown-months .flatpickr-monthDropdown-month{background-color:transparent;outline:none;padding:0}.flatpickr-weekdays{background:transparent;text-align:center;overflow:hidden;width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:28px}.flatpickr-weekdays .flatpickr-weekdaycontainer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}span.flatpickr-weekday{cursor:default;font-size:90%;background:transparent;color:#0000008a;line-height:1;margin:0;text-align:center;display:block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;font-weight:bolder}.dayContainer,.flatpickr-weeks{padding:1px 0 0}.flatpickr-days{position:relative;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;width:307.875px}.flatpickr-days:focus{outline:0}.dayContainer{padding:0;outline:0;text-align:left;width:307.875px;min-width:307.875px;max-width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;display:-ms-flexbox;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-wrap:wrap;-ms-flex-pack:justify;-webkit-justify-content:space-around;justify-content:space-around;-webkit-transform:translate3d(0px,0px,0px);transform:translateZ(0);opacity:1}.dayContainer+.dayContainer{-webkit-box-shadow:-1px 0 0 #e6e6e6;box-shadow:-1px 0 #e6e6e6}.flatpickr-day{background:none;border:1px solid transparent;border-radius:150px;-webkit-box-sizing:border-box;box-sizing:border-box;color:#393939;cursor:pointer;font-weight:400;width:14.2857143%;-webkit-flex-basis:14.2857143%;-ms-flex-preferred-size:14.2857143%;flex-basis:14.2857143%;max-width:39px;height:39px;line-height:39px;margin:0;display:inline-block;position:relative;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center}.flatpickr-day.inRange,.flatpickr-day.prevMonthDay.inRange,.flatpickr-day.nextMonthDay.inRange,.flatpickr-day.today.inRange,.flatpickr-day.prevMonthDay.today.inRange,.flatpickr-day.nextMonthDay.today.inRange,.flatpickr-day:hover,.flatpickr-day.prevMonthDay:hover,.flatpickr-day.nextMonthDay:hover,.flatpickr-day:focus,.flatpickr-day.prevMonthDay:focus,.flatpickr-day.nextMonthDay:focus{cursor:pointer;outline:0;background:#e6e6e6;border-color:#e6e6e6}.flatpickr-day.today{border-color:#959ea9}.flatpickr-day.today:hover,.flatpickr-day.today:focus{border-color:#959ea9;background:#959ea9;color:#fff}.flatpickr-day.selected,.flatpickr-day.startRange,.flatpickr-day.endRange,.flatpickr-day.selected.inRange,.flatpickr-day.startRange.inRange,.flatpickr-day.endRange.inRange,.flatpickr-day.selected:focus,.flatpickr-day.startRange:focus,.flatpickr-day.endRange:focus,.flatpickr-day.selected:hover,.flatpickr-day.startRange:hover,.flatpickr-day.endRange:hover,.flatpickr-day.selected.prevMonthDay,.flatpickr-day.startRange.prevMonthDay,.flatpickr-day.endRange.prevMonthDay,.flatpickr-day.selected.nextMonthDay,.flatpickr-day.startRange.nextMonthDay,.flatpickr-day.endRange.nextMonthDay{background:#569ff7;-webkit-box-shadow:none;box-shadow:none;color:#fff;border-color:#569ff7}.flatpickr-day.selected.startRange,.flatpickr-day.startRange.startRange,.flatpickr-day.endRange.startRange{border-radius:50px 0 0 50px}.flatpickr-day.selected.endRange,.flatpickr-day.startRange.endRange,.flatpickr-day.endRange.endRange{border-radius:0 50px 50px 0}.flatpickr-day.selected.startRange+.endRange:not(:nth-child(7n+1)),.flatpickr-day.startRange.startRange+.endRange:not(:nth-child(7n+1)),.flatpickr-day.endRange.startRange+.endRange:not(:nth-child(7n+1)){-webkit-box-shadow:-10px 0 0 #569ff7;box-shadow:-10px 0 #569ff7}.flatpickr-day.selected.startRange.endRange,.flatpickr-day.startRange.startRange.endRange,.flatpickr-day.endRange.startRange.endRange{border-radius:50px}.flatpickr-day.inRange{border-radius:0;-webkit-box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-5px 0 #e6e6e6,5px 0 #e6e6e6}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover,.flatpickr-day.prevMonthDay,.flatpickr-day.nextMonthDay,.flatpickr-day.notAllowed,.flatpickr-day.notAllowed.prevMonthDay,.flatpickr-day.notAllowed.nextMonthDay{color:#3939394d;background:transparent;border-color:transparent;cursor:default}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover{cursor:not-allowed;color:#3939391a}.flatpickr-day.week.selected{border-radius:0;-webkit-box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7;box-shadow:-5px 0 #569ff7,5px 0 #569ff7}.flatpickr-day.hidden{visibility:hidden}.rangeMode .flatpickr-day{margin-top:1px}.flatpickr-weekwrapper{float:left}.flatpickr-weekwrapper .flatpickr-weeks{padding:0 12px;-webkit-box-shadow:1px 0 0 #e6e6e6;box-shadow:1px 0 #e6e6e6}.flatpickr-weekwrapper .flatpickr-weekday{float:none;width:100%;line-height:28px}.flatpickr-weekwrapper span.flatpickr-day,.flatpickr-weekwrapper span.flatpickr-day:hover{display:block;width:100%;max-width:none;color:#3939394d;background:transparent;cursor:default;border:none}.flatpickr-innerContainer{display:block;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.flatpickr-rContainer{display:inline-block;padding:0;-webkit-box-sizing:border-box;box-sizing:border-box}.flatpickr-time{text-align:center;outline:0;display:block;height:0;line-height:40px;max-height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-time:after{content:"";display:table;clear:both}.flatpickr-time .numInputWrapper{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:40%;height:40px;float:left}.flatpickr-time .numInputWrapper span.arrowUp:after{border-bottom-color:#393939}.flatpickr-time .numInputWrapper span.arrowDown:after{border-top-color:#393939}.flatpickr-time.hasSeconds .numInputWrapper{width:26%}.flatpickr-time.time24hr .numInputWrapper{width:49%}.flatpickr-time input{background:transparent;-webkit-box-shadow:none;box-shadow:none;border:0;border-radius:0;text-align:center;margin:0;padding:0;height:inherit;line-height:inherit;color:#393939;font-size:14px;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-time input.flatpickr-hour{font-weight:700}.flatpickr-time input.flatpickr-minute,.flatpickr-time input.flatpickr-second{font-weight:400}.flatpickr-time input:focus{outline:0;border:0}.flatpickr-time .flatpickr-time-separator,.flatpickr-time .flatpickr-am-pm{height:inherit;float:left;line-height:inherit;color:#393939;font-weight:700;width:2%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.flatpickr-time .flatpickr-am-pm{outline:0;width:18%;cursor:pointer;text-align:center;font-weight:400}.flatpickr-time input:hover,.flatpickr-time .flatpickr-am-pm:hover,.flatpickr-time input:focus,.flatpickr-time .flatpickr-am-pm:focus{background:#eee}.flatpickr-input[readonly]{cursor:pointer}@-webkit-keyframes fpFadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translateZ(0)}}@keyframes fpFadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translateZ(0)}}.vuecal__weekdays-headings{border-bottom:1px solid #ddd;margin-bottom:-1px}.vuecal--week-numbers .vuecal__weekdays-headings,.vuecal--view-with-time .vuecal__weekdays-headings{padding-left:3em}.vuecal--view-with-time.vuecal--twelve-hour .vuecal__weekdays-headings{font-size:.9em;padding-left:4em}.vuecal--overflow-x.vuecal--view-with-time .vuecal__weekdays-headings{padding-left:0}.vuecal__heading{width:100%;height:2.8em;font-weight:400;justify-content:center;text-align:center;align-items:center;position:relative;overflow:hidden}.vuecal__heading>.vuecal__flex{width:100%;height:100%;align-items:initial!important}.vuecal--sticky-split-labels .vuecal__heading{height:3.4em}.vuecal--month-view .vuecal__heading,.vuecal--week-view .vuecal__heading,.vuecal--day-view .vuecal__heading{width:14.2857%}.vuecal--hide-weekends.vuecal--month-view .vuecal__heading,.vuecal--hide-weekends.vuecal--week-view .vuecal__heading,.vuecal--hide-weekends.vuecal--day-view .vuecal__heading,.vuecal--years-view .vuecal__heading{width:20%}.vuecal--year-view .vuecal__heading{width:33.33%}.vuecal__heading .weekday-label{flex-shrink:0;display:flex;justify-content:center;align-items:center}.vuecal--small .vuecal__heading .small,.vuecal--xsmall .vuecal__heading .xsmall{display:block}.vuecal__heading .small,.vuecal__heading .xsmall,.vuecal--small .vuecal__heading .full,.vuecal--small .vuecal__heading .xsmall,.vuecal--xsmall .vuecal__heading .full,.vuecal--xsmall .vuecal__heading .small{display:none}.vuecal .vuecal__split-days-headers{align-items:center}@media screen and (max-width: 550px){.vuecal__heading{line-height:1.2}.vuecal__heading .small,.vuecal--small .vuecal__heading .small,.vuecal--xsmall .vuecal__heading .xsmall{display:block}.vuecal__heading .full,.vuecal__heading .xsmall,.vuecal--small .vuecal__heading .full,.vuecal--small .vuecal__heading .xsmall,.vuecal--xsmall .vuecal__heading .full,.vuecal--xsmall .vuecal__heading .small{display:none}.vuecal--overflow-x .vuecal__heading .full,.vuecal--small.vuecal--overflow-x .vuecal__heading .small,.vuecal--xsmall.vuecal--overflow-x .vuecal__heading .xsmall{display:block}.vuecal--overflow-x .vuecal__heading .small,.vuecal--overflow-x .vuecal__heading .xsmall,.vuecal--small.vuecal--overflow-x .vuecal__heading .full,.vuecal--small.vuecal--overflow-x .vuecal__heading .xsmall,.vuecal--xsmall.vuecal--overflow-x .vuecal__heading .full,.vuecal--xsmall.vuecal--overflow-x .vuecal__heading .small{display:none}}@media screen and (max-width: 450px){.vuecal__heading .xsmall,.vuecal--small .vuecal__heading .xsmall,.vuecal--xsmall .vuecal__heading .xsmall{display:block}.vuecal__heading .full,.vuecal__heading .small,.vuecal--small .vuecal__heading .full,.vuecal--small .vuecal__heading .small,.vuecal--xsmall .vuecal__heading .full,.vuecal--xsmall .vuecal__heading .small{display:none}.vuecal--small.vuecal--overflow-x .vuecal__heading .small,.vuecal--xsmall.vuecal--overflow-x .vuecal__heading .xsmall{display:block}.vuecal--small.vuecal--overflow-x .vuecal__heading .full,.vuecal--small.vuecal--overflow-x .vuecal__heading .xsmall,.vuecal--xsmall.vuecal--overflow-x .vuecal__heading .full,.vuecal--xsmall.vuecal--overflow-x .vuecal__heading .small{display:none}}.vuecal__header button{outline:none;font-family:inherit}.vuecal__menu{padding:0;margin:0;list-style-type:none;justify-content:center;background-color:#00000005}.vuecal__view-btn{background:none;border:none;padding:.3em 1em;height:2.2em;font-size:1.3em;border-bottom:0 solid currentColor;cursor:pointer;color:inherit;box-sizing:border-box;transition:.2s}.vuecal__view-btn--active{border-bottom-width:2px;background:#ffffff26}.vuecal__title-bar{background-color:#0000001a;display:flex;align-items:center;text-align:center;justify-content:space-between;font-size:1.4em;line-height:1.3;min-height:2em}.vuecal--xsmall .vuecal__title-bar{font-size:1.3em}.vuecal__title{position:relative;justify-content:center}.vuecal__title button{cursor:pointer;background:none;border:none}.vuecal__title button.slide-fade--left-leave-active,.vuecal__title button.slide-fade--right-leave-active{width:100%}.vuecal__today-btn{position:relative;align-items:center;display:flex;font-size:.8em;background:none;border:none}.vuecal__today-btn span.default{font-size:.8em;padding:3px 6px;text-transform:uppercase;cursor:pointer}.vuecal__arrow{cursor:pointer;position:relative;z-index:1;background:none;border:none;white-space:nowrap}.vuecal__arrow--prev{margin-left:.6em}.vuecal__arrow--next{margin-right:.6em}.vuecal__arrow i.angle{display:inline-block;border:solid currentColor;border-width:0 2px 2px 0;padding:.25em;transform:rotate(-45deg)}.vuecal__arrow--prev i.angle{border-width:2px 0 0 2px}.vuecal__arrow--highlighted,.vuecal__today-btn--highlighted,.vuecal__view-btn--highlighted{position:relative;background-color:#0000000a}.vuecal__arrow--highlighted *,.vuecal__today-btn--highlighted *,.vuecal__view-btn--highlighted *{pointer-events:none}.vuecal__arrow--highlighted:before,.vuecal__arrow--highlighted:after,.vuecal__today-btn--highlighted:before,.vuecal__today-btn--highlighted:after,.vuecal__view-btn--highlighted:before,.vuecal__view-btn--highlighted:after{content:"";background-color:inherit;animation:sonar .8s infinite ease-out;position:absolute;top:50%;left:50%;pointer-events:none}.vuecal__arrow--highlighted:before,.vuecal__today-btn--highlighted:before,.vuecal__view-btn--highlighted:before{width:3em;height:3em;border-radius:3em;margin-top:-1.5em;margin-left:-1.5em}.vuecal__arrow--highlighted:after,.vuecal__today-btn--highlighted:after,.vuecal__view-btn--highlighted:after{animation-duration:1.5s;animation-delay:.1s;width:2.6em;height:2.6em;border-radius:2.6em;margin-top:-1.3em;margin-left:-1.3em}@keyframes sonar{0%,20%{opacity:1}to{transform:scale(2.5);opacity:0}}@media screen and (max-width: 450px){.vuecal__title{font-size:.9em}.vuecal__view-btn{padding-left:.6em;padding-right:.6em}}@media screen and (max-width: 350px){.vuecal__view-btn{font-size:1.1em}}.vuecal__event{color:#666;background-color:#f8f8f8cc;position:relative;box-sizing:border-box;left:0;width:100%;z-index:1;transition:box-shadow .3s,left .3s,width .3s;overflow:hidden}.vuecal--no-time .vuecal__event{min-height:8px}.vuecal:not(.vuecal--dragging-event) .vuecal__event:hover{z-index:2}.vuecal__cell .vuecal__event *{-webkit-user-select:text;-moz-user-select:text;user-select:text}.vuecal--view-with-time .vuecal__event:not(.vuecal__event--all-day){position:absolute}.vuecal--view-with-time .vuecal__bg .vuecal__event--all-day{position:absolute;top:0;bottom:0;z-index:0;opacity:.6;width:auto;right:0}.vuecal--view-with-time .vuecal__all-day .vuecal__event--all-day{position:relative;left:0}.vuecal__event--background{z-index:0}.vuecal__event--focus,.vuecal__event:focus{box-shadow:1px 1px 6px #0003;z-index:3;outline:none}.vuecal__event.vuecal__event--dragging{opacity:.7}.vuecal__event.vuecal__event--static{opacity:0;transition:opacity .1s}@-moz-document url-prefix(){.vuecal__event.vuecal__event--dragging{opacity:1}}.vuecal__event-resize-handle{position:absolute;bottom:0;left:0;right:0;height:1em;background-color:#ffffff4d;opacity:0;transform:translateY(110%);transition:.3s;cursor:ns-resize}.vuecal__event:hover .vuecal__event-resize-handle,.vuecal__event:focus .vuecal__event-resize-handle,.vuecal__event--focus .vuecal__event-resize-handle,.vuecal__event--resizing .vuecal__event-resize-handle{opacity:1;transform:translateY(0)}.vuecal__event--dragging .vuecal__event-resize-handle{display:none}.vuecal__event-delete{position:absolute;top:0;left:0;right:0;display:flex;flex-direction:column;align-items:center;justify-content:center;height:1.4em;line-height:1.4em;background-color:#dd3333d9;color:#fff;z-index:0;cursor:pointer;transform:translateY(-110%);transition:.3s}.vuecal__event .vuecal__event-delete{-webkit-user-select:none;-moz-user-select:none;user-select:none}.vuecal--full-height-delete .vuecal__event-delete{height:auto;bottom:0}.vuecal--full-height-delete .vuecal__event-delete:before{content:"";width:1.7em;height:1.8em;display:block;background-image:url('data:image/svg+xml;utf8,')}.vuecal__event--deletable .vuecal__event-delete{transform:translateY(0);z-index:1}.vuecal__event--deletable.vuecal__event--dragging .vuecal__event-delete{opacity:0;transition:none}.vuecal--month-view .vuecal__event-title{font-size:.85em}.vuecal--short-events .vuecal__event-title{text-align:left;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding:0 3px}.vuecal__event-title,.vuecal__event-content{-webkit-hyphens:auto;hyphens:auto}.vuecal__event-title--edit{border-bottom:1px solid transparent;text-align:center;transition:.3s;color:inherit;background-image:url('data:image/svg+xml;utf8,');background-repeat:no-repeat;background-position:120% .15em;background-size:.4em;outline:none;width:100%}.vuecal__event-title--edit:hover,.vuecal__event-title--edit:focus{border-color:#0006;background-position:99% .15em;background-size:1.2em}.vuecal__cell{position:relative;width:100%;display:flex;justify-content:center;align-items:center;text-align:center;transition:.15s ease-in-out background-color}.vuecal__cells.month-view .vuecal__cell,.vuecal__cells.week-view .vuecal__cell{width:14.2857%}.vuecal--hide-weekends .vuecal__cells.month-view .vuecal__cell,.vuecal--hide-weekends .vuecal__cells.week-view .vuecal__cell,.vuecal__cells.years-view .vuecal__cell{width:20%}.vuecal__cells.year-view .vuecal__cell{width:33.33%}.vuecal__cells.day-view .vuecal__cell{flex:1}.vuecal--overflow-x.vuecal--day-view .vuecal__cell{width:auto}.vuecal--click-to-navigate .vuecal__cell:not(.vuecal__cell--disabled){cursor:pointer}.vuecal--view-with-time .vuecal__cell,.vuecal--week-view.vuecal--no-time .vuecal__cell:not(.vuecal__cell--has-splits),.vuecal--day-view.vuecal--no-time .vuecal__cell:not(.vuecal__cell--has-splits){display:block}.vuecal__cell.vuecal__cell--has-splits{flex-direction:row;display:flex}.vuecal__cell:before{content:"";position:absolute;z-index:0;top:0;left:0;right:-1px;bottom:-1px;border:1px solid rgba(196,196,196,.25)}.vuecal--overflow-x.vuecal--day-view .vuecal__cell:before{bottom:0}.vuecal__cell--today,.vuecal__cell--current{background-color:#f0f0ff66;z-index:1}.vuecal__cell--selected{background-color:#ebfff566;z-index:2}.vuecal--day-view .vuecal__cell--selected{background:none}.vuecal__cell--out-of-scope{color:#00000040}.vuecal__cell--disabled{color:#00000040;cursor:not-allowed}.vuecal__cell--highlighted:not(.vuecal__cell--has-splits),.vuecal__cell-split.vuecal__cell-split--highlighted{background-color:#0000000a;transition-duration:5ms}.vuecal__cell-content{position:relative;width:100%;height:100%;outline:none}.vuecal--years-view .vuecal__cell-content,.vuecal--year-view .vuecal__cell-content,.vuecal--month-view .vuecal__cell-content{justify-content:center}.vuecal__cell .cell-time-labels{position:absolute;top:0;left:0;right:0;bottom:0;display:flex;flex-direction:column}.vuecal__cell .cell-time-label{flex-grow:1;font-size:.8em;opacity:.3;line-height:1.7}.vuecal__cell-split{display:flex;flex-grow:1;flex-direction:column;height:100%;position:relative;transition:.15s ease-in-out background-color}.vuecal__cell-events{width:100%}.vuecal__cell-events-count{position:absolute;left:50%;top:65%;transform:translate(-50%);min-width:12px;height:12px;line-height:12px;padding:0 3px;background:#999;color:#fff;border-radius:12px;font-size:10px;box-sizing:border-box}.vuecal__cell .vuecal__special-hours{position:absolute;left:0;right:0;box-sizing:border-box}.vuecal--overflow-x.vuecal--week-view .vuecal__cell,.vuecal__cell-split{overflow:hidden}.vuecal__no-event{padding-top:1em;color:#aaa;justify-self:flex-start;margin-bottom:auto}.vuecal__all-day .vuecal__no-event{display:none}.vuecal__now-line{position:absolute;left:0;width:100%;height:0;color:red;border-top:1px solid currentColor;opacity:.6;z-index:1}.vuecal__now-line:before{content:"";position:absolute;top:-6px;left:0;border:5px solid transparent;border-left-color:currentColor}.vuecal{height:100%;box-shadow:0 0 0 1px inset #00000014}.vuecal *{-webkit-user-select:none;-moz-user-select:none;user-select:none}.vuecal--has-touch *:not(.vuecal__event-title--edit){-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.vuecal .clickable{cursor:pointer}.vuecal--resizing-event,.vuecal--drag-creating-event{cursor:ns-resize}.vuecal--dragging-event{cursor:move;cursor:grabbing}.vuecal .dragging-helper{position:absolute;width:60px;height:40px;background:#8abee6cc;border:1px solid #61a9e0;z-index:10}.vuecal--xsmall{font-size:.9em}.vuecal__flex{display:flex;flex-direction:row}.vuecal__flex[column]{flex-direction:column;flex:1 1 auto}.vuecal__flex[grow]{flex:1 1 auto;width:100%}.vuecal__flex[wrap]{flex-wrap:wrap}.vuecal__split-days-headers.slide-fade--right-leave-active{display:none}.vuecal--week-numbers.vuecal--month-view .vuecal__split-days-headers{margin-left:3em}.vuecal--day-view:not(.vuecal--overflow-x) .vuecal__split-days-headers{margin-left:3em;height:2.2em}.vuecal--day-view.vuecal--twelve-hour:not(.vuecal--overflow-x) .vuecal__split-days-headers{margin-left:4em}.vuecal__split-days-headers .day-split-header{display:flex;flex-grow:1;flex-basis:0;justify-content:center;align-items:center;height:100%}.vuecal__split-days-headers .vuecal--day-view.vuecal--overflow-x.vuecal--sticky-split-labels .day-split-header{height:1.5em}.vuecal__body{position:relative;overflow:hidden}.vuecal__all-day{min-height:1.7em;margin-bottom:-1px;flex-shrink:0}.vuecal__all-day-text{width:3em;box-sizing:border-box;color:#999;padding-right:2px;display:flex;flex-shrink:0;align-items:center;justify-content:flex-end;border-bottom:1px solid #ddd;-webkit-hyphens:auto;hyphens:auto}.vuecal__all-day-text span{font-size:.85em;text-align:right;line-height:1.1}.vuecal--twelve-hour .vuecal__all-day>span{width:4em}.vuecal__bg{overflow:auto;overflow-x:hidden;-webkit-overflow-scrolling:touch;min-height:60px;position:relative;width:100%}.vuecal--no-time .vuecal__bg{display:flex;flex:1 1 auto;overflow:auto}.vuecal__week-numbers{width:3em;flex-shrink:0!important}.vuecal__week-numbers .vuecal__week-number-cell{opacity:.4;font-size:.9em;align-items:center;justify-items:center;justify-content:center}.vuecal__scrollbar-check{position:absolute;top:0;left:0;right:0;bottom:0;overflow:scroll;visibility:hidden;z-index:-1}.vuecal__scrollbar-check div{height:120%}.vuecal__time-column{width:3em;height:100%;flex-shrink:0}.vuecal--twelve-hour .vuecal__time-column{width:4em;font-size:.9em}.vuecal--overflow-x.vuecal--week-view .vuecal__time-column{margin-top:2.8em;box-shadow:0 1px 1px #0000004d}.vuecal--overflow-x.vuecal--week-view.vuecal--sticky-split-labels .vuecal__time-column{margin-top:3.4em}.vuecal--overflow-x.vuecal--day-view.vuecal--sticky-split-labels .vuecal__time-column{margin-top:1.5em}.vuecal__time-column .vuecal__time-cell{color:#999;text-align:right;padding-right:2px;font-size:.9em}.vuecal__time-column .vuecal__time-cell-line:before{content:"";position:absolute;left:0;right:0;border-top:1px solid rgba(196,196,196,.3)}.vuecal__cells{margin:0 1px 1px 0}.vuecal--overflow-x.vuecal--day-view .vuecal__cells{margin:0}.vuecal--events-on-month-view.vuecal--short-events .vuecal__cells{width:99.9%}.vuecal--overflow-x.vuecal--day-view .vuecal__cells,.vuecal--overflow-x.vuecal--week-view .vuecal__cells{flex-wrap:nowrap;overflow:auto}.slide-fade--left-enter-active,.slide-fade--left-leave-active,.slide-fade--right-enter-active,.slide-fade--right-leave-active{transition:.25s ease-out}.slide-fade--left-enter-from,.slide-fade--right-leave-to{transform:translate(-15px);opacity:0}.slide-fade--left-leave-to,.slide-fade--right-enter-from{transform:translate(15px);opacity:0}.slide-fade--left-leave-active,.slide-fade--right-leave-active{position:absolute!important;height:100%}.vuecal__title-bar .slide-fade--left-leave-active,.vuecal__title-bar .slide-fade--right-leave-active{left:0;right:0;height:auto}.vuecal__heading .slide-fade--left-leave-active,.vuecal__heading .slide-fade--right-leave-active{display:flex;align-items:center}.vuecal--green-theme .vuecal__menu,.vuecal--green-theme .vuecal__cell-events-count{background-color:#42b983;color:#fff}.vuecal--green-theme .vuecal__title-bar{background-color:#e4f5ef}.vuecal--green-theme .vuecal__cell--today,.vuecal--green-theme .vuecal__cell--current{background-color:#f0f0ff66}.vuecal--green-theme:not(.vuecal--day-view) .vuecal__cell--selected{background-color:#ebfff566}.vuecal--green-theme .vuecal__cell--selected:before{border-color:#42b98380}.vuecal--green-theme .vuecal__cell--highlighted:not(.vuecal__cell--has-splits),.vuecal--green-theme .vuecal__cell-split--highlighted{background-color:#c3ffe180}.vuecal--green-theme .vuecal__arrow--highlighted,.vuecal--green-theme .vuecal__today-btn--highlighted,.vuecal--green-theme .vuecal__view-btn--highlighted{background-color:#88ecbf40}.vuecal--blue-theme .vuecal__menu,.vuecal--blue-theme .vuecal__cell-events-count{background-color:#42a3b9cc;color:#fff}.vuecal--blue-theme .vuecal__title-bar{background-color:#00a5bc4d}.vuecal--blue-theme .vuecal__cell--today,.vuecal--blue-theme .vuecal__cell--current{background-color:#f0f0ff66}.vuecal--blue-theme:not(.vuecal--day-view) .vuecal__cell--selected{background-color:#ebfdff66}.vuecal--blue-theme .vuecal__cell--selected:before{border-color:#73bfcc80}.vuecal--blue-theme .vuecal__cell--highlighted:not(.vuecal__cell--has-splits),.vuecal--blue-theme .vuecal__cell-split--highlighted{background-color:#00a5bc0f}.vuecal--blue-theme .vuecal__arrow--highlighted,.vuecal--blue-theme .vuecal__today-btn--highlighted,.vuecal--blue-theme .vuecal__view-btn--highlighted{background-color:#42a3b933}.vuecal--rounded-theme .vuecal__weekdays-headings{border:none}.vuecal--rounded-theme .vuecal__cell,.vuecal--rounded-theme .vuecal__cell:before{background:none;border:none}.vuecal--rounded-theme .vuecal__cell--out-of-scope{opacity:.4}.vuecal--rounded-theme .vuecal__cell-content{width:30px;height:30px;flex-grow:0;border:1px solid transparent;border-radius:30px;color:#333}.vuecal--rounded-theme.vuecal--day-view .vuecal__cell-content{width:auto;background:none}.vuecal--rounded-theme.vuecal--year-view .vuecal__cell{width:33.33%}.vuecal--rounded-theme.vuecal--year-view .vuecal__cell-content{width:85px}.vuecal--rounded-theme.vuecal--years-view .vuecal__cell-content{width:52px}.vuecal--rounded-theme .vuecal__cell{background-color:transparent!important}.vuecal--rounded-theme.vuecal--green-theme:not(.vuecal--day-view) .vuecal__cell-content{background-color:#f1faf7}.vuecal--rounded-theme.vuecal--green-theme:not(.vuecal--day-view) .vuecal__cell--today .vuecal__cell-content{background-color:#42b983;color:#fff}.vuecal--rounded-theme.vuecal--green-theme .vuecal--day-view .vuecal__cell--today:before{background-color:#42b9830d}.vuecal--rounded-theme.vuecal--green-theme:not(.vuecal--day-view) .vuecal__cell--selected .vuecal__cell-content{border-color:#42b983}.vuecal--rounded-theme.vuecal--green-theme .vuecal__cell--highlighted:not(.vuecal__cell--has-splits),.vuecal--rounded-theme.vuecal--green-theme .vuecal__cell-split--highlighted{background-color:#c3ffe180}.vuecal--rounded-theme.vuecal--blue-theme:not(.vuecal--day-view) .vuecal__cell-content{background-color:#64b6ff33}.vuecal--rounded-theme.vuecal--blue-theme:not(.vuecal--day-view) .vuecal__cell--today .vuecal__cell-content{background-color:#8fb7e4;color:#fff}.vuecal--rounded-theme.vuecal--blue-theme .vuecal--day-view .vuecal__cell--today:before{background-color:#8fb7e41a}.vuecal--rounded-theme.vuecal--blue-theme:not(.vuecal--day-view) .vuecal__cell--selected .vuecal__cell-content{border-color:#61a9e0}.vuecal--rounded-theme.vuecal--blue-theme .vuecal__cell--highlighted:not(.vuecal__cell--has-splits),.vuecal--rounded-theme.vuecal--blue-theme .vuecal__cell-split--highlighted{background-color:#00a5bc0f}.vuecal--date-picker .vuecal__title-bar{font-size:1.2em}.vuecal--date-picker .vuecal__heading{height:2.2em;font-weight:500;opacity:.4}.vuecal--date-picker .vuecal__weekdays-headings{border:none}.vuecal--date-picker .vuecal__body{margin-left:1px}.vuecal--date-picker .vuecal__cell,.vuecal--date-picker .vuecal__cell:before{background:none;border:none}.vuecal--date-picker .vuecal__cell-content{height:26px;flex-grow:0;border:1px solid transparent;border-radius:25px;transition:background-color .2s cubic-bezier(.39,.58,.57,1)}.vuecal--date-picker.vuecal--years-view .vuecal__cell-content{flex:0;padding:0 4px;height:24px}.vuecal--date-picker.vuecal--year-view .vuecal__cell-content{flex:0;padding:0 15px}.vuecal--date-picker.vuecal--month-view .vuecal__cell-content{width:26px}.vuecal--date-picker:not(.vuecal--day-view) .vuecal__cell-content:hover{background-color:#0000001a}.vuecal--date-picker:not(.vuecal--day-view) .vuecal__cell--selected .vuecal__cell-content{background-color:#42b982;color:#fff}.vuecal--date-picker:not(.vuecal--day-view) .vuecal__cell--current .vuecal__cell-content,.vuecal--date-picker:not(.vuecal--day-view) .vuecal__cell--today .vuecal__cell-content{border-color:#42b982} diff --git a/public/admin/build/assets/app-Dz7u1TwN.js b/public/admin/build/assets/app-Dz7u1TwN.js new file mode 100644 index 0000000..6793a0b --- /dev/null +++ b/public/admin/build/assets/app-Dz7u1TwN.js @@ -0,0 +1,76 @@ +const WE="modulepreload",YE=function(e,t){return new URL(e,t).href},Bd={},Ue=function(t,n,r){let i=Promise.resolve();if(n&&n.length>0){const o=document.getElementsByTagName("link"),a=document.querySelector("meta[property=csp-nonce]"),l=(a==null?void 0:a.nonce)||(a==null?void 0:a.getAttribute("nonce"));i=Promise.allSettled(n.map(c=>{if(c=YE(c,r),c in Bd)return;Bd[c]=!0;const u=c.endsWith(".css"),f=u?'[rel="stylesheet"]':"";if(!!r)for(let p=o.length-1;p>=0;p--){const g=o[p];if(g.href===c&&(!u||g.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${c}"]${f}`))return;const m=document.createElement("link");if(m.rel=u?"stylesheet":WE,u||(m.as="script"),m.crossOrigin="",m.href=c,l&&m.setAttribute("nonce",l),document.head.appendChild(m),u)return new Promise((p,g)=>{m.addEventListener("load",p),m.addEventListener("error",()=>g(new Error(`Unable to preload CSS for ${c}`)))})}))}function s(o){const a=new Event("vite:preloadError",{cancelable:!0});if(a.payload=o,window.dispatchEvent(a),!a.defaultPrevented)throw o}return i.then(o=>{for(const a of o||[])a.status==="rejected"&&s(a.reason);return t().catch(s)})};/** +* @vue/shared v3.5.25 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function Wt(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const et={},wi=[],Bt=()=>{},Ei=()=>!1,ci=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Vl=e=>e.startsWith("onUpdate:"),Je=Object.assign,Bl=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},zE=Object.prototype.hasOwnProperty,ot=(e,t)=>zE.call(e,t),be=Array.isArray,Di=e=>Hi(e)==="[object Map]",ui=e=>Hi(e)==="[object Set]",Tu=e=>Hi(e)==="[object Date]",om=e=>Hi(e)==="[object RegExp]",Le=e=>typeof e=="function",Be=e=>typeof e=="string",En=e=>typeof e=="symbol",at=e=>e!==null&&typeof e=="object",jl=e=>(at(e)||Le(e))&&Le(e.then)&&Le(e.catch),mf=Object.prototype.toString,Hi=e=>mf.call(e),am=e=>Hi(e).slice(8,-1),Ro=e=>Hi(e)==="[object Object]",Po=e=>Be(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Pr=Wt(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),lm=Wt("bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo"),Hl=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},KE=/-\w/g,mt=Hl(e=>e.replace(KE,t=>t.slice(1).toUpperCase())),GE=/\B([A-Z])/g,on=Hl(e=>e.replace(GE,"-$1").toLowerCase()),fi=Hl(e=>e.charAt(0).toUpperCase()+e.slice(1)),Ci=Hl(e=>e?`on${fi(e)}`:""),rn=(e,t)=>!Object.is(e,t),Oi=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},Lo=e=>{const t=parseFloat(e);return isNaN(t)?e:t},po=e=>{const t=Be(e)?Number(e):NaN;return isNaN(t)?e:t};let jd;const ko=()=>jd||(jd=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{}),XE=/^[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*$/;function JE(e){return XE.test(e)?`__props.${e}`:`__props[${JSON.stringify(e)}]`}function cm(e,t){return e+JSON.stringify(t,(n,r)=>typeof r=="function"?r.toString():r)}const ZE={TEXT:1,1:"TEXT",CLASS:2,2:"CLASS",STYLE:4,4:"STYLE",PROPS:8,8:"PROPS",FULL_PROPS:16,16:"FULL_PROPS",NEED_HYDRATION:32,32:"NEED_HYDRATION",STABLE_FRAGMENT:64,64:"STABLE_FRAGMENT",KEYED_FRAGMENT:128,128:"KEYED_FRAGMENT",UNKEYED_FRAGMENT:256,256:"UNKEYED_FRAGMENT",NEED_PATCH:512,512:"NEED_PATCH",DYNAMIC_SLOTS:1024,1024:"DYNAMIC_SLOTS",DEV_ROOT_FRAGMENT:2048,2048:"DEV_ROOT_FRAGMENT",CACHED:-1,"-1":"CACHED",BAIL:-2,"-2":"BAIL"},QE={1:"TEXT",2:"CLASS",4:"STYLE",8:"PROPS",16:"FULL_PROPS",32:"NEED_HYDRATION",64:"STABLE_FRAGMENT",128:"KEYED_FRAGMENT",256:"UNKEYED_FRAGMENT",512:"NEED_PATCH",1024:"DYNAMIC_SLOTS",2048:"DEV_ROOT_FRAGMENT",[-1]:"CACHED",[-2]:"BAIL"},qE={ELEMENT:1,1:"ELEMENT",FUNCTIONAL_COMPONENT:2,2:"FUNCTIONAL_COMPONENT",STATEFUL_COMPONENT:4,4:"STATEFUL_COMPONENT",TEXT_CHILDREN:8,8:"TEXT_CHILDREN",ARRAY_CHILDREN:16,16:"ARRAY_CHILDREN",SLOTS_CHILDREN:32,32:"SLOTS_CHILDREN",TELEPORT:64,64:"TELEPORT",SUSPENSE:128,128:"SUSPENSE",COMPONENT_SHOULD_KEEP_ALIVE:256,256:"COMPONENT_SHOULD_KEEP_ALIVE",COMPONENT_KEPT_ALIVE:512,512:"COMPONENT_KEPT_ALIVE",COMPONENT:6,6:"COMPONENT"},eb={STABLE:1,1:"STABLE",DYNAMIC:2,2:"DYNAMIC",FORWARDED:3,3:"FORWARDED"},tb={1:"STABLE",2:"DYNAMIC",3:"FORWARDED"},nb="Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error,Symbol",vf=Wt(nb),rb=vf,Hd=2;function um(e,t=0,n=e.length){if(t=Math.max(0,Math.min(t,e.length)),n=Math.max(0,Math.min(n,e.length)),t>n)return"";let r=e.split(/(\r?\n)/);const i=r.filter((a,l)=>l%2===1);r=r.filter((a,l)=>l%2===0);let s=0;const o=[];for(let a=0;a=t){for(let l=a-Hd;l<=a+Hd||n>s;l++){if(l<0||l>=r.length)continue;const c=l+1;o.push(`${c}${" ".repeat(Math.max(3-String(c).length,0))}| ${r[l]}`);const u=r[l].length,f=i[l]&&i[l].length||0;if(l===a){const d=t-(s-(u+f)),m=Math.max(1,n>s?u-d:n-t);o.push(" | "+" ".repeat(d)+"^".repeat(m))}else if(l>a){if(n>s){const d=Math.max(Math.min(n-s,u),1);o.push(" | "+"^".repeat(d))}s+=u+f}}break}return o.join(` +`)}function ws(e){if(be(e)){const t={};for(let n=0;n{if(n){const r=n.split(sb);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function ab(e){if(!e)return"";if(Be(e))return e;let t="";for(const n in e){const r=e[n];if(Be(r)||typeof r=="number"){const i=n.startsWith("--")?n:on(n);t+=`${i}:${r};`}}return t}function Ds(e){let t="";if(Be(e))t=e;else if(be(e))for(let n=0;n/="'\u0009\u000a\u000c\u0020]/,Rc={};function pb(e){if(Rc.hasOwnProperty(e))return Rc[e];const t=hb.test(e);return t&&console.error(`unsafe attribute name: ${e}`),Rc[e]=!t}const mb={acceptCharset:"accept-charset",className:"class",htmlFor:"for",httpEquiv:"http-equiv"},gb=Wt("accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,inert,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap"),vb=Wt("xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xmlns:xlink,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan"),yb=Wt("accent,accentunder,actiontype,align,alignmentscope,altimg,altimg-height,altimg-valign,altimg-width,alttext,bevelled,close,columnsalign,columnlines,columnspan,denomalign,depth,dir,display,displaystyle,encoding,equalcolumns,equalrows,fence,fontstyle,fontweight,form,frame,framespacing,groupalign,height,href,id,indentalign,indentalignfirst,indentalignlast,indentshift,indentshiftfirst,indentshiftlast,indextype,justify,largetop,largeop,lquote,lspace,mathbackground,mathcolor,mathsize,mathvariant,maxsize,minlabelspacing,mode,other,overflow,position,rowalign,rowlines,rowspan,rquote,rspace,scriptlevel,scriptminsize,scriptsizemultiplier,selection,separator,separators,shift,side,src,stackalign,stretchy,subscriptshift,superscriptshift,symmetric,voffset,width,widths,xlink:href,xlink:show,xlink:type,xmlns");function Eb(e){if(e==null)return!1;const t=typeof e;return t==="string"||t==="number"||t==="boolean"}const bb=/["'&<>]/;function Sb(e){const t=""+e,n=bb.exec(t);if(!n)return t;let r="",i,s,o=0;for(s=n.index;s||--!>|?@[\\\]^`{|}~]/g;function Db(e,t){return e.replace(ym,n=>t?n==='"'?'\\\\\\"':`\\\\${n}`:`\\${n}`)}function Cb(e,t){if(e.length!==t.length)return!1;let n=!0;for(let r=0;n&&rBr(n,t))}const Em=e=>!!(e&&e.__v_isRef===!0),bf=e=>Be(e)?e:e==null?"":be(e)||at(e)&&(e.toString===mf||!Le(e.toString))?Em(e)?bf(e.value):JSON.stringify(e,bm,2):String(e),bm=(e,t)=>Em(t)?bm(e,t.value):Di(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,i],s)=>(n[Pc(r,s)+" =>"]=i,n),{})}:ui(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>Pc(n))}:En(t)?Pc(t):at(t)&&!be(t)&&!Ro(t)?String(t):t,Pc=(e,t="")=>{var n;return En(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};function Sm(e){return e==null?"initial":typeof e=="string"?e===""?" ":e:String(e)}const Ob=Object.freeze(Object.defineProperty({__proto__:null,EMPTY_ARR:wi,EMPTY_OBJ:et,NO:Ei,NOOP:Bt,PatchFlagNames:QE,PatchFlags:ZE,ShapeFlags:qE,SlotFlags:eb,camelize:mt,capitalize:fi,cssVarNameEscapeSymbolsRE:ym,def:gf,escapeHtml:Sb,escapeHtmlComment:wb,extend:Je,genCacheKey:cm,genPropsAccessExp:JE,generateCodeFrame:um,getEscapedCssVarName:Db,getGlobalThis:ko,hasChanged:rn,hasOwn:ot,hyphenate:on,includeBooleanAttr:Ef,invokeArrayFns:Oi,isArray:be,isBooleanAttr:db,isBuiltInDirective:lm,isDate:Tu,isFunction:Le,isGloballyAllowed:vf,isGloballyWhitelisted:rb,isHTMLTag:dm,isIntegerKey:Po,isKnownHtmlAttr:gb,isKnownMathMLAttr:yb,isKnownSvgAttr:vb,isMap:Di,isMathMLTag:pm,isModelListener:Vl,isObject:at,isOn:ci,isPlainObject:Ro,isPromise:jl,isRegExp:om,isRenderableAttrValue:Eb,isReservedProp:Pr,isSSRSafeAttrName:pb,isSVGTag:hm,isSet:ui,isSpecialBooleanAttr:vm,isString:Be,isSymbol:En,isVoidTag:mm,looseEqual:Br,looseIndexOf:Fo,looseToNumber:Lo,makeMap:Wt,normalizeClass:Ds,normalizeCssVarValue:Sm,normalizeProps:fm,normalizeStyle:ws,objectToString:mf,parseStringStyle:yf,propsToAttrMap:mb,remove:Bl,slotFlagsText:tb,stringifyStyle:ab,toDisplayString:bf,toHandlerKey:Ci,toNumber:po,toRawType:am,toTypeString:Hi},Symbol.toStringTag,{value:"Module"}));/** +* @vue/reactivity v3.5.25 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let en;class Sf{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=en,!t&&en&&(this.index=(en.scopes||(en.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0&&--this._on===0&&(en=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let n,r;for(n=0,r=this.effects.length;n0)return;if(eo){let t=eo;for(eo=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;qs;){let t=qs;for(qs=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(r){e||(e=r)}t=n}}if(e)throw e}function Cm(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Om(e){let t,n=e.depsTail,r=n;for(;r;){const i=r.prevDep;r.version===-1?(r===n&&(n=i),Df(r),Mb(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=i}e.deps=t,e.depsTail=n}function wu(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Am(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Am(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===go)||(e.globalVersion=go,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!wu(e))))return;e.flags|=2;const t=e.dep,n=pt,r=ar;pt=e,ar=!0;try{Cm(e);const i=e.fn(e._value);(t.version===0||rn(i,e._value))&&(e.flags|=128,e._value=i,t.version++)}catch(i){throw t.version++,i}finally{pt=n,ar=r,Om(e),e.flags&=-3}}function Df(e,t=!1){const{dep:n,prevSub:r,nextSub:i}=e;if(r&&(r.nextSub=i,e.prevSub=void 0),i&&(i.prevSub=r,e.nextSub=void 0),n.subs===e&&(n.subs=r,!r&&n.computed)){n.computed.flags&=-5;for(let s=n.computed.deps;s;s=s.nextDep)Df(s,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function Mb(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}function xb(e,t){e.effect instanceof mo&&(e=e.effect.fn);const n=new mo(e);t&&Je(n,t);try{n.run()}catch(i){throw n.stop(),i}const r=n.run.bind(n);return r.effect=n,r}function Nb(e){e.effect.stop()}let ar=!0;const _m=[];function jr(){_m.push(ar),ar=!1}function Hr(){const e=_m.pop();ar=e===void 0?!0:e}function Ud(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=pt;pt=void 0;try{t()}finally{pt=n}}}let go=0;class Ib{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Ul{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!pt||!ar||pt===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==pt)n=this.activeLink=new Ib(pt,this),pt.deps?(n.prevDep=pt.depsTail,pt.depsTail.nextDep=n,pt.depsTail=n):pt.deps=pt.depsTail=n,Mm(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const r=n.nextDep;r.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=r),n.prevDep=pt.depsTail,n.nextDep=void 0,pt.depsTail.nextDep=n,pt.depsTail=n,pt.deps===n&&(pt.deps=r)}return n}trigger(t){this.version++,go++,this.notify(t)}notify(t){Tf();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{wf()}}}function Mm(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let r=t.deps;r;r=r.nextDep)Mm(r)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const il=new WeakMap,Ai=Symbol(""),Du=Symbol(""),vo=Symbol("");function sn(e,t,n){if(ar&&pt){let r=il.get(e);r||il.set(e,r=new Map);let i=r.get(n);i||(r.set(n,i=new Ul),i.map=r,i.key=n),i.track()}}function xr(e,t,n,r,i,s){const o=il.get(e);if(!o){go++;return}const a=l=>{l&&l.trigger()};if(Tf(),t==="clear")o.forEach(a);else{const l=be(e),c=l&&Po(n);if(l&&n==="length"){const u=Number(r);o.forEach((f,d)=>{(d==="length"||d===vo||!En(d)&&d>=u)&&a(f)})}else switch((n!==void 0||o.has(void 0))&&a(o.get(n)),c&&a(o.get(vo)),t){case"add":l?c&&a(o.get("length")):(a(o.get(Ai)),Di(e)&&a(o.get(Du)));break;case"delete":l||(a(o.get(Ai)),Di(e)&&a(o.get(Du)));break;case"set":Di(e)&&a(o.get(Ai));break}}wf()}function Rb(e,t){const n=il.get(e);return n&&n.get(t)}function Yi(e){const t=it(e);return t===e?t:(sn(t,"iterate",vo),Nn(e)?t:t.map(lr))}function $l(e){return sn(e=it(e),"iterate",vo),e}function Xr(e,t){return vr(e)?Lr(e)?us(lr(t)):us(t):lr(t)}const Pb={__proto__:null,[Symbol.iterator](){return kc(this,Symbol.iterator,e=>Xr(this,e))},concat(...e){return Yi(this).concat(...e.map(t=>be(t)?Yi(t):t))},entries(){return kc(this,"entries",e=>(e[1]=Xr(this,e[1]),e))},every(e,t){return wr(this,"every",e,t,void 0,arguments)},filter(e,t){return wr(this,"filter",e,t,n=>n.map(r=>Xr(this,r)),arguments)},find(e,t){return wr(this,"find",e,t,n=>Xr(this,n),arguments)},findIndex(e,t){return wr(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return wr(this,"findLast",e,t,n=>Xr(this,n),arguments)},findLastIndex(e,t){return wr(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return wr(this,"forEach",e,t,void 0,arguments)},includes(...e){return Fc(this,"includes",e)},indexOf(...e){return Fc(this,"indexOf",e)},join(e){return Yi(this).join(e)},lastIndexOf(...e){return Fc(this,"lastIndexOf",e)},map(e,t){return wr(this,"map",e,t,void 0,arguments)},pop(){return Ns(this,"pop")},push(...e){return Ns(this,"push",e)},reduce(e,...t){return $d(this,"reduce",e,t)},reduceRight(e,...t){return $d(this,"reduceRight",e,t)},shift(){return Ns(this,"shift")},some(e,t){return wr(this,"some",e,t,void 0,arguments)},splice(...e){return Ns(this,"splice",e)},toReversed(){return Yi(this).toReversed()},toSorted(e){return Yi(this).toSorted(e)},toSpliced(...e){return Yi(this).toSpliced(...e)},unshift(...e){return Ns(this,"unshift",e)},values(){return kc(this,"values",e=>Xr(this,e))}};function kc(e,t,n){const r=$l(e),i=r[t]();return r!==e&&!Nn(e)&&(i._next=i.next,i.next=()=>{const s=i._next();return s.done||(s.value=n(s.value)),s}),i}const Lb=Array.prototype;function wr(e,t,n,r,i,s){const o=$l(e),a=o!==e&&!Nn(e),l=o[t];if(l!==Lb[t]){const f=l.apply(e,s);return a?lr(f):f}let c=n;o!==e&&(a?c=function(f,d){return n.call(this,Xr(e,f),d,e)}:n.length>2&&(c=function(f,d){return n.call(this,f,d,e)}));const u=l.call(o,c,r);return a&&i?i(u):u}function $d(e,t,n,r){const i=$l(e);let s=n;return i!==e&&(Nn(e)?n.length>3&&(s=function(o,a,l){return n.call(this,o,a,l,e)}):s=function(o,a,l){return n.call(this,o,Xr(e,a),l,e)}),i[t](s,...r)}function Fc(e,t,n){const r=it(e);sn(r,"iterate",vo);const i=r[t](...n);return(i===-1||i===!1)&&Vo(n[0])?(n[0]=it(n[0]),r[t](...n)):i}function Ns(e,t,n=[]){jr(),Tf();const r=it(e)[t].apply(e,n);return wf(),Hr(),r}const kb=Wt("__proto__,__v_isRef,__isVue"),xm=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(En));function Fb(e){En(e)||(e=String(e));const t=it(this);return sn(t,"has",e),t.hasOwnProperty(e)}class Nm{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,r){if(n==="__v_skip")return t.__v_skip;const i=this._isReadonly,s=this._isShallow;if(n==="__v_isReactive")return!i;if(n==="__v_isReadonly")return i;if(n==="__v_isShallow")return s;if(n==="__v_raw")return r===(i?s?Fm:km:s?Lm:Pm).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(r)?t:void 0;const o=be(t);if(!i){let l;if(o&&(l=Pb[n]))return l;if(n==="hasOwnProperty")return Fb}const a=Reflect.get(t,n,jt(t)?t:r);if((En(n)?xm.has(n):kb(n))||(i||sn(t,"get",n),s))return a;if(jt(a)){const l=o&&Po(n)?a:a.value;return i&&at(l)?sl(l):l}return at(a)?i?sl(a):Yl(a):a}}class Im extends Nm{constructor(t=!1){super(!1,t)}set(t,n,r,i){let s=t[n];const o=be(t)&&Po(n);if(!this._isShallow){const c=vr(s);if(!Nn(r)&&!vr(r)&&(s=it(s),r=it(r)),!o&&jt(s)&&!jt(r))return c||(s.value=r),!0}const a=o?Number(n)e,oa=e=>Reflect.getPrototypeOf(e);function Ub(e,t,n){return function(...r){const i=this.__v_raw,s=it(i),o=Di(s),a=e==="entries"||e===Symbol.iterator&&o,l=e==="keys"&&o,c=i[e](...r),u=n?Cu:t?us:lr;return!t&&sn(s,"iterate",l?Du:Ai),{next(){const{value:f,done:d}=c.next();return d?{value:f,done:d}:{value:a?[u(f[0]),u(f[1])]:u(f),done:d}},[Symbol.iterator](){return this}}}}function aa(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function $b(e,t){const n={get(i){const s=this.__v_raw,o=it(s),a=it(i);e||(rn(i,a)&&sn(o,"get",i),sn(o,"get",a));const{has:l}=oa(o),c=t?Cu:e?us:lr;if(l.call(o,i))return c(s.get(i));if(l.call(o,a))return c(s.get(a));s!==o&&s.get(i)},get size(){const i=this.__v_raw;return!e&&sn(it(i),"iterate",Ai),i.size},has(i){const s=this.__v_raw,o=it(s),a=it(i);return e||(rn(i,a)&&sn(o,"has",i),sn(o,"has",a)),i===a?s.has(i):s.has(i)||s.has(a)},forEach(i,s){const o=this,a=o.__v_raw,l=it(a),c=t?Cu:e?us:lr;return!e&&sn(l,"iterate",Ai),a.forEach((u,f)=>i.call(s,c(u),c(f),o))}};return Je(n,e?{add:aa("add"),set:aa("set"),delete:aa("delete"),clear:aa("clear")}:{add(i){!t&&!Nn(i)&&!vr(i)&&(i=it(i));const s=it(this);return oa(s).has.call(s,i)||(s.add(i),xr(s,"add",i,i)),this},set(i,s){!t&&!Nn(s)&&!vr(s)&&(s=it(s));const o=it(this),{has:a,get:l}=oa(o);let c=a.call(o,i);c||(i=it(i),c=a.call(o,i));const u=l.call(o,i);return o.set(i,s),c?rn(s,u)&&xr(o,"set",i,s):xr(o,"add",i,s),this},delete(i){const s=it(this),{has:o,get:a}=oa(s);let l=o.call(s,i);l||(i=it(i),l=o.call(s,i)),a&&a.call(s,i);const c=s.delete(i);return l&&xr(s,"delete",i,void 0),c},clear(){const i=it(this),s=i.size!==0,o=i.clear();return s&&xr(i,"clear",void 0,void 0),o}}),["keys","values","entries",Symbol.iterator].forEach(i=>{n[i]=Ub(i,e,t)}),n}function Wl(e,t){const n=$b(e,t);return(r,i,s)=>i==="__v_isReactive"?!e:i==="__v_isReadonly"?e:i==="__v_raw"?r:Reflect.get(ot(n,i)&&i in r?n:r,i,s)}const Wb={get:Wl(!1,!1)},Yb={get:Wl(!1,!0)},zb={get:Wl(!0,!1)},Kb={get:Wl(!0,!0)},Pm=new WeakMap,Lm=new WeakMap,km=new WeakMap,Fm=new WeakMap;function Gb(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Xb(e){return e.__v_skip||!Object.isExtensible(e)?0:Gb(am(e))}function Yl(e){return vr(e)?e:zl(e,!1,Vb,Wb,Pm)}function Vm(e){return zl(e,!1,jb,Yb,Lm)}function sl(e){return zl(e,!0,Bb,zb,km)}function Jb(e){return zl(e,!0,Hb,Kb,Fm)}function zl(e,t,n,r,i){if(!at(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const s=Xb(e);if(s===0)return e;const o=i.get(e);if(o)return o;const a=new Proxy(e,s===2?r:n);return i.set(e,a),a}function Lr(e){return vr(e)?Lr(e.__v_raw):!!(e&&e.__v_isReactive)}function vr(e){return!!(e&&e.__v_isReadonly)}function Nn(e){return!!(e&&e.__v_isShallow)}function Vo(e){return e?!!e.__v_raw:!1}function it(e){const t=e&&e.__v_raw;return t?it(t):e}function Bm(e){return!ot(e,"__v_skip")&&Object.isExtensible(e)&&gf(e,"__v_skip",!0),e}const lr=e=>at(e)?Yl(e):e,us=e=>at(e)?sl(e):e;function jt(e){return e?e.__v_isRef===!0:!1}function to(e){return Hm(e,!1)}function jm(e){return Hm(e,!0)}function Hm(e,t){return jt(e)?e:new Zb(e,t)}class Zb{constructor(t,n){this.dep=new Ul,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:it(t),this._value=n?t:lr(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,r=this.__v_isShallow||Nn(t)||vr(t);t=r?t:it(t),rn(t,n)&&(this._rawValue=t,this._value=r?t:lr(t),this.dep.trigger())}}function Qb(e){e.dep&&e.dep.trigger()}function Bo(e){return jt(e)?e.value:e}function qb(e){return Le(e)?e():Bo(e)}const eS={get:(e,t,n)=>t==="__v_raw"?e:Bo(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const i=e[t];return jt(i)&&!jt(n)?(i.value=n,!0):Reflect.set(e,t,n,r)}};function Cf(e){return Lr(e)?e:new Proxy(e,eS)}class tS{constructor(t){this.__v_isRef=!0,this._value=void 0;const n=this.dep=new Ul,{get:r,set:i}=t(n.track.bind(n),n.trigger.bind(n));this._get=r,this._set=i}get value(){return this._value=this._get()}set value(t){this._set(t)}}function Um(e){return new tS(e)}function nS(e){const t=be(e)?new Array(e.length):{};for(const n in e)t[n]=$m(e,n);return t}class rS{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0,this._value=void 0,this._raw=it(t);let i=!0,s=t;if(!be(t)||!Po(String(n)))do i=!Vo(s)||Nn(s);while(i&&(s=s.__v_raw));this._shallow=i}get value(){let t=this._object[this._key];return this._shallow&&(t=Bo(t)),this._value=t===void 0?this._defaultValue:t}set value(t){if(this._shallow&&jt(this._raw[this._key])){const n=this._object[this._key];if(jt(n)){n.value=t;return}}this._object[this._key]=t}get dep(){return Rb(this._raw,this._key)}}class iS{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function sS(e,t,n){return jt(e)?e:Le(e)?new iS(e):at(e)&&arguments.length>1?$m(e,t,n):to(e)}function $m(e,t,n){return new rS(e,t,n)}class oS{constructor(t,n,r){this.fn=t,this.setter=n,this._value=void 0,this.dep=new Ul(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=go-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=r}notify(){if(this.flags|=16,!(this.flags&8)&&pt!==this)return Dm(this,!0),!0}get value(){const t=this.dep.track();return Am(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function aS(e,t,n=!1){let r,i;return Le(e)?r=e:(r=e.get,i=e.set),new oS(r,i,n)}const lS={GET:"get",HAS:"has",ITERATE:"iterate"},cS={SET:"set",ADD:"add",DELETE:"delete",CLEAR:"clear"},la={},ol=new WeakMap;let Jr;function uS(){return Jr}function Wm(e,t=!1,n=Jr){if(n){let r=ol.get(n);r||ol.set(n,r=[]),r.push(e)}}function fS(e,t,n=et){const{immediate:r,deep:i,once:s,scheduler:o,augmentJob:a,call:l}=n,c=y=>i?y:Nn(y)||i===!1||i===0?Nr(y,1):Nr(y);let u,f,d,m,p=!1,g=!1;if(jt(e)?(f=()=>e.value,p=Nn(e)):Lr(e)?(f=()=>c(e),p=!0):be(e)?(g=!0,p=e.some(y=>Lr(y)||Nn(y)),f=()=>e.map(y=>{if(jt(y))return y.value;if(Lr(y))return c(y);if(Le(y))return l?l(y,2):y()})):Le(e)?t?f=l?()=>l(e,2):e:f=()=>{if(d){jr();try{d()}finally{Hr()}}const y=Jr;Jr=u;try{return l?l(e,3,[m]):e(m)}finally{Jr=y}}:f=Bt,t&&i){const y=f,O=i===!0?1/0:i;f=()=>Nr(y(),O)}const v=Tm(),T=()=>{u.stop(),v&&v.active&&Bl(v.effects,u)};if(s&&t){const y=t;t=(...O)=>{y(...O),T()}}let S=g?new Array(e.length).fill(la):la;const E=y=>{if(!(!(u.flags&1)||!u.dirty&&!y))if(t){const O=u.run();if(i||p||(g?O.some((M,V)=>rn(M,S[V])):rn(O,S))){d&&d();const M=Jr;Jr=u;try{const V=[O,S===la?void 0:g&&S[0]===la?[]:S,m];S=O,l?l(t,3,V):t(...V)}finally{Jr=M}}}else u.run()};return a&&a(E),u=new mo(f),u.scheduler=o?()=>o(E,!1):E,m=y=>Wm(y,!1,u),d=u.onStop=()=>{const y=ol.get(u);if(y){if(l)l(y,4);else for(const O of y)O();ol.delete(u)}},t?r?E(!0):S=u.run():o?o(E.bind(null,!0),!0):u.run(),T.pause=u.pause.bind(u),T.resume=u.resume.bind(u),T.stop=T,T}function Nr(e,t=1/0,n){if(t<=0||!at(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,jt(e))Nr(e.value,t,n);else if(be(e))for(let r=0;r{Nr(r,t,n)});else if(Ro(e)){for(const r in e)Nr(e[r],t,n);for(const r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&Nr(e[r],t,n)}return e}/** +* @vue/runtime-core v3.5.25 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/const Ym=[];function dS(e){Ym.push(e)}function hS(){Ym.pop()}function pS(e,t){}const mS={SETUP_FUNCTION:0,0:"SETUP_FUNCTION",RENDER_FUNCTION:1,1:"RENDER_FUNCTION",NATIVE_EVENT_HANDLER:5,5:"NATIVE_EVENT_HANDLER",COMPONENT_EVENT_HANDLER:6,6:"COMPONENT_EVENT_HANDLER",VNODE_HOOK:7,7:"VNODE_HOOK",DIRECTIVE_HOOK:8,8:"DIRECTIVE_HOOK",TRANSITION_HOOK:9,9:"TRANSITION_HOOK",APP_ERROR_HANDLER:10,10:"APP_ERROR_HANDLER",APP_WARN_HANDLER:11,11:"APP_WARN_HANDLER",FUNCTION_REF:12,12:"FUNCTION_REF",ASYNC_COMPONENT_LOADER:13,13:"ASYNC_COMPONENT_LOADER",SCHEDULER:14,14:"SCHEDULER",COMPONENT_UPDATE:15,15:"COMPONENT_UPDATE",APP_UNMOUNT_CLEANUP:16,16:"APP_UNMOUNT_CLEANUP"},gS={sp:"serverPrefetch hook",bc:"beforeCreate hook",c:"created hook",bm:"beforeMount hook",m:"mounted hook",bu:"beforeUpdate hook",u:"updated",bum:"beforeUnmount hook",um:"unmounted hook",a:"activated hook",da:"deactivated hook",ec:"errorCaptured hook",rtc:"renderTracked hook",rtg:"renderTriggered hook",0:"setup function",1:"render function",2:"watcher getter",3:"watcher callback",4:"watcher cleanup function",5:"native event handler",6:"component event handler",7:"vnode hook",8:"directive hook",9:"transition hook",10:"app errorHandler",11:"app warnHandler",12:"ref function",13:"async component loader",14:"scheduler flush",15:"component update",16:"app unmount cleanup function"};function Cs(e,t,n,r){try{return r?e(...r):e()}catch(i){Ui(i,t,n)}}function Xn(e,t,n,r){if(Le(e)){const i=Cs(e,t,n,r);return i&&jl(i)&&i.catch(s=>{Ui(s,t,n)}),i}if(be(e)){const i=[];for(let s=0;s>>1,i=mn[r],s=Eo(i);s=Eo(n)?mn.push(e):mn.splice(yS(t),0,e),e.flags|=1,Km()}}function Km(){al||(al=zm.then(Gm))}function yo(e){be(e)?rs.push(...e):Zr&&e.id===-1?Zr.splice(Qi+1,0,e):e.flags&1||(rs.push(e),e.flags|=1),Km()}function Wd(e,t,n=hr+1){for(;nEo(n)-Eo(r));if(rs.length=0,Zr){Zr.push(...t);return}for(Zr=t,Qi=0;Qie.id==null?e.flags&2?-1:1/0:e.id;function Gm(e){try{for(hr=0;hrqi.emit(i,...s)),ca=[]):typeof window<"u"&&window.HTMLElement&&!((r=(n=window.navigator)==null?void 0:n.userAgent)!=null&&r.includes("jsdom"))?((t.__VUE_DEVTOOLS_HOOK_REPLAY__=t.__VUE_DEVTOOLS_HOOK_REPLAY__||[]).push(s=>{Xm(s,t)}),setTimeout(()=>{qi||(t.__VUE_DEVTOOLS_HOOK_REPLAY__=null,ca=[])},3e3)):ca=[]}let Xt=null,Gl=null;function bo(e){const t=Xt;return Xt=e,Gl=e&&e.type.__scopeId||null,t}function ES(e){Gl=e}function bS(){Gl=null}const SS=e=>Af;function Af(e,t=Xt,n){if(!t||e._n)return e;const r=(...i)=>{r._d&&Do(-1);const s=bo(t);let o;try{o=e(...i)}finally{bo(s),r._d&&Do(1)}return o};return r._n=!0,r._c=!0,r._d=!0,r}function TS(e,t){if(Xt===null)return e;const n=$o(Xt),r=e.dirs||(e.dirs=[]);for(let i=0;ie.__isTeleport,no=e=>e&&(e.disabled||e.disabled===""),Yd=e=>e&&(e.defer||e.defer===""),zd=e=>typeof SVGElement<"u"&&e instanceof SVGElement,Kd=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,Ou=(e,t)=>{const n=e&&e.to;return Be(n)?t?t(n):null:n},Qm={name:"Teleport",__isTeleport:!0,process(e,t,n,r,i,s,o,a,l,c){const{mc:u,pc:f,pbc:d,o:{insert:m,querySelector:p,createText:g,createComment:v}}=c,T=no(t.props);let{shapeFlag:S,children:E,dynamicChildren:y}=t;if(e==null){const O=t.el=g(""),M=t.anchor=g("");m(O,n,r),m(M,n,r);const V=(D,x)=>{S&16&&u(E,D,x,i,s,o,a,l)},j=()=>{const D=t.target=Ou(t.props,p),x=qm(D,t,g,m);D&&(o!=="svg"&&zd(D)?o="svg":o!=="mathml"&&Kd(D)&&(o="mathml"),i&&i.isCE&&(i.ce._teleportTargets||(i.ce._teleportTargets=new Set)).add(D),T||(V(D,x),Fa(t,!1)))};T&&(V(n,M),Fa(t,!0)),Yd(t.props)?(t.el.__isMounted=!1,kt(()=>{j(),delete t.el.__isMounted},s)):j()}else{if(Yd(t.props)&&e.el.__isMounted===!1){kt(()=>{Qm.process(e,t,n,r,i,s,o,a,l,c)},s);return}t.el=e.el,t.targetStart=e.targetStart;const O=t.anchor=e.anchor,M=t.target=e.target,V=t.targetAnchor=e.targetAnchor,j=no(e.props),D=j?n:M,x=j?O:V;if(o==="svg"||zd(M)?o="svg":(o==="mathml"||Kd(M))&&(o="mathml"),y?(d(e.dynamicChildren,y,D,i,s,o,a),Bf(e,t,!0)):l||f(e,t,D,x,i,s,o,a,!1),T)j?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):ua(t,n,O,c,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const L=t.target=Ou(t.props,p);L&&ua(t,L,null,c,0)}else j&&ua(t,M,V,c,1);Fa(t,T)}},remove(e,t,n,{um:r,o:{remove:i}},s){const{shapeFlag:o,children:a,anchor:l,targetStart:c,targetAnchor:u,target:f,props:d}=e;if(f&&(i(c),i(u)),s&&i(l),o&16){const m=s||!no(d);for(let p=0;p{e.isMounted=!0}),Ql(()=>{e.isUnmounting=!0}),e}const $n=[Function,Array],Mf={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:$n,onEnter:$n,onAfterEnter:$n,onEnterCancelled:$n,onBeforeLeave:$n,onLeave:$n,onAfterLeave:$n,onLeaveCancelled:$n,onBeforeAppear:$n,onAppear:$n,onAfterAppear:$n,onAppearCancelled:$n},eg=e=>{const t=e.subTree;return t.component?eg(t.component):t},CS={name:"BaseTransition",props:Mf,setup(e,{slots:t}){const n=Pn(),r=_f();return()=>{const i=t.default&&Xl(t.default(),!0);if(!i||!i.length)return;const s=tg(i),o=it(e),{mode:a}=o;if(r.isLeaving)return Vc(s);const l=Gd(s);if(!l)return Vc(s);let c=fs(l,o,r,n,f=>c=f);l.type!==It&&Ur(l,c);let u=n.subTree&&Gd(n.subTree);if(u&&u.type!==It&&!sr(u,l)&&eg(n).type!==It){let f=fs(u,o,r,n);if(Ur(u,f),a==="out-in"&&l.type!==It)return r.isLeaving=!0,f.afterLeave=()=>{r.isLeaving=!1,n.job.flags&8||n.update(),delete f.afterLeave,u=void 0},Vc(s);a==="in-out"&&l.type!==It?f.delayLeave=(d,m,p)=>{const g=rg(r,u);g[String(u.key)]=u,d[Mr]=()=>{m(),d[Mr]=void 0,delete c.delayedLeave,u=void 0},c.delayedLeave=()=>{p(),delete c.delayedLeave,u=void 0}}:u=void 0}else u&&(u=void 0);return s}}};function tg(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==It){t=n;break}}return t}const ng=CS;function rg(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function fs(e,t,n,r,i){const{appear:s,mode:o,persisted:a=!1,onBeforeEnter:l,onEnter:c,onAfterEnter:u,onEnterCancelled:f,onBeforeLeave:d,onLeave:m,onAfterLeave:p,onLeaveCancelled:g,onBeforeAppear:v,onAppear:T,onAfterAppear:S,onAppearCancelled:E}=t,y=String(e.key),O=rg(n,e),M=(D,x)=>{D&&Xn(D,r,9,x)},V=(D,x)=>{const L=x[1];M(D,x),be(D)?D.every(P=>P.length<=1)&&L():D.length<=1&&L()},j={mode:o,persisted:a,beforeEnter(D){let x=l;if(!n.isMounted)if(s)x=v||l;else return;D[Mr]&&D[Mr](!0);const L=O[y];L&&sr(e,L)&&L.el[Mr]&&L.el[Mr](),M(x,[D])},enter(D){let x=c,L=u,P=f;if(!n.isMounted)if(s)x=T||c,L=S||u,P=E||f;else return;let k=!1;const $=D[fa]=q=>{k||(k=!0,q?M(P,[D]):M(L,[D]),j.delayedLeave&&j.delayedLeave(),D[fa]=void 0)};x?V(x,[D,$]):$()},leave(D,x){const L=String(e.key);if(D[fa]&&D[fa](!0),n.isUnmounting)return x();M(d,[D]);let P=!1;const k=D[Mr]=$=>{P||(P=!0,x(),$?M(g,[D]):M(p,[D]),D[Mr]=void 0,O[L]===e&&delete O[L])};O[L]=e,m?V(m,[D,k]):k()},clone(D){const x=fs(D,t,n,r,i);return i&&i(x),x}};return j}function Vc(e){if(jo(e))return e=yr(e),e.children=null,e}function Gd(e){if(!jo(e))return Zm(e.type)&&e.children?tg(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&Le(n.default))return n.default()}}function Ur(e,t){e.shapeFlag&6&&e.component?(e.transition=t,Ur(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Xl(e,t=!1,n){let r=[],i=0;for(let s=0;s1)for(let s=0;sn.value,set:s=>n.value=s})}return n}const cl=new WeakMap;function is(e,t,n,r,i=!1){if(be(e)){e.forEach((p,g)=>is(p,t&&(be(t)?t[g]:t),n,r,i));return}if(ii(r)&&!i){r.shapeFlag&512&&r.type.__asyncResolved&&r.component.subTree.component&&is(e,t,n,r.component.subTree);return}const s=r.shapeFlag&4?$o(r.component):r.el,o=i?null:s,{i:a,r:l}=e,c=t&&t.r,u=a.refs===et?a.refs={}:a.refs,f=a.setupState,d=it(f),m=f===et?Ei:p=>ot(d,p);if(c!=null&&c!==l){if(Xd(t),Be(c))u[c]=null,m(c)&&(f[c]=null);else if(jt(c)){c.value=null;const p=t;p.k&&(u[p.k]=null)}}if(Le(l))Cs(l,a,12,[o,u]);else{const p=Be(l),g=jt(l);if(p||g){const v=()=>{if(e.f){const T=p?m(l)?f[l]:u[l]:l.value;if(i)be(T)&&Bl(T,s);else if(be(T))T.includes(s)||T.push(s);else if(p)u[l]=[s],m(l)&&(f[l]=u[l]);else{const S=[s];l.value=S,e.k&&(u[e.k]=S)}}else p?(u[l]=o,m(l)&&(f[l]=o)):g&&(l.value=o,e.k&&(u[e.k]=o))};if(o){const T=()=>{v(),cl.delete(e)};T.id=-1,cl.set(e,T),kt(T,n)}else Xd(e),v()}}}function Xd(e){const t=cl.get(e);t&&(t.flags|=8,cl.delete(e))}let Jd=!1;const zi=()=>{Jd||(console.error("Hydration completed but contains mismatches."),Jd=!0)},_S=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",MS=e=>e.namespaceURI.includes("MathML"),da=e=>{if(e.nodeType===1){if(_S(e))return"svg";if(MS(e))return"mathml"}},ts=e=>e.nodeType===8;function xS(e){const{mt:t,p:n,o:{patchProp:r,createText:i,nextSibling:s,parentNode:o,remove:a,insert:l,createComment:c}}=e,u=(E,y)=>{if(!y.hasChildNodes()){n(null,E,y),ll(),y._vnode=E;return}f(y.firstChild,E,null,null,null),ll(),y._vnode=E},f=(E,y,O,M,V,j=!1)=>{j=j||!!y.dynamicChildren;const D=ts(E)&&E.data==="[",x=()=>g(E,y,O,M,V,D),{type:L,ref:P,shapeFlag:k,patchFlag:$}=y;let q=E.nodeType;y.el=E,$===-2&&(j=!1,y.dynamicChildren=null);let U=null;switch(L){case si:q!==3?y.children===""?(l(y.el=i(""),o(E),E),U=E):U=x():(E.data!==y.children&&(zi(),E.data=y.children),U=s(E));break;case It:S(E)?(U=s(E),T(y.el=E.content.firstChild,E,O)):q!==8||D?U=x():U=s(E);break;case Mi:if(D&&(E=s(E),q=E.nodeType),q===1||q===3){U=E;const W=!y.children.length;for(let J=0;J{j=j||!!y.dynamicChildren;const{type:D,props:x,patchFlag:L,shapeFlag:P,dirs:k,transition:$}=y,q=D==="input"||D==="option";if(q||L!==-1){k&&pr(y,null,O,"created");let U=!1;if(S(E)){U=Lg(null,$)&&O&&O.vnode.props&&O.vnode.props.appear;const J=E.content.firstChild;if(U){const Se=J.getAttribute("class");Se&&(J.$cls=Se),$.beforeEnter(J)}T(J,E,O),y.el=E=J}if(P&16&&!(x&&(x.innerHTML||x.textContent))){let J=m(E.firstChild,y,E,O,M,V,j);for(;J;){ha(E,1)||zi();const Se=J;J=J.nextSibling,a(Se)}}else if(P&8){let J=y.children;J[0]===` +`&&(E.tagName==="PRE"||E.tagName==="TEXTAREA")&&(J=J.slice(1));const{textContent:Se}=E;Se!==J&&Se!==J.replace(/\r\n|\r/g,` +`)&&(ha(E,0)||zi(),E.textContent=y.children)}if(x){if(q||!j||L&48){const J=E.tagName.includes("-");for(const Se in x)(q&&(Se.endsWith("value")||Se==="indeterminate")||ci(Se)&&!Pr(Se)||Se[0]==="."||J)&&r(E,Se,null,x[Se],void 0,O)}else if(x.onClick)r(E,"onClick",null,x.onClick,void 0,O);else if(L&4&&Lr(x.style))for(const J in x.style)x.style[J]}let W;(W=x&&x.onVnodeBeforeMount)&&On(W,O,y),k&&pr(y,null,O,"beforeMount"),((W=x&&x.onVnodeMounted)||k||U)&&Vg(()=>{W&&On(W,O,y),U&&$.enter(E),k&&pr(y,null,O,"mounted")},M)}return E.nextSibling},m=(E,y,O,M,V,j,D)=>{D=D||!!y.dynamicChildren;const x=y.children,L=x.length;for(let P=0;P{const{slotScopeIds:D}=y;D&&(V=V?V.concat(D):D);const x=o(E),L=m(s(E),y,x,O,M,V,j);return L&&ts(L)&&L.data==="]"?s(y.anchor=L):(zi(),l(y.anchor=c("]"),x,L),L)},g=(E,y,O,M,V,j)=>{if(ha(E.parentElement,1)||zi(),y.el=null,j){const L=v(E);for(;;){const P=s(E);if(P&&P!==L)a(P);else break}}const D=s(E),x=o(E);return a(E),n(null,y,x,D,O,M,da(x),V),O&&(O.vnode.el=y.el,tc(O,y.el)),D},v=(E,y="[",O="]")=>{let M=0;for(;E;)if(E=s(E),E&&ts(E)&&(E.data===y&&M++,E.data===O)){if(M===0)return s(E);M--}return E},T=(E,y,O)=>{const M=y.parentNode;M&&M.replaceChild(E,y);let V=O;for(;V;)V.vnode.el===y&&(V.vnode.el=V.subTree.el=E),V=V.parent},S=E=>E.nodeType===1&&E.tagName==="TEMPLATE";return[u,f]}const Zd="data-allow-mismatch",NS={0:"text",1:"children",2:"class",3:"style",4:"attribute"};function ha(e,t){if(t===0||t===1)for(;e&&!e.hasAttribute(Zd);)e=e.parentElement;const n=e&&e.getAttribute(Zd);if(n==null)return!1;if(n==="")return!0;{const r=n.split(",");return t===0&&r.includes("children")?!0:r.includes(NS[t])}}const IS=ko().requestIdleCallback||(e=>setTimeout(e,1)),RS=ko().cancelIdleCallback||(e=>clearTimeout(e)),PS=(e=1e4)=>t=>{const n=IS(t,{timeout:e});return()=>RS(n)};function LS(e){const{top:t,left:n,bottom:r,right:i}=e.getBoundingClientRect(),{innerHeight:s,innerWidth:o}=window;return(t>0&&t0&&r0&&n0&&i(t,n)=>{const r=new IntersectionObserver(i=>{for(const s of i)if(s.isIntersecting){r.disconnect(),t();break}},e);return n(i=>{if(i instanceof Element){if(LS(i))return t(),r.disconnect(),!1;r.observe(i)}}),()=>r.disconnect()},FS=e=>t=>{if(e){const n=matchMedia(e);if(n.matches)t();else return n.addEventListener("change",t,{once:!0}),()=>n.removeEventListener("change",t)}},VS=(e=[])=>(t,n)=>{Be(e)&&(e=[e]);let r=!1;const i=o=>{r||(r=!0,s(),t(),o.target.dispatchEvent(new o.constructor(o.type,o)))},s=()=>{n(o=>{for(const a of e)o.removeEventListener(a,i)})};return n(o=>{for(const a of e)o.addEventListener(a,i,{once:!0})}),s};function BS(e,t){if(ts(e)&&e.data==="["){let n=1,r=e.nextSibling;for(;r;){if(r.nodeType===1){if(t(r)===!1)break}else if(ts(r))if(r.data==="]"){if(--n===0)break}else r.data==="["&&n++;r=r.nextSibling}}else t(e)}const ii=e=>!!e.type.__asyncLoader;function jS(e){Le(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:i=200,hydrate:s,timeout:o,suspensible:a=!0,onError:l}=e;let c=null,u,f=0;const d=()=>(f++,c=null,m()),m=()=>{let p;return c||(p=c=t().catch(g=>{if(g=g instanceof Error?g:new Error(String(g)),l)return new Promise((v,T)=>{l(g,()=>v(d()),()=>T(g),f+1)});throw g}).then(g=>p!==c&&c?c:(g&&(g.__esModule||g[Symbol.toStringTag]==="Module")&&(g=g.default),u=g,g)))};return xf({name:"AsyncComponentWrapper",__asyncLoader:m,__asyncHydrate(p,g,v){let T=!1;(g.bu||(g.bu=[])).push(()=>T=!0);const S=()=>{T||v()},E=s?()=>{const y=s(S,O=>BS(p,O));y&&(g.bum||(g.bum=[])).push(y)}:S;u?E():m().then(()=>!g.isUnmounted&&E())},get __asyncResolved(){return u},setup(){const p=Gt;if(Nf(p),u)return()=>pa(u,p);const g=E=>{c=null,Ui(E,p,13,!r)};if(a&&p.suspense||ds)return m().then(E=>()=>pa(E,p)).catch(E=>(g(E),()=>r?St(r,{error:E}):null));const v=to(!1),T=to(),S=to(!!i);return i&&setTimeout(()=>{S.value=!1},i),o!=null&&setTimeout(()=>{if(!v.value&&!T.value){const E=new Error(`Async component timed out after ${o}ms.`);g(E),T.value=E}},o),m().then(()=>{v.value=!0,p.parent&&jo(p.parent.vnode)&&p.parent.update()}).catch(E=>{g(E),T.value=E}),()=>{if(v.value&&u)return pa(u,p);if(T.value&&r)return St(r,{error:T.value});if(n&&!S.value)return pa(n,p)}}})}function pa(e,t){const{ref:n,props:r,children:i,ce:s}=t.vnode,o=St(e,r,i);return o.ref=n,o.ce=s,delete t.vnode.ce,o}const jo=e=>e.type.__isKeepAlive,HS={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){const n=Pn(),r=n.ctx;if(!r.renderer)return()=>{const S=t.default&&t.default();return S&&S.length===1?S[0]:S};const i=new Map,s=new Set;let o=null;const a=n.suspense,{renderer:{p:l,m:c,um:u,o:{createElement:f}}}=r,d=f("div");r.activate=(S,E,y,O,M)=>{const V=S.component;c(S,E,y,0,a),l(V.vnode,S,E,y,V,a,O,S.slotScopeIds,M),kt(()=>{V.isDeactivated=!1,V.a&&Oi(V.a);const j=S.props&&S.props.onVnodeMounted;j&&On(j,V.parent,S)},a)},r.deactivate=S=>{const E=S.component;fl(E.m),fl(E.a),c(S,d,null,1,a),kt(()=>{E.da&&Oi(E.da);const y=S.props&&S.props.onVnodeUnmounted;y&&On(y,E.parent,S),E.isDeactivated=!0},a)};function m(S){Bc(S),u(S,n,a,!0)}function p(S){i.forEach((E,y)=>{const O=Fu(E.type);O&&!S(O)&&g(y)})}function g(S){const E=i.get(S);E&&(!o||!sr(E,o))?m(E):o&&Bc(o),i.delete(S),s.delete(S)}ss(()=>[e.include,e.exclude],([S,E])=>{S&&p(y=>zs(S,y)),E&&p(y=>!zs(E,y))},{flush:"post",deep:!0});let v=null;const T=()=>{v!=null&&(dl(n.subTree.type)?kt(()=>{i.set(v,ma(n.subTree))},n.subTree.suspense):i.set(v,ma(n.subTree)))};return Ho(T),Zl(T),Ql(()=>{i.forEach(S=>{const{subTree:E,suspense:y}=n,O=ma(E);if(S.type===O.type&&S.key===O.key){Bc(O);const M=O.component.da;M&&kt(M,y);return}m(S)})}),()=>{if(v=null,!t.default)return o=null;const S=t.default(),E=S[0];if(S.length>1)return o=null,S;if(!$r(E)||!(E.shapeFlag&4)&&!(E.shapeFlag&128))return o=null,E;let y=ma(E);if(y.type===It)return o=null,y;const O=y.type,M=Fu(ii(y)?y.type.__asyncResolved||{}:O),{include:V,exclude:j,max:D}=e;if(V&&(!M||!zs(V,M))||j&&M&&zs(j,M))return y.shapeFlag&=-257,o=y,E;const x=y.key==null?O:y.key,L=i.get(x);return y.el&&(y=yr(y),E.shapeFlag&128&&(E.ssContent=y)),v=x,L?(y.el=L.el,y.component=L.component,y.transition&&Ur(y,y.transition),y.shapeFlag|=512,s.delete(x),s.add(x)):(s.add(x),D&&s.size>parseInt(D,10)&&g(s.values().next().value)),y.shapeFlag|=256,o=y,dl(E.type)?E:y}}},US=HS;function zs(e,t){return be(e)?e.some(n=>zs(n,t)):Be(e)?e.split(",").includes(t):om(e)?(e.lastIndex=0,e.test(t)):!1}function ig(e,t){og(e,"a",t)}function sg(e,t){og(e,"da",t)}function og(e,t,n=Gt){const r=e.__wdc||(e.__wdc=()=>{let i=n;for(;i;){if(i.isDeactivated)return;i=i.parent}return e()});if(Jl(t,r,n),n){let i=n.parent;for(;i&&i.parent;)jo(i.parent.vnode)&&$S(r,t,n,i),i=i.parent}}function $S(e,t,n,r){const i=Jl(t,e,r,!0);ql(()=>{Bl(r[t],i)},n)}function Bc(e){e.shapeFlag&=-257,e.shapeFlag&=-513}function ma(e){return e.shapeFlag&128?e.ssContent:e}function Jl(e,t,n=Gt,r=!1){if(n){const i=n[e]||(n[e]=[]),s=t.__weh||(t.__weh=(...o)=>{jr();const a=Pi(n),l=Xn(t,n,e,o);return a(),Hr(),l});return r?i.unshift(s):i.push(s),s}}const Wr=e=>(t,n=Gt)=>{(!ds||e==="sp")&&Jl(e,(...r)=>t(...r),n)},ag=Wr("bm"),Ho=Wr("m"),If=Wr("bu"),Zl=Wr("u"),Ql=Wr("bum"),ql=Wr("um"),lg=Wr("sp"),cg=Wr("rtg"),ug=Wr("rtc");function fg(e,t=Gt){Jl("ec",e,t)}const Rf="components",WS="directives";function dg(e,t){return Pf(Rf,e,!0,t)||e}const hg=Symbol.for("v-ndc");function YS(e){return Be(e)?Pf(Rf,e,!1)||e:e||hg}function zS(e){return Pf(WS,e)}function Pf(e,t,n=!0,r=!1){const i=Xt||Gt;if(i){const s=i.type;if(e===Rf){const a=Fu(s,!1);if(a&&(a===t||a===mt(t)||a===fi(mt(t))))return s}const o=Qd(i[e]||s[e],t)||Qd(i.appContext[e],t);return!o&&r?s:o}}function Qd(e,t){return e&&(e[t]||e[mt(t)]||e[fi(mt(t))])}function KS(e,t,n,r){let i;const s=n&&n[r],o=be(e);if(o||Be(e)){const a=o&&Lr(e);let l=!1,c=!1;a&&(l=!Nn(e),c=vr(e),e=$l(e)),i=new Array(e.length);for(let u=0,f=e.length;ut(a,l,void 0,s&&s[l]));else{const a=Object.keys(e);i=new Array(a.length);for(let l=0,c=a.length;l{const s=r.fn(...i);return s&&(s.key=r.key),s}:r.fn)}return e}function XS(e,t,n={},r,i){if(Xt.ce||Xt.parent&&ii(Xt.parent)&&Xt.parent.ce){const c=Object.keys(n).length>0;return t!=="default"&&(n.name=t),wo(),hl(Ut,null,[St("slot",n,r&&r())],c?-2:64)}let s=e[t];s&&s._c&&(s._d=!1),wo();const o=s&&Lf(s(n)),a=n.key||o&&o.key,l=hl(Ut,{key:(a&&!En(a)?a:`_${t}`)+(!o&&r?"_fb":"")},o||(r?r():[]),o&&e._===1?64:-2);return!i&&l.scopeId&&(l.slotScopeIds=[l.scopeId+"-s"]),s&&s._c&&(s._d=!0),l}function Lf(e){return e.some(t=>$r(t)?!(t.type===It||t.type===Ut&&!Lf(t.children)):!0)?e:null}function JS(e,t){const n={};for(const r in e)n[t&&/[A-Z]/.test(r)?`on:${r}`:Ci(r)]=e[r];return n}const Au=e=>e?Yg(e)?$o(e):Au(e.parent):null,ro=Je(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Au(e.parent),$root:e=>Au(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>kf(e),$forceUpdate:e=>e.f||(e.f=()=>{Of(e.update)}),$nextTick:e=>e.n||(e.n=Kl.bind(e.proxy)),$watch:e=>S0.bind(e)}),jc=(e,t)=>e!==et&&!e.__isScriptSetup&&ot(e,t),_u={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:r,data:i,props:s,accessCache:o,type:a,appContext:l}=e;if(t[0]!=="$"){const d=o[t];if(d!==void 0)switch(d){case 1:return r[t];case 2:return i[t];case 4:return n[t];case 3:return s[t]}else{if(jc(r,t))return o[t]=1,r[t];if(i!==et&&ot(i,t))return o[t]=2,i[t];if(ot(s,t))return o[t]=3,s[t];if(n!==et&&ot(n,t))return o[t]=4,n[t];Mu&&(o[t]=0)}}const c=ro[t];let u,f;if(c)return t==="$attrs"&&sn(e.attrs,"get",""),c(e);if((u=a.__cssModules)&&(u=u[t]))return u;if(n!==et&&ot(n,t))return o[t]=4,n[t];if(f=l.config.globalProperties,ot(f,t))return f[t]},set({_:e},t,n){const{data:r,setupState:i,ctx:s}=e;return jc(i,t)?(i[t]=n,!0):r!==et&&ot(r,t)?(r[t]=n,!0):ot(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(s[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:i,props:s,type:o}},a){let l;return!!(n[a]||e!==et&&a[0]!=="$"&&ot(e,a)||jc(t,a)||ot(s,a)||ot(r,a)||ot(ro,a)||ot(i.config.globalProperties,a)||(l=o.__cssModules)&&l[a])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:ot(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}},ZS=Je({},_u,{get(e,t){if(t!==Symbol.unscopables)return _u.get(e,t,e)},has(e,t){return t[0]!=="_"&&!vf(t)}});function QS(){return null}function qS(){return null}function e0(e){}function t0(e){}function n0(){return null}function r0(){}function i0(e,t){return null}function s0(){return pg().slots}function o0(){return pg().attrs}function pg(e){const t=Pn();return t.setupContext||(t.setupContext=Xg(t))}function So(e){return be(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}function a0(e,t){const n=So(e);for(const r in t){if(r.startsWith("__skip"))continue;let i=n[r];i?be(i)||Le(i)?i=n[r]={type:i,default:t[r]}:i.default=t[r]:i===null&&(i=n[r]={default:t[r]}),i&&t[`__skip_${r}`]&&(i.skipFactory=!0)}return n}function l0(e,t){return!e||!t?e||t:be(e)&&be(t)?e.concat(t):Je({},So(e),So(t))}function c0(e,t){const n={};for(const r in e)t.includes(r)||Object.defineProperty(n,r,{enumerable:!0,get:()=>e[r]});return n}function u0(e){const t=Pn();let n=e();return Pu(),jl(n)&&(n=n.catch(r=>{throw Pi(t),r})),[n,()=>Pi(t)]}let Mu=!0;function f0(e){const t=kf(e),n=e.proxy,r=e.ctx;Mu=!1,t.beforeCreate&&qd(t.beforeCreate,e,"bc");const{data:i,computed:s,methods:o,watch:a,provide:l,inject:c,created:u,beforeMount:f,mounted:d,beforeUpdate:m,updated:p,activated:g,deactivated:v,beforeDestroy:T,beforeUnmount:S,destroyed:E,unmounted:y,render:O,renderTracked:M,renderTriggered:V,errorCaptured:j,serverPrefetch:D,expose:x,inheritAttrs:L,components:P,directives:k,filters:$}=t;if(c&&d0(c,r,null),o)for(const W in o){const J=o[W];Le(J)&&(r[W]=J.bind(n))}if(i){const W=i.call(n,n);at(W)&&(e.data=Yl(W))}if(Mu=!0,s)for(const W in s){const J=s[W],Se=Le(J)?J.bind(n,n):Le(J.get)?J.get.bind(n,n):Bt,Ye=!Le(J)&&Le(J.set)?J.set.bind(n):Bt,Ee=Jg({get:Se,set:Ye});Object.defineProperty(r,W,{enumerable:!0,configurable:!0,get:()=>Ee.value,set:ke=>Ee.value=ke})}if(a)for(const W in a)mg(a[W],r,n,W);if(l){const W=Le(l)?l.call(n):l;Reflect.ownKeys(W).forEach(J=>{vg(J,W[J])})}u&&qd(u,e,"c");function U(W,J){be(J)?J.forEach(Se=>W(Se.bind(n))):J&&W(J.bind(n))}if(U(ag,f),U(Ho,d),U(If,m),U(Zl,p),U(ig,g),U(sg,v),U(fg,j),U(ug,M),U(cg,V),U(Ql,S),U(ql,y),U(lg,D),be(x))if(x.length){const W=e.exposed||(e.exposed={});x.forEach(J=>{Object.defineProperty(W,J,{get:()=>n[J],set:Se=>n[J]=Se,enumerable:!0})})}else e.exposed||(e.exposed={});O&&e.render===Bt&&(e.render=O),L!=null&&(e.inheritAttrs=L),P&&(e.components=P),k&&(e.directives=k),D&&Nf(e)}function d0(e,t,n=Bt){be(e)&&(e=xu(e));for(const r in e){const i=e[r];let s;at(i)?"default"in i?s=io(i.from||r,i.default,!0):s=io(i.from||r):s=io(i),jt(s)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>s.value,set:o=>s.value=o}):t[r]=s}}function qd(e,t,n){Xn(be(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function mg(e,t,n,r){let i=r.includes(".")?Sg(n,r):()=>n[r];if(Be(e)){const s=t[e];Le(s)&&ss(i,s)}else if(Le(e))ss(i,e.bind(n));else if(at(e))if(be(e))e.forEach(s=>mg(s,t,n,r));else{const s=Le(e.handler)?e.handler.bind(n):t[e.handler];Le(s)&&ss(i,s,e)}}function kf(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:i,optionsCache:s,config:{optionMergeStrategies:o}}=e.appContext,a=s.get(t);let l;return a?l=a:!i.length&&!n&&!r?l=t:(l={},i.length&&i.forEach(c=>ul(l,c,o,!0)),ul(l,t,o)),at(t)&&s.set(t,l),l}function ul(e,t,n,r=!1){const{mixins:i,extends:s}=t;s&&ul(e,s,n,!0),i&&i.forEach(o=>ul(e,o,n,!0));for(const o in t)if(!(r&&o==="expose")){const a=h0[o]||n&&n[o];e[o]=a?a(e[o],t[o]):t[o]}return e}const h0={data:eh,props:th,emits:th,methods:Ks,computed:Ks,beforeCreate:hn,created:hn,beforeMount:hn,mounted:hn,beforeUpdate:hn,updated:hn,beforeDestroy:hn,beforeUnmount:hn,destroyed:hn,unmounted:hn,activated:hn,deactivated:hn,errorCaptured:hn,serverPrefetch:hn,components:Ks,directives:Ks,watch:m0,provide:eh,inject:p0};function eh(e,t){return t?e?function(){return Je(Le(e)?e.call(this,this):e,Le(t)?t.call(this,this):t)}:t:e}function p0(e,t){return Ks(xu(e),xu(t))}function xu(e){if(be(e)){const t={};for(let n=0;n1)return n&&Le(t)?t.call(r&&r.proxy):t}}function y0(){return!!(Pn()||_i)}const yg=Symbol.for("v-scx"),Eg=()=>io(yg);function E0(e,t){return Uo(e,null,t)}function b0(e,t){return Uo(e,null,{flush:"post"})}function bg(e,t){return Uo(e,null,{flush:"sync"})}function ss(e,t,n){return Uo(e,t,n)}function Uo(e,t,n=et){const{immediate:r,deep:i,flush:s,once:o}=n,a=Je({},n),l=t&&r||!t&&s!=="post";let c;if(ds){if(s==="sync"){const m=Eg();c=m.__watcherHandles||(m.__watcherHandles=[])}else if(!l){const m=()=>{};return m.stop=Bt,m.resume=Bt,m.pause=Bt,m}}const u=Gt;a.call=(m,p,g)=>Xn(m,u,p,g);let f=!1;s==="post"?a.scheduler=m=>{kt(m,u&&u.suspense)}:s!=="sync"&&(f=!0,a.scheduler=(m,p)=>{p?m():Of(m)}),a.augmentJob=m=>{t&&(m.flags|=4),f&&(m.flags|=2,u&&(m.id=u.uid,m.i=u))};const d=fS(e,t,a);return ds&&(c?c.push(d):l&&d()),d}function S0(e,t,n){const r=this.proxy,i=Be(e)?e.includes(".")?Sg(r,e):()=>r[e]:e.bind(r,r);let s;Le(t)?s=t:(s=t.handler,n=t);const o=Pi(this),a=Uo(i,s.bind(r),n);return o(),a}function Sg(e,t){const n=t.split(".");return()=>{let r=e;for(let i=0;i{let u,f=et,d;return bg(()=>{const m=e[i];rn(u,m)&&(u=m,c())}),{get(){return l(),n.get?n.get(u):u},set(m){const p=n.set?n.set(m):m;if(!rn(p,u)&&!(f!==et&&rn(m,f)))return;const g=r.vnode.props;g&&(t in g||i in g||s in g)&&(`onUpdate:${t}`in g||`onUpdate:${i}`in g||`onUpdate:${s}`in g)||(u=m,c()),r.emit(`update:${t}`,p),rn(m,p)&&rn(m,f)&&!rn(p,d)&&c(),f=m,d=p}}});return a[Symbol.iterator]=()=>{let l=0;return{next(){return l<2?{value:l++?o||et:a,done:!1}:{done:!0}}}},a}const Tg=(e,t)=>t==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${mt(t)}Modifiers`]||e[`${on(t)}Modifiers`];function w0(e,t,...n){if(e.isUnmounted)return;const r=e.vnode.props||et;let i=n;const s=t.startsWith("update:"),o=s&&Tg(r,t.slice(7));o&&(o.trim&&(i=n.map(u=>Be(u)?u.trim():u)),o.number&&(i=n.map(Lo)));let a,l=r[a=Ci(t)]||r[a=Ci(mt(t))];!l&&s&&(l=r[a=Ci(on(t))]),l&&Xn(l,e,6,i);const c=r[a+"Once"];if(c){if(!e.emitted)e.emitted={};else if(e.emitted[a])return;e.emitted[a]=!0,Xn(c,e,6,i)}}const D0=new WeakMap;function wg(e,t,n=!1){const r=n?D0:t.emitsCache,i=r.get(e);if(i!==void 0)return i;const s=e.emits;let o={},a=!1;if(!Le(e)){const l=c=>{const u=wg(c,t,!0);u&&(a=!0,Je(o,u))};!n&&t.mixins.length&&t.mixins.forEach(l),e.extends&&l(e.extends),e.mixins&&e.mixins.forEach(l)}return!s&&!a?(at(e)&&r.set(e,null),null):(be(s)?s.forEach(l=>o[l]=null):Je(o,s),at(e)&&r.set(e,o),o)}function ec(e,t){return!e||!ci(t)?!1:(t=t.slice(2).replace(/Once$/,""),ot(e,t[0].toLowerCase()+t.slice(1))||ot(e,on(t))||ot(e,t))}function Va(e){const{type:t,vnode:n,proxy:r,withProxy:i,propsOptions:[s],slots:o,attrs:a,emit:l,render:c,renderCache:u,props:f,data:d,setupState:m,ctx:p,inheritAttrs:g}=e,v=bo(e);let T,S;try{if(n.shapeFlag&4){const y=i||r,O=y;T=_n(c.call(O,y,u,f,m,d,p)),S=a}else{const y=t;T=_n(y.length>1?y(f,{attrs:a,slots:o,emit:l}):y(f,null)),S=t.props?a:O0(a)}}catch(y){so.length=0,Ui(y,e,1),T=St(It)}let E=T;if(S&&g!==!1){const y=Object.keys(S),{shapeFlag:O}=E;y.length&&O&7&&(s&&y.some(Vl)&&(S=A0(S,s)),E=yr(E,S,!1,!0))}return n.dirs&&(E=yr(E,null,!1,!0),E.dirs=E.dirs?E.dirs.concat(n.dirs):n.dirs),n.transition&&Ur(E,n.transition),T=E,bo(v),T}function C0(e,t=!0){let n;for(let r=0;r{let t;for(const n in e)(n==="class"||n==="style"||ci(n))&&((t||(t={}))[n]=e[n]);return t},A0=(e,t)=>{const n={};for(const r in e)(!Vl(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function _0(e,t,n){const{props:r,children:i,component:s}=e,{props:o,children:a,patchFlag:l}=t,c=s.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&l>=0){if(l&1024)return!0;if(l&16)return r?nh(r,o,c):!!o;if(l&8){const u=t.dynamicProps;for(let f=0;fObject.create(Dg),Og=e=>Object.getPrototypeOf(e)===Dg;function M0(e,t,n,r=!1){const i={},s=Cg();e.propsDefaults=Object.create(null),Ag(e,t,i,s);for(const o in e.propsOptions[0])o in i||(i[o]=void 0);n?e.props=r?i:Vm(i):e.type.props?e.props=i:e.props=s,e.attrs=s}function x0(e,t,n,r){const{props:i,attrs:s,vnode:{patchFlag:o}}=e,a=it(i),[l]=e.propsOptions;let c=!1;if((r||o>0)&&!(o&16)){if(o&8){const u=e.vnode.dynamicProps;for(let f=0;f{l=!0;const[d,m]=_g(f,t,!0);Je(o,d),m&&a.push(...m)};!n&&t.mixins.length&&t.mixins.forEach(u),e.extends&&u(e.extends),e.mixins&&e.mixins.forEach(u)}if(!s&&!l)return at(e)&&r.set(e,wi),wi;if(be(s))for(let u=0;ue==="_"||e==="_ctx"||e==="$stable",Vf=e=>be(e)?e.map(_n):[_n(e)],I0=(e,t,n)=>{if(t._n)return t;const r=Af((...i)=>Vf(t(...i)),n);return r._c=!1,r},Mg=(e,t,n)=>{const r=e._ctx;for(const i in e){if(Ff(i))continue;const s=e[i];if(Le(s))t[i]=I0(i,s,r);else if(s!=null){const o=Vf(s);t[i]=()=>o}}},xg=(e,t)=>{const n=Vf(t);e.slots.default=()=>n},Ng=(e,t,n)=>{for(const r in t)(n||!Ff(r))&&(e[r]=t[r])},R0=(e,t,n)=>{const r=e.slots=Cg();if(e.vnode.shapeFlag&32){const i=t._;i?(Ng(r,t,n),n&&gf(r,"_",i,!0)):Mg(t,r)}else t&&xg(e,t)},P0=(e,t,n)=>{const{vnode:r,slots:i}=e;let s=!0,o=et;if(r.shapeFlag&32){const a=t._;a?n&&a===1?s=!1:Ng(i,t,n):(s=!t.$stable,Mg(t,i)),o=t}else t&&(xg(e,t),o={default:1});if(s)for(const a in i)!Ff(a)&&o[a]==null&&delete i[a]},kt=Vg;function Ig(e){return Pg(e)}function Rg(e){return Pg(e,xS)}function Pg(e,t){const n=ko();n.__VUE__=!0;const{insert:r,remove:i,patchProp:s,createElement:o,createText:a,createComment:l,setText:c,setElementText:u,parentNode:f,nextSibling:d,setScopeId:m=Bt,insertStaticContent:p}=e,g=(_,N,Y,ee=null,Z=null,Q=null,oe=void 0,ne=null,ie=!!N.dynamicChildren)=>{if(_===N)return;_&&!sr(_,N)&&(ee=pe(_),ke(_,Z,Q,!0),_=null),N.patchFlag===-2&&(ie=!1,N.dynamicChildren=null);const{type:te,ref:Te,shapeFlag:fe}=N;switch(te){case si:v(_,N,Y,ee);break;case It:T(_,N,Y,ee);break;case Mi:_==null&&S(N,Y,ee,oe);break;case Ut:P(_,N,Y,ee,Z,Q,oe,ne,ie);break;default:fe&1?O(_,N,Y,ee,Z,Q,oe,ne,ie):fe&6?k(_,N,Y,ee,Z,Q,oe,ne,ie):(fe&64||fe&128)&&te.process(_,N,Y,ee,Z,Q,oe,ne,ie,lt)}Te!=null&&Z?is(Te,_&&_.ref,Q,N||_,!N):Te==null&&_&&_.ref!=null&&is(_.ref,null,Q,_,!0)},v=(_,N,Y,ee)=>{if(_==null)r(N.el=a(N.children),Y,ee);else{const Z=N.el=_.el;N.children!==_.children&&c(Z,N.children)}},T=(_,N,Y,ee)=>{_==null?r(N.el=l(N.children||""),Y,ee):N.el=_.el},S=(_,N,Y,ee)=>{[_.el,_.anchor]=p(_.children,N,Y,ee,_.el,_.anchor)},E=({el:_,anchor:N},Y,ee)=>{let Z;for(;_&&_!==N;)Z=d(_),r(_,Y,ee),_=Z;r(N,Y,ee)},y=({el:_,anchor:N})=>{let Y;for(;_&&_!==N;)Y=d(_),i(_),_=Y;i(N)},O=(_,N,Y,ee,Z,Q,oe,ne,ie)=>{if(N.type==="svg"?oe="svg":N.type==="math"&&(oe="mathml"),_==null)M(N,Y,ee,Z,Q,oe,ne,ie);else{const te=_.el&&_.el._isVueCE?_.el:null;try{te&&te._beginPatch(),D(_,N,Z,Q,oe,ne,ie)}finally{te&&te._endPatch()}}},M=(_,N,Y,ee,Z,Q,oe,ne)=>{let ie,te;const{props:Te,shapeFlag:fe,transition:ye,dirs:we}=_;if(ie=_.el=o(_.type,Q,Te&&Te.is,Te),fe&8?u(ie,_.children):fe&16&&j(_.children,ie,null,ee,Z,Hc(_,Q),oe,ne),we&&pr(_,null,ee,"created"),V(ie,_,_.scopeId,oe,ee),Te){for(const Xe in Te)Xe!=="value"&&!Pr(Xe)&&s(ie,Xe,null,Te[Xe],Q,ee);"value"in Te&&s(ie,"value",null,Te.value,Q),(te=Te.onVnodeBeforeMount)&&On(te,ee,_)}we&&pr(_,null,ee,"beforeMount");const Pe=Lg(Z,ye);Pe&&ye.beforeEnter(ie),r(ie,N,Y),((te=Te&&Te.onVnodeMounted)||Pe||we)&&kt(()=>{te&&On(te,ee,_),Pe&&ye.enter(ie),we&&pr(_,null,ee,"mounted")},Z)},V=(_,N,Y,ee,Z)=>{if(Y&&m(_,Y),ee)for(let Q=0;Q{for(let te=ie;te<_.length;te++){const Te=_[te]=ne?Qr(_[te]):_n(_[te]);g(null,Te,N,Y,ee,Z,Q,oe,ne)}},D=(_,N,Y,ee,Z,Q,oe)=>{const ne=N.el=_.el;let{patchFlag:ie,dynamicChildren:te,dirs:Te}=N;ie|=_.patchFlag&16;const fe=_.props||et,ye=N.props||et;let we;if(Y&&di(Y,!1),(we=ye.onVnodeBeforeUpdate)&&On(we,Y,N,_),Te&&pr(N,_,Y,"beforeUpdate"),Y&&di(Y,!0),(fe.innerHTML&&ye.innerHTML==null||fe.textContent&&ye.textContent==null)&&u(ne,""),te?x(_.dynamicChildren,te,ne,Y,ee,Hc(N,Z),Q):oe||J(_,N,ne,null,Y,ee,Hc(N,Z),Q,!1),ie>0){if(ie&16)L(ne,fe,ye,Y,Z);else if(ie&2&&fe.class!==ye.class&&s(ne,"class",null,ye.class,Z),ie&4&&s(ne,"style",fe.style,ye.style,Z),ie&8){const Pe=N.dynamicProps;for(let Xe=0;Xe{we&&On(we,Y,N,_),Te&&pr(N,_,Y,"updated")},ee)},x=(_,N,Y,ee,Z,Q,oe)=>{for(let ne=0;ne{if(N!==Y){if(N!==et)for(const Q in N)!Pr(Q)&&!(Q in Y)&&s(_,Q,N[Q],null,Z,ee);for(const Q in Y){if(Pr(Q))continue;const oe=Y[Q],ne=N[Q];oe!==ne&&Q!=="value"&&s(_,Q,ne,oe,Z,ee)}"value"in Y&&s(_,"value",N.value,Y.value,Z)}},P=(_,N,Y,ee,Z,Q,oe,ne,ie)=>{const te=N.el=_?_.el:a(""),Te=N.anchor=_?_.anchor:a("");let{patchFlag:fe,dynamicChildren:ye,slotScopeIds:we}=N;we&&(ne=ne?ne.concat(we):we),_==null?(r(te,Y,ee),r(Te,Y,ee),j(N.children||[],Y,Te,Z,Q,oe,ne,ie)):fe>0&&fe&64&&ye&&_.dynamicChildren?(x(_.dynamicChildren,ye,Y,Z,Q,oe,ne),(N.key!=null||Z&&N===Z.subTree)&&Bf(_,N,!0)):J(_,N,Y,Te,Z,Q,oe,ne,ie)},k=(_,N,Y,ee,Z,Q,oe,ne,ie)=>{N.slotScopeIds=ne,_==null?N.shapeFlag&512?Z.ctx.activate(N,Y,ee,oe,ie):$(N,Y,ee,Z,Q,oe,ie):q(_,N,ie)},$=(_,N,Y,ee,Z,Q,oe)=>{const ne=_.component=Wg(_,ee,Z);if(jo(_)&&(ne.ctx.renderer=lt),zg(ne,!1,oe),ne.asyncDep){if(Z&&Z.registerDep(ne,U,oe),!_.el){const ie=ne.subTree=St(It);T(null,ie,N,Y),_.placeholder=ie.el}}else U(ne,_,N,Y,Z,Q,oe)},q=(_,N,Y)=>{const ee=N.component=_.component;if(_0(_,N,Y))if(ee.asyncDep&&!ee.asyncResolved){W(ee,N,Y);return}else ee.next=N,ee.update();else N.el=_.el,ee.vnode=N},U=(_,N,Y,ee,Z,Q,oe)=>{const ne=()=>{if(_.isMounted){let{next:fe,bu:ye,u:we,parent:Pe,vnode:Xe}=_;{const B=kg(_);if(B){fe&&(fe.el=Xe.el,W(_,fe,oe)),B.asyncDep.then(()=>{_.isUnmounted||ne()});return}}let F=fe,H;di(_,!1),fe?(fe.el=Xe.el,W(_,fe,oe)):fe=Xe,ye&&Oi(ye),(H=fe.props&&fe.props.onVnodeBeforeUpdate)&&On(H,Pe,fe,Xe),di(_,!0);const w=Va(_),A=_.subTree;_.subTree=w,g(A,w,f(A.el),pe(A),_,Z,Q),fe.el=w.el,F===null&&tc(_,w.el),we&&kt(we,Z),(H=fe.props&&fe.props.onVnodeUpdated)&&kt(()=>On(H,Pe,fe,Xe),Z)}else{let fe;const{el:ye,props:we}=N,{bm:Pe,m:Xe,parent:F,root:H,type:w}=_,A=ii(N);if(di(_,!1),Pe&&Oi(Pe),!A&&(fe=we&&we.onVnodeBeforeMount)&&On(fe,F,N),di(_,!0),ye&&st){const B=()=>{_.subTree=Va(_),st(ye,_.subTree,_,Z,null)};A&&w.__asyncHydrate?w.__asyncHydrate(ye,_,B):B()}else{H.ce&&H.ce._def.shadowRoot!==!1&&H.ce._injectChildStyle(w);const B=_.subTree=Va(_);g(null,B,Y,ee,_,Z,Q),N.el=B.el}if(Xe&&kt(Xe,Z),!A&&(fe=we&&we.onVnodeMounted)){const B=N;kt(()=>On(fe,F,B),Z)}(N.shapeFlag&256||F&&ii(F.vnode)&&F.vnode.shapeFlag&256)&&_.a&&kt(_.a,Z),_.isMounted=!0,N=Y=ee=null}};_.scope.on();const ie=_.effect=new mo(ne);_.scope.off();const te=_.update=ie.run.bind(ie),Te=_.job=ie.runIfDirty.bind(ie);Te.i=_,Te.id=_.uid,ie.scheduler=()=>Of(Te),di(_,!0),te()},W=(_,N,Y)=>{N.component=_;const ee=_.vnode.props;_.vnode=N,_.next=null,x0(_,N.props,ee,Y),P0(_,N.children,Y),jr(),Wd(_),Hr()},J=(_,N,Y,ee,Z,Q,oe,ne,ie=!1)=>{const te=_&&_.children,Te=_?_.shapeFlag:0,fe=N.children,{patchFlag:ye,shapeFlag:we}=N;if(ye>0){if(ye&128){Ye(te,fe,Y,ee,Z,Q,oe,ne,ie);return}else if(ye&256){Se(te,fe,Y,ee,Z,Q,oe,ne,ie);return}}we&8?(Te&16&&re(te,Z,Q),fe!==te&&u(Y,fe)):Te&16?we&16?Ye(te,fe,Y,ee,Z,Q,oe,ne,ie):re(te,Z,Q,!0):(Te&8&&u(Y,""),we&16&&j(fe,Y,ee,Z,Q,oe,ne,ie))},Se=(_,N,Y,ee,Z,Q,oe,ne,ie)=>{_=_||wi,N=N||wi;const te=_.length,Te=N.length,fe=Math.min(te,Te);let ye;for(ye=0;yeTe?re(_,Z,Q,!0,!1,fe):j(N,Y,ee,Z,Q,oe,ne,ie,fe)},Ye=(_,N,Y,ee,Z,Q,oe,ne,ie)=>{let te=0;const Te=N.length;let fe=_.length-1,ye=Te-1;for(;te<=fe&&te<=ye;){const we=_[te],Pe=N[te]=ie?Qr(N[te]):_n(N[te]);if(sr(we,Pe))g(we,Pe,Y,null,Z,Q,oe,ne,ie);else break;te++}for(;te<=fe&&te<=ye;){const we=_[fe],Pe=N[ye]=ie?Qr(N[ye]):_n(N[ye]);if(sr(we,Pe))g(we,Pe,Y,null,Z,Q,oe,ne,ie);else break;fe--,ye--}if(te>fe){if(te<=ye){const we=ye+1,Pe=weye)for(;te<=fe;)ke(_[te],Z,Q,!0),te++;else{const we=te,Pe=te,Xe=new Map;for(te=Pe;te<=ye;te++){const se=N[te]=ie?Qr(N[te]):_n(N[te]);se.key!=null&&Xe.set(se.key,te)}let F,H=0;const w=ye-Pe+1;let A=!1,B=0;const G=new Array(w);for(te=0;te=w){ke(se,Z,Q,!0);continue}let le;if(se.key!=null)le=Xe.get(se.key);else for(F=Pe;F<=ye;F++)if(G[F-Pe]===0&&sr(se,N[F])){le=F;break}le===void 0?ke(se,Z,Q,!0):(G[le-Pe]=te+1,le>=B?B=le:A=!0,g(se,N[le],Y,null,Z,Q,oe,ne,ie),H++)}const X=A?L0(G):wi;for(F=X.length-1,te=w-1;te>=0;te--){const se=Pe+te,le=N[se],he=N[se+1],ce=se+1{const{el:Q,type:oe,transition:ne,children:ie,shapeFlag:te}=_;if(te&6){Ee(_.component.subTree,N,Y,ee);return}if(te&128){_.suspense.move(N,Y,ee);return}if(te&64){oe.move(_,N,Y,lt);return}if(oe===Ut){r(Q,N,Y);for(let fe=0;fene.enter(Q),Z);else{const{leave:fe,delayLeave:ye,afterLeave:we}=ne,Pe=()=>{_.ctx.isUnmounted?i(Q):r(Q,N,Y)},Xe=()=>{Q._isLeaving&&Q[Mr](!0),fe(Q,()=>{Pe(),we&&we()})};ye?ye(Q,Pe,Xe):Xe()}else r(Q,N,Y)},ke=(_,N,Y,ee=!1,Z=!1)=>{const{type:Q,props:oe,ref:ne,children:ie,dynamicChildren:te,shapeFlag:Te,patchFlag:fe,dirs:ye,cacheIndex:we}=_;if(fe===-2&&(Z=!1),ne!=null&&(jr(),is(ne,null,Y,_,!0),Hr()),we!=null&&(N.renderCache[we]=void 0),Te&256){N.ctx.deactivate(_);return}const Pe=Te&1&&ye,Xe=!ii(_);let F;if(Xe&&(F=oe&&oe.onVnodeBeforeUnmount)&&On(F,N,_),Te&6)xe(_.component,Y,ee);else{if(Te&128){_.suspense.unmount(Y,ee);return}Pe&&pr(_,null,N,"beforeUnmount"),Te&64?_.type.remove(_,N,Y,lt,ee):te&&!te.hasOnce&&(Q!==Ut||fe>0&&fe&64)?re(te,N,Y,!1,!0):(Q===Ut&&fe&384||!Z&&Te&16)&&re(ie,N,Y),ee&&Fe(_)}(Xe&&(F=oe&&oe.onVnodeUnmounted)||Pe)&&kt(()=>{F&&On(F,N,_),Pe&&pr(_,null,N,"unmounted")},Y)},Fe=_=>{const{type:N,el:Y,anchor:ee,transition:Z}=_;if(N===Ut){je(Y,ee);return}if(N===Mi){y(_);return}const Q=()=>{i(Y),Z&&!Z.persisted&&Z.afterLeave&&Z.afterLeave()};if(_.shapeFlag&1&&Z&&!Z.persisted){const{leave:oe,delayLeave:ne}=Z,ie=()=>oe(Y,Q);ne?ne(_.el,Q,ie):ie()}else Q()},je=(_,N)=>{let Y;for(;_!==N;)Y=d(_),i(_),_=Y;i(N)},xe=(_,N,Y)=>{const{bum:ee,scope:Z,job:Q,subTree:oe,um:ne,m:ie,a:te}=_;fl(ie),fl(te),ee&&Oi(ee),Z.stop(),Q&&(Q.flags|=8,ke(oe,_,N,Y)),ne&&kt(ne,N),kt(()=>{_.isUnmounted=!0},N)},re=(_,N,Y,ee=!1,Z=!1,Q=0)=>{for(let oe=Q;oe<_.length;oe++)ke(_[oe],N,Y,ee,Z)},pe=_=>{if(_.shapeFlag&6)return pe(_.component.subTree);if(_.shapeFlag&128)return _.suspense.next();const N=d(_.anchor||_.el),Y=N&&N[Jm];return Y?d(Y):N};let _e=!1;const Ie=(_,N,Y)=>{_==null?N._vnode&&ke(N._vnode,null,null,!0):g(N._vnode||null,_,N,null,null,null,Y),N._vnode=_,_e||(_e=!0,Wd(),ll(),_e=!1)},lt={p:g,um:ke,m:Ee,r:Fe,mt:$,mc:j,pc:J,pbc:x,n:pe,o:e};let dt,st;return t&&([dt,st]=t(lt)),{render:Ie,hydrate:dt,createApp:v0(Ie,dt)}}function Hc({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function di({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Lg(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Bf(e,t,n=!1){const r=e.children,i=t.children;if(be(r)&&be(i))for(let s=0;s>1,e[n[a]]0&&(t[r]=n[s-1]),n[s]=r)}}for(s=n.length,o=n[s-1];s-- >0;)n[s]=o,o=t[o];return n}function kg(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:kg(t)}function fl(e){if(e)for(let t=0;te.__isSuspense;let Iu=0;const k0={name:"Suspense",__isSuspense:!0,process(e,t,n,r,i,s,o,a,l,c){if(e==null)V0(t,n,r,i,s,o,a,l,c);else{if(s&&s.deps>0&&!e.suspense.isInFallback){t.suspense=e.suspense,t.suspense.vnode=t,t.el=e.el;return}B0(e,t,n,r,i,o,a,l,c)}},hydrate:j0,normalize:H0},F0=k0;function To(e,t){const n=e.props&&e.props[t];Le(n)&&n()}function V0(e,t,n,r,i,s,o,a,l){const{p:c,o:{createElement:u}}=l,f=u("div"),d=e.suspense=Fg(e,i,r,t,f,n,s,o,a,l);c(null,d.pendingBranch=e.ssContent,f,null,r,d,s,o),d.deps>0?(To(e,"onPending"),To(e,"onFallback"),c(null,e.ssFallback,t,n,r,null,s,o),os(d,e.ssFallback)):d.resolve(!1,!0)}function B0(e,t,n,r,i,s,o,a,{p:l,um:c,o:{createElement:u}}){const f=t.suspense=e.suspense;f.vnode=t,t.el=e.el;const d=t.ssContent,m=t.ssFallback,{activeBranch:p,pendingBranch:g,isInFallback:v,isHydrating:T}=f;if(g)f.pendingBranch=d,sr(g,d)?(l(g,d,f.hiddenContainer,null,i,f,s,o,a),f.deps<=0?f.resolve():v&&(T||(l(p,m,n,r,i,null,s,o,a),os(f,m)))):(f.pendingId=Iu++,T?(f.isHydrating=!1,f.activeBranch=g):c(g,i,f),f.deps=0,f.effects.length=0,f.hiddenContainer=u("div"),v?(l(null,d,f.hiddenContainer,null,i,f,s,o,a),f.deps<=0?f.resolve():(l(p,m,n,r,i,null,s,o,a),os(f,m))):p&&sr(p,d)?(l(p,d,n,r,i,f,s,o,a),f.resolve(!0)):(l(null,d,f.hiddenContainer,null,i,f,s,o,a),f.deps<=0&&f.resolve()));else if(p&&sr(p,d))l(p,d,n,r,i,f,s,o,a),os(f,d);else if(To(t,"onPending"),f.pendingBranch=d,d.shapeFlag&512?f.pendingId=d.component.suspenseId:f.pendingId=Iu++,l(null,d,f.hiddenContainer,null,i,f,s,o,a),f.deps<=0)f.resolve();else{const{timeout:S,pendingId:E}=f;S>0?setTimeout(()=>{f.pendingId===E&&f.fallback(m)},S):S===0&&f.fallback(m)}}function Fg(e,t,n,r,i,s,o,a,l,c,u=!1){const{p:f,m:d,um:m,n:p,o:{parentNode:g,remove:v}}=c;let T;const S=U0(e);S&&t&&t.pendingBranch&&(T=t.pendingId,t.deps++);const E=e.props?po(e.props.timeout):void 0,y=s,O={vnode:e,parent:t,parentComponent:n,namespace:o,container:r,hiddenContainer:i,deps:0,pendingId:Iu++,timeout:typeof E=="number"?E:-1,activeBranch:null,pendingBranch:null,isInFallback:!u,isHydrating:u,isUnmounted:!1,effects:[],resolve(M=!1,V=!1){const{vnode:j,activeBranch:D,pendingBranch:x,pendingId:L,effects:P,parentComponent:k,container:$,isInFallback:q}=O;let U=!1;O.isHydrating?O.isHydrating=!1:M||(U=D&&x.transition&&x.transition.mode==="out-in",U&&(D.transition.afterLeave=()=>{L===O.pendingId&&(d(x,$,s===y?p(D):s,0),yo(P),q&&j.ssFallback&&(j.ssFallback.el=null))}),D&&(g(D.el)===$&&(s=p(D)),m(D,k,O,!0),!U&&q&&j.ssFallback&&kt(()=>j.ssFallback.el=null,O)),U||d(x,$,s,0)),os(O,x),O.pendingBranch=null,O.isInFallback=!1;let W=O.parent,J=!1;for(;W;){if(W.pendingBranch){W.effects.push(...P),J=!0;break}W=W.parent}!J&&!U&&yo(P),O.effects=[],S&&t&&t.pendingBranch&&T===t.pendingId&&(t.deps--,t.deps===0&&!V&&t.resolve()),To(j,"onResolve")},fallback(M){if(!O.pendingBranch)return;const{vnode:V,activeBranch:j,parentComponent:D,container:x,namespace:L}=O;To(V,"onFallback");const P=p(j),k=()=>{O.isInFallback&&(f(null,M,x,P,D,null,L,a,l),os(O,M))},$=M.transition&&M.transition.mode==="out-in";$&&(j.transition.afterLeave=k),O.isInFallback=!0,m(j,D,null,!0),$||k()},move(M,V,j){O.activeBranch&&d(O.activeBranch,M,V,j),O.container=M},next(){return O.activeBranch&&p(O.activeBranch)},registerDep(M,V,j){const D=!!O.pendingBranch;D&&O.deps++;const x=M.vnode.el;M.asyncDep.catch(L=>{Ui(L,M,0)}).then(L=>{if(M.isUnmounted||O.isUnmounted||O.pendingId!==M.suspenseId)return;M.asyncResolved=!0;const{vnode:P}=M;Lu(M,L,!1),x&&(P.el=x);const k=!x&&M.subTree.el;V(M,P,g(x||M.subTree.el),x?null:p(M.subTree),O,o,j),k&&(P.placeholder=null,v(k)),tc(M,P.el),D&&--O.deps===0&&O.resolve()})},unmount(M,V){O.isUnmounted=!0,O.activeBranch&&m(O.activeBranch,n,M,V),O.pendingBranch&&m(O.pendingBranch,n,M,V)}};return O}function j0(e,t,n,r,i,s,o,a,l){const c=t.suspense=Fg(t,r,n,e.parentNode,document.createElement("div"),null,i,s,o,a,!0),u=l(e,c.pendingBranch=t.ssContent,n,c,s,o);return c.deps===0&&c.resolve(!1,!0),u}function H0(e){const{shapeFlag:t,children:n}=e,r=t&32;e.ssContent=ih(r?n.default:n),e.ssFallback=r?ih(n.fallback):St(It)}function ih(e){let t;if(Le(e)){const n=Ri&&e._c;n&&(e._d=!1,wo()),e=e(),n&&(e._d=!0,t=cn,Bg())}return be(e)&&(e=C0(e)),e=_n(e),t&&!e.dynamicChildren&&(e.dynamicChildren=t.filter(n=>n!==e)),e}function Vg(e,t){t&&t.pendingBranch?be(e)?t.effects.push(...e):t.effects.push(e):yo(e)}function os(e,t){e.activeBranch=t;const{vnode:n,parentComponent:r}=e;let i=t.el;for(;!i&&t.component;)t=t.component.subTree,i=t.el;n.el=i,r&&r.subTree===n&&(r.vnode.el=i,tc(r,i))}function U0(e){const t=e.props&&e.props.suspensible;return t!=null&&t!==!1}const Ut=Symbol.for("v-fgt"),si=Symbol.for("v-txt"),It=Symbol.for("v-cmt"),Mi=Symbol.for("v-stc"),so=[];let cn=null;function wo(e=!1){so.push(cn=e?null:[])}function Bg(){so.pop(),cn=so[so.length-1]||null}let Ri=1;function Do(e,t=!1){Ri+=e,e<0&&cn&&t&&(cn.hasOnce=!0)}function jg(e){return e.dynamicChildren=Ri>0?cn||wi:null,Bg(),Ri>0&&cn&&cn.push(e),e}function $0(e,t,n,r,i,s){return jg(jf(e,t,n,r,i,s,!0))}function hl(e,t,n,r,i){return jg(St(e,t,n,r,i,!0))}function $r(e){return e?e.__v_isVNode===!0:!1}function sr(e,t){return e.type===t.type&&e.key===t.key}function W0(e){}const Hg=({key:e})=>e??null,Ba=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?Be(e)||jt(e)||Le(e)?{i:Xt,r:e,k:t,f:!!n}:e:null);function jf(e,t=null,n=null,r=0,i=null,s=e===Ut?0:1,o=!1,a=!1){const l={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Hg(t),ref:t&&Ba(t),scopeId:Gl,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:s,patchFlag:r,dynamicProps:i,dynamicChildren:null,appContext:null,ctx:Xt};return a?(Uf(l,n),s&128&&e.normalize(l)):n&&(l.shapeFlag|=Be(n)?8:16),Ri>0&&!o&&cn&&(l.patchFlag>0||s&6)&&l.patchFlag!==32&&cn.push(l),l}const St=Y0;function Y0(e,t=null,n=null,r=0,i=null,s=!1){if((!e||e===hg)&&(e=It),$r(e)){const a=yr(e,t,!0);return n&&Uf(a,n),Ri>0&&!s&&cn&&(a.shapeFlag&6?cn[cn.indexOf(e)]=a:cn.push(a)),a.patchFlag=-2,a}if(q0(e)&&(e=e.__vccOpts),t){t=Ug(t);let{class:a,style:l}=t;a&&!Be(a)&&(t.class=Ds(a)),at(l)&&(Vo(l)&&!be(l)&&(l=Je({},l)),t.style=ws(l))}const o=Be(e)?1:dl(e)?128:Zm(e)?64:at(e)?4:Le(e)?2:0;return jf(e,t,n,r,i,o,s,!0)}function Ug(e){return e?Vo(e)||Og(e)?Je({},e):e:null}function yr(e,t,n=!1,r=!1){const{props:i,ref:s,patchFlag:o,children:a,transition:l}=e,c=t?$g(i||{},t):i,u={__v_isVNode:!0,__v_skip:!0,type:e.type,props:c,key:c&&Hg(c),ref:t&&t.ref?n&&s?be(s)?s.concat(Ba(t)):[s,Ba(t)]:Ba(t):s,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Ut?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:l,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&yr(e.ssContent),ssFallback:e.ssFallback&&yr(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return l&&r&&Ur(u,l.clone(u)),u}function Hf(e=" ",t=0){return St(si,null,e,t)}function z0(e,t){const n=St(Mi,null,e);return n.staticCount=t,n}function K0(e="",t=!1){return t?(wo(),hl(It,null,e)):St(It,null,e)}function _n(e){return e==null||typeof e=="boolean"?St(It):be(e)?St(Ut,null,e.slice()):$r(e)?Qr(e):St(si,null,String(e))}function Qr(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:yr(e)}function Uf(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(be(t))n=16;else if(typeof t=="object")if(r&65){const i=t.default;i&&(i._c&&(i._d=!1),Uf(e,i()),i._c&&(i._d=!0));return}else{n=32;const i=t._;!i&&!Og(t)?t._ctx=Xt:i===3&&Xt&&(Xt.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else Le(t)?(t={default:t,_ctx:Xt},n=32):(t=String(t),r&64?(n=16,t=[Hf(t)]):n=8);e.children=t,e.shapeFlag|=n}function $g(...e){const t={};for(let n=0;nGt||Xt;let pl,Ru;{const e=ko(),t=(n,r)=>{let i;return(i=e[n])||(i=e[n]=[]),i.push(r),s=>{i.length>1?i.forEach(o=>o(s)):i[0](s)}};pl=t("__VUE_INSTANCE_SETTERS__",n=>Gt=n),Ru=t("__VUE_SSR_SETTERS__",n=>ds=n)}const Pi=e=>{const t=Gt;return pl(e),e.scope.on(),()=>{e.scope.off(),pl(t)}},Pu=()=>{Gt&&Gt.scope.off(),pl(null)};function Yg(e){return e.vnode.shapeFlag&4}let ds=!1;function zg(e,t=!1,n=!1){t&&Ru(t);const{props:r,children:i}=e.vnode,s=Yg(e);M0(e,r,s,t),R0(e,i,n||t);const o=s?J0(e,t):void 0;return t&&Ru(!1),o}function J0(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,_u);const{setup:r}=n;if(r){jr();const i=e.setupContext=r.length>1?Xg(e):null,s=Pi(e),o=Cs(r,e,0,[e.props,i]),a=jl(o);if(Hr(),s(),(a||e.sp)&&!ii(e)&&Nf(e),a){if(o.then(Pu,Pu),t)return o.then(l=>{Lu(e,l,t)}).catch(l=>{Ui(l,e,0)});e.asyncDep=o}else Lu(e,o,t)}else Gg(e,t)}function Lu(e,t,n){Le(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:at(t)&&(e.setupState=Cf(t)),Gg(e,n)}let ml,ku;function Kg(e){ml=e,ku=t=>{t.render._rc&&(t.withProxy=new Proxy(t.ctx,ZS))}}const Z0=()=>!ml;function Gg(e,t,n){const r=e.type;if(!e.render){if(!t&&ml&&!r.render){const i=r.template||kf(e).template;if(i){const{isCustomElement:s,compilerOptions:o}=e.appContext.config,{delimiters:a,compilerOptions:l}=r,c=Je(Je({isCustomElement:s,delimiters:a},o),l);r.render=ml(i,c)}}e.render=r.render||Bt,ku&&ku(e)}{const i=Pi(e);jr();try{f0(e)}finally{Hr(),i()}}}const Q0={get(e,t){return sn(e,"get",""),e[t]}};function Xg(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Q0),slots:e.slots,emit:e.emit,expose:t}}function $o(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Cf(Bm(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in ro)return ro[n](e)},has(t,n){return n in t||n in ro}})):e.proxy}function Fu(e,t=!0){return Le(e)?e.displayName||e.name:e.name||t&&e.__name}function q0(e){return Le(e)&&"__vccOpts"in e}const Jg=(e,t)=>aS(e,t,ds);function $f(e,t,n){try{Do(-1);const r=arguments.length;return r===2?at(t)&&!be(t)?$r(t)?St(e,null,[t]):St(e,t):St(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&$r(n)&&(n=[n]),St(e,t,n))}finally{Do(1)}}function eT(){}function tT(e,t,n,r){const i=n[r];if(i&&Zg(i,e))return i;const s=t();return s.memo=e.slice(),s.cacheIndex=r,n[r]=s}function Zg(e,t){const n=e.memo;if(n.length!=t.length)return!1;for(let r=0;r0&&cn&&cn.push(e),!0}const Qg="3.5.25",nT=Bt,rT=gS,iT=qi,sT=Xm,oT={createComponentInstance:Wg,setupComponent:zg,renderComponentRoot:Va,setCurrentRenderingInstance:bo,isVNode:$r,normalizeVNode:_n,getComponentPublicInstance:$o,ensureValidVNode:Lf,pushWarningContext:dS,popWarningContext:hS},aT=oT,lT=null,cT=null,uT=null;/** +* @vue/runtime-dom v3.5.25 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let Vu;const sh=typeof window<"u"&&window.trustedTypes;if(sh)try{Vu=sh.createPolicy("vue",{createHTML:e=>e})}catch{}const qg=Vu?e=>Vu.createHTML(e):e=>e,fT="http://www.w3.org/2000/svg",dT="http://www.w3.org/1998/Math/MathML",_r=typeof document<"u"?document:null,oh=_r&&_r.createElement("template"),ev={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const i=t==="svg"?_r.createElementNS(fT,e):t==="mathml"?_r.createElementNS(dT,e):n?_r.createElement(e,{is:n}):_r.createElement(e);return e==="select"&&r&&r.multiple!=null&&i.setAttribute("multiple",r.multiple),i},createText:e=>_r.createTextNode(e),createComment:e=>_r.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>_r.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,i,s){const o=n?n.previousSibling:t.lastChild;if(i&&(i===s||i.nextSibling))for(;t.insertBefore(i.cloneNode(!0),n),!(i===s||!(i=i.nextSibling)););else{oh.innerHTML=qg(r==="svg"?`${e}`:r==="mathml"?`${e}`:e);const a=oh.content;if(r==="svg"||r==="mathml"){const l=a.firstChild;for(;l.firstChild;)a.appendChild(l.firstChild);a.removeChild(l)}t.insertBefore(a,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},zr="transition",Is="animation",hs=Symbol("_vtc"),tv={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},nv=Je({},Mf,tv),hT=e=>(e.displayName="Transition",e.props=nv,e),pT=hT((e,{slots:t})=>$f(ng,rv(e),t)),hi=(e,t=[])=>{be(e)?e.forEach(n=>n(...t)):e&&e(...t)},ah=e=>e?be(e)?e.some(t=>t.length>1):e.length>1:!1;function rv(e){const t={};for(const P in e)P in tv||(t[P]=e[P]);if(e.css===!1)return t;const{name:n="v",type:r,duration:i,enterFromClass:s=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:a=`${n}-enter-to`,appearFromClass:l=s,appearActiveClass:c=o,appearToClass:u=a,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:d=`${n}-leave-active`,leaveToClass:m=`${n}-leave-to`}=e,p=mT(i),g=p&&p[0],v=p&&p[1],{onBeforeEnter:T,onEnter:S,onEnterCancelled:E,onLeave:y,onLeaveCancelled:O,onBeforeAppear:M=T,onAppear:V=S,onAppearCancelled:j=E}=t,D=(P,k,$,q)=>{P._enterCancelled=q,Gr(P,k?u:a),Gr(P,k?c:o),$&&$()},x=(P,k)=>{P._isLeaving=!1,Gr(P,f),Gr(P,m),Gr(P,d),k&&k()},L=P=>(k,$)=>{const q=P?V:S,U=()=>D(k,P,$);hi(q,[k,U]),lh(()=>{Gr(k,P?l:s),fr(k,P?u:a),ah(q)||ch(k,r,g,U)})};return Je(t,{onBeforeEnter(P){hi(T,[P]),fr(P,s),fr(P,o)},onBeforeAppear(P){hi(M,[P]),fr(P,l),fr(P,c)},onEnter:L(!1),onAppear:L(!0),onLeave(P,k){P._isLeaving=!0;const $=()=>x(P,k);fr(P,f),P._enterCancelled?(fr(P,d),Bu(P)):(Bu(P),fr(P,d)),lh(()=>{P._isLeaving&&(Gr(P,f),fr(P,m),ah(y)||ch(P,r,v,$))}),hi(y,[P,$])},onEnterCancelled(P){D(P,!1,void 0,!0),hi(E,[P])},onAppearCancelled(P){D(P,!0,void 0,!0),hi(j,[P])},onLeaveCancelled(P){x(P),hi(O,[P])}})}function mT(e){if(e==null)return null;if(at(e))return[Uc(e.enter),Uc(e.leave)];{const t=Uc(e);return[t,t]}}function Uc(e){return po(e)}function fr(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[hs]||(e[hs]=new Set)).add(t)}function Gr(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[hs];n&&(n.delete(t),n.size||(e[hs]=void 0))}function lh(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let gT=0;function ch(e,t,n,r){const i=e._endId=++gT,s=()=>{i===e._endId&&r()};if(n!=null)return setTimeout(s,n);const{type:o,timeout:a,propCount:l}=iv(e,t);if(!o)return r();const c=o+"end";let u=0;const f=()=>{e.removeEventListener(c,d),s()},d=m=>{m.target===e&&++u>=l&&f()};setTimeout(()=>{u(n[p]||"").split(", "),i=r(`${zr}Delay`),s=r(`${zr}Duration`),o=uh(i,s),a=r(`${Is}Delay`),l=r(`${Is}Duration`),c=uh(a,l);let u=null,f=0,d=0;t===zr?o>0&&(u=zr,f=o,d=s.length):t===Is?c>0&&(u=Is,f=c,d=l.length):(f=Math.max(o,c),u=f>0?o>c?zr:Is:null,d=u?u===zr?s.length:l.length:0);const m=u===zr&&/\b(?:transform|all)(?:,|$)/.test(r(`${zr}Property`).toString());return{type:u,timeout:f,propCount:d,hasTransform:m}}function uh(e,t){for(;e.lengthfh(n)+fh(e[r])))}function fh(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Bu(e){return(e?e.ownerDocument:document).body.offsetHeight}function vT(e,t,n){const r=e[hs];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const gl=Symbol("_vod"),sv=Symbol("_vsh"),ov={name:"show",beforeMount(e,{value:t},{transition:n}){e[gl]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Rs(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),Rs(e,!0),r.enter(e)):r.leave(e,()=>{Rs(e,!1)}):Rs(e,t))},beforeUnmount(e,{value:t}){Rs(e,t)}};function Rs(e,t){e.style.display=t?e[gl]:"none",e[sv]=!t}function yT(){ov.getSSRProps=({value:e})=>{if(!e)return{style:{display:"none"}}}}const av=Symbol("");function ET(e){const t=Pn();if(!t)return;const n=t.ut=(i=e(t.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner="${t.uid}"]`)).forEach(s=>vl(s,i))},r=()=>{const i=e(t.proxy);t.ce?vl(t.ce,i):ju(t.subTree,i),n(i)};If(()=>{yo(r)}),Ho(()=>{ss(r,Bt,{flush:"post"});const i=new MutationObserver(r);i.observe(t.subTree.el.parentNode,{childList:!0}),ql(()=>i.disconnect())})}function ju(e,t){if(e.shapeFlag&128){const n=e.suspense;e=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push(()=>{ju(n.activeBranch,t)})}for(;e.component;)e=e.component.subTree;if(e.shapeFlag&1&&e.el)vl(e.el,t);else if(e.type===Ut)e.children.forEach(n=>ju(n,t));else if(e.type===Mi){let{el:n,anchor:r}=e;for(;n&&(vl(n,t),n!==r);)n=n.nextSibling}}function vl(e,t){if(e.nodeType===1){const n=e.style;let r="";for(const i in t){const s=Sm(t[i]);n.setProperty(`--${i}`,s),r+=`--${i}: ${s};`}n[av]=r}}const bT=/(?:^|;)\s*display\s*:/;function ST(e,t,n){const r=e.style,i=Be(n);let s=!1;if(n&&!i){if(t)if(Be(t))for(const o of t.split(";")){const a=o.slice(0,o.indexOf(":")).trim();n[a]==null&&ja(r,a,"")}else for(const o in t)n[o]==null&&ja(r,o,"");for(const o in n)o==="display"&&(s=!0),ja(r,o,n[o])}else if(i){if(t!==n){const o=r[av];o&&(n+=";"+o),r.cssText=n,s=bT.test(n)}}else t&&e.removeAttribute("style");gl in e&&(e[gl]=s?r.display:"",e[sv]&&(r.display="none"))}const dh=/\s*!important$/;function ja(e,t,n){if(be(n))n.forEach(r=>ja(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=TT(e,t);dh.test(n)?e.setProperty(on(r),n.replace(dh,""),"important"):e[r]=n}}const hh=["Webkit","Moz","ms"],$c={};function TT(e,t){const n=$c[t];if(n)return n;let r=mt(t);if(r!=="filter"&&r in e)return $c[t]=r;r=fi(r);for(let i=0;iWc||(OT.then(()=>Wc=0),Wc=Date.now());function _T(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;Xn(MT(r,n.value),t,5,[r])};return n.value=e,n.attached=AT(),n}function MT(e,t){if(be(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>i=>!i._stopped&&r&&r(i))}else return t}const Eh=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,lv=(e,t,n,r,i,s)=>{const o=i==="svg";t==="class"?vT(e,r,o):t==="style"?ST(e,n,r):ci(t)?Vl(t)||DT(e,t,n,r,s):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):xT(e,t,r,o))?(gh(e,t,r),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&mh(e,t,r,o,s,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!Be(r))?gh(e,mt(t),r,s,t):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),mh(e,t,r,o))};function xT(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&Eh(t)&&Le(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const i=e.tagName;if(i==="IMG"||i==="VIDEO"||i==="CANVAS"||i==="SOURCE")return!1}return Eh(t)&&Be(n)?!1:t in e}const bh={};function cv(e,t,n){let r=xf(e,t);Ro(r)&&(r=Je({},r,t));class i extends nc{constructor(o){super(r,o,n)}}return i.def=r,i}const NT=(e,t)=>cv(e,t,Sv),IT=typeof HTMLElement<"u"?HTMLElement:class{};class nc extends IT{constructor(t,n={},r=bl){super(),this._def=t,this._props=n,this._createApp=r,this._isVueCE=!0,this._instance=null,this._app=null,this._nonce=this._def.nonce,this._connected=!1,this._resolved=!1,this._patching=!1,this._dirty=!1,this._numberProps=null,this._styleChildren=new WeakSet,this._ob=null,this.shadowRoot&&r!==bl?this._root=this.shadowRoot:t.shadowRoot!==!1?(this.attachShadow(Je({},t.shadowRootOptions,{mode:"open"})),this._root=this.shadowRoot):this._root=this}connectedCallback(){if(!this.isConnected)return;!this.shadowRoot&&!this._resolved&&this._parseSlots(),this._connected=!0;let t=this;for(;t=t&&(t.parentNode||t.host);)if(t instanceof nc){this._parent=t;break}this._instance||(this._resolved?this._mount(this._def):t&&t._pendingResolve?this._pendingResolve=t._pendingResolve.then(()=>{this._pendingResolve=void 0,this._resolveDef()}):this._resolveDef())}_setParent(t=this._parent){t&&(this._instance.parent=t._instance,this._inheritParentContext(t))}_inheritParentContext(t=this._parent){t&&this._app&&Object.setPrototypeOf(this._app._context.provides,t._instance.provides)}disconnectedCallback(){this._connected=!1,Kl(()=>{this._connected||(this._ob&&(this._ob.disconnect(),this._ob=null),this._app&&this._app.unmount(),this._instance&&(this._instance.ce=void 0),this._app=this._instance=null,this._teleportTargets&&(this._teleportTargets.clear(),this._teleportTargets=void 0))})}_processMutations(t){for(const n of t)this._setAttr(n.attributeName)}_resolveDef(){if(this._pendingResolve)return;for(let r=0;r{this._resolved=!0,this._pendingResolve=void 0;const{props:s,styles:o}=r;let a;if(s&&!be(s))for(const l in s){const c=s[l];(c===Number||c&&c.type===Number)&&(l in this._props&&(this._props[l]=po(this._props[l])),(a||(a=Object.create(null)))[mt(l)]=!0)}this._numberProps=a,this._resolveProps(r),this.shadowRoot&&this._applyStyles(o),this._mount(r)},n=this._def.__asyncLoader;n?this._pendingResolve=n().then(r=>{r.configureApp=this._def.configureApp,t(this._def=r,!0)}):t(this._def)}_mount(t){this._app=this._createApp(t),this._inheritParentContext(),t.configureApp&&t.configureApp(this._app),this._app._ceVNode=this._createVNode(),this._app.mount(this._root);const n=this._instance&&this._instance.exposed;if(n)for(const r in n)ot(this,r)||Object.defineProperty(this,r,{get:()=>Bo(n[r])})}_resolveProps(t){const{props:n}=t,r=be(n)?n:Object.keys(n||{});for(const i of Object.keys(this))i[0]!=="_"&&r.includes(i)&&this._setProp(i,this[i]);for(const i of r.map(mt))Object.defineProperty(this,i,{get(){return this._getProp(i)},set(s){this._setProp(i,s,!0,!this._patching)}})}_setAttr(t){if(t.startsWith("data-v-"))return;const n=this.hasAttribute(t);let r=n?this.getAttribute(t):bh;const i=mt(t);n&&this._numberProps&&this._numberProps[i]&&(r=po(r)),this._setProp(i,r,!1,!0)}_getProp(t){return this._props[t]}_setProp(t,n,r=!0,i=!1){if(n!==this._props[t]&&(this._dirty=!0,n===bh?delete this._props[t]:(this._props[t]=n,t==="key"&&this._app&&(this._app._ceVNode.key=n)),i&&this._instance&&this._update(),r)){const s=this._ob;s&&(this._processMutations(s.takeRecords()),s.disconnect()),n===!0?this.setAttribute(on(t),""):typeof n=="string"||typeof n=="number"?this.setAttribute(on(t),n+""):n||this.removeAttribute(on(t)),s&&s.observe(this,{attributes:!0})}}_update(){const t=this._createVNode();this._app&&(t.appContext=this._app._context),bv(t,this._root)}_createVNode(){const t={};this.shadowRoot||(t.onVnodeMounted=t.onVnodeUpdated=this._renderSlots.bind(this));const n=St(this._def,Je(t,this._props));return this._instance||(n.ce=r=>{this._instance=r,r.ce=this,r.isCE=!0;const i=(s,o)=>{this.dispatchEvent(new CustomEvent(s,Ro(o[0])?Je({detail:o},o[0]):{detail:o}))};r.emit=(s,...o)=>{i(s,o),on(s)!==s&&i(on(s),o)},this._setParent()}),n}_applyStyles(t,n){if(!t)return;if(n){if(n===this._def||this._styleChildren.has(n))return;this._styleChildren.add(n)}const r=this._nonce;for(let i=t.length-1;i>=0;i--){const s=document.createElement("style");r&&s.setAttribute("nonce",r),s.textContent=t[i],this.shadowRoot.prepend(s)}}_parseSlots(){const t=this._slots={};let n;for(;n=this.firstChild;){const r=n.nodeType===1&&n.getAttribute("slot")||"default";(t[r]||(t[r]=[])).push(n),this.removeChild(n)}}_renderSlots(){const t=this._getSlots(),n=this._instance.type.__scopeId;for(let r=0;r(delete e.props.mode,e),kT=LT({name:"TransitionGroup",props:Je({},nv,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=Pn(),r=_f();let i,s;return Zl(()=>{if(!i.length)return;const o=e.moveClass||`${e.name||"v"}-move`;if(!HT(i[0].el,n.vnode.el,o)){i=[];return}i.forEach(VT),i.forEach(BT);const a=i.filter(jT);Bu(n.vnode.el),a.forEach(l=>{const c=l.el,u=c.style;fr(c,o),u.transform=u.webkitTransform=u.transitionDuration="";const f=c[yl]=d=>{d&&d.target!==c||(!d||d.propertyName.endsWith("transform"))&&(c.removeEventListener("transitionend",f),c[yl]=null,Gr(c,o))};c.addEventListener("transitionend",f)}),i=[]}),()=>{const o=it(e),a=rv(o);let l=o.tag||Ut;if(i=[],s)for(let c=0;c{a.split(/\s+/).forEach(l=>l&&r.classList.remove(l))}),n.split(/\s+/).forEach(a=>a&&r.classList.add(a)),r.style.display="none";const s=t.nodeType===1?t:t.parentNode;s.appendChild(r);const{hasTransform:o}=iv(r);return s.removeChild(r),o}const ai=e=>{const t=e.props["onUpdate:modelValue"]||!1;return be(t)?n=>Oi(t,n):t};function UT(e){e.target.composing=!0}function Th(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Kn=Symbol("_assign");function wh(e,t,n){return t&&(e=e.trim()),n&&(e=Lo(e)),e}const El={created(e,{modifiers:{lazy:t,trim:n,number:r}},i){e[Kn]=ai(i);const s=r||i.props&&i.props.type==="number";Ir(e,t?"change":"input",o=>{o.target.composing||e[Kn](wh(e.value,n,s))}),(n||s)&&Ir(e,"change",()=>{e.value=wh(e.value,n,s)}),t||(Ir(e,"compositionstart",UT),Ir(e,"compositionend",Th),Ir(e,"change",Th))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:i,number:s}},o){if(e[Kn]=ai(o),e.composing)return;const a=(s||e.type==="number")&&!/^0\d/.test(e.value)?Lo(e.value):e.value,l=t??"";a!==l&&(document.activeElement===e&&e.type!=="range"&&(r&&t===n||i&&e.value.trim()===l)||(e.value=l))}},Wf={deep:!0,created(e,t,n){e[Kn]=ai(n),Ir(e,"change",()=>{const r=e._modelValue,i=ps(e),s=e.checked,o=e[Kn];if(be(r)){const a=Fo(r,i),l=a!==-1;if(s&&!l)o(r.concat(i));else if(!s&&l){const c=[...r];c.splice(a,1),o(c)}}else if(ui(r)){const a=new Set(r);s?a.add(i):a.delete(i),o(a)}else o(pv(e,s))})},mounted:Dh,beforeUpdate(e,t,n){e[Kn]=ai(n),Dh(e,t,n)}};function Dh(e,{value:t,oldValue:n},r){e._modelValue=t;let i;if(be(t))i=Fo(t,r.props.value)>-1;else if(ui(t))i=t.has(r.props.value);else{if(t===n)return;i=Br(t,pv(e,!0))}e.checked!==i&&(e.checked=i)}const Yf={created(e,{value:t},n){e.checked=Br(t,n.props.value),e[Kn]=ai(n),Ir(e,"change",()=>{e[Kn](ps(e))})},beforeUpdate(e,{value:t,oldValue:n},r){e[Kn]=ai(r),t!==n&&(e.checked=Br(t,r.props.value))}},hv={deep:!0,created(e,{value:t,modifiers:{number:n}},r){const i=ui(t);Ir(e,"change",()=>{const s=Array.prototype.filter.call(e.options,o=>o.selected).map(o=>n?Lo(ps(o)):ps(o));e[Kn](e.multiple?i?new Set(s):s:s[0]),e._assigning=!0,Kl(()=>{e._assigning=!1})}),e[Kn]=ai(r)},mounted(e,{value:t}){Ch(e,t)},beforeUpdate(e,t,n){e[Kn]=ai(n)},updated(e,{value:t}){e._assigning||Ch(e,t)}};function Ch(e,t){const n=e.multiple,r=be(t);if(!(n&&!r&&!ui(t))){for(let i=0,s=e.options.length;iString(c)===String(a)):o.selected=Fo(t,a)>-1}else o.selected=t.has(a);else if(Br(ps(o),t)){e.selectedIndex!==i&&(e.selectedIndex=i);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function ps(e){return"_value"in e?e._value:e.value}function pv(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const mv={created(e,t,n){ga(e,t,n,null,"created")},mounted(e,t,n){ga(e,t,n,null,"mounted")},beforeUpdate(e,t,n,r){ga(e,t,n,r,"beforeUpdate")},updated(e,t,n,r){ga(e,t,n,r,"updated")}};function gv(e,t){switch(e){case"SELECT":return hv;case"TEXTAREA":return El;default:switch(t){case"checkbox":return Wf;case"radio":return Yf;default:return El}}}function ga(e,t,n,r,i){const o=gv(e.tagName,n.props&&n.props.type)[i];o&&o(e,t,n,r)}function $T(){El.getSSRProps=({value:e})=>({value:e}),Yf.getSSRProps=({value:e},t)=>{if(t.props&&Br(t.props.value,e))return{checked:!0}},Wf.getSSRProps=({value:e},t)=>{if(be(e)){if(t.props&&Fo(e,t.props.value)>-1)return{checked:!0}}else if(ui(e)){if(t.props&&e.has(t.props.value))return{checked:!0}}else if(e)return{checked:!0}},mv.getSSRProps=(e,t)=>{if(typeof t.type!="string")return;const n=gv(t.type.toUpperCase(),t.props&&t.props.type);if(n.getSSRProps)return n.getSSRProps(e,t)}}const WT=["ctrl","shift","alt","meta"],YT={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>WT.some(n=>e[`${n}Key`]&&!t.includes(n))},zT=(e,t)=>{const n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=(i,...s)=>{for(let o=0;o{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=i=>{if(!("key"in i))return;const s=on(i.key);if(t.some(o=>o===s||KT[o]===s))return e(i)})},vv=Je({patchProp:lv},ev);let oo,Oh=!1;function yv(){return oo||(oo=Ig(vv))}function Ev(){return oo=Oh?oo:Rg(vv),Oh=!0,oo}const bv=(...e)=>{yv().render(...e)},XT=(...e)=>{Ev().hydrate(...e)},bl=(...e)=>{const t=yv().createApp(...e),{mount:n}=t;return t.mount=r=>{const i=wv(r);if(!i)return;const s=t._component;!Le(s)&&!s.render&&!s.template&&(s.template=i.innerHTML),i.nodeType===1&&(i.textContent="");const o=n(i,!1,Tv(i));return i instanceof Element&&(i.removeAttribute("v-cloak"),i.setAttribute("data-v-app","")),o},t},Sv=(...e)=>{const t=Ev().createApp(...e),{mount:n}=t;return t.mount=r=>{const i=wv(r);if(i)return n(i,!0,Tv(i))},t};function Tv(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function wv(e){return Be(e)?document.querySelector(e):e}let Ah=!1;const JT=()=>{Ah||(Ah=!0,$T(),yT())},Dv=Object.freeze(Object.defineProperty({__proto__:null,BaseTransition:ng,BaseTransitionPropsValidators:Mf,Comment:It,DeprecationTypes:uT,EffectScope:Sf,ErrorCodes:mS,ErrorTypeStrings:rT,Fragment:Ut,KeepAlive:US,ReactiveEffect:mo,Static:Mi,Suspense:F0,Teleport:DS,Text:si,TrackOpTypes:lS,Transition:pT,TransitionGroup:FT,TriggerOpTypes:cS,VueElement:nc,assertNumber:pS,callWithAsyncErrorHandling:Xn,callWithErrorHandling:Cs,camelize:mt,capitalize:fi,cloneVNode:yr,compatUtils:cT,computed:Jg,createApp:bl,createBlock:hl,createCommentVNode:K0,createElementBlock:$0,createElementVNode:jf,createHydrationRenderer:Rg,createPropsRestProxy:c0,createRenderer:Ig,createSSRApp:Sv,createSlots:GS,createStaticVNode:z0,createTextVNode:Hf,createVNode:St,customRef:Um,defineAsyncComponent:jS,defineComponent:xf,defineCustomElement:cv,defineEmits:qS,defineExpose:e0,defineModel:r0,defineOptions:t0,defineProps:QS,defineSSRCustomElement:NT,defineSlots:n0,devtools:iT,effect:xb,effectScope:Ab,getCurrentInstance:Pn,getCurrentScope:Tm,getCurrentWatcher:uS,getTransitionRawChildren:Xl,guardReactiveProps:Ug,h:$f,handleError:Ui,hasInjectionContext:y0,hydrate:XT,hydrateOnIdle:PS,hydrateOnInteraction:VS,hydrateOnMediaQuery:FS,hydrateOnVisible:kS,initCustomFormatter:eT,initDirectivesForSSR:JT,inject:io,isMemoSame:Zg,isProxy:Vo,isReactive:Lr,isReadonly:vr,isRef:jt,isRuntimeOnly:Z0,isShallow:Nn,isVNode:$r,markRaw:Bm,mergeDefaults:a0,mergeModels:l0,mergeProps:$g,nextTick:Kl,nodeOps:ev,normalizeClass:Ds,normalizeProps:fm,normalizeStyle:ws,onActivated:ig,onBeforeMount:ag,onBeforeUnmount:Ql,onBeforeUpdate:If,onDeactivated:sg,onErrorCaptured:fg,onMounted:Ho,onRenderTracked:ug,onRenderTriggered:cg,onScopeDispose:_b,onServerPrefetch:lg,onUnmounted:ql,onUpdated:Zl,onWatcherCleanup:Wm,openBlock:wo,patchProp:lv,popScopeId:bS,provide:vg,proxyRefs:Cf,pushScopeId:ES,queuePostFlushCb:yo,reactive:Yl,readonly:sl,ref:to,registerRuntimeCompiler:Kg,render:bv,renderList:KS,renderSlot:XS,resolveComponent:dg,resolveDirective:zS,resolveDynamicComponent:YS,resolveFilter:lT,resolveTransitionHooks:fs,setBlockTracking:Do,setDevtoolsHook:sT,setTransitionHooks:Ur,shallowReactive:Vm,shallowReadonly:Jb,shallowRef:jm,ssrContextKey:yg,ssrUtils:aT,stop:Nb,toDisplayString:bf,toHandlerKey:Ci,toHandlers:JS,toRaw:it,toRef:sS,toRefs:nS,toValue:qb,transformVNodeArgs:W0,triggerRef:Qb,unref:Bo,useAttrs:o0,useCssModule:PT,useCssVars:ET,useHost:uv,useId:OS,useModel:T0,useSSRContext:Eg,useShadowRoot:RT,useSlots:s0,useTemplateRef:AS,useTransitionState:_f,vModelCheckbox:Wf,vModelDynamic:mv,vModelRadio:Yf,vModelSelect:hv,vModelText:El,vShow:ov,version:Qg,warn:nT,watch:ss,watchEffect:E0,watchPostEffect:b0,watchSyncEffect:bg,withAsyncContext:u0,withCtx:Af,withDefaults:i0,withDirectives:TS,withKeys:GT,withMemo:tT,withModifiers:zT,withScopeId:SS},Symbol.toStringTag,{value:"Module"}));/** +* @vue/compiler-core v3.5.25 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/const ms=Symbol(""),as=Symbol(""),rc=Symbol(""),Co=Symbol(""),zf=Symbol(""),li=Symbol(""),Kf=Symbol(""),Gf=Symbol(""),ic=Symbol(""),sc=Symbol(""),Os=Symbol(""),oc=Symbol(""),Xf=Symbol(""),ac=Symbol(""),lc=Symbol(""),cc=Symbol(""),uc=Symbol(""),fc=Symbol(""),dc=Symbol(""),Jf=Symbol(""),Zf=Symbol(""),Wo=Symbol(""),Oo=Symbol(""),hc=Symbol(""),pc=Symbol(""),gs=Symbol(""),As=Symbol(""),mc=Symbol(""),Sl=Symbol(""),Cv=Symbol(""),Tl=Symbol(""),Ao=Symbol(""),Ov=Symbol(""),Av=Symbol(""),gc=Symbol(""),_v=Symbol(""),Mv=Symbol(""),vc=Symbol(""),Qf=Symbol(""),Li={[ms]:"Fragment",[as]:"Teleport",[rc]:"Suspense",[Co]:"KeepAlive",[zf]:"BaseTransition",[li]:"openBlock",[Kf]:"createBlock",[Gf]:"createElementBlock",[ic]:"createVNode",[sc]:"createElementVNode",[Os]:"createCommentVNode",[oc]:"createTextVNode",[Xf]:"createStaticVNode",[ac]:"resolveComponent",[lc]:"resolveDynamicComponent",[cc]:"resolveDirective",[uc]:"resolveFilter",[fc]:"withDirectives",[dc]:"renderList",[Jf]:"renderSlot",[Zf]:"createSlots",[Wo]:"toDisplayString",[Oo]:"mergeProps",[hc]:"normalizeClass",[pc]:"normalizeStyle",[gs]:"normalizeProps",[As]:"guardReactiveProps",[mc]:"toHandlers",[Sl]:"camelize",[Cv]:"capitalize",[Tl]:"toHandlerKey",[Ao]:"setBlockTracking",[Ov]:"pushScopeId",[Av]:"popScopeId",[gc]:"withCtx",[_v]:"unref",[Mv]:"isRef",[vc]:"withMemo",[Qf]:"isMemoSame"};function xv(e){Object.getOwnPropertySymbols(e).forEach(t=>{Li[t]=e[t]})}const ZT={HTML:0,0:"HTML",SVG:1,1:"SVG",MATH_ML:2,2:"MATH_ML"},QT={ROOT:0,0:"ROOT",ELEMENT:1,1:"ELEMENT",TEXT:2,2:"TEXT",COMMENT:3,3:"COMMENT",SIMPLE_EXPRESSION:4,4:"SIMPLE_EXPRESSION",INTERPOLATION:5,5:"INTERPOLATION",ATTRIBUTE:6,6:"ATTRIBUTE",DIRECTIVE:7,7:"DIRECTIVE",COMPOUND_EXPRESSION:8,8:"COMPOUND_EXPRESSION",IF:9,9:"IF",IF_BRANCH:10,10:"IF_BRANCH",FOR:11,11:"FOR",TEXT_CALL:12,12:"TEXT_CALL",VNODE_CALL:13,13:"VNODE_CALL",JS_CALL_EXPRESSION:14,14:"JS_CALL_EXPRESSION",JS_OBJECT_EXPRESSION:15,15:"JS_OBJECT_EXPRESSION",JS_PROPERTY:16,16:"JS_PROPERTY",JS_ARRAY_EXPRESSION:17,17:"JS_ARRAY_EXPRESSION",JS_FUNCTION_EXPRESSION:18,18:"JS_FUNCTION_EXPRESSION",JS_CONDITIONAL_EXPRESSION:19,19:"JS_CONDITIONAL_EXPRESSION",JS_CACHE_EXPRESSION:20,20:"JS_CACHE_EXPRESSION",JS_BLOCK_STATEMENT:21,21:"JS_BLOCK_STATEMENT",JS_TEMPLATE_LITERAL:22,22:"JS_TEMPLATE_LITERAL",JS_IF_STATEMENT:23,23:"JS_IF_STATEMENT",JS_ASSIGNMENT_EXPRESSION:24,24:"JS_ASSIGNMENT_EXPRESSION",JS_SEQUENCE_EXPRESSION:25,25:"JS_SEQUENCE_EXPRESSION",JS_RETURN_STATEMENT:26,26:"JS_RETURN_STATEMENT"},qT={ELEMENT:0,0:"ELEMENT",COMPONENT:1,1:"COMPONENT",SLOT:2,2:"SLOT",TEMPLATE:3,3:"TEMPLATE"},ew={NOT_CONSTANT:0,0:"NOT_CONSTANT",CAN_SKIP_PATCH:1,1:"CAN_SKIP_PATCH",CAN_CACHE:2,2:"CAN_CACHE",CAN_STRINGIFY:3,3:"CAN_STRINGIFY"},Ht={start:{line:1,column:1,offset:0},end:{line:1,column:1,offset:0},source:""};function Nv(e,t=""){return{type:0,source:t,children:e,helpers:new Set,components:[],directives:[],hoists:[],imports:[],cached:[],temps:0,codegenNode:void 0,loc:Ht}}function vs(e,t,n,r,i,s,o,a=!1,l=!1,c=!1,u=Ht){return e&&(a?(e.helper(li),e.helper(Vi(e.inSSR,c))):e.helper(Fi(e.inSSR,c)),o&&e.helper(fc)),{type:13,tag:t,props:n,children:r,patchFlag:i,dynamicProps:s,directives:o,isBlock:a,disableTracking:l,isComponent:c,loc:u}}function oi(e,t=Ht){return{type:17,loc:t,elements:e}}function Un(e,t=Ht){return{type:15,loc:t,properties:e}}function Rt(e,t){return{type:16,loc:Ht,key:Be(e)?We(e,!0):e,value:t}}function We(e,t=!1,n=Ht,r=0){return{type:4,loc:n,content:e,isStatic:t,constType:t?3:r}}function tw(e,t){return{type:5,loc:t,content:Be(e)?We(e,!1,t):e}}function Gn(e,t=Ht){return{type:8,loc:t,children:e}}function Vt(e,t=[],n=Ht){return{type:14,loc:n,callee:e,arguments:t}}function ki(e,t=void 0,n=!1,r=!1,i=Ht){return{type:18,params:e,returns:t,newline:n,isSlot:r,loc:i}}function wl(e,t,n,r=!0){return{type:19,test:e,consequent:t,alternate:n,newline:r,loc:Ht}}function Iv(e,t,n=!1,r=!1){return{type:20,index:e,value:t,needPauseTracking:n,inVOnce:r,needArraySpread:!1,loc:Ht}}function Rv(e){return{type:21,body:e,loc:Ht}}function nw(e){return{type:22,elements:e,loc:Ht}}function rw(e,t,n){return{type:23,test:e,consequent:t,alternate:n,loc:Ht}}function iw(e,t){return{type:24,left:e,right:t,loc:Ht}}function sw(e){return{type:25,expressions:e,loc:Ht}}function ow(e){return{type:26,returns:e,loc:Ht}}function Fi(e,t){return e||t?ic:sc}function Vi(e,t){return e||t?Kf:Gf}function yc(e,{helper:t,removeHelper:n,inSSR:r}){e.isBlock||(e.isBlock=!0,n(Fi(r,e.isComponent)),t(li),t(Vi(r,e.isComponent)))}const _h=new Uint8Array([123,123]),Mh=new Uint8Array([125,125]);function xh(e){return e>=97&&e<=122||e>=65&&e<=90}function Hn(e){return e===32||e===10||e===9||e===12||e===13}function Kr(e){return e===47||e===62||Hn(e)}function Dl(e){const t=new Uint8Array(e.length);for(let n=0;n=0;i--){const s=this.newlines[i];if(t>s){n=i+2,r=t-s;break}}return{column:r,line:n,offset:t}}peek(){return this.buffer.charCodeAt(this.index+1)}stateText(t){t===60?(this.index>this.sectionStart&&this.cbs.ontext(this.sectionStart,this.index),this.state=5,this.sectionStart=this.index):!this.inVPre&&t===this.delimiterOpen[0]&&(this.state=2,this.delimiterIndex=0,this.stateInterpolationOpen(t))}stateInterpolationOpen(t){if(t===this.delimiterOpen[this.delimiterIndex])if(this.delimiterIndex===this.delimiterOpen.length-1){const n=this.index+1-this.delimiterOpen.length;n>this.sectionStart&&this.cbs.ontext(this.sectionStart,n),this.state=3,this.sectionStart=n}else this.delimiterIndex++;else this.inRCDATA?(this.state=32,this.stateInRCDATA(t)):(this.state=1,this.stateText(t))}stateInterpolation(t){t===this.delimiterClose[0]&&(this.state=4,this.delimiterIndex=0,this.stateInterpolationClose(t))}stateInterpolationClose(t){t===this.delimiterClose[this.delimiterIndex]?this.delimiterIndex===this.delimiterClose.length-1?(this.cbs.oninterpolation(this.sectionStart,this.index+1),this.inRCDATA?this.state=32:this.state=1,this.sectionStart=this.index+1):this.delimiterIndex++:(this.state=3,this.stateInterpolation(t))}stateSpecialStartSequence(t){const n=this.sequenceIndex===this.currentSequence.length;if(!(n?Kr(t):(t|32)===this.currentSequence[this.sequenceIndex]))this.inRCDATA=!1;else if(!n){this.sequenceIndex++;return}this.sequenceIndex=0,this.state=6,this.stateInTagName(t)}stateInRCDATA(t){if(this.sequenceIndex===this.currentSequence.length){if(t===62||Hn(t)){const n=this.index-this.currentSequence.length;if(this.sectionStart=t||(this.state===28?this.currentSequence===Qt.CdataEnd?this.cbs.oncdata(this.sectionStart,t):this.cbs.oncomment(this.sectionStart,t):this.state===6||this.state===11||this.state===18||this.state===17||this.state===12||this.state===13||this.state===14||this.state===15||this.state===16||this.state===20||this.state===19||this.state===21||this.state===9||this.cbs.ontext(this.sectionStart,t))}emitCodePoint(t,n){}}const lw={COMPILER_IS_ON_ELEMENT:"COMPILER_IS_ON_ELEMENT",COMPILER_V_BIND_SYNC:"COMPILER_V_BIND_SYNC",COMPILER_V_BIND_OBJECT_ORDER:"COMPILER_V_BIND_OBJECT_ORDER",COMPILER_V_ON_NATIVE:"COMPILER_V_ON_NATIVE",COMPILER_V_IF_V_FOR_PRECEDENCE:"COMPILER_V_IF_V_FOR_PRECEDENCE",COMPILER_NATIVE_TEMPLATE:"COMPILER_NATIVE_TEMPLATE",COMPILER_INLINE_TEMPLATE:"COMPILER_INLINE_TEMPLATE",COMPILER_FILTERS:"COMPILER_FILTERS"},cw={COMPILER_IS_ON_ELEMENT:{message:'Platform-native elements with "is" prop will no longer be treated as components in Vue 3 unless the "is" value is explicitly prefixed with "vue:".',link:"https://v3-migration.vuejs.org/breaking-changes/custom-elements-interop.html"},COMPILER_V_BIND_SYNC:{message:e=>`.sync modifier for v-bind has been removed. Use v-model with argument instead. \`v-bind:${e}.sync\` should be changed to \`v-model:${e}\`.`,link:"https://v3-migration.vuejs.org/breaking-changes/v-model.html"},COMPILER_V_BIND_OBJECT_ORDER:{message:'v-bind="obj" usage is now order sensitive and behaves like JavaScript object spread: it will now overwrite an existing non-mergeable attribute that appears before v-bind in the case of conflict. To retain 2.x behavior, move v-bind to make it the first attribute. You can also suppress this warning if the usage is intended.',link:"https://v3-migration.vuejs.org/breaking-changes/v-bind.html"},COMPILER_V_ON_NATIVE:{message:".native modifier for v-on has been removed as is no longer necessary.",link:"https://v3-migration.vuejs.org/breaking-changes/v-on-native-modifier-removed.html"},COMPILER_V_IF_V_FOR_PRECEDENCE:{message:"v-if / v-for precedence when used on the same element has changed in Vue 3: v-if now takes higher precedence and will no longer have access to v-for scope variables. It is best to avoid the ambiguity with +
    + + + +

    FDzmTm6+O6TU9wne9h)iT58;M?YYc&D>Cfe~V{? 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 HfB*mh2bVX3 literal 0 HcmV?d00001 diff --git a/packages/Webkul/Admin/tests/e2e-pw/data/images/3.webp b/packages/Webkul/Admin/tests/e2e-pw/data/images/3.webp new file mode 100644 index 0000000000000000000000000000000000000000..8fd079916a9ca3a928928d0b8eec0dd921fa0e00 GIT binary patch literal 123028 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

    + + + + + + + + + + stopPush(); endif; ?> + + hasRenderedOnce('b8d4a7f4-dd1d-4990-a38b-0acd9fb5c6ca')): $__env->markAsRenderedOnce('b8d4a7f4-dd1d-4990-a38b-0acd9fb5c6ca'); +$__env->startPush('styles'); ?> + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/5931db70af1cddda7346ccc0f7cc9a7f.php b/storage/framework/views/5931db70af1cddda7346ccc0f7cc9a7f.php new file mode 100755 index 0000000..913316e --- /dev/null +++ b/storage/framework/views/5931db70af1cddda7346ccc0f7cc9a7f.php @@ -0,0 +1,30 @@ +isEmpty())): ?> + + + \ No newline at end of file diff --git a/storage/framework/views/5953494c629bb665f26aa6b07777aa87.php b/storage/framework/views/5953494c629bb665f26aa6b07777aa87.php new file mode 100755 index 0000000..85d2b88 --- /dev/null +++ b/storage/framework/views/5953494c629bb665f26aa6b07777aa87.php @@ -0,0 +1,21 @@ +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/storage/framework/views/5a4cf762ce54bc823dbc2a8be5808bca.php b/storage/framework/views/5a4cf762ce54bc823dbc2a8be5808bca.php new file mode 100755 index 0000000..1aaf907 --- /dev/null +++ b/storage/framework/views/5a4cf762ce54bc823dbc2a8be5808bca.php @@ -0,0 +1,18 @@ +isEmpty())): ?> + + + \ No newline at end of file diff --git a/storage/framework/views/5b1d7562a1e69a71ca4d5fd7543b436c.php b/storage/framework/views/5b1d7562a1e69a71ca4d5fd7543b436c.php new file mode 100755 index 0000000..f27f3f7 --- /dev/null +++ b/storage/framework/views/5b1d7562a1e69a71ca4d5fd7543b436c.php @@ -0,0 +1,21 @@ + + + 'admin::components.form.control-group.controls.inline.datetime','data' => [':name' => '\''.e($attribute->code).'\'',':value' => '\''.e($value).'\'','rules' => 'required','position' => 'left','label' => $attribute->name,':errors' => 'errors','placeholder' => $attribute->name,'url' => $url,'allowEdit' => $allowEdit]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.controls.inline.datetime'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([':name' => '\''.e($attribute->code).'\'',':value' => '\''.e($value).'\'','rules' => 'required','position' => 'left','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),':errors' => 'errors','placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),'url' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($url),'allow-edit' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($allowEdit)]); ?> +renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/5b5bd30afeabd8a4a991c7754401bbb9.php b/storage/framework/views/5b5bd30afeabd8a4a991c7754401bbb9.php new file mode 100755 index 0000000..4370e3d --- /dev/null +++ b/storage/framework/views/5b5bd30afeabd8a4a991c7754401bbb9.php @@ -0,0 +1,387 @@ + +onlyProps([ + 'attribute' => '', + 'value' => '', + 'validations' => '', +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'attribute' => '', + 'value' => '', + 'validations' => '', +]); ?> + '', + 'value' => '', + 'validations' => '', +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + +type): + case ('text'): ?> + + + 'admin::components.attributes.edit.text','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.text'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.email','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.email'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.phone','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.phone'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.lookup','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations,'canAddNew' => 'true']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.lookup'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations),'can-add-new' => 'true']); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.select','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.select'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.multiselect','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.multiselect'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.price','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.price'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.image','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.image'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.file','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.file'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.textarea','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.textarea'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.address','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.address'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.date','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.date'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.datetime','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.datetime'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.boolean','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.boolean'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.checkbox','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.checkbox'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/5c2001e939204ec0b7ec56c9a9f31d3d.php b/storage/framework/views/5c2001e939204ec0b7ec56c9a9f31d3d.php new file mode 100644 index 0000000..9d90871 --- /dev/null +++ b/storage/framework/views/5c2001e939204ec0b7ec56c9a9f31d3d.php @@ -0,0 +1,5 @@ +startSection('title', __('Page Expired')); ?> +startSection('code', '419'); ?> +startSection('message', __('Page Expired')); ?> + +make('errors::minimal', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> \ No newline at end of file diff --git a/storage/framework/views/5c4dbb25213fcc1592166fa8594fe465.php b/storage/framework/views/5c4dbb25213fcc1592166fa8594fe465.php new file mode 100755 index 0000000..1885e99 --- /dev/null +++ b/storage/framework/views/5c4dbb25213fcc1592166fa8594fe465.php @@ -0,0 +1,21 @@ + + + 'admin::components.form.control-group.controls.inline.image','data' => [':name' => '\''.e($attribute->code).'\'',':value' => '\''.e(route('admin.settings.attributes.download', ['path' => $value])).'\'','rules' => 'required|mimes:jpeg,jpg,png,gif','position' => 'left','label' => $attribute->name,':errors' => 'errors','placeholder' => $attribute->name,'url' => $url,'allowEdit' => $allowEdit]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.controls.inline.image'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([':name' => '\''.e($attribute->code).'\'',':value' => '\''.e(route('admin.settings.attributes.download', ['path' => $value])).'\'','rules' => 'required|mimes:jpeg,jpg,png,gif','position' => 'left','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),':errors' => 'errors','placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),'url' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($url),'allow-edit' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($allowEdit)]); ?> +renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/5c69291b8becda40307a38b846104d1e.php b/storage/framework/views/5c69291b8becda40307a38b846104d1e.php new file mode 100755 index 0000000..1c271ab --- /dev/null +++ b/storage/framework/views/5c69291b8becda40307a38b846104d1e.php @@ -0,0 +1,5 @@ +
    merge(['class' => 'mb-2.5'])); ?>> + + +
    + \ No newline at end of file diff --git a/storage/framework/views/5cc12c0ae8298cca78ee87beeb85fd1a.php b/storage/framework/views/5cc12c0ae8298cca78ee87beeb85fd1a.php new file mode 100755 index 0000000..465fee8 --- /dev/null +++ b/storage/framework/views/5cc12c0ae8298cca78ee87beeb85fd1a.php @@ -0,0 +1,657 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.settings.groups.index.title'); ?> + endSlot(); ?> + +
    + +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.groups']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.groups']); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + get('admin::app.settings.groups.index.title'); ?> +
    +
    + +
    + +
    + + + + hasPermission('settings.user.groups.create')): ?> + + + + + +
    +
    +
    + + + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + +
    + + hasRenderedOnce('d3a19fbf-dbcd-4511-9fa7-8ef8c46612dd')): $__env->markAsRenderedOnce('d3a19fbf-dbcd-4511-9fa7-8ef8c46612dd'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/5cd7fc7afc1451da8e7f5d36c56c5a84.php b/storage/framework/views/5cd7fc7afc1451da8e7f5d36c56c5a84.php new file mode 100755 index 0000000..b21b211 --- /dev/null +++ b/storage/framework/views/5cd7fc7afc1451da8e7f5d36c56c5a84.php @@ -0,0 +1,37 @@ +
    +
    + + + + + 'admin::components.shimmer.charts.bar','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.charts.bar'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/storage/framework/views/5d2dafabab6d773fcd75ee6e0d9cdff2.php b/storage/framework/views/5d2dafabab6d773fcd75ee6e0d9cdff2.php new file mode 100755 index 0000000..6e3f743 --- /dev/null +++ b/storage/framework/views/5d2dafabab6d773fcd75ee6e0d9cdff2.php @@ -0,0 +1,429 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.leads.edit.title'); ?> + endSlot(); ?> + + $lead]); ?> + + + + + + 'admin::components.form.index','data' => ['action' => route('admin.leads.update', $lead->id),'method' => 'PUT']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.leads.update', $lead->id)),'method' => 'PUT']); ?> +
    +
    +
    + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'leads.edit','entity' => $lead]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'leads.edit','entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($lead)]); ?> +renderComponent(); ?> + + + + + + + + + + +
    + get('admin::app.leads.edit.title'); ?> +
    +
    + +
    + $lead]); ?> + + + +
    + + + + + + + +
    + + $lead]); ?> + +
    +
    + + + + + + + + 'admin::components.shimmer.leads.datagrid','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.leads.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + +
    + renderComponent(); ?> + + + + + + + + + + + $lead]); ?> + + + hasRenderedOnce('aa104d92-1436-4701-9706-d64d96cabc30')): $__env->markAsRenderedOnce('aa104d92-1436-4701-9706-d64d96cabc30'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + + hasRenderedOnce('835a142b-0ca7-457b-882e-3a86e710f8e7')): $__env->markAsRenderedOnce('835a142b-0ca7-457b-882e-3a86e710f8e7'); +$__env->startPush('styles'); ?> + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/5d80da38c76349f24e95b9aea7bec760.php b/storage/framework/views/5d80da38c76349f24e95b9aea7bec760.php new file mode 100755 index 0000000..4eab5c1 --- /dev/null +++ b/storage/framework/views/5d80da38c76349f24e95b9aea7bec760.php @@ -0,0 +1,309 @@ + +onlyProps([ + 'allowEdit' => true, +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'allowEdit' => true, +]); ?> + true, +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + +except('options')); ?> + + :allow-edit="" +> +
    +
    +
    +
    +
    +
    + +hasRenderedOnce('db8287ba-3965-4a99-83ee-ec690a14dad5')): $__env->markAsRenderedOnce('db8287ba-3965-4a99-83ee-ec690a14dad5'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/5e843da415e20346a427dc270b5d0294.php b/storage/framework/views/5e843da415e20346a427dc270b5d0294.php new file mode 100755 index 0000000..6fc7161 --- /dev/null +++ b/storage/framework/views/5e843da415e20346a427dc270b5d0294.php @@ -0,0 +1,142 @@ + + + + + + <?php echo e($title ?? ''); ?> + + + + + + + + + + + yieldPushContent('meta'); ?> + + set(['src/Resources/assets/css/app.css', 'src/Resources/assets/js/app.js'], 'webform')); ?> + + + + + + + getConfigData('general.design.admin_logo.favicon')): ?> + + + + + + yieldPushContent('styles'); ?> + + + + + + + + + + + +
    + + + + 'web_form::components.flash-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('web_form::flash-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + + + + +
    + + + + + yieldPushContent('scripts'); ?> + + + + + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/5f29a9e0bea8869d6d23a7fdafef86e1.php b/storage/framework/views/5f29a9e0bea8869d6d23a7fdafef86e1.php new file mode 100755 index 0000000..a4879b8 --- /dev/null +++ b/storage/framework/views/5f29a9e0bea8869d6d23a7fdafef86e1.php @@ -0,0 +1,324 @@ + + getLookUpEntity($attribute->lookup_type, old($attribute->code) ?: $value); + ?> + + +
    + +
    + get('admin::app.components.attributes.lookup.click-to-add'); ?> + + +
    + + +
    +
    +
    +
    + + +hasRenderedOnce('5dfd2d10-29b2-48a8-87fa-8ad6afdc149c')): $__env->markAsRenderedOnce('5dfd2d10-29b2-48a8-87fa-8ad6afdc149c'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/5fee729c5c99ff4c2d07fe314dfc6111.php b/storage/framework/views/5fee729c5c99ff4c2d07fe314dfc6111.php new file mode 100755 index 0000000..ca5b111 --- /dev/null +++ b/storage/framework/views/5fee729c5c99ff4c2d07fe314dfc6111.php @@ -0,0 +1,14 @@ +isEmpty())): ?> +
      + addLoop($__currentLoopData); foreach($__currentLoopData as $breadcrumb): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> + last): ?> +
    • title); ?>
    • + url): ?> +
    • title); ?>
    • + +
    • title); ?>
    • + + popLoop(); $loop = $__env->getLastLoop(); ?> +
    + + \ No newline at end of file diff --git a/storage/framework/views/605b124922e9cee59c768f18ecb2a1f8.php b/storage/framework/views/605b124922e9cee59c768f18ecb2a1f8.php new file mode 100755 index 0000000..5963364 --- /dev/null +++ b/storage/framework/views/605b124922e9cee59c768f18ecb2a1f8.php @@ -0,0 +1,12 @@ + +
    + +
    + +
    +

    +

    +
    +
    +
    + \ No newline at end of file diff --git a/storage/framework/views/60afd578ec2561a00b3ba5488bfda498.php b/storage/framework/views/60afd578ec2561a00b3ba5488bfda498.php new file mode 100755 index 0000000..02aa5fb --- /dev/null +++ b/storage/framework/views/60afd578ec2561a00b3ba5488bfda498.php @@ -0,0 +1,387 @@ + +onlyProps([ + 'attribute' => '', + 'value' => '', + 'validations' => '', +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'attribute' => '', + 'value' => '', + 'validations' => '', +]); ?> + '', + 'value' => '', + 'validations' => '', +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + +type): + case ('text'): ?> + + + 'admin::components.attributes.edit.text','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.text'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.email','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.email'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.phone','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.phone'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.lookup','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations,'canAddNew' => 'true']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.lookup'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations),'can-add-new' => 'true']); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.select','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.select'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.multiselect','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.multiselect'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.price','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.price'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.image','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.image'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.file','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.file'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.textarea','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.textarea'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.address','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.address'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.date','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.date'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.datetime','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.datetime'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.boolean','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.boolean'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.checkbox','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.checkbox'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/6196735aba6c22cc64b61dfd6a574bf8.php b/storage/framework/views/6196735aba6c22cc64b61dfd6a574bf8.php new file mode 100755 index 0000000..cf9d694 --- /dev/null +++ b/storage/framework/views/6196735aba6c22cc64b61dfd6a574bf8.php @@ -0,0 +1,79 @@ + + + 'admin::components.shimmer.leads.index.kanban.toolbar','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.leads.index.kanban.toolbar'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + +
    + + +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + + +
    + + +
    + +
    +
    + +
    + + +
    +
    +
    +
    +
    + + +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    + +
    +
    + +
    \ No newline at end of file diff --git a/storage/framework/views/622acc512af7c1ed3719802780a93697.php b/storage/framework/views/622acc512af7c1ed3719802780a93697.php new file mode 100755 index 0000000..41472c5 --- /dev/null +++ b/storage/framework/views/622acc512af7c1ed3719802780a93697.php @@ -0,0 +1,84 @@ + + +hasRenderedOnce('eb3e055c-bb13-4e7d-92d4-188dcc478366')): $__env->markAsRenderedOnce('eb3e055c-bb13-4e7d-92d4-188dcc478366'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/643c43a91b2568b91ae66692762e507e.php b/storage/framework/views/643c43a91b2568b91ae66692762e507e.php new file mode 100755 index 0000000..b7907dc --- /dev/null +++ b/storage/framework/views/643c43a91b2568b91ae66692762e507e.php @@ -0,0 +1,100 @@ + +onlyProps(['position' => 'left']) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps(['position' => 'left']); ?> + 'left']), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + +> + + + 'admin::components.shimmer.tabs.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.tabs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + +hasRenderedOnce('f74f4975-d7f7-42c9-9055-4a2cdfffa81a')): $__env->markAsRenderedOnce('f74f4975-d7f7-42c9-9055-4a2cdfffa81a'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/645b117505eaf328b063b457f0a7e171.php b/storage/framework/views/645b117505eaf328b063b457f0a7e171.php new file mode 100755 index 0000000..b674e5a --- /dev/null +++ b/storage/framework/views/645b117505eaf328b063b457f0a7e171.php @@ -0,0 +1,241 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.contacts.persons.create.title'); ?> + endSlot(); ?> + + + + + + + + 'admin::components.form.index','data' => ['action' => route('admin.contacts.persons.store'),'enctype' => 'multipart/form-data']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.contacts.persons.store')),'enctype' => 'multipart/form-data']); ?> +
    + +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'contacts.persons.create']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'contacts.persons.create']); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + get('admin::app.contacts.persons.create.title'); ?> +
    +
    + +
    +
    + + + + + + + + +
    +
    +
    + + +
    + + + + + + 'admin::components.attributes.index','data' => ['customAttributes' => app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + ['code', 'NOTIN', ['organization_id']], + 'entity_type' => 'persons', + ]),'customValidations' => [ + 'name' => [ + 'min:2', + 'max:100', + ], + 'job_title' => [ + 'max:100', + ], + ]]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['custom-attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + ['code', 'NOTIN', ['organization_id']], + 'entity_type' => 'persons', + ])),'custom-validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute([ + 'name' => [ + 'min:2', + 'max:100', + ], + 'job_title' => [ + 'max:100', + ], + ])]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + +
    +
    + renderComponent(); ?> + + + + + + + + + + + + + + hasRenderedOnce('c1883912-f03d-4f17-9897-888de4ff14a5')): $__env->markAsRenderedOnce('c1883912-f03d-4f17-9897-888de4ff14a5'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/662fc54fc0def05c1b259622e811803c.php b/storage/framework/views/662fc54fc0def05c1b259622e811803c.php new file mode 100755 index 0000000..4f0e59a --- /dev/null +++ b/storage/framework/views/662fc54fc0def05c1b259622e811803c.php @@ -0,0 +1,71 @@ +
    + + + 'admin::components.shimmer.datagrid.toolbar','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid.toolbar'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + +
    +
    +
    + + + 'admin::components.shimmer.mail.datagrid.table.head','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.mail.datagrid.table.head'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.shimmer.mail.datagrid.table.body','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.mail.datagrid.table.body'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + +
    +
    +
    +
    + \ No newline at end of file diff --git a/storage/framework/views/66efbdfac607c4462bb2298a98d6faac.php b/storage/framework/views/66efbdfac607c4462bb2298a98d6faac.php new file mode 100755 index 0000000..c882d1d --- /dev/null +++ b/storage/framework/views/66efbdfac607c4462bb2298a98d6faac.php @@ -0,0 +1,783 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.settings.data-transfer.imports.create.title'); ?> + endSlot(); ?> + + + + + + + 'admin::components.form.index','data' => ['action' => route('admin.settings.data_transfer.imports.store'),'enctype' => 'multipart/form-data']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.data_transfer.imports.store')),'enctype' => 'multipart/form-data']); ?> + + + + +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.data_transfers.create']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.data_transfers.create']); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + get('admin::app.settings.data-transfer.imports.create.title'); ?> +
    +
    + +
    + +
    + + + + hasPermission('settings.data_transfer.imports.create')): ?> + + + + + + +
    +
    +
    + + +
    + +
    + + + + +
    +

    + get('admin::app.settings.data-transfer.imports.create.general'); ?> +

    + + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.settings.data-transfer.imports.create.type'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'select','name' => 'type','id' => 'import-type','value' => old('type') ?? 'persons','ref' => 'importType','rules' => 'required','label' => trans('admin::app.settings.data-transfer.imports.create.type')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'select','name' => 'type','id' => 'import-type','value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(old('type') ?? 'persons'),'ref' => 'importType','rules' => 'required','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.settings.data-transfer.imports.create.type'))]); ?> + addLoop($__currentLoopData); foreach($__currentLoopData as $code => $importer): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> + + popLoop(); $loop = $__env->getLastLoop(); ?> + renderComponent(); ?> + + + + + + + + + + + + + get('admin::app.settings.data-transfer.imports.create.download-sample'); ?> + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'type']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'type']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.settings.data-transfer.imports.create.file'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'file','name' => 'file','rules' => 'required','label' => trans('admin::app.settings.data-transfer.imports.create.file')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'file','name' => 'file','rules' => 'required','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.settings.data-transfer.imports.create.file'))]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'file']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'file']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + +
    + + + +
    + + +
    + + + + + + + 'admin::components.accordion.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::accordion'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('header', null, []); ?> +
    +

    + get('admin::app.settings.data-transfer.imports.create.settings'); ?> +

    +
    + endSlot(); ?> + + slot('content', null, []); ?> + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.settings.data-transfer.imports.create.action'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'select','name' => 'action','id' => 'action','value' => old('action') ?? 'append','rules' => 'required','label' => trans('admin::app.settings.data-transfer.imports.create.action')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'select','name' => 'action','id' => 'action','value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(old('action') ?? 'append'),'rules' => 'required','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.settings.data-transfer.imports.create.action'))]); ?> + + + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'action']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'action']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.settings.data-transfer.imports.create.validation-strategy'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'select','name' => 'validation_strategy','id' => 'validation_strategy','value' => old('validation_strategy') ?? 'stop-on-errors','rules' => 'required','label' => trans('admin::app.settings.data-transfer.imports.create.validation-strategy')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'select','name' => 'validation_strategy','id' => 'validation_strategy','value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(old('validation_strategy') ?? 'stop-on-errors'),'rules' => 'required','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.settings.data-transfer.imports.create.validation-strategy'))]); ?> + + + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'validation_strategy']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'validation_strategy']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.settings.data-transfer.imports.create.allowed-errors'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'text','name' => 'allowed_errors','value' => old('allowed_errors') ?? 10,'rules' => 'required','label' => trans('admin::app.settings.data-transfer.imports.create.allowed-errors'),'placeholder' => trans('admin::app.settings.data-transfer.imports.create.allowed-errors')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'text','name' => 'allowed_errors','value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(old('allowed_errors') ?? 10),'rules' => 'required','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.settings.data-transfer.imports.create.allowed-errors')),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.settings.data-transfer.imports.create.allowed-errors'))]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'allowed_errors']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'allowed_errors']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.settings.data-transfer.imports.create.field-separator'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'text','name' => 'field_separator','value' => old('field_separator') ?? ',','rules' => 'required','label' => trans('admin::app.settings.data-transfer.imports.create.field-separator'),'placeholder' => trans('admin::app.settings.data-transfer.imports.create.field-separator')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'text','name' => 'field_separator','value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(old('field_separator') ?? ','),'rules' => 'required','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.settings.data-transfer.imports.create.field-separator')),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.settings.data-transfer.imports.create.field-separator'))]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'field_separator']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'field_separator']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.form.control-group.index','data' => ['class' => '!mb-0']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => '!mb-0']); ?> + + + 'admin::components.form.control-group.label','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + get('admin::app.settings.data-transfer.imports.create.process-in-queue'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'switch','name' => 'process_in_queue','id' => 'maintenance-mode-status','checked' => false]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'switch','name' => 'process_in_queue','id' => 'maintenance-mode-status','checked' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(false)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'process_in_queue']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'process_in_queue']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + + + + +
    +
    + + + + renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/6855d2e33205b91888dcc7a02816a39b.php b/storage/framework/views/6855d2e33205b91888dcc7a02816a39b.php new file mode 100755 index 0000000..adeb020 --- /dev/null +++ b/storage/framework/views/6855d2e33205b91888dcc7a02816a39b.php @@ -0,0 +1,241 @@ + + + + + +hasRenderedOnce('30c199c8-5279-4b1e-95f8-ca7a1fc2afcc')): $__env->markAsRenderedOnce('30c199c8-5279-4b1e-95f8-ca7a1fc2afcc'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/689347dc050fe533aed0a037aa9c5cdd.php b/storage/framework/views/689347dc050fe533aed0a037aa9c5cdd.php new file mode 100755 index 0000000..40336c8 --- /dev/null +++ b/storage/framework/views/689347dc050fe533aed0a037aa9c5cdd.php @@ -0,0 +1,5 @@ +
    merge(['class' => 'mb-4'])); ?>> + + +
    + \ No newline at end of file diff --git a/storage/framework/views/692fa9c7f895fcb4e21a1f1731a60406.php b/storage/framework/views/692fa9c7f895fcb4e21a1f1731a60406.php new file mode 100755 index 0000000..6316feb --- /dev/null +++ b/storage/framework/views/692fa9c7f895fcb4e21a1f1731a60406.php @@ -0,0 +1,22 @@ +getCurrentActiveMenu('admin')?->getChildren(); +?> + +isNotEmpty() +): ?> +
    +
    + addLoop($__currentLoopData); foreach($__currentLoopData as $tab): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> + +
    pb-3.5 px-2.5 text-base font-medium text-gray-600 dark:text-gray-300 cursor-pointer"> + getName()); ?> + +
    +
    + popLoop(); $loop = $__env->getLastLoop(); ?> +
    +
    + + \ No newline at end of file diff --git a/storage/framework/views/696327619b02356f19b3adf2c3bf704f.php b/storage/framework/views/696327619b02356f19b3adf2c3bf704f.php new file mode 100755 index 0000000..53fc246 --- /dev/null +++ b/storage/framework/views/696327619b02356f19b3adf2c3bf704f.php @@ -0,0 +1,32 @@ +lookup_type + ? app('Webkul\Attribute\Repositories\AttributeRepository')->getLookUpOptions($attribute->lookup_type) + : $attribute->options()->orderBy('sort_order')->get(); +?> + + + + 'admin::components.form.control-group.control','data' => ['type' => 'select','id' => ''.e($attribute->code).'','name' => ''.e($attribute->code).'','rules' => ''.e($validations).'','label' => $attribute->name,'placeholder' => $attribute->name,'value' => old($attribute->code) ?? $value]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'select','id' => ''.e($attribute->code).'','name' => ''.e($attribute->code).'','rules' => ''.e($validations).'','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(old($attribute->code) ?? $value)]); ?> + addLoop($__currentLoopData); foreach($__currentLoopData as $option): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> + + popLoop(); $loop = $__env->getLastLoop(); ?> + renderComponent(); ?> + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/6be40a9fac33782099171d0d80e025cf.php b/storage/framework/views/6be40a9fac33782099171d0d80e025cf.php new file mode 100755 index 0000000..6ed2572 --- /dev/null +++ b/storage/framework/views/6be40a9fac33782099171d0d80e025cf.php @@ -0,0 +1,272 @@ + + + + + + + + + 'admin::components.shimmer.dashboard.index.over-all','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.dashboard.index.over-all'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + +hasRenderedOnce('84a07157-2082-477b-aea6-b06e93592a9b')): $__env->markAsRenderedOnce('84a07157-2082-477b-aea6-b06e93592a9b'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/6ce34c8fbee2f19577a6005fe418d650.php b/storage/framework/views/6ce34c8fbee2f19577a6005fe418d650.php new file mode 100755 index 0000000..12d5770 --- /dev/null +++ b/storage/framework/views/6ce34c8fbee2f19577a6005fe418d650.php @@ -0,0 +1,17 @@ + +
    + +
    + +
    +

    +

    +
    +
    + + +
    +

    +
    +
    + \ No newline at end of file diff --git a/storage/framework/views/6d2001f86aa58fedf8ebfbcfb16c5b76.php b/storage/framework/views/6d2001f86aa58fedf8ebfbcfb16c5b76.php new file mode 100755 index 0000000..01f324f --- /dev/null +++ b/storage/framework/views/6d2001f86aa58fedf8ebfbcfb16c5b76.php @@ -0,0 +1,1922 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.settings.workflows.edit.title'); ?> + endSlot(); ?> + + + + + + + 'admin::components.form.index','data' => ['action' => route('admin.settings.workflows.update', $workflow->id),'method' => 'PUT']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.workflows.update', $workflow->id)),'method' => 'PUT']); ?> +
    +
    +
    + $workflow]); ?> + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.workflows.edit','entity' => $workflow]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.workflows.edit','entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($workflow)]); ?> +renderComponent(); ?> + + + + + + + + + + + $workflow]); ?> + + +
    + get('admin::app.settings.workflows.edit.title'); ?> +
    +
    + +
    +
    + $workflow]); ?> + + + + + + $workflow]); ?> + +
    +
    +
    + + + + + + + 'admin::components.attributes.edit.lookup','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.lookup'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + +
    + renderComponent(); ?> + + + + + + + + + + + hasRenderedOnce('836d3ec8-7ae5-42e6-ab1a-c29de06af475')): $__env->markAsRenderedOnce('836d3ec8-7ae5-42e6-ab1a-c29de06af475'); +$__env->startPush('scripts'); ?> + + + + + + + + + + + + stopPush(); endif; ?> + + hasRenderedOnce('543abf3c-6a48-422a-aabe-01c68eace57c')): $__env->markAsRenderedOnce('543abf3c-6a48-422a-aabe-01c68eace57c'); +$__env->startPush('styles'); ?> + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/6de5c8c28cb29acce8a2bd9af36344a8.php b/storage/framework/views/6de5c8c28cb29acce8a2bd9af36344a8.php new file mode 100755 index 0000000..cbdd168 --- /dev/null +++ b/storage/framework/views/6de5c8c28cb29acce8a2bd9af36344a8.php @@ -0,0 +1,227 @@ + +onlyProps([ + 'isActive' => false, + 'position' => 'right', + 'width' => '500px', +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'isActive' => false, + 'position' => 'right', + 'width' => '500px', +]); ?> + false, + 'position' => 'right', + 'width' => '500px', +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + is-active="" + position="" + width="" +> + + + + + + + + + + + + + + + + + +hasRenderedOnce('656890cc-63ee-41ca-b747-ad71e98ec95e')): $__env->markAsRenderedOnce('656890cc-63ee-41ca-b747-ad71e98ec95e'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/6e12219585f1d10655b79c1a5e0b6718.php b/storage/framework/views/6e12219585f1d10655b79c1a5e0b6718.php new file mode 100755 index 0000000..3c82c65 --- /dev/null +++ b/storage/framework/views/6e12219585f1d10655b79c1a5e0b6718.php @@ -0,0 +1,60 @@ +> + +hasRenderedOnce('cc52e6d6-61d7-437c-b4af-99867ac5f29d')): $__env->markAsRenderedOnce('cc52e6d6-61d7-437c-b4af-99867ac5f29d'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/6fb6d9feeb93e6fdb9c5e671249d0b02.php b/storage/framework/views/6fb6d9feeb93e6fdb9c5e671249d0b02.php new file mode 100755 index 0000000..08117bf --- /dev/null +++ b/storage/framework/views/6fb6d9feeb93e6fdb9c5e671249d0b02.php @@ -0,0 +1,46 @@ +> +
    merge(['class' => 'shimmer bg-neutral-100'])); ?>>
    +
    + +hasRenderedOnce('64e34f58-e15e-4d49-a238-e25b825c841d')): $__env->markAsRenderedOnce('64e34f58-e15e-4d49-a238-e25b825c841d'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/705ba4a03b5ebcb6854888da30ba37f8.php b/storage/framework/views/705ba4a03b5ebcb6854888da30ba37f8.php new file mode 100755 index 0000000..851af8d --- /dev/null +++ b/storage/framework/views/705ba4a03b5ebcb6854888da30ba37f8.php @@ -0,0 +1,141 @@ + + +hasRenderedOnce('64791307-ca65-4511-88fe-04712ca5c720')): $__env->markAsRenderedOnce('64791307-ca65-4511-88fe-04712ca5c720'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/718638775cf4f89c56d3240e2a076acb.php b/storage/framework/views/718638775cf4f89c56d3240e2a076acb.php new file mode 100755 index 0000000..a41c111 --- /dev/null +++ b/storage/framework/views/718638775cf4f89c56d3240e2a076acb.php @@ -0,0 +1,1279 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.mail.index.' . request('route')); ?> + endSlot(); ?> + +
    +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'mail.route','entity' => request('route')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'mail.route','entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(request('route'))]); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + + get('admin::app.mail.index.' . request('route')); ?> +
    +
    + +
    +
    + + + + + hasPermission('mail.compose')): ?> + + + + + +
    +
    +
    + + + + + + + 'admin::components.shimmer.mail.datagrid.index','data' => ['isMultiRow' => true]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.mail.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['is-multi-row' => true]); ?> +renderComponent(); ?> + + + + + + + + + + +
    + + hasRenderedOnce('023ade48-dd7d-439f-abcf-39a13bcbd4a7')): $__env->markAsRenderedOnce('023ade48-dd7d-439f-abcf-39a13bcbd4a7'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/722922ee7af664e6e83dc93040da9fbc.php b/storage/framework/views/722922ee7af664e6e83dc93040da9fbc.php new file mode 100755 index 0000000..8dfc3d7 --- /dev/null +++ b/storage/framework/views/722922ee7af664e6e83dc93040da9fbc.php @@ -0,0 +1,59 @@ + +has('as')): ?> + > + + + + + + + +onlyProps([ + 'method' => 'POST', + ]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'method' => 'POST', + ]); ?> + 'POST', + ]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + + + > + + + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/727e484febeccf10f8c1e01e91fb2f18.php b/storage/framework/views/727e484febeccf10f8c1e01e91fb2f18.php new file mode 100755 index 0000000..31d10ad --- /dev/null +++ b/storage/framework/views/727e484febeccf10f8c1e01e91fb2f18.php @@ -0,0 +1,9 @@ +
    + + + + + + + +
    \ No newline at end of file diff --git a/storage/framework/views/7338f0eab0650fe45e0cbc7b97dfdf31.php b/storage/framework/views/7338f0eab0650fe45e0cbc7b97dfdf31.php new file mode 100755 index 0000000..9df0bdb --- /dev/null +++ b/storage/framework/views/7338f0eab0650fe45e0cbc7b97dfdf31.php @@ -0,0 +1,133 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.settings.pipelines.index.title'); ?> + endSlot(); ?> + +
    +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.pipelines']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.pipelines']); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + + get('admin::app.settings.pipelines.index.title'); ?> +
    +
    + +
    +
    + + + + hasPermission('settings.lead.pipelines.create')): ?> + + + get('admin::app.settings.pipelines.index.create-btn'); ?> + + + + + +
    +
    +
    + + + + + + + + 'admin::components.datagrid.index','data' => ['src' => route('admin.settings.pipelines.index')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['src' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.pipelines.index'))]); ?> + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + +
    + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/73d0f687bf3f179b75a519792a6a0190.php b/storage/framework/views/73d0f687bf3f179b75a519792a6a0190.php new file mode 100755 index 0000000..68d5956 --- /dev/null +++ b/storage/framework/views/73d0f687bf3f179b75a519792a6a0190.php @@ -0,0 +1,131 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.settings.workflows.index.title'); ?> + endSlot(); ?> + +
    +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.workflows']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.workflows']); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + get('admin::app.settings.workflows.index.title'); ?> +
    +
    + +
    + +
    + + + + hasPermission('settings.automation.workflows.create')): ?> + + get('admin::app.settings.workflows.index.create-btn'); ?> + + + + + +
    +
    +
    + + + + + + + 'admin::components.datagrid.index','data' => ['src' => route('admin.settings.workflows.index')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['src' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.workflows.index'))]); ?> + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + +
    + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/73f6108386de9d6b9dd8e8f4d6aafcdf.php b/storage/framework/views/73f6108386de9d6b9dd8e8f4d6aafcdf.php new file mode 100755 index 0000000..089f59d --- /dev/null +++ b/storage/framework/views/73f6108386de9d6b9dd8e8f4d6aafcdf.php @@ -0,0 +1,85 @@ + +onlyProps(['isMultiRow' => false]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps(['isMultiRow' => false]); ?> + false]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + +
    + + + 'admin::components.shimmer.datagrid.toolbar','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid.toolbar'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + +
    +
    +
    + + + 'admin::components.shimmer.datagrid.table.head','data' => ['isMultiRow' => $isMultiRow]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid.table.head'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['isMultiRow' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($isMultiRow)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.shimmer.datagrid.table.body','data' => ['isMultiRow' => $isMultiRow]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid.table.body'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['isMultiRow' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($isMultiRow)]); ?> +renderComponent(); ?> + + + + + + + + + +
    +
    +
    +
    + \ No newline at end of file diff --git a/storage/framework/views/74349877583591de964288672b6047a7.php b/storage/framework/views/74349877583591de964288672b6047a7.php new file mode 100755 index 0000000..543a8f6 --- /dev/null +++ b/storage/framework/views/74349877583591de964288672b6047a7.php @@ -0,0 +1,12 @@ + + +addLoop($__currentLoopData); foreach($__currentLoopData as $bgColor): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> +
    +popLoop(); $loop = $__env->getLastLoop(); ?> + +addLoop($__currentLoopData); foreach($__currentLoopData as $textColor): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> +
    +popLoop(); $loop = $__env->getLastLoop(); ?> \ No newline at end of file diff --git a/storage/framework/views/74d0fe6129f6d2d2751bf1d6c1c5e6be.php b/storage/framework/views/74d0fe6129f6d2d2751bf1d6c1c5e6be.php new file mode 100755 index 0000000..e358832 --- /dev/null +++ b/storage/framework/views/74d0fe6129f6d2d2751bf1d6c1c5e6be.php @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/storage/framework/views/7545453b31afffb888d933c90f187db5.php b/storage/framework/views/7545453b31afffb888d933c90f187db5.php new file mode 100755 index 0000000..e4982f2 --- /dev/null +++ b/storage/framework/views/7545453b31afffb888d933c90f187db5.php @@ -0,0 +1,40 @@ + + +onlyProps(['color' => 'currentColor']) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps(['color' => 'currentColor']); ?> + 'currentColor']), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + \ No newline at end of file diff --git a/storage/framework/views/763aa3438a725492f52411b7c5af8cac.php b/storage/framework/views/763aa3438a725492f52411b7c5af8cac.php new file mode 100755 index 0000000..8c8fa3c --- /dev/null +++ b/storage/framework/views/763aa3438a725492f52411b7c5af8cac.php @@ -0,0 +1,201 @@ + + + v-bind="$attrs" +> + +hasRenderedOnce('fb8bf576-5c34-4f79-a551-d9ab89c1d6cd')): $__env->markAsRenderedOnce('fb8bf576-5c34-4f79-a551-d9ab89c1d6cd'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/76580b75925f708c1a37f6afa9029bb9.php b/storage/framework/views/76580b75925f708c1a37f6afa9029bb9.php new file mode 100755 index 0000000..7dcbbf6 --- /dev/null +++ b/storage/framework/views/76580b75925f708c1a37f6afa9029bb9.php @@ -0,0 +1,338 @@ + +onlyProps([ + 'allowEdit' => true, +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'allowEdit' => true, +]); ?> + true, +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + :allow-edit="" +> +
    +
    +
    +
    +
    +
    + +hasRenderedOnce('4aa8b015-9fe7-47da-9303-a7771f80a4dd')): $__env->markAsRenderedOnce('4aa8b015-9fe7-47da-9303-a7771f80a4dd'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/78de902192b1714ac039398d9f4426d8.php b/storage/framework/views/78de902192b1714ac039398d9f4426d8.php new file mode 100755 index 0000000..4ad3cc5 --- /dev/null +++ b/storage/framework/views/78de902192b1714ac039398d9f4426d8.php @@ -0,0 +1,96 @@ +> + +hasRenderedOnce('5dcbdcea-f6f4-435b-ae76-dd8aacd7f7fb')): $__env->markAsRenderedOnce('5dcbdcea-f6f4-435b-ae76-dd8aacd7f7fb'); +$__env->startPush('scripts'); ?> + + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/79e8e90194be1d8195f6f37c97738d0e.php b/storage/framework/views/79e8e90194be1d8195f6f37c97738d0e.php new file mode 100755 index 0000000..22ce0db --- /dev/null +++ b/storage/framework/views/79e8e90194be1d8195f6f37c97738d0e.php @@ -0,0 +1,5 @@ +merge(['scope' => 'col', 'class' => 'whitespace-nowrap px-6 py-4 font-semibold'])); ?>> + + + + \ No newline at end of file diff --git a/storage/framework/views/7a1d92179836214dd1888bc3bb83cc42.php b/storage/framework/views/7a1d92179836214dd1888bc3bb83cc42.php new file mode 100755 index 0000000..81290a5 --- /dev/null +++ b/storage/framework/views/7a1d92179836214dd1888bc3bb83cc42.php @@ -0,0 +1,57 @@ +hasRenderedOnce('16db1fbc-07cb-4131-b013-19bf621731ec')): $__env->markAsRenderedOnce('16db1fbc-07cb-4131-b013-19bf621731ec'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/7a87d246bb7b408660a5fb294f811956.php b/storage/framework/views/7a87d246bb7b408660a5fb294f811956.php new file mode 100755 index 0000000..b7b38a9 --- /dev/null +++ b/storage/framework/views/7a87d246bb7b408660a5fb294f811956.php @@ -0,0 +1,13 @@ + +
    + +
    + +
    +

    +

    +
    +
    +
    + + \ No newline at end of file diff --git a/storage/framework/views/7afe19b7ca789b437f936aa7a33665d6.php b/storage/framework/views/7afe19b7ca789b437f936aa7a33665d6.php new file mode 100755 index 0000000..d7cd94b --- /dev/null +++ b/storage/framework/views/7afe19b7ca789b437f936aa7a33665d6.php @@ -0,0 +1,362 @@ +> + +hasRenderedOnce('2e9c24c1-27dd-4c68-8c49-99530649d48d')): $__env->markAsRenderedOnce('2e9c24c1-27dd-4c68-8c49-99530649d48d'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/7c39c87d70316fd50ddef81471da8c68.php b/storage/framework/views/7c39c87d70316fd50ddef81471da8c68.php new file mode 100755 index 0000000..ef7419d --- /dev/null +++ b/storage/framework/views/7c39c87d70316fd50ddef81471da8c68.php @@ -0,0 +1,42 @@ + +onlyProps(['isMultiRow' => false]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps(['isMultiRow' => false]); ?> + false]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + +
    +
    + +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    + +
    +
    + +
    + +
    +
    + + \ No newline at end of file diff --git a/storage/framework/views/7d32429f498c45b7a16b838740c1f803.php b/storage/framework/views/7d32429f498c45b7a16b838740c1f803.php new file mode 100755 index 0000000..6ef9937 --- /dev/null +++ b/storage/framework/views/7d32429f498c45b7a16b838740c1f803.php @@ -0,0 +1,21 @@ +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/storage/framework/views/7dd35949e06fe81b098af5553fa6a342.php b/storage/framework/views/7dd35949e06fe81b098af5553fa6a342.php new file mode 100755 index 0000000..e86ad21 --- /dev/null +++ b/storage/framework/views/7dd35949e06fe81b098af5553fa6a342.php @@ -0,0 +1,126 @@ + + + +
    + + + 'admin::components.dropdown.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::dropdown'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('toggle', null, []); ?> + + + + + + + + endSlot(); ?> + + slot('content', null, ['class' => '!p-0']); ?> + + + + +
    + + get('admin::app.leads.index.view-switcher.all-pipelines'); ?> + +
    + + + + + + all(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $tempPipeline): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> + $tempPipeline]); ?> + + + + name); ?> + + + + $tempPipeline]); ?> + + popLoop(); $loop = $__env->getLastLoop(); ?> + + + + + + + + get('admin::app.leads.index.view-switcher.create-new-pipeline'); ?> + + + + + + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    +
    + + \ No newline at end of file diff --git a/storage/framework/views/7df9fc296534d20b4c1d0a6636050ffb.php b/storage/framework/views/7df9fc296534d20b4c1d0a6636050ffb.php new file mode 100755 index 0000000..8a9e563 --- /dev/null +++ b/storage/framework/views/7df9fc296534d20b4c1d0a6636050ffb.php @@ -0,0 +1,1247 @@ +getEmailTemplatePlaceholders()); ?> + + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.settings.webhooks.create.title'); ?> + endSlot(); ?> + + + + + + + 'admin::components.form.index','data' => ['action' => route('admin.settings.webhooks.store')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.webhooks.store'))]); ?> +
    +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.webhooks.create']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.webhooks.create']); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + get('admin::app.settings.webhooks.create.title'); ?> +
    +
    + +
    +
    + + + + + + + + +
    +
    +
    + + +
    + renderComponent(); ?> + + + + + + + + + + + + + + hasRenderedOnce('ccfefab4-5792-4aa6-9780-7aac970b9e06')): $__env->markAsRenderedOnce('ccfefab4-5792-4aa6-9780-7aac970b9e06'); +$__env->startPush('scripts'); ?> + + + + + + + + + + + + + stopPush(); endif; ?> + + hasRenderedOnce('6c1be1ed-40ce-468c-9c98-90851cdae499')): $__env->markAsRenderedOnce('6c1be1ed-40ce-468c-9c98-90851cdae499'); +$__env->startPush('styles'); ?> + + + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/80328a3d8d637cac7f3cd1dcaf8ba595.php b/storage/framework/views/80328a3d8d637cac7f3cd1dcaf8ba595.php new file mode 100755 index 0000000..07f906d --- /dev/null +++ b/storage/framework/views/80328a3d8d637cac7f3cd1dcaf8ba595.php @@ -0,0 +1,71 @@ +
    + + + 'admin::components.shimmer.datagrid.toolbar','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid.toolbar'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + +
    +
    +
    + + + 'admin::components.shimmer.mail.datagrid.table.head','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.mail.datagrid.table.head'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.shimmer.mail.datagrid.table.body','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.mail.datagrid.table.body'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + +
    +
    +
    +
    + \ No newline at end of file diff --git a/storage/framework/views/8045eecedb3d7e156af551095e06d541.php b/storage/framework/views/8045eecedb3d7e156af551095e06d541.php new file mode 100755 index 0000000..346df83 --- /dev/null +++ b/storage/framework/views/8045eecedb3d7e156af551095e06d541.php @@ -0,0 +1,4 @@ +merge(['scope' => 'row', 'class' => 'border-b border-gray-200 last:border-b-0 dark:border-gray-800'])); ?>> + + + \ No newline at end of file diff --git a/storage/framework/views/81832cbe8b1dc51181dd4444cc2b75ac.php b/storage/framework/views/81832cbe8b1dc51181dd4444cc2b75ac.php new file mode 100755 index 0000000..b1feff0 --- /dev/null +++ b/storage/framework/views/81832cbe8b1dc51181dd4444cc2b75ac.php @@ -0,0 +1,20 @@ + + + 'admin::components.form.control-group.control','data' => ['type' => 'text','id' => $attribute->code,'name' => $attribute->code,'value' => old($attribute->code) ?? $value,'rules' => $validations,'label' => $attribute->name]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'text','id' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->code),'name' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->code),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(old($attribute->code) ?? $value),'rules' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations),'label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name)]); ?> +renderComponent(); ?> + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/81aa4767a1c1fd106645581a82b3d039.php b/storage/framework/views/81aa4767a1c1fd106645581a82b3d039.php new file mode 100755 index 0000000..c21c2bd --- /dev/null +++ b/storage/framework/views/81aa4767a1c1fd106645581a82b3d039.php @@ -0,0 +1,7 @@ +
    +
    + +
    + +
    +
    \ No newline at end of file diff --git a/storage/framework/views/82d6f8989f545ac1df2a6907421f2bda.php b/storage/framework/views/82d6f8989f545ac1df2a6907421f2bda.php new file mode 100755 index 0000000..cdde560 --- /dev/null +++ b/storage/framework/views/82d6f8989f545ac1df2a6907421f2bda.php @@ -0,0 +1,84 @@ + + +hasRenderedOnce('a886c6a6-c632-4b50-a1b1-3fab092be852')): $__env->markAsRenderedOnce('a886c6a6-c632-4b50-a1b1-3fab092be852'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/8384b9be9a053dd08ab203ee1264ea99.php b/storage/framework/views/8384b9be9a053dd08ab203ee1264ea99.php new file mode 100755 index 0000000..bd8abbc --- /dev/null +++ b/storage/framework/views/8384b9be9a053dd08ab203ee1264ea99.php @@ -0,0 +1,70 @@ +> +
    +
    + +hasRenderedOnce('517d5197-765d-4d63-9af8-4392c7d1101d')): $__env->markAsRenderedOnce('517d5197-765d-4d63-9af8-4392c7d1101d'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/83c4e4975e1dc8e11aaba8b00b2637e1.php b/storage/framework/views/83c4e4975e1dc8e11aaba8b00b2637e1.php new file mode 100755 index 0000000..46493bf --- /dev/null +++ b/storage/framework/views/83c4e4975e1dc8e11aaba8b00b2637e1.php @@ -0,0 +1,86 @@ +> + + + + +hasRenderedOnce('ecdc8b63-ca36-4250-9ca6-0fea9fbeca37')): $__env->markAsRenderedOnce('ecdc8b63-ca36-4250-9ca6-0fea9fbeca37'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/84ca5927186a61d96c9aa979ed9d32c3.php b/storage/framework/views/84ca5927186a61d96c9aa979ed9d32c3.php new file mode 100755 index 0000000..7d288cd --- /dev/null +++ b/storage/framework/views/84ca5927186a61d96c9aa979ed9d32c3.php @@ -0,0 +1,227 @@ + +onlyProps([ + 'isActive' => false, + 'position' => 'right', + 'width' => '500px', +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'isActive' => false, + 'position' => 'right', + 'width' => '500px', +]); ?> + false, + 'position' => 'right', + 'width' => '500px', +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + is-active="" + position="" + width="" +> + + + + + + + + + + + + + + + + + +hasRenderedOnce('b0260640-5431-4558-b3ea-15bbaacad0de')): $__env->markAsRenderedOnce('b0260640-5431-4558-b3ea-15bbaacad0de'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/854e22ee1ae052a7b502f2086fdd520c.php b/storage/framework/views/854e22ee1ae052a7b502f2086fdd520c.php new file mode 100755 index 0000000..010028c --- /dev/null +++ b/storage/framework/views/854e22ee1ae052a7b502f2086fdd520c.php @@ -0,0 +1,21 @@ +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/storage/framework/views/857502e84b2e3d811ca62093f06a83ef.php b/storage/framework/views/857502e84b2e3d811ca62093f06a83ef.php new file mode 100755 index 0000000..e75b441 --- /dev/null +++ b/storage/framework/views/857502e84b2e3d811ca62093f06a83ef.php @@ -0,0 +1,49 @@ + +has('as')): ?> + > + + + + + + + +onlyProps(['method' => 'POST']) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps(['method' => 'POST']); ?> + 'POST']), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + + + > + + + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/869b8c53bbaa41f201693cd8ac233e18.php b/storage/framework/views/869b8c53bbaa41f201693cd8ac233e18.php new file mode 100755 index 0000000..328b31f --- /dev/null +++ b/storage/framework/views/869b8c53bbaa41f201693cd8ac233e18.php @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/storage/framework/views/86e7ad99a2f60c181ff6221e8a463026.php b/storage/framework/views/86e7ad99a2f60c181ff6221e8a463026.php new file mode 100755 index 0000000..f5725b2 --- /dev/null +++ b/storage/framework/views/86e7ad99a2f60c181ff6221e8a463026.php @@ -0,0 +1,30 @@ +isEmpty())): ?> + + + \ No newline at end of file diff --git a/storage/framework/views/8702e7e94dc56cac392789fa6382a77b.php b/storage/framework/views/8702e7e94dc56cac392789fa6382a77b.php new file mode 100755 index 0000000..0929d49 --- /dev/null +++ b/storage/framework/views/8702e7e94dc56cac392789fa6382a77b.php @@ -0,0 +1,13 @@ +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    \ No newline at end of file diff --git a/storage/framework/views/88072a664aaf8108f0f58cda06c46095.php b/storage/framework/views/88072a664aaf8108f0f58cda06c46095.php new file mode 100755 index 0000000..2acddfa --- /dev/null +++ b/storage/framework/views/88072a664aaf8108f0f58cda06c46095.php @@ -0,0 +1,22 @@ +code) ?: $value ?> + + + + + \ No newline at end of file diff --git a/storage/framework/views/884cada878fc61b9e4a4d0ca41058011.php b/storage/framework/views/884cada878fc61b9e4a4d0ca41058011.php new file mode 100755 index 0000000..5b603f9 --- /dev/null +++ b/storage/framework/views/884cada878fc61b9e4a4d0ca41058011.php @@ -0,0 +1,426 @@ + +onlyProps([ + 'allowEdit' => true, +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'allowEdit' => true, +]); ?> + true, +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + +except('value')); ?> + + :value=get('value'))); ?> + + :allow-edit="" +> +
    +
    +
    +
    +
    +
    + +hasRenderedOnce('33cb2245-d0e7-43c4-96d4-f4a9d2a57fb3')): $__env->markAsRenderedOnce('33cb2245-d0e7-43c4-96d4-f4a9d2a57fb3'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/88b14aed5dac5bd92d7147188398c84b.php b/storage/framework/views/88b14aed5dac5bd92d7147188398c84b.php new file mode 100755 index 0000000..9ddd9bb --- /dev/null +++ b/storage/framework/views/88b14aed5dac5bd92d7147188398c84b.php @@ -0,0 +1,287 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.leads.view.title', ['title' => $lead->title]); ?> + endSlot(); ?> + + +
    + + $lead]); ?> + + +
    + +
    + +
    + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'leads.view','entity' => $lead]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'leads.view','entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($lead)]); ?> +renderComponent(); ?> + + + + + + + + + +
    + +
    + rotten_days) > 0): ?> + tags->prepend([ + 'name' => '' . trans('admin::app.leads.view.rotten-days', ['days' => $days]), + 'color' => '#FEE2E2' + ]); + ?> + + + $lead]); ?> + + + + + + 'admin::components.tags.index','data' => ['attachEndpoint' => route('admin.leads.tags.attach', $lead->id),'detachEndpoint' => route('admin.leads.tags.detach', $lead->id),'addedTags' => $lead->tags]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::tags'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attach-endpoint' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.leads.tags.attach', $lead->id)),'detach-endpoint' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.leads.tags.detach', $lead->id)),'added-tags' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($lead->tags)]); ?> +renderComponent(); ?> + + + + + + + + + + + $lead]); ?> + +
    + + + $lead]); ?> + + + +

    + title); ?> + +

    + + $lead]); ?> + + + +
    + $lead]); ?> + + + hasPermission('mail.compose')): ?> + + + + 'admin::components.activities.actions.mail','data' => ['entity' => $lead,'entityControlName' => 'lead_id']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::activities.actions.mail'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($lead),'entity-control-name' => 'lead_id']); ?> +renderComponent(); ?> + + + + + + + + + + + + hasPermission('activities.create')): ?> + + + + 'admin::components.activities.actions.file','data' => ['entity' => $lead,'entityControlName' => 'lead_id']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::activities.actions.file'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($lead),'entity-control-name' => 'lead_id']); ?> +renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.activities.actions.note','data' => ['entity' => $lead,'entityControlName' => 'lead_id']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::activities.actions.note'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($lead),'entity-control-name' => 'lead_id']); ?> +renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.activities.actions.activity','data' => ['entity' => $lead,'entityControlName' => 'lead_id']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::activities.actions.activity'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($lead),'entity-control-name' => 'lead_id']); ?> +renderComponent(); ?> + + + + + + + + + + + + $lead]); ?> + +
    +
    + + + make('admin::leads.view.attributes', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + make('admin::leads.view.person', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> +
    + + $lead]); ?> + + + $lead]); ?> + + + +
    + + make('admin::leads.view.stages', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + $lead]); ?> + + + + + 'admin::components.activities.index','data' => ['endpoint' => route('admin.leads.activities.index', $lead->id),'emailDetachEndpoint' => route('admin.leads.emails.detach', $lead->id),'activeType' => request()->query('from') === 'quotes' ? 'quotes' : 'all','extraTypes' => [ + ['name' => 'description', 'label' => trans('admin::app.leads.view.tabs.description')], + ['name' => 'products', 'label' => trans('admin::app.leads.view.tabs.products')], + ['name' => 'quotes', 'label' => trans('admin::app.leads.view.tabs.quotes')], + ]]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::activities'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['endpoint' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.leads.activities.index', $lead->id)),'email-detach-endpoint' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.leads.emails.detach', $lead->id)),'activeType' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(request()->query('from') === 'quotes' ? 'quotes' : 'all'),'extra-types' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute([ + ['name' => 'description', 'label' => trans('admin::app.leads.view.tabs.description')], + ['name' => 'products', 'label' => trans('admin::app.leads.view.tabs.products')], + ['name' => 'quotes', 'label' => trans('admin::app.leads.view.tabs.quotes')], + ])]); ?> + + slot('products', null, []); ?> + make('admin::leads.view.products', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + endSlot(); ?> + + + slot('quotes', null, []); ?> + make('admin::leads.view.quotes', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + endSlot(); ?> + + + slot('description', null, []); ?> +
    + description); ?> + +
    + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + + + $lead]); ?> + +
    + + $lead]); ?> + +
    + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/88bea98a1376d5d8feaf9cc6532eb4ba.php b/storage/framework/views/88bea98a1376d5d8feaf9cc6532eb4ba.php new file mode 100755 index 0000000..f69fc24 --- /dev/null +++ b/storage/framework/views/88bea98a1376d5d8feaf9cc6532eb4ba.php @@ -0,0 +1,125 @@ + +onlyProps([ + 'isActive' => true, +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'isActive' => true, +]); ?> + true, +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + +
    merge(['class' => 'box-shadow rounded-lg border border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-900'])); ?>> + + + > + + + 'admin::components.shimmer.accordion.index','data' => ['class' => 'h-[271px] w-[360px]']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.accordion'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'h-[271px] w-[360px]']); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + + + +
    + +hasRenderedOnce('704a1804-6644-41df-a496-0d3a431b7b4c')): $__env->markAsRenderedOnce('704a1804-6644-41df-a496-0d3a431b7b4c'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/8a17e69ebe882e749209f94a38820f3c.php b/storage/framework/views/8a17e69ebe882e749209f94a38820f3c.php new file mode 100755 index 0000000..e603a50 --- /dev/null +++ b/storage/framework/views/8a17e69ebe882e749209f94a38820f3c.php @@ -0,0 +1,776 @@ +getNameKey()) ?? system_config()->getConfigData($field->getNameKey())); ?> + + + +
    + +
    + +
    +
    +
    + +hasRenderedOnce('f77d7c2d-2a42-4ba0-aac7-b569b0f3d956')): $__env->markAsRenderedOnce('f77d7c2d-2a42-4ba0-aac7-b569b0f3d956'); +$__env->startPush('scripts'); ?> + + + + + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/8a59a466a35144d796c5b814196af89b.php b/storage/framework/views/8a59a466a35144d796c5b814196af89b.php new file mode 100755 index 0000000..d715a2a --- /dev/null +++ b/storage/framework/views/8a59a466a35144d796c5b814196af89b.php @@ -0,0 +1,245 @@ +
    + +
    + + + + 'admin::components.layouts.sidebar.mobile.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts.sidebar.mobile'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + getConfigData('general.general.admin_logo.logo_image')): ?> + <?php echo e(config('app.name')); ?> + + <?php echo e(config('app.name')); ?> + + <?php echo e(config('app.name')); ?> + + +
    + +
    + + make('admin::components.layouts.header.desktop.mega-search', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + make('admin::components.layouts.header.quick-creation', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> +
    + +
    +
    + + make('admin::components.layouts.header.mobile.mega-search', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> +
    + + + +
    + +
    +
    + +
    + + make('admin::components.layouts.header.quick-creation', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> +
    + + + + + 'admin::components.dropdown.index','data' => ['position' => 'bottom-'.e(in_array(app()->getLocale(), ['fa', 'ar']) ? 'left' : 'right').'']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::dropdown'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['position' => 'bottom-'.e(in_array(app()->getLocale(), ['fa', 'ar']) ? 'left' : 'right').'']); ?> + slot('toggle', null, []); ?> + guard('user')->user()); ?> + + image): ?> + + + + + endSlot(); ?> + + + slot('content', null, ['class' => 'mt-2 border-t-0 !p-0']); ?> +
    + + + +

    + get('admin::app.layouts.app-version', ['version' => core()->version()]); ?> +

    +
    + +
    + + get('admin::app.layouts.my-account'); ?> + + + + + + 'admin::components.form.index','data' => ['method' => 'DELETE','action' => ''.e(route('admin.session.destroy')).'','id' => 'adminLogout']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['method' => 'DELETE','action' => ''.e(route('admin.session.destroy')).'','id' => 'adminLogout']); ?> + renderComponent(); ?> + + + + + + + + + + + + get('admin::app.layouts.sign-out'); ?> + +
    + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + +
    +
    + +hasRenderedOnce('517f80af-d0e7-4f1f-b910-f0764e3becdf')): $__env->markAsRenderedOnce('517f80af-d0e7-4f1f-b910-f0764e3becdf'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/8bae8d55f9e611db52d14d4cea7aed55.php b/storage/framework/views/8bae8d55f9e611db52d14d4cea7aed55.php new file mode 100755 index 0000000..e0b8a20 --- /dev/null +++ b/storage/framework/views/8bae8d55f9e611db52d14d4cea7aed55.php @@ -0,0 +1,4 @@ +merge(['class' => 'bg-gray-50 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300'])); ?>> + + + \ No newline at end of file diff --git a/storage/framework/views/8bf5d3a224233878842202702d6fc971.php b/storage/framework/views/8bf5d3a224233878842202702d6fc971.php new file mode 100755 index 0000000..39dd3e9 --- /dev/null +++ b/storage/framework/views/8bf5d3a224233878842202702d6fc971.php @@ -0,0 +1,500 @@ + +onlyProps([ + 'type' => 'text', + 'name' => '', +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'type' => 'text', + 'name' => '', +]); ?> + 'text', + 'name' => '', +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])); ?> + + name="" + > + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400'])); ?> + + /> + + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])); ?> + + name="" + > +
    + + attributes->merge(['class' => 'py-2.5 text-gray-500 ltr:pl-4 rtl:pr-4'])); ?>> + + + + + + + + + + + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full p-2.5 text-sm text-gray-600 dark:bg-gray-900 dark:text-gray-300'])); ?> + + /> +
    +
    + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])); ?> + + name="" + > + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full dark:file:bg-gray-800 dark:file:dark:text-white rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400'])); ?> + + @change="handleChange" + @blur="handleBlur" + /> + + + + + + except('class')); ?> + + > + except(['value'])->merge(['class' => 'w-full appearance-none rounded-md border text-sm text-gray-600 transition-all hover:border-gray-400 dark:text-gray-300 dark:hover:border-gray-400'])); ?> + + > + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])); ?> + + name="" + > + 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400' + ]; + + if ($attributes->get('tinymce', false) || $attributes->get(':tinymce', false)) { + $defaultAttributes['id'] = $attributes->get(':id', 'id'); + } + ?> + + + + get('tinymce', false) || $attributes->get(':tinymce', false)): ?> + + + 'admin::components.tinymce.index','data' => ['selector' => 'textarea#' . ($attributes->get('id') ?? $attributes->get(':id')),':field' => 'field']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::tinymce'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['selector' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute('textarea#' . ($attributes->get('id') ?? $attributes->get(':id'))),':field' => 'field']); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['rules' => 'regex:^\d{4}-\d{2}-\d{2}$'])); ?> + + name="" + > + + + 'admin::components.flat-picker.date','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::flat-picker.date'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400'])); ?> + + autocomplete="off" + /> + renderComponent(); ?> + + + + + + + + + + + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['rules' => 'regex:^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$'])); ?> + + name="" + > + + + 'admin::components.flat-picker.datetime','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::flat-picker.datetime'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400'])); ?> + + autocomplete="off" + > + renderComponent(); ?> + + + + + + + + + + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])); ?> + + name="" + > + + + + + + + except([])->merge(['class' => 'flex w-full flex-col rounded-md border bg-white px-3 py-2.5 text-sm font-normal text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400'])); ?> + + name="" + multiple + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 'admin::components.media.images','data' => ['name' => ''.e($name).'',':class' => '[errors && errors[\''.e($name).'\'] ? \'border !border-red-600 hover:border-red-600\' : \'\']','attributes' => $attributes]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::media.images'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => ''.e($name).'',':class' => '[errors && errors[\''.e($name).'\'] ? \'border !border-red-600 hover:border-red-600\' : \'\']','attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attributes)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.form.control-group.controls.inline.text','data' => ['attributes' => $attributes]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.controls.inline.text'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attributes)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + > + + + + + + + + + + 'admin::components.form.control-group.controls.tags','data' => ['name' => $name,'data' => $attributes->get(':data') ?? $attributes->get('data'),'attributes' => $attributes]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.controls.tags'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($name),'data' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attributes->get(':data') ?? $attributes->get('data')),'attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attributes)]); ?> +renderComponent(); ?> + + + + + + + + + + + + +hasRenderedOnce('f89a5345-d0a9-435c-88eb-c688107d8bc7')): $__env->markAsRenderedOnce('f89a5345-d0a9-435c-88eb-c688107d8bc7'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/8c4fb3572583daf48a49a4c3c10aa8f0.php b/storage/framework/views/8c4fb3572583daf48a49a4c3c10aa8f0.php new file mode 100755 index 0000000..10a8435 --- /dev/null +++ b/storage/framework/views/8c4fb3572583daf48a49a4c3c10aa8f0.php @@ -0,0 +1,592 @@ + + + + + + 'admin::components.shimmer.common.address','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.common.address'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + +hasRenderedOnce('2b90d9f3-9e4d-4972-b820-898c7e8bf0b7')): $__env->markAsRenderedOnce('2b90d9f3-9e4d-4972-b820-898c7e8bf0b7'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/8cd6f22911eceb78967b172efb7a3e4d.php b/storage/framework/views/8cd6f22911eceb78967b172efb7a3e4d.php new file mode 100755 index 0000000..0e1bd8f --- /dev/null +++ b/storage/framework/views/8cd6f22911eceb78967b172efb7a3e4d.php @@ -0,0 +1,21 @@ + + + 'admin::components.form.control-group.controls.inline.boolean','data' => [':name' => '\''.e($attribute->code).'\'','value' => json_encode($value),'rules' => 'required','position' => 'left','label' => $attribute->name,':errors' => 'errors','placeholder' => $attribute->name,'url' => $url,'allowEdit' => $allowEdit]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.controls.inline.boolean'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([':name' => '\''.e($attribute->code).'\'','value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(json_encode($value)),'rules' => 'required','position' => 'left','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),':errors' => 'errors','placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),'url' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($url),'allow-edit' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($allowEdit)]); ?> +renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/8db0fee22081357b08aac61d2811038f.php b/storage/framework/views/8db0fee22081357b08aac61d2811038f.php new file mode 100755 index 0000000..f3b3955 --- /dev/null +++ b/storage/framework/views/8db0fee22081357b08aac61d2811038f.php @@ -0,0 +1,222 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.dashboard.index.title'); ?> + endSlot(); ?> + + + + + +
    + + + +
    +

    + get('admin::app.dashboard.index.title'); ?> +

    +
    + + + + + + + + + + +
    +
    +
    +
    +
    + + + +
    + + + + + + + + +
    + + + + +
    + + make('admin::dashboard.index.revenue', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + make('admin::dashboard.index.over-all', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + make('admin::dashboard.index.total-leads', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + +
    + + make('admin::dashboard.index.top-selling-products', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + make('admin::dashboard.index.top-persons', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> +
    +
    + + + + + + + + +
    + + make('admin::dashboard.index.open-leads-by-states', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + make('admin::dashboard.index.revenue-by-sources', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + make('admin::dashboard.index.revenue-by-types', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> +
    + + + +
    + + + + + hasRenderedOnce('6b012e08-1880-4962-91f3-cedcee3c943d')): $__env->markAsRenderedOnce('6b012e08-1880-4962-91f3-cedcee3c943d'); +$__env->startPush('scripts'); ?> + + + + + + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/8e57faf3fdad6d72cd5dae96efb6e32d.php b/storage/framework/views/8e57faf3fdad6d72cd5dae96efb6e32d.php new file mode 100755 index 0000000..3ef28fb --- /dev/null +++ b/storage/framework/views/8e57faf3fdad6d72cd5dae96efb6e32d.php @@ -0,0 +1,29 @@ +startComponent('admin::emails.layout'); ?> +
    +

    + get('admin::app.emails.common.user.forget-password.dear', ['username' => $user_name]); ?>, 👋 +

    + +

    + get('admin::app.emails.common.user.forget-password.info'); ?> +

    + +

    + + get('admin::app.emails.common.user.forget-password.reset-password'); ?> + +

    + +

    + get('admin::app.emails.common.user.forget-password.final-summary'); ?> +

    + +

    + get('admin::app.emails.common.user.forget-password.thanks'); ?> +

    +
    +renderComponent(); ?> + \ No newline at end of file diff --git a/storage/framework/views/8f116a3d8eb219317dd63973388de625.php b/storage/framework/views/8f116a3d8eb219317dd63973388de625.php new file mode 100755 index 0000000..60b7443 --- /dev/null +++ b/storage/framework/views/8f116a3d8eb219317dd63973388de625.php @@ -0,0 +1,38 @@ + + + + + + + + + + + + +
    +
    + +
    + + <?php echo e(config('app.name')); ?> + +
    + + + + + + +

    + get('admin::app.emails.common.cheers', ['app_name' => config('app.name')]); ?> +

    +
    +
    + + + \ No newline at end of file diff --git a/storage/framework/views/9055d5aa6817e1c2a482961ccb336070.php b/storage/framework/views/9055d5aa6817e1c2a482961ccb336070.php new file mode 100755 index 0000000..c1a0b1d --- /dev/null +++ b/storage/framework/views/9055d5aa6817e1c2a482961ccb336070.php @@ -0,0 +1,658 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.settings.tags.index.title'); ?> + endSlot(); ?> + +
    + +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.tags']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.tags']); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + get('admin::app.settings.tags.index.title'); ?> +
    +
    + +
    + + + + + hasPermission('settings.other_settings.tags.create')): ?> +
    + +
    + + + + +
    +
    + + + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + +
    + + hasRenderedOnce('aadcc06a-0764-4186-a267-2414a06e95e0')): $__env->markAsRenderedOnce('aadcc06a-0764-4186-a267-2414a06e95e0'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/909db4de01ae69ca6d8fdb47d48c3ae9.php b/storage/framework/views/909db4de01ae69ca6d8fdb47d48c3ae9.php new file mode 100755 index 0000000..97c0ae9 --- /dev/null +++ b/storage/framework/views/909db4de01ae69ca6d8fdb47d48c3ae9.php @@ -0,0 +1,41 @@ +
    + +
    + +
    +
    +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    +
    +
    + +
    +
    +
    +
    + +
    +
    + + +
    +
    +
    + +
    +
    +
    \ No newline at end of file diff --git a/storage/framework/views/90a5248af06033b8f4dd64a644274070.php b/storage/framework/views/90a5248af06033b8f4dd64a644274070.php new file mode 100755 index 0000000..3982ac1 --- /dev/null +++ b/storage/framework/views/90a5248af06033b8f4dd64a644274070.php @@ -0,0 +1,293 @@ + +onlyProps([ + 'allowEdit' => true, +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'allowEdit' => true, +]); ?> + true, +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + :allow-edit="" + > +
    +
    +
    +
    +
    +
    + +hasRenderedOnce('3d496ce1-f97b-41af-8b98-5bd7337a28ab')): $__env->markAsRenderedOnce('3d496ce1-f97b-41af-8b98-5bd7337a28ab'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/90b04458d177c3dada7a3e01eb2c135a.php b/storage/framework/views/90b04458d177c3dada7a3e01eb2c135a.php new file mode 100755 index 0000000..00abd18 --- /dev/null +++ b/storage/framework/views/90b04458d177c3dada7a3e01eb2c135a.php @@ -0,0 +1,171 @@ + + + + + + + + + 'admin::components.shimmer.dashboard.index.top-selling-products','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.dashboard.index.top-selling-products'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + +hasRenderedOnce('bb1c48c5-abdc-41c4-a8d5-89bdafcaef69')): $__env->markAsRenderedOnce('bb1c48c5-abdc-41c4-a8d5-89bdafcaef69'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/90deeaf9f2dcac7abfde3cc13e37ffd7.php b/storage/framework/views/90deeaf9f2dcac7abfde3cc13e37ffd7.php new file mode 100755 index 0000000..4a6caec --- /dev/null +++ b/storage/framework/views/90deeaf9f2dcac7abfde3cc13e37ffd7.php @@ -0,0 +1,20 @@ +hasPages()): ?> + + + \ No newline at end of file diff --git a/storage/framework/views/91bc81542d0d8bc6a883e11ba4f0a393.php b/storage/framework/views/91bc81542d0d8bc6a883e11ba4f0a393.php new file mode 100755 index 0000000..04f9781 --- /dev/null +++ b/storage/framework/views/91bc81542d0d8bc6a883e11ba4f0a393.php @@ -0,0 +1,5 @@ +
  3. merge(['class' => 'cursor-pointer px-5 py-2 text-sm text-gray-800 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-950 '])); ?>> + + +
  4. + \ No newline at end of file diff --git a/storage/framework/views/925d1237a9e4ca489126a9072aa264d2.php b/storage/framework/views/925d1237a9e4ca489126a9072aa264d2.php new file mode 100755 index 0000000..c2e9f12 --- /dev/null +++ b/storage/framework/views/925d1237a9e4ca489126a9072aa264d2.php @@ -0,0 +1,188 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.quotes.index.title'); ?> + endSlot(); ?> + + +
    +
    +
    + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'quotes']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'quotes']); ?> +renderComponent(); ?> + + + + + + + + + + +
    + get('admin::app.quotes.index.title'); ?> +
    +
    + +
    + +
    + hasPermission('quotes.create')): ?> + + get('admin::app.quotes.index.create-btn'); ?> + + +
    +
    +
    + + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + +
    +
    + + hasRenderedOnce('00b2a494-37a1-4ec5-801c-c202def1310d')): $__env->markAsRenderedOnce('00b2a494-37a1-4ec5-801c-c202def1310d'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/92acfd4627deaa2d813e04f81ba29728.php b/storage/framework/views/92acfd4627deaa2d813e04f81ba29728.php new file mode 100755 index 0000000..965a019 --- /dev/null +++ b/storage/framework/views/92acfd4627deaa2d813e04f81ba29728.php @@ -0,0 +1,212 @@ + + + + + + + + + 'admin::components.shimmer.dashboard.index.revenue-by-sources','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.dashboard.index.revenue-by-sources'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + +hasRenderedOnce('f1b98192-fbb0-40b4-bc43-10b01083aae3')): $__env->markAsRenderedOnce('f1b98192-fbb0-40b4-bc43-10b01083aae3'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/92b3aade7795023f63125b7bb1702d03.php b/storage/framework/views/92b3aade7795023f63125b7bb1702d03.php new file mode 100755 index 0000000..c9946d8 --- /dev/null +++ b/storage/framework/views/92b3aade7795023f63125b7bb1702d03.php @@ -0,0 +1,639 @@ + +onlyProps([ + 'isMultiRow' => false, + 'toolbarLeftBefore' => null, + 'toolbarLeftAfter' => null, + 'toolbarRightBefore' => null, + 'toolbarRightAfter' => null, +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'isMultiRow' => false, + 'toolbarLeftBefore' => null, + 'toolbarLeftAfter' => null, + 'toolbarRightBefore' => null, + 'toolbarRightAfter' => null, +]); ?> + false, + 'toolbarLeftBefore' => null, + 'toolbarLeftAfter' => null, + 'toolbarRightBefore' => null, + 'toolbarRightAfter' => null, +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + +> + + + + +hasRenderedOnce('07e471f0-385c-411d-949d-0a0446508e1c')): $__env->markAsRenderedOnce('07e471f0-385c-411d-949d-0a0446508e1c'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/92b933031062dd5cad4972c31428fb46.php b/storage/framework/views/92b933031062dd5cad4972c31428fb46.php new file mode 100755 index 0000000..ae63fd6 --- /dev/null +++ b/storage/framework/views/92b933031062dd5cad4972c31428fb46.php @@ -0,0 +1,181 @@ + + + + + + + + + 'admin::components.shimmer.dashboard.index.top-persons','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.dashboard.index.top-persons'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + +hasRenderedOnce('2f5a2c3c-a231-44c0-9903-9c279002594f')): $__env->markAsRenderedOnce('2f5a2c3c-a231-44c0-9903-9c279002594f'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/92e13459cd974753921232bbfbf0aeb9.php b/storage/framework/views/92e13459cd974753921232bbfbf0aeb9.php new file mode 100755 index 0000000..d23b956 --- /dev/null +++ b/storage/framework/views/92e13459cd974753921232bbfbf0aeb9.php @@ -0,0 +1,38 @@ + +onlyProps([ + 'name' => '', + 'entity' => null, + 'route' => null, +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'name' => '', + 'entity' => null, + 'route' => null, +]); ?> + '', + 'entity' => null, + 'route' => null, +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + +
    +
    + + + + + + + +
    +
    + \ No newline at end of file diff --git a/storage/framework/views/9317ecbb458a25699dddb338429ce29a.php b/storage/framework/views/9317ecbb458a25699dddb338429ce29a.php new file mode 100755 index 0000000..aef98a1 --- /dev/null +++ b/storage/framework/views/9317ecbb458a25699dddb338429ce29a.php @@ -0,0 +1,85 @@ + +onlyProps(['isMultiRow' => false]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps(['isMultiRow' => false]); ?> + false]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + +
    + + + 'admin::components.shimmer.datagrid.toolbar','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid.toolbar'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + +
    +
    +
    + + + 'admin::components.shimmer.datagrid.table.head','data' => ['isMultiRow' => $isMultiRow]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid.table.head'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['isMultiRow' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($isMultiRow)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.shimmer.datagrid.table.body','data' => ['isMultiRow' => $isMultiRow]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid.table.body'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['isMultiRow' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($isMultiRow)]); ?> +renderComponent(); ?> + + + + + + + + + +
    +
    +
    +
    + \ No newline at end of file diff --git a/storage/framework/views/934aab714a4eb851ea4eb219c788782b.php b/storage/framework/views/934aab714a4eb851ea4eb219c788782b.php new file mode 100755 index 0000000..10c6f90 --- /dev/null +++ b/storage/framework/views/934aab714a4eb851ea4eb219c788782b.php @@ -0,0 +1,108 @@ +addLoop($__currentLoopData); foreach($__currentLoopData as $attribute): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> + is_required) { + $validations[] = 'required'; + } + + if ($attribute->type == 'price') { + $validations[] = 'decimal'; + } + + $validations[] = $attribute->validation; + + $validations = implode('|', array_filter($validations)); + ?> + + + + 'admin::components.form.control-group.index','data' => ['class' => 'mb-2.5 w-full']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'mb-2.5 w-full']); ?> + + + 'admin::components.form.control-group.label','data' => ['for' => ''.e($attribute->code).'','class' => $attribute->is_required ? 'required' : '']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['for' => ''.e($attribute->code).'','class' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->is_required ? 'required' : '')]); ?> + name); ?> + + + type == 'price'): ?> + (currencySymbol(config('app.currency'))); ?>) + + renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.attributes.edit.index','data' => ['attribute' => $attribute,'validations' => $validations,'value' => isset($entity) ? $entity[$attribute->code] : null]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.index'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(isset($entity) ? $entity[$attribute->code] : null)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => $attribute->code]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->code)]); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + +popLoop(); $loop = $__env->getLastLoop(); ?> \ No newline at end of file diff --git a/storage/framework/views/93aa69ca334eb6628bd9f09efab714ad.php b/storage/framework/views/93aa69ca334eb6628bd9f09efab714ad.php new file mode 100755 index 0000000..65fa5d0 --- /dev/null +++ b/storage/framework/views/93aa69ca334eb6628bd9f09efab714ad.php @@ -0,0 +1,522 @@ + + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.settings.email-template.create.title'); ?> + endSlot(); ?> + + + + + + + 'admin::components.form.index','data' => ['action' => route('admin.settings.email_templates.store'),'method' => 'POST']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.email_templates.store')),'method' => 'POST']); ?> +
    +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.email_templates.create']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.email_templates.create']); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + get('admin::app.settings.email-template.create.title'); ?> +
    +
    + +
    + +
    + + + + + + + +
    +
    +
    + + +
    + renderComponent(); ?> + + + + + + + + + + + + + + hasRenderedOnce('50ebe5be-a4b2-46be-879e-cf7c43eab07c')): $__env->markAsRenderedOnce('50ebe5be-a4b2-46be-879e-cf7c43eab07c'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/9558f9114f97694e92ae6472c02ebf05.php b/storage/framework/views/9558f9114f97694e92ae6472c02ebf05.php new file mode 100755 index 0000000..e638669 --- /dev/null +++ b/storage/framework/views/9558f9114f97694e92ae6472c02ebf05.php @@ -0,0 +1,1740 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.settings.attributes.edit.title'); ?> + endSlot(); ?> + + $attribute]); ?> + + + + + + 'admin::components.form.index','data' => ['action' => route('admin.settings.attributes.update', $attribute->id),'encType' => 'multipart/form-data','method' => 'PUT']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.attributes.update', $attribute->id)),'encType' => 'multipart/form-data','method' => 'PUT']); ?> +
    + $attribute]); ?> + + + +
    +
    + $attribute]); ?> + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.attributes.edit','entity' => $attribute]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.attributes.edit','entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute)]); ?> +renderComponent(); ?> + + + + + + + + + + + $attribute]); ?> + + +
    + $attribute]); ?> + + + get('admin::app.settings.attributes.edit.title'); ?> + + $attribute]); ?> + +
    +
    + +
    + +
    + $attribute]); ?> + + + hasPermission('settings.automation.attributes.edit')): ?> + + + + $attribute]); ?> + +
    +
    +
    + + + + + + + 'admin::components.shimmer.settings.attributes','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.settings.attributes'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + $attribute]); ?> + +
    + renderComponent(); ?> + + + + + + + + + + + $attribute]); ?> + + + hasRenderedOnce('4f74ad12-e87c-48ab-abe6-068c06dcab69')): $__env->markAsRenderedOnce('4f74ad12-e87c-48ab-abe6-068c06dcab69'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/95b5c81635c64aea784454aff2257ef7.php b/storage/framework/views/95b5c81635c64aea784454aff2257ef7.php new file mode 100755 index 0000000..2b79c07 --- /dev/null +++ b/storage/framework/views/95b5c81635c64aea784454aff2257ef7.php @@ -0,0 +1,658 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.account.edit.title'); ?> + endSlot(); ?> + + $user]); ?> + + + + + + 'admin::components.form.index','data' => ['action' => route('admin.user.account.update'),'enctype' => 'multipart/form-data','method' => 'PUT']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.user.account.update')),'enctype' => 'multipart/form-data','method' => 'PUT']); ?> +
    +
    + $user]); ?> + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'dashboard.account.edit','entity' => $user]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'dashboard.account.edit','entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($user)]); ?> +renderComponent(); ?> + + + + + + + + + + + $user]); ?> + + +
    + $user]); ?> + + + get('admin::app.account.edit.title'); ?> + + $user]); ?> + +
    +
    + +
    + +
    + $user]); ?> + + + + + $user]); ?> + +
    +
    +
    + + +
    + $user]); ?> + + + +
    + +
    +

    + get('admin::app.account.edit.general'); ?> +

    + + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.media.images','data' => ['name' => 'image','uploadedImages' => $user->image ? [['id' => 'image', 'url' => $user->image_url]] : []]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::media.images'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'image','uploaded-images' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($user->image ? [['id' => 'image', 'url' => $user->image_url]] : [])]); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + +

    + get('admin::app.account.edit.upload-image-info'); ?> +

    + + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.account.edit.name'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'text','name' => 'name','rules' => 'required','value' => old('name') ?: $user->name,'label' => trans('admin::app.account.edit.name'),'placeholder' => trans('admin::app.account.edit.name')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'text','name' => 'name','rules' => 'required','value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(old('name') ?: $user->name),'label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.account.edit.name')),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.account.edit.name'))]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'name']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'name']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.form.control-group.index','data' => ['class' => '!mb-0']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => '!mb-0']); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.account.edit.email'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'email','name' => 'email','id' => 'email','rules' => 'required','value' => old('email') ?: $user->email,'label' => trans('admin::app.account.edit.email')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'email','name' => 'email','id' => 'email','rules' => 'required','value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(old('email') ?: $user->email),'label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.account.edit.email'))]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'email']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'email']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + +
    +
    + + $user]); ?> + + + $user]); ?> + + + +
    + + + 'admin::components.accordion.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::accordion'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('header', null, []); ?> +

    + get('admin::app.account.edit.change-password'); ?> +

    + endSlot(); ?> + + + slot('content', null, []); ?> + $user]); ?> + + + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.account.edit.current-password'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'password','name' => 'current_password','rules' => 'required|min:6','label' => trans('admin::app.account.edit.current-password'),'placeholder' => trans('admin::app.account.edit.current-password')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'password','name' => 'current_password','rules' => 'required|min:6','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.account.edit.current-password')),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.account.edit.current-password'))]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'current_password']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'current_password']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + $user]); ?> + + + $user]); ?> + + + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + get('admin::app.account.edit.password'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'password','name' => 'password','rules' => 'min:6','placeholder' => trans('admin::app.account.edit.password'),'ref' => 'password']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'password','name' => 'password','rules' => 'min:6','placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.account.edit.password')),'ref' => 'password']); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'password']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'password']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + $user]); ?> + + + $user]); ?> + + + + + + 'admin::components.form.control-group.index','data' => ['class' => '!mb-0']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => '!mb-0']); ?> + + + 'admin::components.form.control-group.label','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + get('admin::app.account.edit.confirm-password'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'password','name' => 'password_confirmation','rules' => 'confirmed:@password','label' => trans('admin::app.account.edit.confirm-password'),'placeholder' => trans('admin::app.account.edit.confirm-password')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'password','name' => 'password_confirmation','rules' => 'confirmed:@password','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.account.edit.confirm-password')),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.account.edit.confirm-password'))]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'password_confirmation']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'password_confirmation']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + $user]); ?> + + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + +
    + + $user]); ?> + +
    + renderComponent(); ?> + + + + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/973ec33cebe14c9893ad5d32ad8c68c9.php b/storage/framework/views/973ec33cebe14c9893ad5d32ad8c68c9.php new file mode 100755 index 0000000..5108953 --- /dev/null +++ b/storage/framework/views/973ec33cebe14c9893ad5d32ad8c68c9.php @@ -0,0 +1,25 @@ +
    +
    +
    +
    + +
    + +
    + +
    + +
    + +
    + +
    + + +
    +
    +
    +
    + +
    +
    \ No newline at end of file diff --git a/storage/framework/views/974fb0b69dbc0076e14acbf808232f09.php b/storage/framework/views/974fb0b69dbc0076e14acbf808232f09.php new file mode 100755 index 0000000..3eaecc5 --- /dev/null +++ b/storage/framework/views/974fb0b69dbc0076e14acbf808232f09.php @@ -0,0 +1,155 @@ + $lead]); ?> + + +person): ?> +
    + + + 'admin::components.accordion.index','data' => ['class' => 'select-none !border-none']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::accordion'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'select-none !border-none']); ?> + slot('header', null, ['class' => '!p-0']); ?> +
    +

    get('admin::app.leads.view.persons.title'); ?>

    + + hasPermission('contacts.persons.edit')): ?> + + +
    + endSlot(); ?> + + slot('content', null, ['class' => 'mt-4 !px-0 !pb-0']); ?> +
    + $lead]); ?> + + + + + + 'admin::components.avatar.index','data' => ['name' => $lead->person->name]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::avatar'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($lead->person->name)]); ?> +renderComponent(); ?> + + + + + + + + + + + $lead]); ?> + + + +
    + $lead]); ?> + + + + person->name); ?> + + + + $lead]); ?> + + + $lead]); ?> + + + person->job_title): ?> + + person->organization): ?> + get('admin::app.leads.view.persons.job-title', [ + 'job_title' => $lead->person->job_title, + 'organization' => $lead->person->organization->name + ]); ?> + + person->job_title); ?> + + + + + + $lead]); ?> + + + $lead]); ?> + + + person->emails; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $email): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> +
    + + + + + + + () + +
    + popLoop(); $loop = $__env->getLastLoop(); ?> + + $lead]); ?> + + + $lead]); ?> + + + person->contact_numbers; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $contactNumber): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> +
    + + + + + + + () + +
    + popLoop(); $loop = $__env->getLastLoop(); ?> + + $lead]); ?> + +
    +
    + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + +
    + + $lead]); ?> \ No newline at end of file diff --git a/storage/framework/views/98072615de1b43056c7a8ff124ef81d0.php b/storage/framework/views/98072615de1b43056c7a8ff124ef81d0.php new file mode 100755 index 0000000..8321dd3 --- /dev/null +++ b/storage/framework/views/98072615de1b43056c7a8ff124ef81d0.php @@ -0,0 +1,50 @@ + + + + + + 'admin::components.datagrid.index','data' => ['src' => route('admin.leads.index')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['src' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.leads.index'))]); ?> + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + slot('toolbarRightAfter', null, []); ?> + make('admin::leads.index.view-switcher', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/99aa974efcee7262d96012bc812fca61.php b/storage/framework/views/99aa974efcee7262d96012bc812fca61.php new file mode 100755 index 0000000..f9274cc --- /dev/null +++ b/storage/framework/views/99aa974efcee7262d96012bc812fca61.php @@ -0,0 +1,18 @@ + +
    + +
    + +
    +

    +

    +
    +
    + + +
    +

    +
    +
    + + \ No newline at end of file diff --git a/storage/framework/views/9ad7840c207a7afc87ee0e1cb234dcfa.php b/storage/framework/views/9ad7840c207a7afc87ee0e1cb234dcfa.php new file mode 100755 index 0000000..5e1dd50 --- /dev/null +++ b/storage/framework/views/9ad7840c207a7afc87ee0e1cb234dcfa.php @@ -0,0 +1,25 @@ +getLookUpEntity($attribute->lookup_type, $value); +?> + + + + 'admin::components.form.control-group.controls.inline.lookup','data' => [':name' => '\''.e($attribute->code).'\'',':value' => '\''.e($lookUpEntity?->name).'\'','attribute' => $attribute,'position' => 'left','label' => $attribute->name,':errors' => 'errors','placeholder' => $attribute->name,'url' => $url,'allowEdit' => $allowEdit,'valueLabel' => $lookUpEntity?->name ?? '--']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.controls.inline.lookup'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([':name' => '\''.e($attribute->code).'\'',':value' => '\''.e($lookUpEntity?->name).'\'','attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'position' => 'left','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),':errors' => 'errors','placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),'url' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($url),'allow-edit' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($allowEdit),'value-label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($lookUpEntity?->name ?? '--')]); ?> +renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/9b0031b4889c60054d46ba508003d13e.php b/storage/framework/views/9b0031b4889c60054d46ba508003d13e.php new file mode 100755 index 0000000..96df0d1 --- /dev/null +++ b/storage/framework/views/9b0031b4889c60054d46ba508003d13e.php @@ -0,0 +1,116 @@ +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/storage/framework/views/9bc5b97a529c41a831f2a790c6b68649.php b/storage/framework/views/9bc5b97a529c41a831f2a790c6b68649.php new file mode 100755 index 0000000..7305f26 --- /dev/null +++ b/storage/framework/views/9bc5b97a529c41a831f2a790c6b68649.php @@ -0,0 +1,4 @@ +merge(['class' => 'bg-white dark:bg-gray-900 dark:text-gray-300 dark:border-gray-800'])); ?>> + + + \ No newline at end of file diff --git a/storage/framework/views/9d29dd05b14ef75e0e09c9fb664383d9.php b/storage/framework/views/9d29dd05b14ef75e0e09c9fb664383d9.php new file mode 100755 index 0000000..e368f28 --- /dev/null +++ b/storage/framework/views/9d29dd05b14ef75e0e09c9fb664383d9.php @@ -0,0 +1,21 @@ + + + 'admin::components.form.control-group.controls.inline.text','data' => ['type' => 'inline',':name' => '\''.e($attribute->code).'\'','value' => $value,'position' => 'left','rules' => 'required','label' => $attribute->name,'placeholder' => $attribute->name,':errors' => 'errors','url' => $url,'allowEdit' => $allowEdit]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.controls.inline.text'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'inline',':name' => '\''.e($attribute->code).'\'','value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'position' => 'left','rules' => 'required','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),':errors' => 'errors','url' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($url),'allow-edit' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($allowEdit)]); ?> +renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/9ef6f52bd7cece2edcd3a9f011ce1337.php b/storage/framework/views/9ef6f52bd7cece2edcd3a9f011ce1337.php new file mode 100755 index 0000000..c3ca4bf --- /dev/null +++ b/storage/framework/views/9ef6f52bd7cece2edcd3a9f011ce1337.php @@ -0,0 +1,17 @@ +
    +
    +

    +
    + +
    +
    + +

    + +
    +
    + +
    +
    +
    +
    \ No newline at end of file diff --git a/storage/framework/views/9ef7d91b1c5f09419a9136420111b3a6.php b/storage/framework/views/9ef7d91b1c5f09419a9136420111b3a6.php new file mode 100755 index 0000000..15256e9 --- /dev/null +++ b/storage/framework/views/9ef7d91b1c5f09419a9136420111b3a6.php @@ -0,0 +1,283 @@ + + + + + + + + + 'admin::components.shimmer.dashboard.index.revenue','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.dashboard.index.revenue'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + +hasRenderedOnce('9d233a8c-5991-4d05-bc2b-bbcae094d976')): $__env->markAsRenderedOnce('9d233a8c-5991-4d05-bc2b-bbcae094d976'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/9ffcff2286213d3a8fe04af513c7cd88.php b/storage/framework/views/9ffcff2286213d3a8fe04af513c7cd88.php new file mode 100755 index 0000000..fcc01d8 --- /dev/null +++ b/storage/framework/views/9ffcff2286213d3a8fe04af513c7cd88.php @@ -0,0 +1,66 @@ + +onlyProps(['isMultiRow' => false]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps(['isMultiRow' => false]); ?> + false]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + +
    +
    + +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    + +
    +
    +
    + +
    +
    + +
    + +
    +
    + +
    +
    + +
    + +
    +
    +
    + + + \ No newline at end of file diff --git a/storage/framework/views/a00783c81487f8730c1391b08502d86c.php b/storage/framework/views/a00783c81487f8730c1391b08502d86c.php new file mode 100755 index 0000000..96539f1 --- /dev/null +++ b/storage/framework/views/a00783c81487f8730c1391b08502d86c.php @@ -0,0 +1,45 @@ + + + + + +hasRenderedOnce('8af452bb-343b-45e0-b5d8-ad4fbbc224d5')): $__env->markAsRenderedOnce('8af452bb-343b-45e0-b5d8-ad4fbbc224d5'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/a0b01cc8d8aa93c4b0106214b50105d3.php b/storage/framework/views/a0b01cc8d8aa93c4b0106214b50105d3.php new file mode 100755 index 0000000..47a6d67 --- /dev/null +++ b/storage/framework/views/a0b01cc8d8aa93c4b0106214b50105d3.php @@ -0,0 +1,556 @@ + + $lead]); ?> + + + + + + + 'admin::components.shimmer.leads.view.stages','data' => ['count' => $lead->pipeline->stages->count() - 1]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.leads.view.stages'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['count' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($lead->pipeline->stages->count() - 1)]); ?> +renderComponent(); ?> + + + + + + + + + + + + $lead]); ?> + + +hasRenderedOnce('19468328-c6d0-46ff-9538-e807a2cd3e1c')): $__env->markAsRenderedOnce('19468328-c6d0-46ff-9538-e807a2cd3e1c'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/a0b4fa9fb4c26e44c4aa216c07a722a9.php b/storage/framework/views/a0b4fa9fb4c26e44c4aa216c07a722a9.php new file mode 100755 index 0000000..32a7f5e --- /dev/null +++ b/storage/framework/views/a0b4fa9fb4c26e44c4aa216c07a722a9.php @@ -0,0 +1,190 @@ + +onlyProps(['position' => 'bottom-left']) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps(['position' => 'bottom-left']); ?> + 'bottom-left']), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + +merge(['class' => 'relative'])); ?>> + + + + + + + + + + + + + + + + +hasRenderedOnce('93369625-a76d-4e97-b7bc-d590576f69a5')): $__env->markAsRenderedOnce('93369625-a76d-4e97-b7bc-d590576f69a5'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/a15b5670fe81fa7c104d47953f0a0948.php b/storage/framework/views/a15b5670fe81fa7c104d47953f0a0948.php new file mode 100755 index 0000000..de4f9d9 --- /dev/null +++ b/storage/framework/views/a15b5670fe81fa7c104d47953f0a0948.php @@ -0,0 +1,47 @@ +hasPages()): ?> + + + \ No newline at end of file diff --git a/storage/framework/views/a1b6707d7b57bbc79ebb3cfb0642233c.php b/storage/framework/views/a1b6707d7b57bbc79ebb3cfb0642233c.php new file mode 100755 index 0000000..8d03c47 --- /dev/null +++ b/storage/framework/views/a1b6707d7b57bbc79ebb3cfb0642233c.php @@ -0,0 +1,243 @@ + + + + + + + + + + <?php echo e($title ?? ''); ?> + + + + + + + + + + + yieldPushContent('meta'); ?> + + set(['src/Resources/assets/css/app.css', 'src/Resources/assets/js/app.js'])); ?> + + + + + + + getConfigData('general.design.admin_logo.favicon')): ?> + + + + + + getConfigData('general.settings.menu_color.brand_color') ?? '#0E90D9'; + ?> + + yieldPushContent('styles'); ?> + + + + + + + + + + + +
    + + + + 'admin::components.flash-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::flash-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.modal.confirm','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::modal.confirm'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + + 'admin::components.layouts.header.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts.header'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + +
    + + + + + yieldPushContent('scripts'); ?> + + + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/a1f8639f84aec9a6fcc765cd7fdb91d8.php b/storage/framework/views/a1f8639f84aec9a6fcc765cd7fdb91d8.php new file mode 100755 index 0000000..009be9a --- /dev/null +++ b/storage/framework/views/a1f8639f84aec9a6fcc765cd7fdb91d8.php @@ -0,0 +1,21 @@ + + + 'admin::components.form.control-group.controls.inline.text','data' => ['type' => 'inline',':name' => '\''.e($attribute->code).'\'',':value' => '\''.e($value).'\'','position' => 'left','rules' => 'required','label' => $attribute->name,'placeholder' => $attribute->name,':errors' => 'errors','url' => $url,'allowEdit' => $allowEdit]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.controls.inline.text'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'inline',':name' => '\''.e($attribute->code).'\'',':value' => '\''.e($value).'\'','position' => 'left','rules' => 'required','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),':errors' => 'errors','url' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($url),'allow-edit' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($allowEdit)]); ?> +renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/a20a7427658b5c91a3f551c4fb22b570.php b/storage/framework/views/a20a7427658b5c91a3f551c4fb22b570.php new file mode 100755 index 0000000..513ddd6 --- /dev/null +++ b/storage/framework/views/a20a7427658b5c91a3f551c4fb22b570.php @@ -0,0 +1,598 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.settings.data-transfer.imports.import.title'); ?> + endSlot(); ?> + + +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.data_transfers.import','entity' => $import]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.data_transfers.import','entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($import)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + get('admin::app.settings.data-transfer.imports.import.title'); ?> +
    +
    + +
    + +
    + + + + + hasPermission('settings.data_transfer.imports.edit')): ?> + + get('admin::app.settings.data-transfer.imports.import.edit-btn'); ?> + + + + + +
    +
    +
    + + + + + hasRenderedOnce('35c4cc68-7a74-4dd7-a899-e2a4f9100e19')): $__env->markAsRenderedOnce('35c4cc68-7a74-4dd7-a899-e2a4f9100e19'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/a3034fb28815c6737c7f1fe6dc837ca7.php b/storage/framework/views/a3034fb28815c6737c7f1fe6dc837ca7.php new file mode 100755 index 0000000..30294bb --- /dev/null +++ b/storage/framework/views/a3034fb28815c6737c7f1fe6dc837ca7.php @@ -0,0 +1,546 @@ + +onlyProps([ + 'entity' => null, + 'entityControlName' => null, +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'entity' => null, + 'entityControlName' => null, +]); ?> + null, + 'entityControlName' => null, +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + +
    + + + + + + + + + + + + + + + + +
    + +hasRenderedOnce('786ceddc-089a-4bbf-9a89-e0ac450796f2')): $__env->markAsRenderedOnce('786ceddc-089a-4bbf-9a89-e0ac450796f2'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/a37261f10bbbc05300815fb27a6ce63f.php b/storage/framework/views/a37261f10bbbc05300815fb27a6ce63f.php new file mode 100755 index 0000000..7aaf163 --- /dev/null +++ b/storage/framework/views/a37261f10bbbc05300815fb27a6ce63f.php @@ -0,0 +1,512 @@ + + + +hasRenderedOnce('9f78f9ab-144d-4c99-98ca-89a2ac460885')): $__env->markAsRenderedOnce('9f78f9ab-144d-4c99-98ca-89a2ac460885'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/a4ffc4ebcff2eba17458b2d181875a11.php b/storage/framework/views/a4ffc4ebcff2eba17458b2d181875a11.php new file mode 100755 index 0000000..b972e6d --- /dev/null +++ b/storage/framework/views/a4ffc4ebcff2eba17458b2d181875a11.php @@ -0,0 +1,4 @@ +merge(['scope' => 'row', 'class' => 'border-b border-gray-200 dark:border-gray-800'])); ?>> + + + \ No newline at end of file diff --git a/storage/framework/views/a52f436cfd938cdb4acb6d87ffec90d8.php b/storage/framework/views/a52f436cfd938cdb4acb6d87ffec90d8.php new file mode 100755 index 0000000..51db60c --- /dev/null +++ b/storage/framework/views/a52f436cfd938cdb4acb6d87ffec90d8.php @@ -0,0 +1,20 @@ + + + 'admin::components.form.control-group.control','data' => ['type' => 'text','id' => $attribute->code,'name' => $attribute->code,'value' => old($attribute->code) ?? $value,'rules' => $validations,'label' => $attribute->name]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'text','id' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->code),'name' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->code),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(old($attribute->code) ?? $value),'rules' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations),'label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name)]); ?> +renderComponent(); ?> + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/a55cad60de14a3e8924ed2c7fafe03d4.php b/storage/framework/views/a55cad60de14a3e8924ed2c7fafe03d4.php new file mode 100755 index 0000000..9ac3b6b --- /dev/null +++ b/storage/framework/views/a55cad60de14a3e8924ed2c7fafe03d4.php @@ -0,0 +1,130 @@ +getActiveConfigurationItem(); +?> + + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + getName()); ?> + + endSlot(); ?> + + + + + + + + 'admin::components.form.index','data' => ['action' => '','enctype' => 'multipart/form-data']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => '','enctype' => 'multipart/form-data']); ?> + +
    +

    + + +

    + + +
    + + + + + + get('admin::app.configuration.index.back'); ?> + + + + + + + + + + + + +
    +
    + +
    + getChildren(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $child): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> +
    +

    + getName()); ?> + +

    + +

    + getInfo(); ?> + +

    +
    + +
    + + + + getFields(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $field): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> + getType() == 'blade' + && view()->exists($path = $field->getPath()) + ): ?> + render(); ?> + + + make('admin::configuration.field-type', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + popLoop(); $loop = $__env->getLastLoop(); ?> + + + +
    + popLoop(); $loop = $__env->getLastLoop(); ?> +
    + renderComponent(); ?> + + + + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/a615b108a840c54bfeb4d02b8c45acf2.php b/storage/framework/views/a615b108a840c54bfeb4d02b8c45acf2.php new file mode 100755 index 0000000..29c893f --- /dev/null +++ b/storage/framework/views/a615b108a840c54bfeb4d02b8c45acf2.php @@ -0,0 +1,30 @@ +format('Y-m-d'); + } elseif (is_string($value)) { + $value = \Carbon\Carbon::parse($value)->format('Y-m-d'); + } + } +?> + + + + 'admin::components.form.control-group.controls.inline.date','data' => [':name' => '\''.e($attribute->code).'\'',':value' => '\''.e($value).'\'','rules' => 'required','position' => 'left','label' => $attribute->name,':errors' => 'errors','placeholder' => $attribute->name,'url' => $url,'allowEdit' => $allowEdit]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.controls.inline.date'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([':name' => '\''.e($attribute->code).'\'',':value' => '\''.e($value).'\'','rules' => 'required','position' => 'left','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),':errors' => 'errors','placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),'url' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($url),'allow-edit' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($allowEdit)]); ?> +renderComponent(); ?> + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/a6fb7309da265defe85e1a1064366648.php b/storage/framework/views/a6fb7309da265defe85e1a1064366648.php new file mode 100755 index 0000000..b387585 --- /dev/null +++ b/storage/framework/views/a6fb7309da265defe85e1a1064366648.php @@ -0,0 +1,21 @@ + + + 'admin::components.form.control-group.control','data' => ['type' => 'datetime','id' => $attribute->code,'name' => $attribute->code,'value' => old($attribute->code) ?? $value,'rules' => $validations.'|regex:^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$','label' => $attribute->name]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'datetime','id' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->code),'name' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->code),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(old($attribute->code) ?? $value),'rules' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations.'|regex:^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$'),'label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name)]); ?> +renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/a827f213957676a16001cd91dc112549.php b/storage/framework/views/a827f213957676a16001cd91dc112549.php new file mode 100755 index 0000000..8a6ef1a --- /dev/null +++ b/storage/framework/views/a827f213957676a16001cd91dc112549.php @@ -0,0 +1,2467 @@ + + + + <?php echo app('translator')->get('installer::app.installer.index.title'); ?> + + + + + + + yieldPushContent('meta'); ?> + + set(['src/Resources/assets/css/app.css', 'src/Resources/assets/js/app.js'], 'installer')); ?> + + + + + + + + + yieldPushContent('styles'); ?> + + + 'united-arab-emirates-dirham', + 'ARS' => 'argentine-peso', + 'AUD' => 'australian-dollar', + 'BDT' => 'bangladeshi-taka', + 'BRL' => 'brazilian-real', + 'CAD' => 'canadian-dollar', + 'CHF' => 'swiss-franc', + 'CLP' => 'chilean-peso', + 'CNY' => 'chinese-yuan', + 'COP' => 'colombian-peso', + 'CZK' => 'czech-koruna', + 'DKK' => 'danish-krone', + 'DZD' => 'algerian-dinar', + 'EGP' => 'egyptian-pound', + 'EUR' => 'euro', + 'FJD' => 'fijian-dollar', + 'GBP' => 'british-pound-sterling', + 'HKD' => 'hong-kong-dollar', + 'HUF' => 'hungarian-forint', + 'IDR' => 'indonesian-rupiah', + 'ILS' => 'israeli-new-shekel', + 'INR' => 'indian-rupee', + 'JOD' => 'jordanian-dinar', + 'JPY' => 'japanese-yen', + 'KRW' => 'south-korean-won', + 'KWD' => 'kuwaiti-dinar', + 'KZT' => 'kazakhstani-tenge', + 'LBP' => 'lebanese-pound', + 'LKR' => 'sri-lankan-rupee', + 'LYD' => 'libyan-dinar', + 'MAD' => 'moroccan-dirham', + 'MUR' => 'mauritian-rupee', + 'MXN' => 'mexican-peso', + 'MYR' => 'malaysian-ringgit', + 'NGN' => 'nigerian-naira', + 'NOK' => 'norwegian-krone', + 'NPR' => 'nepalese-rupee', + 'NZD' => 'new-zealand-dollar', + 'OMR' => 'omani-rial', + 'PAB' => 'panamanian-balboa', + 'PEN' => 'peruvian-nuevo-sol', + 'PHP' => 'philippine-peso', + 'PKR' => 'pakistani-rupee', + 'PLN' => 'polish-zloty', + 'PYG' => 'paraguayan-guarani', + 'QAR' => 'qatari-rial', + 'RON' => 'romanian-leu', + 'RUB' => 'russian-ruble', + 'SAR' => 'saudi-riyal', + 'SEK' => 'swedish-krona', + 'SGD' => 'singapore-dollar', + 'THB' => 'thai-baht', + 'TND' => 'tunisian-dinar', + 'TRY' => 'turkish-lira', + 'TWD' => 'new-taiwan-dollar', + 'UAH' => 'ukrainian-hryvnia', + 'USD' => 'united-states-dollar', + 'UZS' => 'uzbekistani-som', + 'VEF' => 'venezuelan-bolívar', + 'VND' => 'vietnamese-dong', + 'XAF' => 'cfa-franc-beac', + 'XOF' => 'cfa-franc-bceao', + 'ZAR' => 'south-african-rand', + 'ZMW' => 'zambian-kwacha' + ]; + ?> + + +
    +
    + + +
    +
    + + hasRenderedOnce('ce55ceac-e890-49a4-9ba5-b776f480875a')): $__env->markAsRenderedOnce('ce55ceac-e890-49a4-9ba5-b776f480875a'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + + yieldPushContent('scripts'); ?> + + + \ No newline at end of file diff --git a/storage/framework/views/aa751045bcf62af601caa003cf69f1e5.php b/storage/framework/views/aa751045bcf62af601caa003cf69f1e5.php new file mode 100755 index 0000000..51201b8 --- /dev/null +++ b/storage/framework/views/aa751045bcf62af601caa003cf69f1e5.php @@ -0,0 +1,1693 @@ +getModel(); + + if (isset($lead)) { + $quote->fill([ + 'person_id' => $lead->person_id, + 'user_id' => $lead->user_id, + 'billing_address' => $lead->person->organization ? $lead->person->organization->address : null + ]); + } +?> + + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.quotes.create.title'); ?> + endSlot(); ?> + + + + + + + 'admin::components.form.index','data' => ['action' => route('admin.quotes.store').'?'.http_build_query(array_merge( + request()->route()->parameters(), + request()->all() + ))]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.quotes.store').'?'.http_build_query(array_merge( + request()->route()->parameters(), + request()->all() + )))]); ?> +
    +
    +
    + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'quotes.create']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'quotes.create']); ?> +renderComponent(); ?> + + + + + + + + + + +
    + get('admin::app.quotes.create.title'); ?> +
    +
    + +
    + +
    + + + + + + + +
    +
    +
    + + + + + 'admin::components.shimmer.quotes.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.quotes'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + +
    + renderComponent(); ?> + + + + + + + + + + + + + + hasRenderedOnce('66992a92-aeb7-4044-979f-cc42d2769663')): $__env->markAsRenderedOnce('66992a92-aeb7-4044-979f-cc42d2769663'); +$__env->startPush('scripts'); ?> + + + + + + + + stopPush(); endif; ?> + + hasRenderedOnce('790dc8a5-fcff-46fd-9ee4-5c544839f5cd')): $__env->markAsRenderedOnce('790dc8a5-fcff-46fd-9ee4-5c544839f5cd'); +$__env->startPush('styles'); ?> + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/aa9b8ba744313423689d8fe2f1840af9.php b/storage/framework/views/aa9b8ba744313423689d8fe2f1840af9.php new file mode 100755 index 0000000..9a9eb0e --- /dev/null +++ b/storage/framework/views/aa9b8ba744313423689d8fe2f1840af9.php @@ -0,0 +1,809 @@ + +onlyProps([ + 'entity' => null, + 'entityControlName' => null, +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'entity' => null, + 'entityControlName' => null, +]); ?> + null, + 'entityControlName' => null, +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + +
    + + + + + + + + + + + + + + + + +
    + + +hasRenderedOnce('af2f0a93-2f10-4d5d-9b69-4c1d7a8200ea')): $__env->markAsRenderedOnce('af2f0a93-2f10-4d5d-9b69-4c1d7a8200ea'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/aba3e368dde555f8dcd51c7aceba4e6b.php b/storage/framework/views/aba3e368dde555f8dcd51c7aceba4e6b.php new file mode 100755 index 0000000..475151a --- /dev/null +++ b/storage/framework/views/aba3e368dde555f8dcd51c7aceba4e6b.php @@ -0,0 +1,190 @@ + +onlyProps(['position' => 'bottom-left']) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps(['position' => 'bottom-left']); ?> + 'bottom-left']), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + +merge(['class' => 'relative'])); ?>> + + + + + + + + + + + + + + + + +hasRenderedOnce('09a29e44-c54a-449e-b2f3-643c5eb84c8a')): $__env->markAsRenderedOnce('09a29e44-c54a-449e-b2f3-643c5eb84c8a'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/abd5fd79a831966c71bb278a11a52c2b.php b/storage/framework/views/abd5fd79a831966c71bb278a11a52c2b.php new file mode 100755 index 0000000..dba78ca --- /dev/null +++ b/storage/framework/views/abd5fd79a831966c71bb278a11a52c2b.php @@ -0,0 +1,29 @@ +lookup_type + ? app('Webkul\Attribute\Repositories\AttributeRepository')->getLookUpOptions($attribute->lookup_type) + : $attribute->options()->orderBy('sort_order')->get(); + + $selectedOption = old($attribute->code) ?: $value; +?> + + + + 'admin::components.form.control-group.controls.inline.multiselect','data' => [':name' => '\''.e($attribute->code).'\'',':value' => '\''.e($selectedOption).'\'','data' => $options,'rules' => 'required','position' => 'left','label' => $attribute->name,':errors' => 'errors','placeholder' => $attribute->name,'url' => $url,'allowEdit' => $allowEdit]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.controls.inline.multiselect'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([':name' => '\''.e($attribute->code).'\'',':value' => '\''.e($selectedOption).'\'','data' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($options),'rules' => 'required','position' => 'left','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),':errors' => 'errors','placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),'url' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($url),'allow-edit' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($allowEdit)]); ?> +renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/ad12a543aad8643f064247eb30d7680e.php b/storage/framework/views/ad12a543aad8643f064247eb30d7680e.php new file mode 100755 index 0000000..74e1426 --- /dev/null +++ b/storage/framework/views/ad12a543aad8643f064247eb30d7680e.php @@ -0,0 +1,153 @@ + + + + + + <?php echo e($title ?? ''); ?> + + + + + + + + + + + yieldPushContent('meta'); ?> + + set(['src/Resources/assets/css/app.css', 'src/Resources/assets/js/app.js'])); ?> + + + + + + + getConfigData('general.design.admin_logo.favicon')): ?> + + + + + + getConfigData('general.settings.menu_color.brand_color') ?? '#0E90D9'; + ?> + + yieldPushContent('styles'); ?> + + + + + + + + + + + +
    + + + + 'admin::components.flash-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::flash-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + + + + +
    + + + + + yieldPushContent('scripts'); ?> + + + + + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/ad152e82c2a5ac11df6a67de491a6e0a.php b/storage/framework/views/ad152e82c2a5ac11df6a67de491a6e0a.php new file mode 100755 index 0000000..c801efd --- /dev/null +++ b/storage/framework/views/ad152e82c2a5ac11df6a67de491a6e0a.php @@ -0,0 +1,1827 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.settings.webforms.create.title'); ?> + endSlot(); ?> + + + + 'admin::components.form.index','data' => ['action' => route('admin.settings.web_forms.store')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.web_forms.store'))]); ?> +
    +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.web_forms.create']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.web_forms.create']); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + get('admin::app.settings.webforms.create.title'); ?> +
    +
    + +
    +
    + + + + + + + + +
    +
    +
    + + +
    + renderComponent(); ?> + + + + + + + + + + + hasRenderedOnce('2b26d422-96c6-45cc-ab3e-c420c2e2d502')): $__env->markAsRenderedOnce('2b26d422-96c6-45cc-ab3e-c420c2e2d502'); +$__env->startPush('scripts'); ?> + + + + + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/ae624372bcce32c8f2b0998c0e654eb2.php b/storage/framework/views/ae624372bcce32c8f2b0998c0e654eb2.php new file mode 100755 index 0000000..e531961 --- /dev/null +++ b/storage/framework/views/ae624372bcce32c8f2b0998c0e654eb2.php @@ -0,0 +1,96 @@ + +onlyProps([ + 'type' => 'text', + 'name' => '', +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'type' => 'text', + 'name' => '', +]); ?> + 'text', + 'name' => '', +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + + + + only(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])); ?> + + > + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full appearance-none rounded-md border px-3 py-2 text-sm text-gray-600 transition-all hover:border-gray-400'])); ?> + + > + + + + + + only(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])); ?> + + > + + + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/ae6d84192f2b8fbb06da1688efe959ba.php b/storage/framework/views/ae6d84192f2b8fbb06da1688efe959ba.php new file mode 100644 index 0000000..7fa27c6 --- /dev/null +++ b/storage/framework/views/ae6d84192f2b8fbb06da1688efe959ba.php @@ -0,0 +1,55 @@ + + + + Super Admin Login + + + + + + set(['src/Resources/assets/css/app.css', 'src/Resources/assets/js/app.js'])); ?> + + + + + + + + + + +
    + + + 'admin::components.flash-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::flash-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + +
    + + + + + \ No newline at end of file diff --git a/storage/framework/views/aea6af283674c4fcb9af8ae7ded8a121.php b/storage/framework/views/aea6af283674c4fcb9af8ae7ded8a121.php new file mode 100755 index 0000000..7c1662a --- /dev/null +++ b/storage/framework/views/aea6af283674c4fcb9af8ae7ded8a121.php @@ -0,0 +1,245 @@ +
    + +
    + + + + 'admin::components.layouts.sidebar.mobile.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts.sidebar.mobile'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + getConfigData('general.general.admin_logo.logo_image')): ?> + <?php echo e(config('app.name')); ?> + + <?php echo e(config('app.name')); ?> + + <?php echo e(config('app.name')); ?> + + +
    + +
    + + make('admin::components.layouts.header.desktop.mega-search', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + make('admin::components.layouts.header.quick-creation', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> +
    + +
    +
    + + make('admin::components.layouts.header.mobile.mega-search', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> +
    + + + +
    + +
    +
    + +
    + + make('admin::components.layouts.header.quick-creation', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> +
    + + + + + 'admin::components.dropdown.index','data' => ['position' => 'bottom-'.e(in_array(app()->getLocale(), ['fa', 'ar']) ? 'left' : 'right').'']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::dropdown'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['position' => 'bottom-'.e(in_array(app()->getLocale(), ['fa', 'ar']) ? 'left' : 'right').'']); ?> + slot('toggle', null, []); ?> + guard('user')->user()); ?> + + image): ?> + + + + + endSlot(); ?> + + + slot('content', null, ['class' => 'mt-2 border-t-0 !p-0']); ?> +
    + + + +

    + get('admin::app.layouts.app-version', ['version' => core()->version()]); ?> +

    +
    + +
    + + get('admin::app.layouts.my-account'); ?> + + + + + + 'admin::components.form.index','data' => ['method' => 'DELETE','action' => ''.e(route('admin.session.destroy')).'','id' => 'adminLogout']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['method' => 'DELETE','action' => ''.e(route('admin.session.destroy')).'','id' => 'adminLogout']); ?> + renderComponent(); ?> + + + + + + + + + + + + get('admin::app.layouts.sign-out'); ?> + +
    + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + +
    +
    + +hasRenderedOnce('a674142b-2f2c-480f-96e8-26d42c61d705')): $__env->markAsRenderedOnce('a674142b-2f2c-480f-96e8-26d42c61d705'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/afd0c6897040e2cc8cb829831a78c878.php b/storage/framework/views/afd0c6897040e2cc8cb829831a78c878.php new file mode 100755 index 0000000..c58a644 --- /dev/null +++ b/storage/framework/views/afd0c6897040e2cc8cb829831a78c878.php @@ -0,0 +1,223 @@ + +onlyProps([ + 'name' => 'attachments', + 'validations' => null, + 'uploadedAttachments' => [], + 'allowMultiple' => false, + 'hideButton' => false, +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'name' => 'attachments', + 'validations' => null, + 'uploadedAttachments' => [], + 'allowMultiple' => false, + 'hideButton' => false, +]); ?> + 'attachments', + 'validations' => null, + 'uploadedAttachments' => [], + 'allowMultiple' => false, + 'hideButton' => false, +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + +hasRenderedOnce('c5ad3b98-3c9a-4e4b-b7f5-db04ec1a5334')): $__env->markAsRenderedOnce('c5ad3b98-3c9a-4e4b-b7f5-db04ec1a5334'); +$__env->startPush('scripts'); ?> + + + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/b0c16e8a003253e493829e3c14194dd2.php b/storage/framework/views/b0c16e8a003253e493829e3c14194dd2.php new file mode 100755 index 0000000..0aef032 --- /dev/null +++ b/storage/framework/views/b0c16e8a003253e493829e3c14194dd2.php @@ -0,0 +1,657 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.settings.groups.index.title'); ?> + endSlot(); ?> + +
    + +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.groups']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.groups']); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + get('admin::app.settings.groups.index.title'); ?> +
    +
    + +
    + +
    + + + + hasPermission('settings.user.groups.create')): ?> + + + + + +
    +
    +
    + + + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + +
    + + hasRenderedOnce('a647b4b2-1b82-45b5-846c-cfd0b7fc79ff')): $__env->markAsRenderedOnce('a647b4b2-1b82-45b5-846c-cfd0b7fc79ff'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/b0d25a274c1687d483793e43b44ae95d.php b/storage/framework/views/b0d25a274c1687d483793e43b44ae95d.php new file mode 100755 index 0000000..6053b2f --- /dev/null +++ b/storage/framework/views/b0d25a274c1687d483793e43b44ae95d.php @@ -0,0 +1,4 @@ +merge(['class' => 'bg-white dark:bg-gray-900 dark:text-gray-300 dark:border-gray-800'])); ?>> + + + \ No newline at end of file diff --git a/storage/framework/views/b1a2cf391c7dc6d3786a1276d45fd47c.php b/storage/framework/views/b1a2cf391c7dc6d3786a1276d45fd47c.php new file mode 100755 index 0000000..a4f2ffc --- /dev/null +++ b/storage/framework/views/b1a2cf391c7dc6d3786a1276d45fd47c.php @@ -0,0 +1,222 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.dashboard.index.title'); ?> + endSlot(); ?> + + + + + +
    + + + +
    +

    + get('admin::app.dashboard.index.title'); ?> +

    +
    + + + + + + + + + + +
    +
    +
    +
    +
    + + + +
    + + + + + + + + +
    + + + + +
    + + make('admin::dashboard.index.revenue', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + make('admin::dashboard.index.over-all', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + make('admin::dashboard.index.total-leads', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + +
    + + make('admin::dashboard.index.top-selling-products', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + make('admin::dashboard.index.top-persons', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> +
    +
    + + + + + + + + +
    + + make('admin::dashboard.index.open-leads-by-states', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + make('admin::dashboard.index.revenue-by-sources', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + make('admin::dashboard.index.revenue-by-types', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> +
    + + + +
    + + + + + hasRenderedOnce('69dc282b-1798-4c2e-bb90-09109493e064')): $__env->markAsRenderedOnce('69dc282b-1798-4c2e-bb90-09109493e064'); +$__env->startPush('scripts'); ?> + + + + + + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/b372d51f5500295bc9228d9d664663fb.php b/storage/framework/views/b372d51f5500295bc9228d9d664663fb.php new file mode 100755 index 0000000..e8b2e64 --- /dev/null +++ b/storage/framework/views/b372d51f5500295bc9228d9d664663fb.php @@ -0,0 +1,21 @@ +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/storage/framework/views/b49985407b07abfefd64aaab2382947e.php b/storage/framework/views/b49985407b07abfefd64aaab2382947e.php new file mode 100755 index 0000000..e37b62f --- /dev/null +++ b/storage/framework/views/b49985407b07abfefd64aaab2382947e.php @@ -0,0 +1,17 @@ +
    +
    +

    +
    + +
    +
    + +

    + +
    +
    + +
    +
    +
    +
    \ No newline at end of file diff --git a/storage/framework/views/b49e8f9599a267bde604c4e4eb02960c.php b/storage/framework/views/b49e8f9599a267bde604c4e4eb02960c.php new file mode 100755 index 0000000..05f5a90 --- /dev/null +++ b/storage/framework/views/b49e8f9599a267bde604c4e4eb02960c.php @@ -0,0 +1,1078 @@ + + + + + +
    + + + + 'admin::components.shimmer.leads.index.kanban','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.leads.index.kanban'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + +
    +
    + + + + +hasRenderedOnce('a79e60a8-8100-4892-9796-438ff66c96d0')): $__env->markAsRenderedOnce('a79e60a8-8100-4892-9796-438ff66c96d0'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/b55b5d08250e5310d019e7e3aacd86b4.php b/storage/framework/views/b55b5d08250e5310d019e7e3aacd86b4.php new file mode 100755 index 0000000..127571d --- /dev/null +++ b/storage/framework/views/b55b5d08250e5310d019e7e3aacd86b4.php @@ -0,0 +1,185 @@ + + + + + + + + + 'admin::components.shimmer.dashboard.index.total-leads','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.dashboard.index.total-leads'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + +hasRenderedOnce('845c6d75-4b33-454a-8531-68be4100b2a2')): $__env->markAsRenderedOnce('845c6d75-4b33-454a-8531-68be4100b2a2'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/b649a86c76252c380b129e4cc338f7be.php b/storage/framework/views/b649a86c76252c380b129e4cc338f7be.php new file mode 100755 index 0000000..2289e5d --- /dev/null +++ b/storage/framework/views/b649a86c76252c380b129e4cc338f7be.php @@ -0,0 +1,324 @@ + + getLookUpEntity($attribute->lookup_type, old($attribute->code) ?: $value); + ?> + + +
    + +
    + get('admin::app.components.attributes.lookup.click-to-add'); ?> + + +
    + + +
    +
    +
    +
    + + +hasRenderedOnce('af4bd289-a6e0-4001-a492-80f3bd118244')): $__env->markAsRenderedOnce('af4bd289-a6e0-4001-a492-80f3bd118244'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/b665faddbd4156979a33bd7256a63804.php b/storage/framework/views/b665faddbd4156979a33bd7256a63804.php new file mode 100755 index 0000000..556db5d --- /dev/null +++ b/storage/framework/views/b665faddbd4156979a33bd7256a63804.php @@ -0,0 +1,99 @@ + $product]); ?> + + +
    + + + 'admin::components.accordion.index','data' => ['class' => 'select-none !border-none']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::accordion'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'select-none !border-none']); ?> + slot('header', null, ['class' => '!p-0']); ?> +

    + get('admin::app.products.view.attributes.about-product'); ?> +

    + endSlot(); ?> + + slot('content', null, ['class' => 'mt-4 !px-0 !pb-0']); ?> + $product]); ?> + + + +
    + + + + 'admin::components.attributes.view','data' => ['customAttributes' => app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + 'entity_type' => 'products', + ['code', 'IN', ['SKU', 'price', 'quantity', 'status']] + ])->sortBy('sort_order'),'entity' => $product,'url' => route('admin.products.update', $product->id),'allowEdit' => true]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.view'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['custom-attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + 'entity_type' => 'products', + ['code', 'IN', ['SKU', 'price', 'quantity', 'status']] + ])->sortBy('sort_order')),'entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($product),'url' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.products.update', $product->id)),'allow-edit' => true]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.attributes.view','data' => ['customAttributes' => app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + 'entity_type' => 'products', + ['code', 'NOTIN', ['SKU', 'price', 'quantity', 'status']] + ])->sortBy('sort_order'),'entity' => $product,'url' => route('admin.products.update', $product->id),'allowEdit' => true]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.view'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['custom-attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + 'entity_type' => 'products', + ['code', 'NOTIN', ['SKU', 'price', 'quantity', 'status']] + ])->sortBy('sort_order')),'entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($product),'url' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.products.update', $product->id)),'allow-edit' => true]); ?> +renderComponent(); ?> + + + + + + + + + +
    + + $product]); ?> + + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + +
    + + $product]); ?> \ No newline at end of file diff --git a/storage/framework/views/b7000ff43eefa965176fcf1bb48f25c9.php b/storage/framework/views/b7000ff43eefa965176fcf1bb48f25c9.php new file mode 100755 index 0000000..fb86df2 --- /dev/null +++ b/storage/framework/views/b7000ff43eefa965176fcf1bb48f25c9.php @@ -0,0 +1,127 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.settings.webhooks.index.title'); ?> + endSlot(); ?> + +
    +
    +
    + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.webhooks']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.webhooks']); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + get('admin::app.settings.webhooks.index.title'); ?> +
    +
    + + +
    + + + + + + + 'admin::components.datagrid.index','data' => ['src' => route('admin.settings.webhooks.index')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['src' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.webhooks.index'))]); ?> + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + +
    + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/b73c32b3e3eb705eb379b5f68dac5cfb.php b/storage/framework/views/b73c32b3e3eb705eb379b5f68dac5cfb.php new file mode 100755 index 0000000..9952c4a --- /dev/null +++ b/storage/framework/views/b73c32b3e3eb705eb379b5f68dac5cfb.php @@ -0,0 +1,3028 @@ +is_read) { + $email->is_read = true; + + $email->save(); + } +?> + + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.mail.view.subject', ['subject' => $email->subject]); ?> + endSlot(); ?> + +
    +
    +
    + $email]); ?> + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'mail.route.view','entity' => $email,'route' => request('route')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'mail.route.view','entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($email),'route' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(request('route'))]); ?> +renderComponent(); ?> + + + + + + + + + + + $email]); ?> + + + +
    +
    + get('admin::app.mail.view.title'); ?> +
    + + + + $email]); ?> + + + + + 'admin::components.tags.index','data' => ['attachEndpoint' => route('admin.mail.tags.attach', $email->id),'detachEndpoint' => route('admin.mail.tags.detach', $email->id),'addedTags' => $email->tags]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::tags'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attach-endpoint' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.mail.tags.attach', $email->id)),'detach-endpoint' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.mail.tags.detach', $email->id)),'added-tags' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($email->tags)]); ?> +renderComponent(); ?> + + + + + + + + + + + $email]); ?> + +
    +
    +
    + + $email]); ?> + + + + + + + 'admin::components.shimmer.leads.view.mail.index','data' => ['count' => $email->count()]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.leads.view.mail'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['count' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($email->count())]); ?> +renderComponent(); ?> + + + + + + + + + + + + $email]); ?> + +
    + + hasRenderedOnce('7a3cbc95-bbf4-4859-b7ce-fc6a93b8e894')): $__env->markAsRenderedOnce('7a3cbc95-bbf4-4859-b7ce-fc6a93b8e894'); +$__env->startPush('scripts'); ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/b76090b5a4cb58a27d81ee28ceee41ba.php b/storage/framework/views/b76090b5a4cb58a27d81ee28ceee41ba.php new file mode 100755 index 0000000..6ce17eb --- /dev/null +++ b/storage/framework/views/b76090b5a4cb58a27d81ee28ceee41ba.php @@ -0,0 +1,686 @@ + $lead]); ?> + + + + + $lead]); ?> + + +hasRenderedOnce('435f6f23-bda1-4b8e-a2b7-b83d61cb1e35')): $__env->markAsRenderedOnce('435f6f23-bda1-4b8e-a2b7-b83d61cb1e35'); +$__env->startPush('scripts'); ?> + + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/b8eaf7547e9a9ea023ea2b6a9aba1195.php b/storage/framework/views/b8eaf7547e9a9ea023ea2b6a9aba1195.php new file mode 100755 index 0000000..eff8f46 --- /dev/null +++ b/storage/framework/views/b8eaf7547e9a9ea023ea2b6a9aba1195.php @@ -0,0 +1,333 @@ + +onlyProps([ + 'name' => 'images', + 'allowMultiple' => false, + 'uploadedVideos' => [], + 'width' => '210px', + 'height' => '120px' +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'name' => 'images', + 'allowMultiple' => false, + 'uploadedVideos' => [], + 'width' => '210px', + 'height' => '120px' +]); ?> + 'images', + 'allowMultiple' => false, + 'uploadedVideos' => [], + 'width' => '210px', + 'height' => '120px' +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + +get('class')); ?> + +> + + +hasRenderedOnce('a3d62c46-9431-47b2-9822-246374bc09e3')): $__env->markAsRenderedOnce('a3d62c46-9431-47b2-9822-246374bc09e3'); +$__env->startPush('scripts'); ?> + + + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/b94d068fd1cfcdbd8dea9170647897f8.php b/storage/framework/views/b94d068fd1cfcdbd8dea9170647897f8.php new file mode 100755 index 0000000..cf4b573 --- /dev/null +++ b/storage/framework/views/b94d068fd1cfcdbd8dea9170647897f8.php @@ -0,0 +1,31 @@ + +
    +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + \ No newline at end of file diff --git a/storage/framework/views/b9a9babe76c8328b3cfd9a0f6be97ac9.php b/storage/framework/views/b9a9babe76c8328b3cfd9a0f6be97ac9.php new file mode 100755 index 0000000..4729e96 --- /dev/null +++ b/storage/framework/views/b9a9babe76c8328b3cfd9a0f6be97ac9.php @@ -0,0 +1,238 @@ + + +
    + + +
    + +
    +
    + + + + + get("admin::app.common.custom-attributes.add-more"); ?> + +
    + + +hasRenderedOnce('afd0579e-88e1-4eca-ac07-92c183b385d4')): $__env->markAsRenderedOnce('afd0579e-88e1-4eca-ac07-92c183b385d4'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/b9dba1f802a8f3ef9925ab0f86ada175.php b/storage/framework/views/b9dba1f802a8f3ef9925ab0f86ada175.php new file mode 100755 index 0000000..30e738e --- /dev/null +++ b/storage/framework/views/b9dba1f802a8f3ef9925ab0f86ada175.php @@ -0,0 +1,188 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.quotes.index.title'); ?> + endSlot(); ?> + + +
    +
    +
    + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'quotes']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'quotes']); ?> +renderComponent(); ?> + + + + + + + + + + +
    + get('admin::app.quotes.index.title'); ?> +
    +
    + +
    + +
    + hasPermission('quotes.create')): ?> + + get('admin::app.quotes.index.create-btn'); ?> + + +
    +
    +
    + + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + +
    +
    + + hasRenderedOnce('76b5cc61-fb17-4c08-b374-1cb6b3ea634c')): $__env->markAsRenderedOnce('76b5cc61-fb17-4c08-b374-1cb6b3ea634c'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/ba39863401b82f9aae2299c32bce8534.php b/storage/framework/views/ba39863401b82f9aae2299c32bce8534.php new file mode 100755 index 0000000..ed985d5 --- /dev/null +++ b/storage/framework/views/ba39863401b82f9aae2299c32bce8534.php @@ -0,0 +1,21 @@ + + + 'admin::components.form.control-group.controls.inline.file','data' => [':name' => '\''.e($attribute->code).'\'',':value' => '\''.e($value ? route('admin.settings.attributes.download', ['path' => $value]) : '').'\'','rules' => 'required|mimes:jpeg,jpg,png,gif','position' => 'left','label' => $attribute->name,':errors' => 'errors','placeholder' => $attribute->name,'url' => $url,'allowEdit' => $allowEdit]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.controls.inline.file'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([':name' => '\''.e($attribute->code).'\'',':value' => '\''.e($value ? route('admin.settings.attributes.download', ['path' => $value]) : '').'\'','rules' => 'required|mimes:jpeg,jpg,png,gif','position' => 'left','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),':errors' => 'errors','placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),'url' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($url),'allow-edit' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($allowEdit)]); ?> +renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/bba119bc75cf4ca9d930c7d1aa6518a1.php b/storage/framework/views/bba119bc75cf4ca9d930c7d1aa6518a1.php new file mode 100755 index 0000000..42979e5 --- /dev/null +++ b/storage/framework/views/bba119bc75cf4ca9d930c7d1aa6518a1.php @@ -0,0 +1,1021 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.activities.edit.title'); ?> + endSlot(); ?> + + + + + + + 'admin::components.form.index','data' => ['action' => route('admin.activities.update', $activity->id),'method' => 'PUT']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.activities.update', $activity->id)),'method' => 'PUT']); ?> +
    +
    +
    + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'activities.edit','entity' => $activity]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'activities.edit','entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($activity)]); ?> +renderComponent(); ?> + + + + + + + + + + + +
    + get('admin::app.activities.edit.title'); ?> +
    +
    + +
    + +
    + + + + + + + + +
    +
    +
    + + +
    + +
    + + + + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +
    +
    + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.activities.edit.schedule_from'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.flat-picker.datetime','data' => ['class' => '!w-full',':allowInput' => 'true']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::flat-picker.datetime'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => '!w-full',':allow-input' => 'true']); ?> + + renderComponent(); ?> + + + + + + + + + +
    + +
    + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.activities.edit.schedule_to'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.flat-picker.datetime','data' => ['class' => '!w-full',':allowInput' => 'true']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::flat-picker.datetime'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => '!w-full',':allow-input' => 'true']); ?> + + renderComponent(); ?> + + + + + + + + + +
    +
    + renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + get('admin::app.activities.edit.comment'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'textarea','name' => 'comment','id' => 'comment','value' => old('comment') ?? $activity->comment,'label' => trans('admin::app.activities.edit.comment'),'placeholder' => trans('admin::app.activities.edit.comment')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'textarea','name' => 'comment','id' => 'comment','value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(old('comment') ?? $activity->comment),'label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.activities.edit.comment')),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.activities.edit.comment'))]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'comment']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'comment']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + get('admin::app.activities.edit.participants'); ?> + renderComponent(); ?> + + + + + + + + + + + + +
    +
      +
    • + +
    • +
    + + +
    +
    + renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.form.control-group.index','data' => ['class' => '!mb-0']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => '!mb-0']); ?> + + + 'admin::components.form.control-group.label','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + get('admin::app.activities.edit.lead'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.attributes.edit.lookup','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.lookup'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'text','placeholder' => '@lang(\'admin::app.common.start-typing\')']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'text','placeholder' => '@lang(\'admin::app.common.start-typing\')']); ?> +renderComponent(); ?> + + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + +
    + + +
    + + + + + + 'admin::components.accordion.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::accordion'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('header', null, []); ?> +
    +

    + get('admin::app.activities.edit.general'); ?> +

    +
    + endSlot(); ?> + + slot('content', null, []); ?> + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.activities.edit.title'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'text','name' => 'title','id' => 'title','rules' => 'required','value' => old('title') ?? $activity->title,'label' => trans('admin::app.activities.edit.title'),'placeholder' => trans('admin::app.activities.edit.title')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'text','name' => 'title','id' => 'title','rules' => 'required','value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(old('title') ?? $activity->title),'label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.activities.edit.title')),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.activities.edit.title'))]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'title']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'title']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.activities.edit.type'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'select','name' => 'type','id' => 'type','value' => old('type') ?? $activity->type,'rules' => 'required','label' => trans('admin::app.activities.edit.type'),'placeholder' => trans('admin::app.activities.edit.type')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'select','name' => 'type','id' => 'type','value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(old('type') ?? $activity->type),'rules' => 'required','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.activities.edit.type')),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.activities.edit.type'))]); ?> + + + + + + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'type']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'type']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.form.control-group.index','data' => ['class' => '!mb-0']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => '!mb-0']); ?> + + + 'admin::components.form.control-group.label','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + get('admin::app.activities.edit.location'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'text','name' => 'location','id' => 'location','value' => old('location') ?? $activity->location,'label' => trans('admin::app.activities.edit.location'),'placeholder' => trans('admin::app.activities.edit.location')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'text','name' => 'location','id' => 'location','value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(old('location') ?? $activity->location),'label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.activities.edit.location')),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.activities.edit.location'))]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'location']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'location']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + + + + +
    +
    +
    + renderComponent(); ?> + + + + + + + + + + + + + + hasRenderedOnce('07f00342-0485-4acb-af02-09fe978fcac7')): $__env->markAsRenderedOnce('07f00342-0485-4acb-af02-09fe978fcac7'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/bbdae7896a1f7165054fd9355cae7301.php b/storage/framework/views/bbdae7896a1f7165054fd9355cae7301.php new file mode 100755 index 0000000..5ed89fa --- /dev/null +++ b/storage/framework/views/bbdae7896a1f7165054fd9355cae7301.php @@ -0,0 +1,41 @@ +
    + +
    + +
    +
    +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    +
    +
    + +
    +
    +
    +
    + +
    +
    + + +
    +
    +
    + +
    +
    +
    \ No newline at end of file diff --git a/storage/framework/views/bd5df4af7aa6519e61a16b0135794c6d.php b/storage/framework/views/bd5df4af7aa6519e61a16b0135794c6d.php new file mode 100755 index 0000000..7a37fee --- /dev/null +++ b/storage/framework/views/bd5df4af7aa6519e61a16b0135794c6d.php @@ -0,0 +1,28 @@ +hasPages()): ?> + + + \ No newline at end of file diff --git a/storage/framework/views/bddfc759890f2c4c9b12ae35f48b5c55.php b/storage/framework/views/bddfc759890f2c4c9b12ae35f48b5c55.php new file mode 100755 index 0000000..09a625f --- /dev/null +++ b/storage/framework/views/bddfc759890f2c4c9b12ae35f48b5c55.php @@ -0,0 +1,560 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.settings.roles.edit.title'); ?> + endSlot(); ?> + + $role]); ?> + + + + + 'admin::components.form.index','data' => ['method' => 'PUT','action' => route('admin.settings.roles.update', $role->id)]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['method' => 'PUT','action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.roles.update', $role->id))]); ?> +
    +
    +
    + $role]); ?> + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.roles.edit','entity' => $role]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.roles.edit','entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($role)]); ?> +renderComponent(); ?> + + + + + + + + + + + $role]); ?> + + +
    + get('admin::app.settings.roles.edit.title'); ?> +
    +
    + +
    +
    + $role]); ?> + + + hasPermission('settings.user.roles.edit')): ?> + + + + + $role]); ?> + +
    +
    +
    + + $role]); ?> + + + +
    + $role]); ?> + + + +
    +
    +

    + get('admin::app.settings.roles.edit.access-control'); ?> +

    + + + + +
    +
    + +
    +
    + + + + + 'admin::components.shimmer.tree.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.tree'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + +
    +
    +
    + + $role]); ?> + + + $role]); ?> + + + +
    + $role]); ?> + + + + + 'admin::components.accordion.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::accordion'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('header', null, []); ?> +
    +

    + get('admin::app.settings.roles.edit.general'); ?> +

    +
    + endSlot(); ?> + + slot('content', null, []); ?> + $role]); ?> + + + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.settings.roles.edit.name'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'text','id' => 'name','name' => 'name','rules' => 'required','value' => ''.e(old('name') ?: $role->name).'','label' => trans('admin::app.settings.roles.edit.name'),'placeholder' => trans('admin::app.settings.roles.edit.name')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'text','id' => 'name','name' => 'name','rules' => 'required','value' => ''.e(old('name') ?: $role->name).'','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.settings.roles.edit.name')),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.settings.roles.edit.name'))]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'name']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'name']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + $role]); ?> + + + $role]); ?> + + + + + + 'admin::components.form.control-group.index','data' => ['class' => '!mb-0']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => '!mb-0']); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.settings.roles.edit.description'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'textarea','id' => 'description','name' => 'description','rules' => 'required','value' => ''.e(old('description') ?: $role->description).'','label' => trans('admin::app.settings.roles.edit.description'),'placeholder' => trans('admin::app.settings.roles.edit.description')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'textarea','id' => 'description','name' => 'description','rules' => 'required','value' => ''.e(old('description') ?: $role->description).'','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.settings.roles.edit.description')),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.settings.roles.edit.description'))]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'description']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'description']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + $role]); ?> + + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + + + $role]); ?> + +
    +
    + + $role]); ?> + +
    + renderComponent(); ?> + + + + + + + + + + + $role]); ?> + + + hasRenderedOnce('d22292fe-290a-497b-8812-326f39962143')): $__env->markAsRenderedOnce('d22292fe-290a-497b-8812-326f39962143'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/be37ec7b1345fcb3c2f3c4f68700e4f6.php b/storage/framework/views/be37ec7b1345fcb3c2f3c4f68700e4f6.php new file mode 100755 index 0000000..93b6fb4 --- /dev/null +++ b/storage/framework/views/be37ec7b1345fcb3c2f3c4f68700e4f6.php @@ -0,0 +1,13 @@ + +
    + +
    + +
    +

    +

    +
    +
    +
    + + \ No newline at end of file diff --git a/storage/framework/views/be65033c29029eb224ea0eceb6f05545.php b/storage/framework/views/be65033c29029eb224ea0eceb6f05545.php new file mode 100755 index 0000000..37d6cea --- /dev/null +++ b/storage/framework/views/be65033c29029eb224ea0eceb6f05545.php @@ -0,0 +1,500 @@ + +onlyProps([ + 'type' => 'text', + 'name' => '', +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'type' => 'text', + 'name' => '', +]); ?> + 'text', + 'name' => '', +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])); ?> + + name="" + > + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400'])); ?> + + /> + + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])); ?> + + name="" + > +
    + + attributes->merge(['class' => 'py-2.5 text-gray-500 ltr:pl-4 rtl:pr-4'])); ?>> + + + + + + + + + + + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full p-2.5 text-sm text-gray-600 dark:bg-gray-900 dark:text-gray-300'])); ?> + + /> +
    +
    + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])); ?> + + name="" + > + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full dark:file:bg-gray-800 dark:file:dark:text-white rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400'])); ?> + + @change="handleChange" + @blur="handleBlur" + /> + + + + + + except('class')); ?> + + > + except(['value'])->merge(['class' => 'w-full appearance-none rounded-md border text-sm text-gray-600 transition-all hover:border-gray-400 dark:text-gray-300 dark:hover:border-gray-400'])); ?> + + > + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])); ?> + + name="" + > + 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400' + ]; + + if ($attributes->get('tinymce', false) || $attributes->get(':tinymce', false)) { + $defaultAttributes['id'] = $attributes->get(':id', 'id'); + } + ?> + + + + get('tinymce', false) || $attributes->get(':tinymce', false)): ?> + + + 'admin::components.tinymce.index','data' => ['selector' => 'textarea#' . ($attributes->get('id') ?? $attributes->get(':id')),':field' => 'field']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::tinymce'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['selector' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute('textarea#' . ($attributes->get('id') ?? $attributes->get(':id'))),':field' => 'field']); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['rules' => 'regex:^\d{4}-\d{2}-\d{2}$'])); ?> + + name="" + > + + + 'admin::components.flat-picker.date','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::flat-picker.date'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400'])); ?> + + autocomplete="off" + /> + renderComponent(); ?> + + + + + + + + + + + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['rules' => 'regex:^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$'])); ?> + + name="" + > + + + 'admin::components.flat-picker.datetime','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::flat-picker.datetime'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400'])); ?> + + autocomplete="off" + > + renderComponent(); ?> + + + + + + + + + + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])); ?> + + name="" + > + + + + + + + except([])->merge(['class' => 'flex w-full flex-col rounded-md border bg-white px-3 py-2.5 text-sm font-normal text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400'])); ?> + + name="" + multiple + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 'admin::components.media.images','data' => ['name' => ''.e($name).'',':class' => '[errors && errors[\''.e($name).'\'] ? \'border !border-red-600 hover:border-red-600\' : \'\']','attributes' => $attributes]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::media.images'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => ''.e($name).'',':class' => '[errors && errors[\''.e($name).'\'] ? \'border !border-red-600 hover:border-red-600\' : \'\']','attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attributes)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.form.control-group.controls.inline.text','data' => ['attributes' => $attributes]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.controls.inline.text'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attributes)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + > + + + + + + + + + + 'admin::components.form.control-group.controls.tags','data' => ['name' => $name,'data' => $attributes->get(':data') ?? $attributes->get('data'),'attributes' => $attributes]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.controls.tags'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($name),'data' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attributes->get(':data') ?? $attributes->get('data')),'attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attributes)]); ?> +renderComponent(); ?> + + + + + + + + + + + + +hasRenderedOnce('5546b0c1-8ed3-4551-bacd-2f1efcb47355')): $__env->markAsRenderedOnce('5546b0c1-8ed3-4551-bacd-2f1efcb47355'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/bfb95f08f5507d145605961ebeaa83f9.php b/storage/framework/views/bfb95f08f5507d145605961ebeaa83f9.php new file mode 100755 index 0000000..160e9c7 --- /dev/null +++ b/storage/framework/views/bfb95f08f5507d145605961ebeaa83f9.php @@ -0,0 +1,31 @@ +hasPages()): ?> + + + \ No newline at end of file diff --git a/storage/framework/views/c0c04d49115719602aeabe1311e2e11e.php b/storage/framework/views/c0c04d49115719602aeabe1311e2e11e.php new file mode 100755 index 0000000..22d108c --- /dev/null +++ b/storage/framework/views/c0c04d49115719602aeabe1311e2e11e.php @@ -0,0 +1,141 @@ + + +hasRenderedOnce('8d4ef6b4-0e2d-40a8-b8d6-d473e7086677')): $__env->markAsRenderedOnce('8d4ef6b4-0e2d-40a8-b8d6-d473e7086677'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/c0eeafa5404ccb3b6a234ee46c87e511.php b/storage/framework/views/c0eeafa5404ccb3b6a234ee46c87e511.php new file mode 100755 index 0000000..b01c1e4 --- /dev/null +++ b/storage/framework/views/c0eeafa5404ccb3b6a234ee46c87e511.php @@ -0,0 +1,4 @@ +merge(['scope' => 'row', 'class' => 'border-b border-gray-200 dark:border-gray-800'])); ?>> + + + \ No newline at end of file diff --git a/storage/framework/views/c100bd2e7fff457a7b18e261caf1ef81.php b/storage/framework/views/c100bd2e7fff457a7b18e261caf1ef81.php new file mode 100755 index 0000000..0fa9e1e --- /dev/null +++ b/storage/framework/views/c100bd2e7fff457a7b18e261caf1ef81.php @@ -0,0 +1,272 @@ + + + + + + + + + 'admin::components.shimmer.dashboard.index.over-all','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.dashboard.index.over-all'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + +hasRenderedOnce('f8dfc77a-ec09-4f70-a95d-1744808b1fd4')): $__env->markAsRenderedOnce('f8dfc77a-ec09-4f70-a95d-1744808b1fd4'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/c12f125c21d124ddb00e61b72c3d6467.php b/storage/framework/views/c12f125c21d124ddb00e61b72c3d6467.php new file mode 100755 index 0000000..b02efaf --- /dev/null +++ b/storage/framework/views/c12f125c21d124ddb00e61b72c3d6467.php @@ -0,0 +1,3 @@ +(function() { + document.write(`render(); ?>`.replaceAll('$', '\$')); +})(); \ No newline at end of file diff --git a/storage/framework/views/c216a456d8abda98e9a1e002200cd508.php b/storage/framework/views/c216a456d8abda98e9a1e002200cd508.php new file mode 100755 index 0000000..e9473de --- /dev/null +++ b/storage/framework/views/c216a456d8abda98e9a1e002200cd508.php @@ -0,0 +1,771 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.settings.marketing.events.index.title'); ?> + endSlot(); ?> + +
    + +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.marketing.events']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.marketing.events']); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + get('admin::app.settings.marketing.events.index.title'); ?> +
    +
    + +
    + +
    + + + + hasPermission('settings.automation.events.create')): ?> + + + + + +
    +
    +
    + + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + +
    + + hasRenderedOnce('dc882a9b-9702-4cf2-b0d2-18fccebf0629')): $__env->markAsRenderedOnce('dc882a9b-9702-4cf2-b0d2-18fccebf0629'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/c4188c8d16ca50973c0514392a83278d.php b/storage/framework/views/c4188c8d16ca50973c0514392a83278d.php new file mode 100755 index 0000000..f6e5df9 --- /dev/null +++ b/storage/framework/views/c4188c8d16ca50973c0514392a83278d.php @@ -0,0 +1,70 @@ +> +
    +
    + +hasRenderedOnce('0cf3e4d9-9b67-4cbf-b9ad-1b55f671beca')): $__env->markAsRenderedOnce('0cf3e4d9-9b67-4cbf-b9ad-1b55f671beca'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/c466ea3b4d80f80373c9b95dbad50b8c.php b/storage/framework/views/c466ea3b4d80f80373c9b95dbad50b8c.php new file mode 100755 index 0000000..e9bb25d --- /dev/null +++ b/storage/framework/views/c466ea3b4d80f80373c9b95dbad50b8c.php @@ -0,0 +1,550 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.settings.sources.index.title'); ?> + endSlot(); ?> + +
    + +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.sources']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.sources']); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + get('admin::app.settings.sources.index.title'); ?> +
    +
    + +
    + + + + + hasPermission('settings.lead.sources.create')): ?> +
    + +
    + + + + +
    +
    + + + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + +
    + + hasRenderedOnce('491f95c7-7f7b-4cee-9142-2b4657addfdb')): $__env->markAsRenderedOnce('491f95c7-7f7b-4cee-9142-2b4657addfdb'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/c4d70cd171bf2fc590ee7c7141de88d2.php b/storage/framework/views/c4d70cd171bf2fc590ee7c7141de88d2.php new file mode 100755 index 0000000..831f02f --- /dev/null +++ b/storage/framework/views/c4d70cd171bf2fc590ee7c7141de88d2.php @@ -0,0 +1,592 @@ + + + + + + 'admin::components.shimmer.common.address','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.common.address'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + +hasRenderedOnce('17832670-5dbe-47a2-b41a-eb029cac4704')): $__env->markAsRenderedOnce('17832670-5dbe-47a2-b41a-eb029cac4704'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/c5467567decfdcefe29aac61f3d5589e.php b/storage/framework/views/c5467567decfdcefe29aac61f3d5589e.php new file mode 100755 index 0000000..febb786 --- /dev/null +++ b/storage/framework/views/c5467567decfdcefe29aac61f3d5589e.php @@ -0,0 +1,171 @@ + + + + + + + + + 'admin::components.shimmer.dashboard.index.top-selling-products','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.dashboard.index.top-selling-products'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + +hasRenderedOnce('f167b167-bc83-453d-9343-e2b3c7620fb9')): $__env->markAsRenderedOnce('f167b167-bc83-453d-9343-e2b3c7620fb9'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/c5bcc7f5f43cdf04c3e1958145d44ff7.php b/storage/framework/views/c5bcc7f5f43cdf04c3e1958145d44ff7.php new file mode 100755 index 0000000..1e53f60 --- /dev/null +++ b/storage/framework/views/c5bcc7f5f43cdf04c3e1958145d44ff7.php @@ -0,0 +1,711 @@ + + + + + + + + +hasRenderedOnce('68aaa7ec-9b95-4cc6-b24e-22ea46d877ae')): $__env->markAsRenderedOnce('68aaa7ec-9b95-4cc6-b24e-22ea46d877ae'); +$__env->startPush('scripts'); ?> + + + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/c62c8976e81c463eb2916ca0044ca1cb.php b/storage/framework/views/c62c8976e81c463eb2916ca0044ca1cb.php new file mode 100755 index 0000000..d7de6bd --- /dev/null +++ b/storage/framework/views/c62c8976e81c463eb2916ca0044ca1cb.php @@ -0,0 +1,21 @@ + +onlyProps(['count' => 5]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps(['count' => 5]); ?> + 5]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + +
    + +
    +
    +
    + +
    \ No newline at end of file diff --git a/storage/framework/views/c6e4ea11ca7454f87ab86a2864a7cc06.php b/storage/framework/views/c6e4ea11ca7454f87ab86a2864a7cc06.php new file mode 100755 index 0000000..25c35f2 --- /dev/null +++ b/storage/framework/views/c6e4ea11ca7454f87ab86a2864a7cc06.php @@ -0,0 +1,47 @@ +hasPages()): ?> + + + \ No newline at end of file diff --git a/storage/framework/views/c84fe614c3ee24c1ddf401fb2bea6af0.php b/storage/framework/views/c84fe614c3ee24c1ddf401fb2bea6af0.php new file mode 100755 index 0000000..af9af20 --- /dev/null +++ b/storage/framework/views/c84fe614c3ee24c1ddf401fb2bea6af0.php @@ -0,0 +1,25 @@ +
    +
    +
    +
    + +
    + +
    + +
    + +
    + +
    + +
    + + +
    +
    +
    +
    + +
    +
    \ No newline at end of file diff --git a/storage/framework/views/c88b70a8a9feab42ed2b012b4e9ee5c1.php b/storage/framework/views/c88b70a8a9feab42ed2b012b4e9ee5c1.php new file mode 100755 index 0000000..32aa675 --- /dev/null +++ b/storage/framework/views/c88b70a8a9feab42ed2b012b4e9ee5c1.php @@ -0,0 +1,296 @@ + +onlyProps([ + 'allowEdit' => true, +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'allowEdit' => true, +]); ?> + true, +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + :allow-edit="" +> +
    +
    +
    +
    +
    +
    + +hasRenderedOnce('a4ebd6db-27fe-4c39-9efa-81954db40347')): $__env->markAsRenderedOnce('a4ebd6db-27fe-4c39-9efa-81954db40347'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/c93246842dd998089762986ccb96fd3d.php b/storage/framework/views/c93246842dd998089762986ccb96fd3d.php new file mode 100755 index 0000000..1978535 --- /dev/null +++ b/storage/framework/views/c93246842dd998089762986ccb96fd3d.php @@ -0,0 +1,254 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get($warehouse->name); ?> + endSlot(); ?> + +
    + + $warehouse]); ?> + + +
    + +
    + +
    + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.warehouses.view','entity' => $warehouse]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.warehouses.view','entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($warehouse)]); ?> +renderComponent(); ?> + + + + + + + + + +
    + + $warehouse]); ?> + + + + + + 'admin::components.tags.index','data' => ['attachEndpoint' => route('admin.settings.warehouses.tags.attach', $warehouse->id),'detachEndpoint' => route('admin.settings.warehouses.tags.detach', $warehouse->id),'addedTags' => $warehouse->tags]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::tags'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attach-endpoint' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.warehouses.tags.attach', $warehouse->id)),'detach-endpoint' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.warehouses.tags.detach', $warehouse->id)),'added-tags' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($warehouse->tags)]); ?> +renderComponent(); ?> + + + + + + + + + + + $warehouse]); ?> + + + $warehouse]); ?> + + + +

    + name); ?> + +

    + + $warehouse]); ?> + + + $warehouse]); ?> + + + +
    + $warehouse]); ?> + + + + + + 'admin::components.activities.actions.file','data' => ['entity' => $warehouse,'entityControlName' => 'warehouse_id']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::activities.actions.file'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($warehouse),'entity-control-name' => 'warehouse_id']); ?> +renderComponent(); ?> + + + + + + + + + + + $warehouse]); ?> + + + $warehouse]); ?> + + + + + + 'admin::components.activities.actions.note','data' => ['entity' => $warehouse,'entityControlName' => 'warehouse_id']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::activities.actions.note'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($warehouse),'entity-control-name' => 'warehouse_id']); ?> +renderComponent(); ?> + + + + + + + + + + + $warehouse]); ?> + + + $warehouse]); ?> + + + + + + 'admin::components.activities.actions.activity','data' => ['entity' => $warehouse,'entityControlName' => 'warehouse_id']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::activities.actions.activity'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($warehouse),'entity-control-name' => 'warehouse_id']); ?> +renderComponent(); ?> + + + + + + + + + + + $warehouse]); ?> + +
    + + $warehouse]); ?> + +
    + + + make('admin::settings.warehouses.view.general-information', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + make('admin::settings.warehouses.view.contact-information', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> +
    + + $warehouse]); ?> + + + $warehouse]); ?> + + + +
    + $warehouse]); ?> + + + + + + 'admin::components.activities.index','data' => ['endpoint' => route('admin.settings.warehouse.activities.index', $warehouse->id),'types' => [ + ['name' => 'all', 'label' => trans('admin::app.settings.warehouses.view.all')], + ['name' => 'note', 'label' => trans('admin::app.settings.warehouses.view.notes')], + ['name' => 'file', 'label' => trans('admin::app.settings.warehouses.view.files')], + ['name' => 'system', 'label' => trans('admin::app.settings.warehouses.view.change-logs')], + ],'extraTypes' => [ + ['name' => 'location', 'label' => trans('admin::app.settings.warehouses.view.location')], + ]]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::activities'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['endpoint' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.warehouse.activities.index', $warehouse->id)),'types' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute([ + ['name' => 'all', 'label' => trans('admin::app.settings.warehouses.view.all')], + ['name' => 'note', 'label' => trans('admin::app.settings.warehouses.view.notes')], + ['name' => 'file', 'label' => trans('admin::app.settings.warehouses.view.files')], + ['name' => 'system', 'label' => trans('admin::app.settings.warehouses.view.change-logs')], + ]),'extra-types' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute([ + ['name' => 'location', 'label' => trans('admin::app.settings.warehouses.view.location')], + ])]); ?> + slot('location', null, []); ?> + make('admin::settings.warehouses.view.locations', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + + + $warehouse]); ?> + +
    + + $warehouse]); ?> + +
    + renderComponent(); ?> + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/c96786be548c061098a89722818ccdd9.php b/storage/framework/views/c96786be548c061098a89722818ccdd9.php new file mode 100755 index 0000000..e3d9773 --- /dev/null +++ b/storage/framework/views/c96786be548c061098a89722818ccdd9.php @@ -0,0 +1,137 @@ + + + + +hasRenderedOnce('eb654c7d-dd22-46a0-80f5-66ba4111a4de')): $__env->markAsRenderedOnce('eb654c7d-dd22-46a0-80f5-66ba4111a4de'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/c9dd5fab3c50756806a823d0086ed3ab.php b/storage/framework/views/c9dd5fab3c50756806a823d0086ed3ab.php new file mode 100755 index 0000000..ad38238 --- /dev/null +++ b/storage/framework/views/c9dd5fab3c50756806a823d0086ed3ab.php @@ -0,0 +1,48 @@ + + + + + + Super Admin - Growup Pro + + + + + +
    + + + + + any()): ?> + + + + yieldContent('content'); ?> +
    + + + \ No newline at end of file diff --git a/storage/framework/views/cacd1ce355b094ed718c8e57c6c09cce.php b/storage/framework/views/cacd1ce355b094ed718c8e57c6c09cce.php new file mode 100755 index 0000000..1f06fc7 --- /dev/null +++ b/storage/framework/views/cacd1ce355b094ed718c8e57c6c09cce.php @@ -0,0 +1,131 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.contacts.organizations.index.title'); ?> + endSlot(); ?> + +
    +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'contacts.organizations']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'contacts.organizations']); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + get('admin::app.contacts.organizations.index.title'); ?> +
    +
    + +
    +
    + + + + hasPermission('contacts.organizations.create')): ?> + + + get('admin::app.contacts.organizations.index.create-btn'); ?> + + + + + +
    +
    +
    + + + + + + + 'admin::components.datagrid.index','data' => ['src' => route('admin.contacts.organizations.index')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['src' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.contacts.organizations.index'))]); ?> + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + +
    + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/cc0143e300080a647abe2f5a7cc57b40.php b/storage/framework/views/cc0143e300080a647abe2f5a7cc57b40.php new file mode 100755 index 0000000..9fce8db --- /dev/null +++ b/storage/framework/views/cc0143e300080a647abe2f5a7cc57b40.php @@ -0,0 +1,172 @@ + + + + \ No newline at end of file diff --git a/storage/framework/views/cc637471677bcb38ce3f1da95b8515a3.php b/storage/framework/views/cc637471677bcb38ce3f1da95b8515a3.php new file mode 100755 index 0000000..43175a2 --- /dev/null +++ b/storage/framework/views/cc637471677bcb38ce3f1da95b8515a3.php @@ -0,0 +1,6 @@ +
    +
    + +
    +
    + \ No newline at end of file diff --git a/storage/framework/views/cd06a68343b54991724d7af0fd4fbf94.php b/storage/framework/views/cd06a68343b54991724d7af0fd4fbf94.php new file mode 100755 index 0000000..2e1464e --- /dev/null +++ b/storage/framework/views/cd06a68343b54991724d7af0fd4fbf94.php @@ -0,0 +1,160 @@ + + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.contacts.organizations.edit.title'); ?> + endSlot(); ?> + + + + + + + 'admin::components.form.index','data' => ['action' => route('admin.contacts.organizations.update', $organization->id),'method' => 'PUT']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.contacts.organizations.update', $organization->id)),'method' => 'PUT']); ?> +
    +
    +
    + $organization]); ?> + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'contacts.organizations.edit','entity' => $organization]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'contacts.organizations.edit','entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($organization)]); ?> +renderComponent(); ?> + + + + + + + + + + + $organization]); ?> + + +
    + get('admin::app.contacts.organizations.edit.title'); ?> +
    +
    + +
    +
    + $organization]); ?> + + + + + + $organization]); ?> + +
    +
    +
    + +
    + + + + + + 'admin::components.attributes.index','data' => ['customAttributes' => app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + 'entity_type' => 'organizations', + ]),'customValidations' => [ + 'name' => [ + 'max:100', + ], + 'address' => [ + 'max:100', + ], + 'postcode' => [ + 'postcode', + ], + ],'entity' => $organization]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['custom-attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + 'entity_type' => 'organizations', + ])),'custom-validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute([ + 'name' => [ + 'max:100', + ], + 'address' => [ + 'max:100', + ], + 'postcode' => [ + 'postcode', + ], + ]),'entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($organization)]); ?> +renderComponent(); ?> + + + + + + + + + + + + +
    +
    + renderComponent(); ?> + + + + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/cdf6fb19a5c0ad1ef5db7342b765bba8.php b/storage/framework/views/cdf6fb19a5c0ad1ef5db7342b765bba8.php new file mode 100755 index 0000000..0dab864 --- /dev/null +++ b/storage/framework/views/cdf6fb19a5c0ad1ef5db7342b765bba8.php @@ -0,0 +1,124 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.products.index.title'); ?> + endSlot(); ?> + +
    +
    +
    + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'products']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'products']); ?> +renderComponent(); ?> + + + + + + + + + + +
    + get('admin::app.products.index.title'); ?> +
    +
    + +
    + + + + + hasPermission('products.create')): ?> + + + + + +
    +
    + + + + + + + 'admin::components.datagrid.index','data' => ['src' => route('admin.products.index')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['src' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.products.index'))]); ?> + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + +
    + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/ce51d0382acd3068014849bcbd3390c7.php b/storage/framework/views/ce51d0382acd3068014849bcbd3390c7.php new file mode 100755 index 0000000..8321c0b --- /dev/null +++ b/storage/framework/views/ce51d0382acd3068014849bcbd3390c7.php @@ -0,0 +1,303 @@ + +onlyProps([ + 'allowEdit' => true, +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'allowEdit' => true, +]); ?> + true, +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + :allow-edit="" +> +
    +
    +
    +
    +
    +
    + +hasRenderedOnce('e1ae9851-6a4a-4416-9f18-a9735ef86d8f')): $__env->markAsRenderedOnce('e1ae9851-6a4a-4416-9f18-a9735ef86d8f'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/cef5a8b8fe9e2295a6f0cd070e4ab426.php b/storage/framework/views/cef5a8b8fe9e2295a6f0cd070e4ab426.php new file mode 100755 index 0000000..c0d73df --- /dev/null +++ b/storage/framework/views/cef5a8b8fe9e2295a6f0cd070e4ab426.php @@ -0,0 +1,303 @@ + +onlyProps([ + 'allowEdit' => true, +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'allowEdit' => true, +]); ?> + true, +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + :allow-edit="" +> +
    +
    +
    +
    +
    +
    + +hasRenderedOnce('af33b841-7e72-4af8-ae47-b2d23cb2cffe')): $__env->markAsRenderedOnce('af33b841-7e72-4af8-ae47-b2d23cb2cffe'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/cf663c2c06309f3a59c67ba60cc1815a.php b/storage/framework/views/cf663c2c06309f3a59c67ba60cc1815a.php new file mode 100755 index 0000000..462771b --- /dev/null +++ b/storage/framework/views/cf663c2c06309f3a59c67ba60cc1815a.php @@ -0,0 +1,1886 @@ + + + + + +hasRenderedOnce('75f33b77-4fb3-4ee6-a138-e7383144c628')): $__env->markAsRenderedOnce('75f33b77-4fb3-4ee6-a138-e7383144c628'); +$__env->startPush('scripts'); ?> + + + + + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/d028a4887c85c25f7b1d6f3b0d730412.php b/storage/framework/views/d028a4887c85c25f7b1d6f3b0d730412.php new file mode 100755 index 0000000..988ca76 --- /dev/null +++ b/storage/framework/views/d028a4887c85c25f7b1d6f3b0d730412.php @@ -0,0 +1,93 @@ +hasPages()): ?> + + + \ No newline at end of file diff --git a/storage/framework/views/d03914f7418dbbe11a34e35b629d81da.php b/storage/framework/views/d03914f7418dbbe11a34e35b629d81da.php new file mode 100755 index 0000000..4f32a06 --- /dev/null +++ b/storage/framework/views/d03914f7418dbbe11a34e35b629d81da.php @@ -0,0 +1,65 @@ +
    + + +
    + +
    +
    + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'file','id' => $attribute->code,'name' => $attribute->code,'rules' => $validations,'label' => $attribute->name]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'file','id' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->code),'name' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->code),'rules' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations),'label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name)]); ?> +renderComponent(); ?> + + + + + + + + + +
    + + +
    + + + 'admin::components.form.control-group.control','data' => ['type' => 'checkbox','name' => ''.e($attribute->code).'[delete]','id' => ''.e($attribute->code).'[delete]','for' => ''.e($attribute->code).'[delete]','value' => '1']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'checkbox','name' => ''.e($attribute->code).'[delete]','id' => ''.e($attribute->code).'[delete]','for' => ''.e($attribute->code).'[delete]','value' => '1']); ?> +renderComponent(); ?> + + + + + + + + + + + +
    + \ No newline at end of file diff --git a/storage/framework/views/d088af29b2c8f0235601107a5f871950.php b/storage/framework/views/d088af29b2c8f0235601107a5f871950.php new file mode 100755 index 0000000..112d845 --- /dev/null +++ b/storage/framework/views/d088af29b2c8f0235601107a5f871950.php @@ -0,0 +1,237 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get($product->name); ?> + endSlot(); ?> + + +
    + + $product]); ?> + + +
    + +
    + +
    + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'products.view','entity' => $product]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'products.view','entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($product)]); ?> +renderComponent(); ?> + + + + + + + + + +
    + + $product]); ?> + + + + + + 'admin::components.tags.index','data' => ['attachEndpoint' => route('admin.products.tags.attach', $product->id),'detachEndpoint' => route('admin.products.tags.detach', $product->id),'addedTags' => $product->tags]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::tags'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attach-endpoint' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.products.tags.attach', $product->id)),'detach-endpoint' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.products.tags.detach', $product->id)),'added-tags' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($product->tags)]); ?> +renderComponent(); ?> + + + + + + + + + + + $product]); ?> + + + +
    + $product]); ?> + + +

    + name); ?> + +

    + + $product]); ?> + + + $product]); ?> + + +

    + get('admin::app.products.view.sku'); ?> : sku); ?> + +

    + + $product]); ?> + +
    + + $product]); ?> + + + +
    + $product]); ?> + + + + + + 'admin::components.activities.actions.note','data' => ['entity' => $product,'entityControlName' => 'product_id']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::activities.actions.note'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($product),'entity-control-name' => 'product_id']); ?> +renderComponent(); ?> + + + + + + + + + + + $product]); ?> + + + $product]); ?> + + + + + + 'admin::components.activities.actions.file','data' => ['entity' => $product,'entityControlName' => 'product_id']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::activities.actions.file'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($product),'entity-control-name' => 'product_id']); ?> +renderComponent(); ?> + + + + + + + + + + + $product]); ?> + +
    + + $product]); ?> + +
    + + + make('admin::products.view.attributes', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> +
    + + $product]); ?> + + + $product]); ?> + + + +
    + $product]); ?> + + + + + + 'admin::components.activities.index','data' => ['endpoint' => route('admin.products.activities.index', $product->id),'types' => [ + ['name' => 'all', 'label' => trans('admin::app.products.view.all')], + ['name' => 'note', 'label' => trans('admin::app.products.view.notes')], + ['name' => 'file', 'label' => trans('admin::app.products.view.files')], + ['name' => 'system', 'label' => trans('admin::app.products.view.change-logs')], + ],'extraTypes' => [ + ['name' => 'inventory', 'label' => trans('admin::app.products.view.inventories')], + ]]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::activities'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['endpoint' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.products.activities.index', $product->id)),'types' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute([ + ['name' => 'all', 'label' => trans('admin::app.products.view.all')], + ['name' => 'note', 'label' => trans('admin::app.products.view.notes')], + ['name' => 'file', 'label' => trans('admin::app.products.view.files')], + ['name' => 'system', 'label' => trans('admin::app.products.view.change-logs')], + ]),'extra-types' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute([ + ['name' => 'inventory', 'label' => trans('admin::app.products.view.inventories')], + ])]); ?> + slot('inventory', null, []); ?> + make('admin::products.view.inventory', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + + + $product]); ?> + +
    + + $product]); ?> + +
    + renderComponent(); ?> + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/d152e93aa18084fce458b6000ce4c6d0.php b/storage/framework/views/d152e93aa18084fce458b6000ce4c6d0.php new file mode 100755 index 0000000..e554186 --- /dev/null +++ b/storage/framework/views/d152e93aa18084fce458b6000ce4c6d0.php @@ -0,0 +1,37 @@ + +onlyProps([ + 'name' => null, + 'controlName' => '', +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'name' => null, + 'controlName' => '', +]); ?> + null, + 'controlName' => '', +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + name="" + v-slot="{ message }" +> +

    merge(['class' => 'mt-1 text-xs italic text-red-600'])); ?> + + v-text="message" + > +

    +
    + \ No newline at end of file diff --git a/storage/framework/views/d1f08c39f1f5d58707d54efd7804b954.php b/storage/framework/views/d1f08c39f1f5d58707d54efd7804b954.php new file mode 100755 index 0000000..0326deb --- /dev/null +++ b/storage/framework/views/d1f08c39f1f5d58707d54efd7804b954.php @@ -0,0 +1,164 @@ +
    + hasPermission('leads.create') + || bouncer()->hasPermission('quotes.create') + || bouncer()->hasPermission('mail.create') + || bouncer()->hasPermission('contacts.persons.create') + || bouncer()->hasPermission('contacts.organizations.create') + || bouncer()->hasPermission('products.create') + || bouncer()->hasPermission('settings.automation.attributes.create') + || bouncer()->hasPermission('settings.user.roles.create') + || bouncer()->hasPermission('settings.user.users.create') + ): ?> + + + 'admin::components.dropdown.index','data' => ['position' => 'bottom-right']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::dropdown'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['position' => 'bottom-right']); ?> + slot('toggle', null, []); ?> + + + endSlot(); ?> + + + slot('content', null, ['class' => 'mt-2 !p-0']); ?> +
    +
    + + hasPermission('leads.create')): ?> + + + + + hasPermission('quotes.create')): ?> + + + + + hasPermission('mail.create')): ?> + + + + + hasPermission('contacts.persons.create')): ?> + + + + + hasPermission('contacts.organizations.create')): ?> + + + + + hasPermission('products.create')): ?> + + + + + hasPermission('settings.automation.attributes.create')): ?> + + + + + hasPermission('settings.user.roles.create')): ?> + + + + + hasPermission('settings.user.users.create')): ?> + + +
    +
    + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + + +
    + \ No newline at end of file diff --git a/storage/framework/views/d2c46ca36ad74e62d092fa104c6403d2.php b/storage/framework/views/d2c46ca36ad74e62d092fa104c6403d2.php new file mode 100755 index 0000000..0aac4ec --- /dev/null +++ b/storage/framework/views/d2c46ca36ad74e62d092fa104c6403d2.php @@ -0,0 +1,29 @@ +lookup_type + ? app('Webkul\Attribute\Repositories\AttributeRepository')->getLookUpOptions($attribute->lookup_type) + : $attribute->options()->orderBy('sort_order')->get(); + + $selectedOption = old($attribute->code) ?: $value; +?> + + + + 'admin::components.form.control-group.controls.inline.multiselect','data' => [':name' => '\''.e($attribute->code).'\'',':value' => '\''.e($selectedOption).'\'','data' => $options,'rules' => 'required','position' => 'left','label' => $attribute->name,':errors' => 'errors','placeholder' => $attribute->name,'url' => $url,'allowEdit' => $allowEdit]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.controls.inline.multiselect'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([':name' => '\''.e($attribute->code).'\'',':value' => '\''.e($selectedOption).'\'','data' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($options),'rules' => 'required','position' => 'left','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),':errors' => 'errors','placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),'url' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($url),'allow-edit' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($allowEdit)]); ?> +renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/d33307fb31bb2672758386635ebd2409.php b/storage/framework/views/d33307fb31bb2672758386635ebd2409.php new file mode 100755 index 0000000..5f7f63f --- /dev/null +++ b/storage/framework/views/d33307fb31bb2672758386635ebd2409.php @@ -0,0 +1,21 @@ + +onlyProps(['count' => 5]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps(['count' => 5]); ?> + 5]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + +
    + +
    + + +
    +
    \ No newline at end of file diff --git a/storage/framework/views/d4062cf192494d743f721004ae6def7a.php b/storage/framework/views/d4062cf192494d743f721004ae6def7a.php new file mode 100755 index 0000000..c724e61 --- /dev/null +++ b/storage/framework/views/d4062cf192494d743f721004ae6def7a.php @@ -0,0 +1,1251 @@ +getEmailTemplatePlaceholders()); ?> + + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.settings.webhooks.edit.title'); ?> + endSlot(); ?> + + $webhook]); ?> + + + + + 'admin::components.form.index','data' => ['action' => route('admin.settings.webhooks.update', $webhook->id),'method' => 'PUT']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.webhooks.update', $webhook->id)),'method' => 'PUT']); ?> +
    +
    +
    + $webhook]); ?> + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.webhooks.edit','entity' => $webhook]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.webhooks.edit','entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($webhook)]); ?> +renderComponent(); ?> + + + + + + + + + + + $webhook]); ?> + + +
    + get('admin::app.settings.webhooks.edit.title'); ?> +
    +
    + +
    +
    + $webhook]); ?> + + + + + + $webhook]); ?> + +
    +
    +
    + + +
    + renderComponent(); ?> + + + + + + + + + + + $webhook]); ?> + + + hasRenderedOnce('797656a1-99a5-4505-8607-5138991eb3de')): $__env->markAsRenderedOnce('797656a1-99a5-4505-8607-5138991eb3de'); +$__env->startPush('scripts'); ?> + + + + + + + + + + + + stopPush(); endif; ?> + + hasRenderedOnce('6c805669-c44a-421d-a5db-c7e3839b5555')): $__env->markAsRenderedOnce('6c805669-c44a-421d-a5db-c7e3839b5555'); +$__env->startPush('styles'); ?> + + + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/d4b0a3e17c2124cfec42f81937afea08.php b/storage/framework/views/d4b0a3e17c2124cfec42f81937afea08.php new file mode 100755 index 0000000..d44a33c --- /dev/null +++ b/storage/framework/views/d4b0a3e17c2124cfec42f81937afea08.php @@ -0,0 +1,243 @@ + + + + + + + + + + <?php echo e($title ?? ''); ?> + + + + + + + + + + + yieldPushContent('meta'); ?> + + set(['src/Resources/assets/css/app.css', 'src/Resources/assets/js/app.js'])); ?> + + + + + + + getConfigData('general.design.admin_logo.favicon')): ?> + + + + + + getConfigData('general.settings.menu_color.brand_color') ?? '#0E90D9'; + ?> + + yieldPushContent('styles'); ?> + + + + + + + + + + + +
    + + + + 'admin::components.flash-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::flash-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.modal.confirm','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::modal.confirm'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + + 'admin::components.layouts.header.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts.header'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + +
    + + + + + yieldPushContent('scripts'); ?> + + + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/d5041d7ba88a56444ac758c9cce83a35.php b/storage/framework/views/d5041d7ba88a56444ac758c9cce83a35.php new file mode 100755 index 0000000..40bfd22 --- /dev/null +++ b/storage/framework/views/d5041d7ba88a56444ac758c9cce83a35.php @@ -0,0 +1,197 @@ + + + + + +hasRenderedOnce('bb73b107-31ac-4737-9514-6a75fec4156a')): $__env->markAsRenderedOnce('bb73b107-31ac-4737-9514-6a75fec4156a'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/d66b74b49d95530ad03f4294dd4ab050.php b/storage/framework/views/d66b74b49d95530ad03f4294dd4ab050.php new file mode 100755 index 0000000..efe56f3 --- /dev/null +++ b/storage/framework/views/d66b74b49d95530ad03f4294dd4ab050.php @@ -0,0 +1,245 @@ + + +
    + + +
    + +
    +
    + + + + + get("admin::app.common.custom-attributes.add-more"); ?> + +
    + + +hasRenderedOnce('572b2766-7cf4-4ed8-a1e6-ee2589734b87')): $__env->markAsRenderedOnce('572b2766-7cf4-4ed8-a1e6-ee2589734b87'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/d6c7c91ccd6193f9cd451e4deeedba4d.php b/storage/framework/views/d6c7c91ccd6193f9cd451e4deeedba4d.php new file mode 100755 index 0000000..a9a5f42 --- /dev/null +++ b/storage/framework/views/d6c7c91ccd6193f9cd451e4deeedba4d.php @@ -0,0 +1,226 @@ + + + 'web_form::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('web_form::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + title); ?> + + endSlot(); ?> + + + +
    +
    + + + 'web_form::components.spinner.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('web_form::spinner'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + +
    +
    +
    + + hasRenderedOnce('ff8bdc2f-f3fc-488b-bb17-b15f60c35846')): $__env->markAsRenderedOnce('ff8bdc2f-f3fc-488b-bb17-b15f60c35846'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/d6fbed627e4c89b29c413eb23eeadcdb.php b/storage/framework/views/d6fbed627e4c89b29c413eb23eeadcdb.php new file mode 100755 index 0000000..555f2a9 --- /dev/null +++ b/storage/framework/views/d6fbed627e4c89b29c413eb23eeadcdb.php @@ -0,0 +1,709 @@ + + + + +hasRenderedOnce('3631ecc4-5ca0-4422-8433-da11d9ab5207')): $__env->markAsRenderedOnce('3631ecc4-5ca0-4422-8433-da11d9ab5207'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/d76543fc136a2fb26036cf2dc1a322f3.php b/storage/framework/views/d76543fc136a2fb26036cf2dc1a322f3.php new file mode 100755 index 0000000..b6cd425 --- /dev/null +++ b/storage/framework/views/d76543fc136a2fb26036cf2dc1a322f3.php @@ -0,0 +1,21 @@ + + + 'admin::components.form.control-group.controls.inline.email','data' => [':name' => '\''.e($attribute->code).'\'','value' => $value,'rules' => 'required|decimal:4','position' => 'left','label' => $attribute->name,':errors' => 'errors','placeholder' => $attribute->name,'url' => $url,'allowEdit' => $allowEdit]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.controls.inline.email'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([':name' => '\''.e($attribute->code).'\'','value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'rules' => 'required|decimal:4','position' => 'left','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),':errors' => 'errors','placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),'url' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($url),'allow-edit' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($allowEdit)]); ?> +renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/d7daa0669623d0843faae680d79d5170.php b/storage/framework/views/d7daa0669623d0843faae680d79d5170.php new file mode 100755 index 0000000..b5f3833 --- /dev/null +++ b/storage/framework/views/d7daa0669623d0843faae680d79d5170.php @@ -0,0 +1,300 @@ + + + 'admin::components.layouts.anonymous','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts.anonymous'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.users.login.title'); ?> + endSlot(); ?> + +
    +
    + + getConfigData('general.design.admin_logo.logo_image')): ?> + <?php echo e(config('app.name')); ?> + + <?php echo e(config('app.name')); ?> + + +
    + + + + + + + 'admin::components.form.index','data' => ['action' => route('admin.session.store')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.session.store'))]); ?> +

    + get('admin::app.users.login.title'); ?> +

    + +
    + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.users.login.email'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'email','class' => 'w-[254px] max-w-full','id' => 'email','name' => 'email','rules' => 'required|email','label' => trans('admin::app.users.login.email'),'placeholder' => trans('admin::app.users.login.email')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'email','class' => 'w-[254px] max-w-full','id' => 'email','name' => 'email','rules' => 'required|email','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.users.login.email')),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.users.login.email'))]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'email']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'email']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.form.control-group.index','data' => ['class' => 'relative w-full']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'relative w-full']); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.users.login.password'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'password','class' => 'w-[254px] max-w-full ltr:pr-10 rtl:pl-10','id' => 'password','name' => 'password','rules' => 'required|min:6','label' => trans('admin::app.users.login.password'),'placeholder' => trans('admin::app.users.login.password')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'password','class' => 'w-[254px] max-w-full ltr:pr-10 rtl:pl-10','id' => 'password','name' => 'password','rules' => 'required|min:6','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.users.login.password')),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.users.login.password'))]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'password']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'password']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + +
    + +
    + + + get('admin::app.users.login.forget-password-link'); ?> + + + + +
    + renderComponent(); ?> + + + + + + + + + + + + +
    +
    + + +
    + Desenvolvido por + + Blyzer + +
    + + startPush('scripts'); ?> + + stopPush(); ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/d8243be939fa006d973e91115191161b.php b/storage/framework/views/d8243be939fa006d973e91115191161b.php new file mode 100755 index 0000000..dab8094 --- /dev/null +++ b/storage/framework/views/d8243be939fa006d973e91115191161b.php @@ -0,0 +1,37 @@ + +onlyProps([ + 'name' => null, + 'controlName' => '', +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'name' => null, + 'controlName' => '', +]); ?> + null, + 'controlName' => '', +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + name="" + v-slot="{ message }" +> +

    merge(['class' => 'mt-1 text-xs italic text-red-600'])); ?> + + v-text="message" + > +

    +
    + \ No newline at end of file diff --git a/storage/framework/views/d84bcbb3d7b8d427bb210340b35bbd2f.php b/storage/framework/views/d84bcbb3d7b8d427bb210340b35bbd2f.php new file mode 100755 index 0000000..c4af01a --- /dev/null +++ b/storage/framework/views/d84bcbb3d7b8d427bb210340b35bbd2f.php @@ -0,0 +1,1282 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.settings.users.index.title'); ?> + endSlot(); ?> + +
    +
    +
    + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.users']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.users']); ?> +renderComponent(); ?> + + + + + + + + + + +
    + get('admin::app.settings.users.index.title'); ?> +
    +
    + +
    + + + + + hasPermission('settings.user.users.create')): ?> +
    + +
    + + + + +
    +
    + + + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + +
    + + hasRenderedOnce('4f44c9f8-9ec4-4bf4-9601-24ef6bf9eddd')): $__env->markAsRenderedOnce('4f44c9f8-9ec4-4bf4-9601-24ef6bf9eddd'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/dc0412c0780ee8f64f910e45f574ee0f.php b/storage/framework/views/dc0412c0780ee8f64f910e45f574ee0f.php new file mode 100755 index 0000000..9709c1f --- /dev/null +++ b/storage/framework/views/dc0412c0780ee8f64f910e45f574ee0f.php @@ -0,0 +1,639 @@ + +onlyProps([ + 'isMultiRow' => false, + 'toolbarLeftBefore' => null, + 'toolbarLeftAfter' => null, + 'toolbarRightBefore' => null, + 'toolbarRightAfter' => null, +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'isMultiRow' => false, + 'toolbarLeftBefore' => null, + 'toolbarLeftAfter' => null, + 'toolbarRightBefore' => null, + 'toolbarRightAfter' => null, +]); ?> + false, + 'toolbarLeftBefore' => null, + 'toolbarLeftAfter' => null, + 'toolbarRightBefore' => null, + 'toolbarRightAfter' => null, +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + +> + + + + +hasRenderedOnce('c8738b28-86a1-499c-9d0f-6cd666a57056')): $__env->markAsRenderedOnce('c8738b28-86a1-499c-9d0f-6cd666a57056'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/dcfc209cfcd29250c5cd4457912cc6c0.php b/storage/framework/views/dcfc209cfcd29250c5cd4457912cc6c0.php new file mode 100755 index 0000000..79465ee --- /dev/null +++ b/storage/framework/views/dcfc209cfcd29250c5cd4457912cc6c0.php @@ -0,0 +1,240 @@ +> +
    + + + get('admin::app.export.export'); ?> +
    +
    + +hasRenderedOnce('25d5a7ab-5f4f-4dda-9f88-4ff6361ae381')): $__env->markAsRenderedOnce('25d5a7ab-5f4f-4dda-9f88-4ff6361ae381'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/dd110fa48c7ea808250a8c92771c47cb.php b/storage/framework/views/dd110fa48c7ea808250a8c92771c47cb.php new file mode 100755 index 0000000..e3f5361 --- /dev/null +++ b/storage/framework/views/dd110fa48c7ea808250a8c92771c47cb.php @@ -0,0 +1,386 @@ + + + 'admin::components.layouts.anonymous','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts.anonymous'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.users.reset-password.title'); ?> + endSlot(); ?> + +
    +
    + + getConfigData('general.design.admin_logo.logo_image')): ?> + <?php echo e(config('app.name')); ?> + + <?php echo e(config('app.name')); ?> + + +
    + + + + + + + 'admin::components.form.index','data' => ['action' => route('admin.reset_password.store')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.reset_password.store'))]); ?> +
    +

    + get('admin::app.users.reset-password.title'); ?> +

    +
    + + + + 'admin::components.form.control-group.control','data' => ['type' => 'hidden','name' => 'token','value' => $token]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'hidden','name' => 'token','value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($token)]); ?> +renderComponent(); ?> + + + + + + + + + + +
    + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.users.reset-password.email'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'email','class' => 'w-[254px] max-w-full','id' => 'email','name' => 'email','rules' => 'required|email','label' => trans('admin::app.users.reset-password.email'),'placeholder' => trans('admin::app.users.reset-password.email')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'email','class' => 'w-[254px] max-w-full','id' => 'email','name' => 'email','rules' => 'required|email','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.users.reset-password.email')),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.users.reset-password.email'))]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'email']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'email']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.users.reset-password.password'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'password','class' => 'w-[254px] max-w-full','id' => 'password','name' => 'password','rules' => 'required|min:6','label' => trans('admin::app.users.reset-password.password'),'placeholder' => trans('admin::app.users.reset-password.password'),'ref' => 'password']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'password','class' => 'w-[254px] max-w-full','id' => 'password','name' => 'password','rules' => 'required|min:6','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.users.reset-password.password')),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.users.reset-password.password')),'ref' => 'password']); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'password']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'password']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.users.reset-password.confirm-password'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'password','class' => 'w-[254px] max-w-full','id' => 'password_confirmation','name' => 'password_confirmation','rules' => 'confirmed:@password','label' => trans('admin::app.users.reset-password.confirm-password'),'placeholder' => trans('admin::app.users.reset-password.confirm-password'),'ref' => 'password']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'password','class' => 'w-[254px] max-w-full','id' => 'password_confirmation','name' => 'password_confirmation','rules' => 'confirmed:@password','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.users.reset-password.confirm-password')),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.users.reset-password.confirm-password')),'ref' => 'password']); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'password_confirmation']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'password_confirmation']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + +
    + +
    + + + get('admin::app.users.reset-password.back-link-title'); ?> + + + + +
    + renderComponent(); ?> + + + + + + + + + + + + +
    +
    + + +
    + Desenvolvido por + + Blyzer + +
    + + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/dd176efcf4d159000b9a55553f87ccb1.php b/storage/framework/views/dd176efcf4d159000b9a55553f87ccb1.php new file mode 100755 index 0000000..9ff64a9 --- /dev/null +++ b/storage/framework/views/dd176efcf4d159000b9a55553f87ccb1.php @@ -0,0 +1,106 @@ + $person]); ?> + + +organization): ?> +
    +

    + get('admin::app.contacts.persons.view.about-organization'); ?> + + +

    + +
    + $person]); ?> + + + + + + 'admin::components.avatar.index','data' => ['name' => $person->organization->name]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::avatar'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($person->organization->name)]); ?> +renderComponent(); ?> + + + + + + + + + + + $person]); ?> + + + +
    + $person]); ?> + + + + organization->name); ?> + + + + $person]); ?> + + + + $person]); ?> + + + organization->address): ?> +
    + organization->address['address'])): ?> + + organization->address['address']); ?> + + + + + organization->address['postcode']) + && isset($person->organization->address['city']) + ): ?> + + organization->address['postcode'] . ' ' . $person->organization->address['city']); ?> + + + + + organization->address['state'])): ?> + + state_name($person->organization->address['state'])); ?> + + + + + organization->address['country'])): ?> + + country_name($person->organization->address['country'])); ?> + + + +
    + + + $person]); ?> + +
    +
    +
    + + + $person]); ?> + + \ No newline at end of file diff --git a/storage/framework/views/dd310000961f2d208873a737c27d849a.php b/storage/framework/views/dd310000961f2d208873a737c27d849a.php new file mode 100755 index 0000000..0ad1c1a --- /dev/null +++ b/storage/framework/views/dd310000961f2d208873a737c27d849a.php @@ -0,0 +1,35 @@ + + + + + + + <?php echo $__env->yieldContent('title'); ?> + + + + + + +
    +
    +
    +
    + yieldContent('code'); ?> +
    + +
    + yieldContent('message'); ?> +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/storage/framework/views/dd4f775cdf3e345524a2ade89dee5cd6.php b/storage/framework/views/dd4f775cdf3e345524a2ade89dee5cd6.php new file mode 100755 index 0000000..e4d9505 --- /dev/null +++ b/storage/framework/views/dd4f775cdf3e345524a2ade89dee5cd6.php @@ -0,0 +1,84 @@ +> + + + + +hasRenderedOnce('96fdc140-b8c4-417a-983a-d8499483590a')): $__env->markAsRenderedOnce('96fdc140-b8c4-417a-983a-d8499483590a'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/dd90c61f625f87e8ccaf54e392e6603a.php b/storage/framework/views/dd90c61f625f87e8ccaf54e392e6603a.php new file mode 100755 index 0000000..de91e2e --- /dev/null +++ b/storage/framework/views/dd90c61f625f87e8ccaf54e392e6603a.php @@ -0,0 +1,153 @@ + + + + + + <?php echo e($title ?? ''); ?> + + + + + + + + + + + yieldPushContent('meta'); ?> + + set(['src/Resources/assets/css/app.css', 'src/Resources/assets/js/app.js'])); ?> + + + + + + + getConfigData('general.design.admin_logo.favicon')): ?> + + + + + + getConfigData('general.settings.menu_color.brand_color') ?? '#0E90D9'; + ?> + + yieldPushContent('styles'); ?> + + + + + + + + + + + +
    + + + + 'admin::components.flash-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::flash-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + + + + +
    + + + + + yieldPushContent('scripts'); ?> + + + + + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/ddc7cd9af3029afaf2b177122446790d.php b/storage/framework/views/ddc7cd9af3029afaf2b177122446790d.php new file mode 100755 index 0000000..5242797 --- /dev/null +++ b/storage/framework/views/ddc7cd9af3029afaf2b177122446790d.php @@ -0,0 +1,67 @@ +
    + + + <?php echo e($attribute->code); ?> + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'file','id' => $attribute->code,'name' => $attribute->code,'class' => '!w-full','rules' => $validations,'label' => $attribute->name]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'file','id' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->code),'name' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->code),'class' => '!w-full','rules' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations),'label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name)]); ?> +renderComponent(); ?> + + + + + + + + + +
    + + +
    + + + 'admin::components.form.control-group.control','data' => ['type' => 'checkbox','name' => ''.e($attribute->code).'[delete]','id' => ''.e($attribute->code).'[delete]','for' => ''.e($attribute->code).'[delete]','value' => '1']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'checkbox','name' => ''.e($attribute->code).'[delete]','id' => ''.e($attribute->code).'[delete]','for' => ''.e($attribute->code).'[delete]','value' => '1']); ?> +renderComponent(); ?> + + + + + + + + + + + +
    + \ No newline at end of file diff --git a/storage/framework/views/ddde46e2c3e07f623e890cd4be59e607.php b/storage/framework/views/ddde46e2c3e07f623e890cd4be59e607.php new file mode 100755 index 0000000..6276a76 --- /dev/null +++ b/storage/framework/views/ddde46e2c3e07f623e890cd4be59e607.php @@ -0,0 +1,17 @@ + +
    + +
    + +
    +

    +

    +
    +
    + + +
    +

    +
    +
    + \ No newline at end of file diff --git a/storage/framework/views/dde597c3b13585264f473de3430b8792.php b/storage/framework/views/dde597c3b13585264f473de3430b8792.php new file mode 100755 index 0000000..d5067b8 --- /dev/null +++ b/storage/framework/views/dde597c3b13585264f473de3430b8792.php @@ -0,0 +1,90 @@ + $warehouse]); ?> + + +
    + + + 'admin::components.accordion.index','data' => ['class' => 'select-none !border-none']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::accordion'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'select-none !border-none']); ?> + slot('header', null, ['class' => '!p-0']); ?> +

    + get('admin::app.settings.warehouses.view.general-information.title'); ?> +

    + endSlot(); ?> + + slot('content', null, ['class' => 'mt-4 !px-0 !pb-0']); ?> + + + + 'admin::components.form.index','data' => ['vSlot' => '{ meta, errors, handleSubmit }','as' => 'div','ref' => 'modalForm']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['v-slot' => '{ meta, errors, handleSubmit }','as' => 'div','ref' => 'modalForm']); ?> +
    + $warehouse]); ?> + + + + + 'admin::components.attributes.view','data' => ['customAttributes' => app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + 'entity_type' => 'warehouses', + ['code', 'NOTIN', ['contact_name', 'contact_emails', 'contact_numbers', 'contact_address']] + ]),'entity' => $warehouse,'url' => route('admin.settings.warehouses.update', $warehouse->id),'allowEdit' => true]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.view'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['custom-attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + 'entity_type' => 'warehouses', + ['code', 'NOTIN', ['contact_name', 'contact_emails', 'contact_numbers', 'contact_address']] + ])),'entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($warehouse),'url' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.warehouses.update', $warehouse->id)),'allow-edit' => true]); ?> +renderComponent(); ?> + + + + + + + + + + + $warehouse]); ?> + +
    + renderComponent(); ?> + + + + + + + + + + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + +
    + + $warehouse]); ?> \ No newline at end of file diff --git a/storage/framework/views/decb4b9850e964b06d91abea7ed638e3.php b/storage/framework/views/decb4b9850e964b06d91abea7ed638e3.php new file mode 100755 index 0000000..c1a9032 --- /dev/null +++ b/storage/framework/views/decb4b9850e964b06d91abea7ed638e3.php @@ -0,0 +1,541 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.settings.types.index.title'); ?> + endSlot(); ?> + +
    + +
    +
    + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.types']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.types']); ?> +renderComponent(); ?> + + + + + + + + + + +
    + get('admin::app.settings.types.index.title'); ?> +
    +
    + +
    + + + + +
    + hasPermission('settings.lead.types.create')): ?> + + +
    + + + +
    +
    + + + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + +
    + + hasRenderedOnce('be77aea3-16c9-4cc2-b08a-63eb271869ff')): $__env->markAsRenderedOnce('be77aea3-16c9-4cc2-b08a-63eb271869ff'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/e0276c8bee964928573ce227b79ec846.php b/storage/framework/views/e0276c8bee964928573ce227b79ec846.php new file mode 100755 index 0000000..3c328ed --- /dev/null +++ b/storage/framework/views/e0276c8bee964928573ce227b79ec846.php @@ -0,0 +1,66 @@ + +onlyProps(['isMultiRow' => false]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps(['isMultiRow' => false]); ?> + false]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + +
    +
    + +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    + +
    +
    +
    + +
    +
    + +
    + +
    +
    + +
    +
    + +
    + +
    +
    +
    + + + \ No newline at end of file diff --git a/storage/framework/views/e0688c0fbc190f2d2b5546e07a44af84.php b/storage/framework/views/e0688c0fbc190f2d2b5546e07a44af84.php new file mode 100755 index 0000000..7f97904 --- /dev/null +++ b/storage/framework/views/e0688c0fbc190f2d2b5546e07a44af84.php @@ -0,0 +1,524 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.contacts.persons.index.title'); ?> + endSlot(); ?> + +
    +
    +
    + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'contacts.persons']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'contacts.persons']); ?> +renderComponent(); ?> + + + + + + + + + + +
    + get('admin::app.contacts.persons.index.title'); ?> +
    +
    + +
    + + + + 'admin::components.datagrid.export.index','data' => ['src' => route('admin.contacts.persons.index')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::datagrid.export'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['src' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.contacts.persons.index'))]); ?> +renderComponent(); ?> + + + + + + + + + + + +
    + + + + hasPermission('contacts.persons.create')): ?> + + get('admin::app.contacts.persons.index.create-btn'); ?> + + + + + +
    +
    +
    + + + + + + + + + 'admin::components.shimmer.datagrid.index','data' => ['isMultiRow' => true]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['is-multi-row' => true]); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + + hasRenderedOnce('df5f3c37-a084-4096-bf45-176fa44ed86b')): $__env->markAsRenderedOnce('df5f3c37-a084-4096-bf45-176fa44ed86b'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/e0c0309d658af32f720f58d954a75621.php b/storage/framework/views/e0c0309d658af32f720f58d954a75621.php new file mode 100755 index 0000000..42fc627 --- /dev/null +++ b/storage/framework/views/e0c0309d658af32f720f58d954a75621.php @@ -0,0 +1,338 @@ + +onlyProps([ + 'allowEdit' => true, +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'allowEdit' => true, +]); ?> + true, +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + :allow-edit="" +> +
    +
    +
    +
    +
    +
    + +hasRenderedOnce('f79c19b7-f75f-4480-a1f8-a24c307c98d7')): $__env->markAsRenderedOnce('f79c19b7-f75f-4480-a1f8-a24c307c98d7'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/e10715403ad8ebf33c12c87a3c8d124c.php b/storage/framework/views/e10715403ad8ebf33c12c87a3c8d124c.php new file mode 100755 index 0000000..5540eff --- /dev/null +++ b/storage/framework/views/e10715403ad8ebf33c12c87a3c8d124c.php @@ -0,0 +1,5 @@ +merge(['scope' => 'row', 'class' => 'whitespace-nowrap px-6 py-4'])); ?>> + + + + \ No newline at end of file diff --git a/storage/framework/views/e12515669a36502caee1fcb5890b704c.php b/storage/framework/views/e12515669a36502caee1fcb5890b704c.php new file mode 100755 index 0000000..8c13c48 --- /dev/null +++ b/storage/framework/views/e12515669a36502caee1fcb5890b704c.php @@ -0,0 +1,101 @@ +> + +hasRenderedOnce('7bd77868-25fe-4b00-8f76-7ef7dc06bc41')): $__env->markAsRenderedOnce('7bd77868-25fe-4b00-8f76-7ef7dc06bc41'); +$__env->startPush('scripts'); ?> + + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/e17ea57b30de72877d20a53f3c29aeaf.php b/storage/framework/views/e17ea57b30de72877d20a53f3c29aeaf.php new file mode 100755 index 0000000..3832567 --- /dev/null +++ b/storage/framework/views/e17ea57b30de72877d20a53f3c29aeaf.php @@ -0,0 +1,207 @@ + + + +hasRenderedOnce('fb5e9d37-dd4a-4a2f-b8ac-506cd5b0f6c3')): $__env->markAsRenderedOnce('fb5e9d37-dd4a-4a2f-b8ac-506cd5b0f6c3'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/e1a71a194e9c94ace82a6690e1ce6f27.php b/storage/framework/views/e1a71a194e9c94ace82a6690e1ce6f27.php new file mode 100755 index 0000000..f51c888 --- /dev/null +++ b/storage/framework/views/e1a71a194e9c94ace82a6690e1ce6f27.php @@ -0,0 +1,5 @@ +
  5. merge(['class' => 'cursor-pointer px-5 py-2 text-sm text-gray-800 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-950 '])); ?>> + + +
  6. + \ No newline at end of file diff --git a/storage/framework/views/e21f4ff533736ebf8374e63f2f425fbf.php b/storage/framework/views/e21f4ff533736ebf8374e63f2f425fbf.php new file mode 100755 index 0000000..1519430 --- /dev/null +++ b/storage/framework/views/e21f4ff533736ebf8374e63f2f425fbf.php @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/storage/framework/views/e2ad14a097b32f80f7bfc5e55946b567.php b/storage/framework/views/e2ad14a097b32f80f7bfc5e55946b567.php new file mode 100755 index 0000000..62dbc90 --- /dev/null +++ b/storage/framework/views/e2ad14a097b32f80f7bfc5e55946b567.php @@ -0,0 +1,683 @@ + +
    + + + +
    +
    + +hasRenderedOnce('8f62ca86-c471-439d-b205-3eb51ef204af')): $__env->markAsRenderedOnce('8f62ca86-c471-439d-b205-3eb51ef204af'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/e41ac4cb9266fc960043673a707c4bc4.php b/storage/framework/views/e41ac4cb9266fc960043673a707c4bc4.php new file mode 100755 index 0000000..305b152 --- /dev/null +++ b/storage/framework/views/e41ac4cb9266fc960043673a707c4bc4.php @@ -0,0 +1,6 @@ +
    +
    + +
    +
    + \ No newline at end of file diff --git a/storage/framework/views/e44c3f8c8fc495a1ec2f928ecd6f077b.php b/storage/framework/views/e44c3f8c8fc495a1ec2f928ecd6f077b.php new file mode 100755 index 0000000..ce808c7 --- /dev/null +++ b/storage/framework/views/e44c3f8c8fc495a1ec2f928ecd6f077b.php @@ -0,0 +1,522 @@ + +onlyProps([ + 'attachEndpoint', + 'detachEndpoint', + 'addedTags' => [], +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'attachEndpoint', + 'detachEndpoint', + 'addedTags' => [], +]); ?> + [], +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + + 'admin::components.shimmer.tags.index','data' => ['count' => '3']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.tags'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['count' => '3']); ?> +renderComponent(); ?> + + + + + + + + + + + +hasRenderedOnce('a237dcd9-dc58-4f0e-ae19-f689f09882d5')): $__env->markAsRenderedOnce('a237dcd9-dc58-4f0e-ae19-f689f09882d5'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/e5ab0b39aa46cbd3d851dae297b36740.php b/storage/framework/views/e5ab0b39aa46cbd3d851dae297b36740.php new file mode 100755 index 0000000..8df8595 --- /dev/null +++ b/storage/framework/views/e5ab0b39aa46cbd3d851dae297b36740.php @@ -0,0 +1,210 @@ + + + + + + + + + 'admin::components.shimmer.dashboard.index.open-leads-by-states','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.dashboard.index.open-leads-by-states'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + +hasRenderedOnce('295b0215-985f-4bb8-b0e1-6d6d9f99d567')): $__env->markAsRenderedOnce('295b0215-985f-4bb8-b0e1-6d6d9f99d567'); +$__env->startPush('scripts'); ?> + + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/e5fb6ecb638634ab6fe102fca42ca237.php b/storage/framework/views/e5fb6ecb638634ab6fe102fca42ca237.php new file mode 100755 index 0000000..2d576ef --- /dev/null +++ b/storage/framework/views/e5fb6ecb638634ab6fe102fca42ca237.php @@ -0,0 +1,212 @@ + + + + + + + + + 'admin::components.shimmer.dashboard.index.revenue-by-sources','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.dashboard.index.revenue-by-sources'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + +hasRenderedOnce('2df48a80-59ed-4075-8db2-8a9396dc039a')): $__env->markAsRenderedOnce('2df48a80-59ed-4075-8db2-8a9396dc039a'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/e646a2dc3039e01a727e45c31f6b5969.php b/storage/framework/views/e646a2dc3039e01a727e45c31f6b5969.php new file mode 100755 index 0000000..edc32ad --- /dev/null +++ b/storage/framework/views/e646a2dc3039e01a727e45c31f6b5969.php @@ -0,0 +1,1312 @@ + + + + + + + + + +hasRenderedOnce('23d1f82e-535c-4989-b9c7-f3b20b7a2b81')): $__env->markAsRenderedOnce('23d1f82e-535c-4989-b9c7-f3b20b7a2b81'); +$__env->startPush('scripts'); ?> + + + + + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/e655b5dc7a417cc04c20dd7746949c81.php b/storage/framework/views/e655b5dc7a417cc04c20dd7746949c81.php new file mode 100755 index 0000000..6fd66ca --- /dev/null +++ b/storage/framework/views/e655b5dc7a417cc04c20dd7746949c81.php @@ -0,0 +1,25 @@ +
    +
    +
    +
    + +
    + +
    + +
    + +
    + +
    + +
    + + +
    +
    +
    +
    + +
    +
    \ No newline at end of file diff --git a/storage/framework/views/e69116b6c1b73e7d6d7e525efdf78de0.php b/storage/framework/views/e69116b6c1b73e7d6d7e525efdf78de0.php new file mode 100755 index 0000000..cc154bb --- /dev/null +++ b/storage/framework/views/e69116b6c1b73e7d6d7e525efdf78de0.php @@ -0,0 +1,102 @@ + + + + + + + + + +hasRenderedOnce('64651783-3a8a-406c-9163-41b52cc49711')): $__env->markAsRenderedOnce('64651783-3a8a-406c-9163-41b52cc49711'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/e8684d137bef4b6d7a4a6952ea74c011.php b/storage/framework/views/e8684d137bef4b6d7a4a6952ea74c011.php new file mode 100755 index 0000000..a899a39 --- /dev/null +++ b/storage/framework/views/e8684d137bef4b6d7a4a6952ea74c011.php @@ -0,0 +1,210 @@ + + + + + + + + + 'admin::components.shimmer.dashboard.index.open-leads-by-states','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.dashboard.index.open-leads-by-states'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + +hasRenderedOnce('09a68fd0-2fcd-4cb0-b4a4-2a100b52f6a3')): $__env->markAsRenderedOnce('09a68fd0-2fcd-4cb0-b4a4-2a100b52f6a3'); +$__env->startPush('scripts'); ?> + + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/e8ce166cee254d2d793d7f11fa6d8524.php b/storage/framework/views/e8ce166cee254d2d793d7f11fa6d8524.php new file mode 100644 index 0000000..cc8df1f --- /dev/null +++ b/storage/framework/views/e8ce166cee254d2d793d7f11fa6d8524.php @@ -0,0 +1,240 @@ +startComponent('super-admin.layouts.anonymous'); ?> +
    +
    + Growup Pro + +
    + + + 'admin::components.form.index','data' => ['action' => route('super-admin.session.store')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('super-admin.session.store'))]); ?> +

    + Super Admin Login +

    + +
    + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + Email + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'email','class' => 'w-[254px] max-w-full','id' => 'email','name' => 'email','rules' => 'required|email','label' => 'Email','placeholder' => 'Email']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'email','class' => 'w-[254px] max-w-full','id' => 'email','name' => 'email','rules' => 'required|email','label' => 'Email','placeholder' => 'Email']); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'email']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'email']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.form.control-group.index','data' => ['class' => 'relative w-full']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'relative w-full']); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + Password + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'password','class' => 'w-[254px] max-w-full ltr:pr-10 rtl:pl-10','id' => 'password','name' => 'password','rules' => 'required|min:6','label' => 'Password','placeholder' => 'Password']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'password','class' => 'w-[254px] max-w-full ltr:pr-10 rtl:pl-10','id' => 'password','name' => 'password','rules' => 'required|min:6','label' => 'Password','placeholder' => 'Password']); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'password']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'password']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + +
    + +
    + +
    + renderComponent(); ?> + + + + + + + + + +
    +
    + +
    + Desenvolvido por + + Blyzer + +
    +
    + + startPush('scripts'); ?> + + stopPush(); ?> +renderComponent(); ?> + + \ No newline at end of file diff --git a/storage/framework/views/e9a64ccf83e40b6b16a288dc330a6877.php b/storage/framework/views/e9a64ccf83e40b6b16a288dc330a6877.php new file mode 100755 index 0000000..9d1831d --- /dev/null +++ b/storage/framework/views/e9a64ccf83e40b6b16a288dc330a6877.php @@ -0,0 +1,63 @@ +lookup_type + ? app('Webkul\Attribute\Repositories\AttributeRepository')->getLookUpOptions($attribute->lookup_type) + : $attribute->options()->orderBy('sort_order')->get(); + + $selectedOption = old($attribute->code, $value); + + $selectedOption = is_array($selectedOption) ? $selectedOption : explode(',', $selectedOption); +?> + + + +addLoop($__currentLoopData); foreach($__currentLoopData as $option): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> + + + 'admin::components.form.control-group.index','data' => ['class' => '!mb-2 flex items-center gap-2.5']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => '!mb-2 flex items-center gap-2.5']); ?> + + + 'admin::components.form.control-group.control','data' => ['type' => 'checkbox','id' => $option->id,'name' => ''.e($attribute->code).'[]','value' => $option->id,'for' => $option->id,'label' => $option->name,'checked' => in_array($option->id, $selectedOption)]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'checkbox','id' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($option->id),'name' => ''.e($attribute->code).'[]','value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($option->id),'for' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($option->id),'label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($option->name),'checked' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(in_array($option->id, $selectedOption))]); ?> +renderComponent(); ?> + + + + + + + + + + + + renderComponent(); ?> + + + + + + + + + +popLoop(); $loop = $__env->getLastLoop(); ?> + \ No newline at end of file diff --git a/storage/framework/views/ed507c4a065f40e23e7c18c118e304cc.php b/storage/framework/views/ed507c4a065f40e23e7c18c118e304cc.php new file mode 100755 index 0000000..bee5434 --- /dev/null +++ b/storage/framework/views/ed507c4a065f40e23e7c18c118e304cc.php @@ -0,0 +1,5 @@ +merge(['scope' => 'row', 'class' => 'whitespace-nowrap px-6 py-4'])); ?>> + + + + \ No newline at end of file diff --git a/storage/framework/views/edb8e49c7ccaa4a5bd586b67f28eb732.php b/storage/framework/views/edb8e49c7ccaa4a5bd586b67f28eb732.php new file mode 100755 index 0000000..0716349 --- /dev/null +++ b/storage/framework/views/edb8e49c7ccaa4a5bd586b67f28eb732.php @@ -0,0 +1,46 @@ +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/storage/framework/views/edeb0bd066809f3fa4eb174c19fe02a4.php b/storage/framework/views/edeb0bd066809f3fa4eb174c19fe02a4.php new file mode 100755 index 0000000..d21a3c5 --- /dev/null +++ b/storage/framework/views/edeb0bd066809f3fa4eb174c19fe02a4.php @@ -0,0 +1,427 @@ + +onlyProps([ + 'allowEdit' => true, +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'allowEdit' => true, +]); ?> + true, +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + +except('value')); ?> + + :value=get('value'))); ?> + + :allow-edit="" +> +
    +
    +
    +
    +
    +
    + +hasRenderedOnce('dd1c357c-739c-4c5b-a892-9b53df3d53b9')): $__env->markAsRenderedOnce('dd1c357c-739c-4c5b-a892-9b53df3d53b9'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/ee76b80f4b4c257890fa6eb02c461b47.php b/storage/framework/views/ee76b80f4b4c257890fa6eb02c461b47.php new file mode 100755 index 0000000..c00124e --- /dev/null +++ b/storage/framework/views/ee76b80f4b4c257890fa6eb02c461b47.php @@ -0,0 +1,4 @@ +merge(['class' => 'bg-gray-50 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300'])); ?>> + + + \ No newline at end of file diff --git a/storage/framework/views/eea27cf20a93f6533c1f9f77ddbc40bc.php b/storage/framework/views/eea27cf20a93f6533c1f9f77ddbc40bc.php new file mode 100755 index 0000000..8b697af --- /dev/null +++ b/storage/framework/views/eea27cf20a93f6533c1f9f77ddbc40bc.php @@ -0,0 +1,126 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.settings.roles.index.title'); ?> + endSlot(); ?> + +
    +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.roles']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.roles']); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + + get('admin::app.settings.roles.index.title'); ?> +
    +
    + +
    + +
    + + + + hasPermission('settings.user.roles.create')): ?> + + get('admin::app.settings.roles.index.create-btn'); ?> + + + + + +
    +
    +
    + + + + 'admin::components.datagrid.index','data' => ['src' => route('admin.settings.roles.index')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['src' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.roles.index'))]); ?> + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + +
    + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/efa161867573b91595bb8fdc55cb83ff.php b/storage/framework/views/efa161867573b91595bb8fdc55cb83ff.php new file mode 100755 index 0000000..cd3ac16 --- /dev/null +++ b/storage/framework/views/efa161867573b91595bb8fdc55cb83ff.php @@ -0,0 +1,131 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.settings.data-transfer.imports.index.title'); ?> + endSlot(); ?> + +
    +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.data_transfers']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.data_transfers']); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + get('admin::app.settings.data-transfer.imports.index.title'); ?> +
    +
    + +
    + +
    + + + + hasPermission('settings.data_transfer.imports.create')): ?> + + get('admin::app.settings.data-transfer.imports.index.button-title'); ?> + + + + + +
    +
    +
    + + + + + + + + 'admin::components.datagrid.index','data' => ['src' => route('admin.settings.data_transfer.imports.index')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['src' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.data_transfer.imports.index'))]); ?> + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + +
    + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/f037afa2cd3deb169723c7576dd246cc.php b/storage/framework/views/f037afa2cd3deb169723c7576dd246cc.php new file mode 100755 index 0000000..4fcfddf --- /dev/null +++ b/storage/framework/views/f037afa2cd3deb169723c7576dd246cc.php @@ -0,0 +1,904 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.activities.index.title'); ?> + endSlot(); ?> + + + + + + +
    +
    +
    + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'activities']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'activities']); ?> +renderComponent(); ?> + + + + + + + + + + +
    + get('admin::app.activities.index.title'); ?> +
    +
    + +
    + + + +
    +
    + + + get('view-type') == 'table' + || ! request()->has('view-type') + ): ?> + + + 'admin::components.shimmer.datagrid.index','data' => ['isMultiRow' => true]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['is-multi-row' => true]); ?> +renderComponent(); ?> + + + + + + + + + + +
    +
    + + + + + hasRenderedOnce('c12f313a-0e3d-451d-9a23-0c17b1fb89cb')): $__env->markAsRenderedOnce('c12f313a-0e3d-451d-9a23-0c17b1fb89cb'); +$__env->startPush('scripts'); ?> + + + + + + + + + + stopPush(); endif; ?> + + hasRenderedOnce('15e7085f-fe8b-4b1a-921f-7b0939007d9b')): $__env->markAsRenderedOnce('15e7085f-fe8b-4b1a-921f-7b0939007d9b'); +$__env->startPush('styles'); ?> + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/f0479fe0a9819bb77bf23ff2870d14a2.php b/storage/framework/views/f0479fe0a9819bb77bf23ff2870d14a2.php new file mode 100755 index 0000000..6a1998b --- /dev/null +++ b/storage/framework/views/f0479fe0a9819bb77bf23ff2870d14a2.php @@ -0,0 +1,24 @@ + + + + addLoop($__currentLoopData); foreach($__currentLoopData as $column): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> + + popLoop(); $loop = $__env->getLastLoop(); ?> + + + + + addLoop($__currentLoopData); foreach($__currentLoopData as $record): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> + + addLoop($__currentLoopData); foreach($__currentLoopData as $column): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> + getClosure()): ?> + + + + + popLoop(); $loop = $__env->getLastLoop(); ?> + + popLoop(); $loop = $__env->getLastLoop(); ?> + +
    getLabel()); ?>
    {$column->getIndex()}); ?>
    + \ No newline at end of file diff --git a/storage/framework/views/f056c191d683862e733efe7cbf77a1bb.php b/storage/framework/views/f056c191d683862e733efe7cbf77a1bb.php new file mode 100755 index 0000000..ad6df74 --- /dev/null +++ b/storage/framework/views/f056c191d683862e733efe7cbf77a1bb.php @@ -0,0 +1,240 @@ +> +
    + + + get('admin::app.export.export'); ?> +
    +
    + +hasRenderedOnce('cb1b0382-096e-42fd-ac4c-15d6bb15f81e')): $__env->markAsRenderedOnce('cb1b0382-096e-42fd-ac4c-15d6bb15f81e'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/f08f9a4bdbea6736050597a3e3943772.php b/storage/framework/views/f08f9a4bdbea6736050597a3e3943772.php new file mode 100755 index 0000000..4fd237f --- /dev/null +++ b/storage/framework/views/f08f9a4bdbea6736050597a3e3943772.php @@ -0,0 +1,59 @@ + +has('as')): ?> + > + + + + + + + +onlyProps([ + 'method' => 'POST', + ]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'method' => 'POST', + ]); ?> + 'POST', + ]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + + + > + + + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/f14cd80c650555595b28d3c36344c1c2.php b/storage/framework/views/f14cd80c650555595b28d3c36344c1c2.php new file mode 100755 index 0000000..4d01956 --- /dev/null +++ b/storage/framework/views/f14cd80c650555595b28d3c36344c1c2.php @@ -0,0 +1,31 @@ + +
    +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + \ No newline at end of file diff --git a/storage/framework/views/f1631a8fe6a313e38d60d7a7f4fbff66.php b/storage/framework/views/f1631a8fe6a313e38d60d7a7f4fbff66.php new file mode 100755 index 0000000..ca3730a --- /dev/null +++ b/storage/framework/views/f1631a8fe6a313e38d60d7a7f4fbff66.php @@ -0,0 +1,17 @@ +
    +
    +

    +

    +
    + +
    +
    +

    +

    +

    +

    +

    +

    +
    +
    +
    \ No newline at end of file diff --git a/storage/framework/views/f16a27acdab6bea42a9a04dc2f8c8311.php b/storage/framework/views/f16a27acdab6bea42a9a04dc2f8c8311.php new file mode 100755 index 0000000..9bd7fda --- /dev/null +++ b/storage/framework/views/f16a27acdab6bea42a9a04dc2f8c8311.php @@ -0,0 +1,130 @@ +getActiveConfigurationItem(); +?> + + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + getName()); ?> + + endSlot(); ?> + + + + + + + + 'admin::components.form.index','data' => ['action' => '','enctype' => 'multipart/form-data']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => '','enctype' => 'multipart/form-data']); ?> + +
    +

    + + +

    + + +
    + + + + + + get('admin::app.configuration.index.back'); ?> + + + + + + + + + + + + +
    +
    + +
    + getChildren(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $child): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> +
    +

    + getName()); ?> + +

    + +

    + getInfo(); ?> + +

    +
    + +
    + + + + getFields(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $field): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> + getType() == 'blade' + && view()->exists($path = $field->getPath()) + ): ?> + render(); ?> + + + make('admin::configuration.field-type', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + popLoop(); $loop = $__env->getLastLoop(); ?> + + + +
    + popLoop(); $loop = $__env->getLastLoop(); ?> +
    + renderComponent(); ?> + + + + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/f2d44e75f98e6576692a8ccc837b1e6f.php b/storage/framework/views/f2d44e75f98e6576692a8ccc837b1e6f.php new file mode 100755 index 0000000..51d64fb --- /dev/null +++ b/storage/framework/views/f2d44e75f98e6576692a8ccc837b1e6f.php @@ -0,0 +1,3 @@ +
    merge(['class' => 'shimmer block bg-neutral-100'])); ?>> + +
    \ No newline at end of file diff --git a/storage/framework/views/f2fe26289caa447896210dce80973ed6.php b/storage/framework/views/f2fe26289caa447896210dce80973ed6.php new file mode 100755 index 0000000..e4ac345 --- /dev/null +++ b/storage/framework/views/f2fe26289caa447896210dce80973ed6.php @@ -0,0 +1,254 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.settings.webforms.index.title'); ?> + endSlot(); ?> + + +
    +
    +
    + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.web_forms']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.web_forms']); ?> +renderComponent(); ?> + + + + + + + + + + +
    + get('admin::app.settings.webforms.index.title'); ?> +
    +
    + +
    + +
    + hasPermission('admin.settings.web_forms.create')): ?> + + +
    +
    +
    + + + + + 'admin::components.shimmer.settings.web-forms.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.settings.web-forms'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + +
    +
    + + hasRenderedOnce('11f4f4eb-05be-4955-88b8-79eaa3ccc39d')): $__env->markAsRenderedOnce('11f4f4eb-05be-4955-88b8-79eaa3ccc39d'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/f43374d46900c297198a91efd93280bb.php b/storage/framework/views/f43374d46900c297198a91efd93280bb.php new file mode 100755 index 0000000..6241bb2 --- /dev/null +++ b/storage/framework/views/f43374d46900c297198a91efd93280bb.php @@ -0,0 +1,131 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.contacts.organizations.index.title'); ?> + endSlot(); ?> + +
    +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'contacts.organizations']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'contacts.organizations']); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + get('admin::app.contacts.organizations.index.title'); ?> +
    +
    + +
    +
    + + + + hasPermission('contacts.organizations.create')): ?> + + + get('admin::app.contacts.organizations.index.create-btn'); ?> + + + + + +
    +
    +
    + + + + + + + 'admin::components.datagrid.index','data' => ['src' => route('admin.contacts.organizations.index')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['src' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.contacts.organizations.index'))]); ?> + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + +
    + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/f441b0949af07185b51f5f12270d8ff0.php b/storage/framework/views/f441b0949af07185b51f5f12270d8ff0.php new file mode 100755 index 0000000..6826847 --- /dev/null +++ b/storage/framework/views/f441b0949af07185b51f5f12270d8ff0.php @@ -0,0 +1,2047 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.settings.webforms.edit.title'); ?> + endSlot(); ?> + + + + 'admin::components.form.index','data' => ['action' => route('admin.settings.web_forms.update', $webForm->id),'method' => 'PUT']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.web_forms.update', $webForm->id)),'method' => 'PUT']); ?> +
    +
    +
    + $webForm]); ?> + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.web_forms.edit','entity' => $webForm]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.web_forms.edit','entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($webForm)]); ?> +renderComponent(); ?> + + + + + + + + + + + $webForm]); ?> + + +
    + get('admin::app.settings.webforms.edit.title'); ?> +
    +
    + +
    +
    + $webForm]); ?> + + + + + + $webForm]); ?> + + + $webForm]); ?> + + + + get('admin::app.settings.webforms.edit.preview'); ?> + + + $webForm]); ?> + + + $webForm]); ?> + + + + + $webForm]); ?> + +
    +
    +
    + + + +
    + renderComponent(); ?> + + + + + + + + + + + hasRenderedOnce('c49e556c-bca8-4b49-bdf6-65cf96b93abc')): $__env->markAsRenderedOnce('c49e556c-bca8-4b49-bdf6-65cf96b93abc'); +$__env->startPush('scripts'); ?> + '); ?>" + /> + + + get('admin::app.settings.webforms.edit.copy'); ?> + + renderComponent(); ?> + + + + + + + + + + + $webForm]); ?> + + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + +
    + + + + + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/f4b3949f3dd837ea9b805b03044ea7c1.php b/storage/framework/views/f4b3949f3dd837ea9b805b03044ea7c1.php new file mode 100755 index 0000000..8d383ea --- /dev/null +++ b/storage/framework/views/f4b3949f3dd837ea9b805b03044ea7c1.php @@ -0,0 +1,90 @@ + $warehouse]); ?> + + +
    + + + 'admin::components.accordion.index','data' => ['class' => 'select-none !border-none']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::accordion'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'select-none !border-none']); ?> + slot('header', null, ['class' => '!p-0']); ?> +

    + get('admin::app.settings.warehouses.view.contact-information.title'); ?> +

    + endSlot(); ?> + + slot('content', null, ['class' => 'mt-4 !px-0 !pb-0']); ?> + + + + 'admin::components.form.index','data' => ['vSlot' => '{ meta, errors, handleSubmit }','as' => 'div','ref' => 'modalForm']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['v-slot' => '{ meta, errors, handleSubmit }','as' => 'div','ref' => 'modalForm']); ?> +
    + $warehouse]); ?> + + + + + 'admin::components.attributes.view','data' => ['customAttributes' => app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + 'entity_type' => 'warehouses', + ['code', 'IN', ['contact_name', 'contact_emails', 'contact_numbers', 'contact_address']] + ]),'entity' => $warehouse,'url' => route('admin.settings.warehouses.update', $warehouse->id),'allowEdit' => true]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.view'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['custom-attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + 'entity_type' => 'warehouses', + ['code', 'IN', ['contact_name', 'contact_emails', 'contact_numbers', 'contact_address']] + ])),'entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($warehouse),'url' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.warehouses.update', $warehouse->id)),'allow-edit' => true]); ?> +renderComponent(); ?> + + + + + + + + + + + $warehouse]); ?> + +
    + renderComponent(); ?> + + + + + + + + + + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + +
    + + $warehouse]); ?> \ No newline at end of file diff --git a/storage/framework/views/f520e9e1ec939cb1f5cade832c4d3dc8.php b/storage/framework/views/f520e9e1ec939cb1f5cade832c4d3dc8.php new file mode 100755 index 0000000..2aebf5d --- /dev/null +++ b/storage/framework/views/f520e9e1ec939cb1f5cade832c4d3dc8.php @@ -0,0 +1,251 @@ + +onlyProps([ + 'isActive' => false, + 'position' => 'center', + 'size' => 'normal', +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'isActive' => false, + 'position' => 'center', + 'size' => 'normal', +]); ?> + false, + 'position' => 'center', + 'size' => 'normal', +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + +> + + + + + + + + + + + + + + + + + +hasRenderedOnce('08f886d0-7a4b-4378-805a-271c51e35067')): $__env->markAsRenderedOnce('08f886d0-7a4b-4378-805a-271c51e35067'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/f561d5461c8e88c79bbe9c1621e3ec4c.php b/storage/framework/views/f561d5461c8e88c79bbe9c1621e3ec4c.php new file mode 100755 index 0000000..10c6961 --- /dev/null +++ b/storage/framework/views/f561d5461c8e88c79bbe9c1621e3ec4c.php @@ -0,0 +1,212 @@ + + + + + + + + + 'admin::components.shimmer.dashboard.index.revenue-by-types','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.dashboard.index.revenue-by-types'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + +hasRenderedOnce('c8568fc6-3d7c-4284-8a60-220f046ca83f')): $__env->markAsRenderedOnce('c8568fc6-3d7c-4284-8a60-220f046ca83f'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/f6b76ad05f9eca674f592a3144628674.php b/storage/framework/views/f6b76ad05f9eca674f592a3144628674.php new file mode 100755 index 0000000..b48fcf9 --- /dev/null +++ b/storage/framework/views/f6b76ad05f9eca674f592a3144628674.php @@ -0,0 +1,39 @@ + + + +
    +
    + + + + + make('admin::leads.index.kanban.search', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + + + + + + + make('admin::leads.index.kanban.filter', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + + + +
    + + + + + + make('admin::leads.index.view-switcher', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + +
    + + + + \ No newline at end of file diff --git a/storage/framework/views/f76c362f43ac9716be49beee6dc42bcd.php b/storage/framework/views/f76c362f43ac9716be49beee6dc42bcd.php new file mode 100755 index 0000000..7824438 --- /dev/null +++ b/storage/framework/views/f76c362f43ac9716be49beee6dc42bcd.php @@ -0,0 +1,47 @@ + +onlyProps([ + 'customAttributes' => [], + 'entity' => null, + 'allowEdit' => false, + 'url' => null, +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'customAttributes' => [], + 'entity' => null, + 'allowEdit' => false, + 'url' => null, +]); ?> + [], + 'entity' => null, + 'allowEdit' => false, + 'url' => null, +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + +
    + addLoop($__currentLoopData); foreach($__currentLoopData as $attribute): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> + exists($typeView = 'admin::components.attributes.view.' . $attribute->type)): ?> +
    +
    name); ?>
    + +
    + make($typeView, [ + 'attribute' => $attribute, + 'value' => isset($entity) ? $entity[$attribute->code] : null, + 'allowEdit' => $allowEdit, + 'url' => $url, + ], \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> +
    +
    + + popLoop(); $loop = $__env->getLastLoop(); ?> +
    \ No newline at end of file diff --git a/storage/framework/views/f79dde1f2e8081a7a504b6f8c11336b2.php b/storage/framework/views/f79dde1f2e8081a7a504b6f8c11336b2.php new file mode 100755 index 0000000..aa59a7c --- /dev/null +++ b/storage/framework/views/f79dde1f2e8081a7a504b6f8c11336b2.php @@ -0,0 +1,5 @@ +merge(['scope' => 'col', 'class' => 'whitespace-nowrap px-6 py-4 font-semibold'])); ?>> + + + + \ No newline at end of file diff --git a/storage/framework/views/f88f0d9a8e2f1cc80cecccd60df508eb.php b/storage/framework/views/f88f0d9a8e2f1cc80cecccd60df508eb.php new file mode 100755 index 0000000..d31f3aa --- /dev/null +++ b/storage/framework/views/f88f0d9a8e2f1cc80cecccd60df508eb.php @@ -0,0 +1,30 @@ +hasPages()): ?> + + + \ No newline at end of file diff --git a/storage/framework/views/fa24ec43edd90de89ad19da955a1ecc4.php b/storage/framework/views/fa24ec43edd90de89ad19da955a1ecc4.php new file mode 100755 index 0000000..61c22d8 --- /dev/null +++ b/storage/framework/views/fa24ec43edd90de89ad19da955a1ecc4.php @@ -0,0 +1,245 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.configuration.index.title'); ?> + endSlot(); ?> + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'configuration']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'configuration']); ?> +renderComponent(); ?> + + + + + + + + + + + + + + +
    +

    + get('admin::app.configuration.index.title'); ?> +

    + + + + + + +
    + + + +
    +
    + + + +
    + + + + + + + + +
    + getItems(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $item): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> +
    +
    + +

    + getName()); ?> + +

    + + +

    + getInfo()); ?> + +

    +
    + +
    + + getChildren(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $key => $child): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> + + getIcon()): ?> +
    + +
    + + +
    +

    + getName()); ?> + +

    + +

    + getInfo()); ?> + +

    +
    +
    + popLoop(); $loop = $__env->getLastLoop(); ?> +
    +
    + popLoop(); $loop = $__env->getLastLoop(); ?> +
    + + + + + hasRenderedOnce('a7252e14-29e8-4999-b3be-204631ca8cc4')): $__env->markAsRenderedOnce('a7252e14-29e8-4999-b3be-204631ca8cc4'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/fa2cf417103f02e1394dd139791598d8.php b/storage/framework/views/fa2cf417103f02e1394dd139791598d8.php new file mode 100755 index 0000000..cdda42e --- /dev/null +++ b/storage/framework/views/fa2cf417103f02e1394dd139791598d8.php @@ -0,0 +1,224 @@ + + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.products.edit.title'); ?> + endSlot(); ?> + + + + + + + 'admin::components.form.index','data' => ['action' => route('admin.products.update', $product->id),'encType' => 'multipart/form-data','method' => 'PUT']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.products.update', $product->id)),'encType' => 'multipart/form-data','method' => 'PUT']); ?> +
    +
    +
    + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'products.edit','entity' => $product]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'products.edit','entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($product)]); ?> +renderComponent(); ?> + + + + + + + + + + +
    + get('admin::app.products.edit.title'); ?> +
    +
    + +
    +
    + $product]); ?> + + + + + + $product]); ?> + +
    +
    +
    + +
    + +
    +
    +

    + get('admin::app.products.create.general'); ?> +

    + + $product]); ?> + + + + + 'admin::components.attributes.index','data' => ['customAttributes' => app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + 'entity_type' => 'products', + ['code', 'NOTIN', ['price', 'quantity']], + ]),'entity' => $product]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['custom-attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + 'entity_type' => 'products', + ['code', 'NOTIN', ['price', 'quantity']], + ])),'entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($product)]); ?> +renderComponent(); ?> + + + + + + + + + + + $product]); ?> + +
    +
    + + +
    + $product]); ?> + + + + + 'admin::components.accordion.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::accordion'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('header', null, []); ?> + $product]); ?> + + +
    +

    + get('admin::app.products.create.price'); ?> +

    +
    + + $product]); ?> + + endSlot(); ?> + + slot('content', null, []); ?> + $product]); ?> + + + + + 'admin::components.attributes.index','data' => ['customAttributes' => app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + 'entity_type' => 'products', + ['code', 'IN', ['price', 'quantity']], + ]),'entity' => $product]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['custom-attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + 'entity_type' => 'products', + ['code', 'IN', ['price', 'quantity']], + ])),'entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($product)]); ?> +renderComponent(); ?> + + + + + + + + + + + $product]); ?> + + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + + + $product]); ?> + +
    +
    +
    + renderComponent(); ?> + + + + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/fa555339de4cdf446f116325eadd4dc6.php b/storage/framework/views/fa555339de4cdf446f116325eadd4dc6.php new file mode 100755 index 0000000..74df977 --- /dev/null +++ b/storage/framework/views/fa555339de4cdf446f116325eadd4dc6.php @@ -0,0 +1,5 @@ +
    merge(['class' => 'mb-4'])); ?>> + + +
    + \ No newline at end of file diff --git a/storage/framework/views/fae2acf3af7f796b07d789eb150178f8.php b/storage/framework/views/fae2acf3af7f796b07d789eb150178f8.php new file mode 100755 index 0000000..f6f8b85 --- /dev/null +++ b/storage/framework/views/fae2acf3af7f796b07d789eb150178f8.php @@ -0,0 +1,18 @@ + +
    + +
    + +
    +

    +

    +
    +
    + + +
    +

    +
    +
    + + \ No newline at end of file diff --git a/storage/framework/views/fb10a49c8fba3a1c0b12ed4f3e8cbba2.php b/storage/framework/views/fb10a49c8fba3a1c0b12ed4f3e8cbba2.php new file mode 100755 index 0000000..706afd8 --- /dev/null +++ b/storage/framework/views/fb10a49c8fba3a1c0b12ed4f3e8cbba2.php @@ -0,0 +1,16 @@ +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    +
    +
    \ No newline at end of file diff --git a/storage/framework/views/fc252ae46c09f7fd2b704dab985a93a7.php b/storage/framework/views/fc252ae46c09f7fd2b704dab985a93a7.php new file mode 100755 index 0000000..c8630ea --- /dev/null +++ b/storage/framework/views/fc252ae46c09f7fd2b704dab985a93a7.php @@ -0,0 +1,195 @@ + + + 'admin::components.layouts.anonymous','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts.anonymous'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.users.forget-password.create.page-title'); ?> + endSlot(); ?> + +
    +
    + + getConfigData('general.design.admin_logo.logo_image')): ?> + <?php echo e(config('app.name')); ?> + + <?php echo e(config('app.name')); ?> + + +
    + + + + + + + 'admin::components.form.index','data' => ['action' => route('admin.forgot_password.store')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.forgot_password.store'))]); ?> +
    +

    + get('admin::app.users.forget-password.create.title'); ?> +

    +
    + +
    + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.users.forget-password.create.email'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'email','class' => 'w-[254px] max-w-full','id' => 'email','name' => 'email','rules' => 'required|email','value' => old('email'),'label' => trans('admin::app.users.forget-password.create.email'),'placeholder' => trans('admin::app.users.forget-password.create.email')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'email','class' => 'w-[254px] max-w-full','id' => 'email','name' => 'email','rules' => 'required|email','value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(old('email')),'label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.users.forget-password.create.email')),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.users.forget-password.create.email'))]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'email']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'email']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + +
    + +
    + + + get('admin::app.users.forget-password.create.sign-in-link'); ?> + + + + +
    + renderComponent(); ?> + + + + + + + + + + + + +
    +
    + + +
    + Desenvolvido por + + Blyzer + +
    + + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/fca414b36e4c13c171c46bfef449ceb3.php b/storage/framework/views/fca414b36e4c13c171c46bfef449ceb3.php new file mode 100755 index 0000000..6cc0e47 --- /dev/null +++ b/storage/framework/views/fca414b36e4c13c171c46bfef449ceb3.php @@ -0,0 +1,126 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.settings.warehouses.index.title'); ?> + endSlot(); ?> + +
    +
    +
    + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.warehouses']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.warehouses']); ?> +renderComponent(); ?> + + + + + + + + + + +
    + + get('admin::app.settings.warehouses.index.title'); ?> +
    +
    + +
    + +
    + + + + hasPermission('settings.automation.warehouses.create')): ?> + + get('admin::app.settings.warehouses.index.create-btn'); ?> + + + + + +
    +
    +
    + + + + + + + + 'admin::components.datagrid.index','data' => ['src' => route('admin.settings.warehouses.index')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['src' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.warehouses.index'))]); ?> + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + +
    + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/fca436142e86e0113dba7bd2c8bbc281.php b/storage/framework/views/fca436142e86e0113dba7bd2c8bbc281.php new file mode 100755 index 0000000..70ce902 --- /dev/null +++ b/storage/framework/views/fca436142e86e0113dba7bd2c8bbc281.php @@ -0,0 +1,17 @@ + +
    + +
    + +
    +

    +

    +
    +
    + + +
    +

    +
    +
    + \ No newline at end of file diff --git a/storage/framework/views/fd0024623da8afa781adf503b6c5876e.php b/storage/framework/views/fd0024623da8afa781adf503b6c5876e.php new file mode 100755 index 0000000..70fb540 --- /dev/null +++ b/storage/framework/views/fd0024623da8afa781adf503b6c5876e.php @@ -0,0 +1,126 @@ + + + +
    + + + 'admin::components.dropdown.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::dropdown'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('toggle', null, []); ?> + + + + + + + + endSlot(); ?> + + slot('content', null, ['class' => '!p-0']); ?> + + + + +
    + + get('admin::app.leads.index.view-switcher.all-pipelines'); ?> + +
    + + + + + + all(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $tempPipeline): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> + $tempPipeline]); ?> + + + + name); ?> + + + + $tempPipeline]); ?> + + popLoop(); $loop = $__env->getLastLoop(); ?> + + + + + + + + get('admin::app.leads.index.view-switcher.create-new-pipeline'); ?> + + + + + + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    +
    + + \ No newline at end of file diff --git a/storage/framework/views/fd6bc016b04e3ac46f0ac3e7d1cd9e82.php b/storage/framework/views/fd6bc016b04e3ac46f0ac3e7d1cd9e82.php new file mode 100755 index 0000000..60e4287 --- /dev/null +++ b/storage/framework/views/fd6bc016b04e3ac46f0ac3e7d1cd9e82.php @@ -0,0 +1,232 @@ + + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.settings.warehouses.edit.title'); ?> + endSlot(); ?> + + $warehouse]); ?> + + + + + 'admin::components.form.index','data' => ['method' => 'PUT','action' => route('admin.settings.warehouses.update', $warehouse->id)]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['method' => 'PUT','action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.warehouses.update', $warehouse->id))]); ?> +
    +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.warehouses.edit','entity' => $warehouse]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.warehouses.edit','entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($warehouse)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + get('admin::app.settings.warehouses.edit.title'); ?> +
    +
    + +
    +
    + + + + + + + + +
    +
    +
    + +
    + +
    +
    +

    + get('admin::app.settings.warehouses.edit.contact-info'); ?> +

    + + $warehouse]); ?> + + + + + 'admin::components.attributes.index','data' => ['customAttributes' => app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + ['code', 'NOTIN', ['name', 'description']], + 'entity_type' => 'warehouses', + ])->sortBy('sort_order'),'customValidations' => [ + 'contact_address' => [ + 'max:100', + ], + 'postcode' => [ + 'postcode', + ], + ],'entity' => $warehouse]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['custom-attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + ['code', 'NOTIN', ['name', 'description']], + 'entity_type' => 'warehouses', + ])->sortBy('sort_order')),'custom-validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute([ + 'contact_address' => [ + 'max:100', + ], + 'postcode' => [ + 'postcode', + ], + ]),'entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($warehouse)]); ?> +renderComponent(); ?> + + + + + + + + + + + $warehouse]); ?> + +
    +
    + + +
    + + + 'admin::components.accordion.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::accordion'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('header', null, []); ?> +
    +

    + get('admin::app.settings.roles.create.general'); ?> +

    +
    + endSlot(); ?> + + slot('content', null, []); ?> + $warehouse]); ?> + + + + + 'admin::components.attributes.index','data' => ['customAttributes' => app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + ['code', 'IN', ['name', 'description']], + 'entity_type' => 'warehouses', + ])->sortBy('sort_order'),'entity' => $warehouse]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['custom-attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + ['code', 'IN', ['name', 'description']], + 'entity_type' => 'warehouses', + ])->sortBy('sort_order')),'entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($warehouse)]); ?> +renderComponent(); ?> + + + + + + + + + + + $warehouse]); ?> + + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + +
    +
    +
    + renderComponent(); ?> + + + + + + + + + + + $warehouse]); ?> + + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/fe5faeb9d28c73897b30c50e779419a2.php b/storage/framework/views/fe5faeb9d28c73897b30c50e779419a2.php new file mode 100755 index 0000000..c01fed4 --- /dev/null +++ b/storage/framework/views/fe5faeb9d28c73897b30c50e779419a2.php @@ -0,0 +1,116 @@ +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/storage/framework/views/fe66cc2a12be3423c9157b9f1427314e.php b/storage/framework/views/fe66cc2a12be3423c9157b9f1427314e.php new file mode 100755 index 0000000..205e7e3 --- /dev/null +++ b/storage/framework/views/fe66cc2a12be3423c9157b9f1427314e.php @@ -0,0 +1,34 @@ +lookup_type + ? app('Webkul\Attribute\Repositories\AttributeRepository')->getLookUpOptions($attribute->lookup_type) + : $attribute->options()->orderBy('sort_order')->get(); + + $selectedOption = old($attribute->code) ?: $value; +?> + + + + \ No newline at end of file diff --git a/storage/framework/views/fe7372eb19574941f5c3dac69cde3dc3.php b/storage/framework/views/fe7372eb19574941f5c3dac69cde3dc3.php new file mode 100755 index 0000000..38f7c55 --- /dev/null +++ b/storage/framework/views/fe7372eb19574941f5c3dac69cde3dc3.php @@ -0,0 +1,904 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.activities.index.title'); ?> + endSlot(); ?> + + + + + + +
    +
    +
    + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'activities']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'activities']); ?> +renderComponent(); ?> + + + + + + + + + + +
    + get('admin::app.activities.index.title'); ?> +
    +
    + +
    + + + +
    +
    + + + get('view-type') == 'table' + || ! request()->has('view-type') + ): ?> + + + 'admin::components.shimmer.datagrid.index','data' => ['isMultiRow' => true]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['is-multi-row' => true]); ?> +renderComponent(); ?> + + + + + + + + + + +
    +
    + + + + + hasRenderedOnce('0ff9b9a3-5f6f-4bc1-a85f-4b17fc84289b')): $__env->markAsRenderedOnce('0ff9b9a3-5f6f-4bc1-a85f-4b17fc84289b'); +$__env->startPush('scripts'); ?> + + + + + + + + + + stopPush(); endif; ?> + + hasRenderedOnce('946f376c-8376-44ad-a2a7-e5eed00e970b')): $__env->markAsRenderedOnce('946f376c-8376-44ad-a2a7-e5eed00e970b'); +$__env->startPush('styles'); ?> + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/ffd442e3c0a04c0587373e639425db60.php b/storage/framework/views/ffd442e3c0a04c0587373e639425db60.php new file mode 100755 index 0000000..e8e8a8a --- /dev/null +++ b/storage/framework/views/ffd442e3c0a04c0587373e639425db60.php @@ -0,0 +1,487 @@ + +onlyProps([ + 'type' => 'text', + 'name' => '', +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'type' => 'text', + 'name' => '', +]); ?> + 'text', + 'name' => '', +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])); ?> + + name="" + > + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400'])); ?> + + /> + + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])); ?> + + name="" + > +
    + + attributes->merge(['class' => 'py-2.5 text-gray-500 ltr:pl-4 rtl:pr-4'])); ?>> + + + + + + + + + + + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full p-2.5 text-sm text-gray-600 dark:bg-gray-900 dark:text-gray-300'])); ?> + + /> +
    +
    + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])); ?> + + name="" + > + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full rounded-md border px-3 py-2.5 text-sm text-gray-600 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:file:bg-gray-800 dark:file:dark:text-white dark:hover:border-gray-400 dark:focus:border-gray-400'])); ?> + + @change="handleChange" + @blur="handleBlur" + /> + + + + + + except('class')); ?> + + > + except(['value'])->merge(['class' => 'w-full appearance-none rounded-md border text-sm text-gray-600 transition-all hover:border-gray-400 dark:text-gray-300 dark:hover:border-gray-400'])); ?> + + > + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])); ?> + + name="" + > + + + get('tinymce', false) || $attributes->get(':tinymce', false)): ?> + + + 'admin::components.tinymce.index','data' => ['selector' => 'textarea#' . $attributes->get('id'),':field' => 'field']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::tinymce'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['selector' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute('textarea#' . $attributes->get('id')),':field' => 'field']); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['rules' => 'regex:^\d{4}-\d{2}-\d{2}$'])); ?> + + name="" + > + + + 'admin::components.flat-picker.date','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::flat-picker.date'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400'])); ?> + + autocomplete="off" + /> + renderComponent(); ?> + + + + + + + + + + + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['rules' => 'regex:^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$'])); ?> + + name="" + > + + + 'admin::components.flat-picker.datetime','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::flat-picker.datetime'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400'])); ?> + + autocomplete="off" + > + renderComponent(); ?> + + + + + + + + + + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])); ?> + + name="" + > + + + + + + + except([])->merge(['class' => 'flex w-full flex-col rounded-md border bg-white px-3 py-2.5 text-sm font-normal text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400'])); ?> + + name="" + multiple + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 'admin::components.media.images','data' => ['name' => ''.e($name).'',':class' => '[errors && errors[\''.e($name).'\'] ? \'border !border-red-600 hover:border-red-600\' : \'\']','attributes' => $attributes]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::media.images'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => ''.e($name).'',':class' => '[errors && errors[\''.e($name).'\'] ? \'border !border-red-600 hover:border-red-600\' : \'\']','attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attributes)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.form.control-group.controls.inline.text','data' => ['attributes' => $attributes]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.controls.inline.text'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attributes)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + > + + + + + + + + + + 'admin::components.form.control-group.controls.tags','data' => ['name' => $name,'data' => $attributes->get(':data') ?? $attributes->get('data'),'attributes' => $attributes]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.controls.tags'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($name),'data' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attributes->get(':data') ?? $attributes->get('data')),'attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attributes)]); ?> +renderComponent(); ?> + + + + + + + + + + + + +hasRenderedOnce('7bb8a351-3dc6-4b7c-bb38-979069ee082f')): $__env->markAsRenderedOnce('7bb8a351-3dc6-4b7c-bb38-979069ee082f'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/logs/laravel.log b/storage/logs/laravel.log new file mode 100755 index 0000000..fd3166e --- /dev/null +++ b/storage/logs/laravel.log @@ -0,0 +1,1055 @@ +[2026-01-29 13:34:52] local.ERROR: PHP Parse error: Syntax error, unexpected '=' on line 1 {"exception":"[object] (Psy\\Exception\\ParseErrorException(code: 0): PHP Parse error: Syntax error, unexpected '=' on line 1 at /var/www/html/vendor/psy/psysh/src/Exception/ParseErrorException.php:44) +[stacktrace] +#0 /var/www/html/vendor/psy/psysh/src/CodeCleaner.php(306): Psy\\Exception\\ParseErrorException::fromParseError(Object(PhpParser\\Error)) +#1 /var/www/html/vendor/psy/psysh/src/CodeCleaner.php(240): Psy\\CodeCleaner->parse('clean(Array, false) +#3 /var/www/html/vendor/psy/psysh/src/Shell.php(881): Psy\\Shell->addCode('use Webkul\\\\User...', true) +#4 /var/www/html/vendor/psy/psysh/src/Shell.php(1390): Psy\\Shell->setCode('use Webkul\\\\User...', true) +#5 /var/www/html/vendor/laravel/tinker/src/Console/TinkerCommand.php(76): Psy\\Shell->execute('use Webkul\\\\User...') +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Laravel\\Tinker\\Console\\TinkerCommand->handle() +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Container/Util.php(41): Illuminate\\Container\\BoundMethod::Illuminate\\Container\\{closure}() +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\\Container\\Util::unwrapIfClosure(Object(Closure)) +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(35): Illuminate\\Container\\BoundMethod::callBoundMethod(Object(Illuminate\\Foundation\\Application), Array, Object(Closure)) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Container/Container.php(662): Illuminate\\Container\\BoundMethod::call(Object(Illuminate\\Foundation\\Application), Array, Array, NULL) +#11 /var/www/html/vendor/laravel/framework/src/Illuminate/Console/Command.php(211): Illuminate\\Container\\Container->call(Array) +#12 /var/www/html/vendor/symfony/console/Command/Command.php(326): Illuminate\\Console\\Command->execute(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Illuminate\\Console\\OutputStyle)) +#13 /var/www/html/vendor/laravel/framework/src/Illuminate/Console/Command.php(180): Symfony\\Component\\Console\\Command\\Command->run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Illuminate\\Console\\OutputStyle)) +#14 /var/www/html/vendor/symfony/console/Application.php(1096): Illuminate\\Console\\Command->run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput)) +#15 /var/www/html/vendor/symfony/console/Application.php(324): Symfony\\Component\\Console\\Application->doRunCommand(Object(Laravel\\Tinker\\Console\\TinkerCommand), Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput)) +#16 /var/www/html/vendor/symfony/console/Application.php(175): Symfony\\Component\\Console\\Application->doRun(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput)) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(201): Symfony\\Component\\Console\\Application->run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput)) +#18 /var/www/html/artisan(35): Illuminate\\Foundation\\Console\\Kernel->handle(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput)) +#19 {main} +"} +[2026-01-29 14:54:37] local.ERROR: Call to undefined method Stancl\Tenancy\Database\Models\Tenant::domains() {"exception":"[object] (BadMethodCallException(code: 0): Call to undefined method Stancl\\Tenancy\\Database\\Models\\Tenant::domains() at /var/www/html/vendor/laravel/framework/src/Illuminate/Support/Traits/ForwardsCalls.php:67) +[stacktrace] +#0 /var/www/html/vendor/laravel/framework/src/Illuminate/Support/Traits/ForwardsCalls.php(36): Illuminate\\Database\\Eloquent\\Model::throwBadMethodCallException('domains') +#1 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(2335): Illuminate\\Database\\Eloquent\\Model->forwardCallTo(Object(Illuminate\\Database\\Eloquent\\Builder), 'domains', Array) +#2 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/QueriesRelationships.php(876): Illuminate\\Database\\Eloquent\\Model->__call('domains', Array) +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Relation.php(110): Illuminate\\Database\\Eloquent\\Builder->Illuminate\\Database\\Eloquent\\Concerns\\{closure}() +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/QueriesRelationships.php(875): Illuminate\\Database\\Eloquent\\Relations\\Relation::noConstraints(Object(Closure)) +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/QueriesRelationships.php(39): Illuminate\\Database\\Eloquent\\Builder->getRelationWithoutConstraints('domains') +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/QueriesRelationships.php(152): Illuminate\\Database\\Eloquent\\Builder->has('domains', '>=', 1, 'and', Object(Closure)) +#7 /var/www/html/vendor/stancl/tenancy/src/Resolvers/DomainTenantResolver.php(36): Illuminate\\Database\\Eloquent\\Builder->whereHas('domains', Object(Closure)) +#8 /var/www/html/vendor/stancl/tenancy/src/Resolvers/Contracts/CachedTenantResolver.php(34): Stancl\\Tenancy\\Resolvers\\DomainTenantResolver->resolveWithoutCache('localhost') +#9 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(26): Stancl\\Tenancy\\Resolvers\\Contracts\\CachedTenantResolver->resolve('localhost') +#10 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'localhost') +#11 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#13 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#19 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#21 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#29 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#30 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#31 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#32 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#33 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#34 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#35 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#36 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#37 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#38 {main} +"} +[2026-01-29 15:08:41] local.ERROR: Tenant could not be identified on domain localhost {"exception":"[object] (Stancl\\Tenancy\\Exceptions\\TenantCouldNotBeIdentifiedOnDomainException(code: 0): Tenant could not be identified on domain localhost at /var/www/html/vendor/stancl/tenancy/src/Resolvers/DomainTenantResolver.php:48) +[stacktrace] +#0 /var/www/html/vendor/stancl/tenancy/src/Resolvers/Contracts/CachedTenantResolver.php(34): Stancl\\Tenancy\\Resolvers\\DomainTenantResolver->resolveWithoutCache('localhost') +#1 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(26): Stancl\\Tenancy\\Resolvers\\Contracts\\CachedTenantResolver->resolve('localhost') +#2 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'localhost') +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#11 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#13 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#29 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#30 {main} +"} +[2026-01-29 15:09:49] local.ERROR: Tenant could not be identified on domain localhost {"exception":"[object] (Stancl\\Tenancy\\Exceptions\\TenantCouldNotBeIdentifiedOnDomainException(code: 0): Tenant could not be identified on domain localhost at /var/www/html/vendor/stancl/tenancy/src/Resolvers/DomainTenantResolver.php:48) +[stacktrace] +#0 /var/www/html/vendor/stancl/tenancy/src/Resolvers/Contracts/CachedTenantResolver.php(34): Stancl\\Tenancy\\Resolvers\\DomainTenantResolver->resolveWithoutCache('localhost') +#1 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(26): Stancl\\Tenancy\\Resolvers\\Contracts\\CachedTenantResolver->resolve('localhost') +#2 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'localhost') +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#11 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#13 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#29 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#30 {main} +"} +[2026-01-29 15:14:30] local.ERROR: Tenant could not be identified on domain localhost {"exception":"[object] (Stancl\\Tenancy\\Exceptions\\TenantCouldNotBeIdentifiedOnDomainException(code: 0): Tenant could not be identified on domain localhost at /var/www/html/vendor/stancl/tenancy/src/Resolvers/DomainTenantResolver.php:48) +[stacktrace] +#0 /var/www/html/vendor/stancl/tenancy/src/Resolvers/Contracts/CachedTenantResolver.php(34): Stancl\\Tenancy\\Resolvers\\DomainTenantResolver->resolveWithoutCache('localhost') +#1 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(26): Stancl\\Tenancy\\Resolvers\\Contracts\\CachedTenantResolver->resolve('localhost') +#2 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'localhost') +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#11 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#13 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#29 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#30 {main} +"} +[2026-01-29 15:21:53] local.ERROR: Tenant could not be identified on domain localhost {"exception":"[object] (Stancl\\Tenancy\\Exceptions\\TenantCouldNotBeIdentifiedOnDomainException(code: 0): Tenant could not be identified on domain localhost at /var/www/html/vendor/stancl/tenancy/src/Resolvers/DomainTenantResolver.php:48) +[stacktrace] +#0 /var/www/html/vendor/stancl/tenancy/src/Resolvers/Contracts/CachedTenantResolver.php(34): Stancl\\Tenancy\\Resolvers\\DomainTenantResolver->resolveWithoutCache('localhost') +#1 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(26): Stancl\\Tenancy\\Resolvers\\Contracts\\CachedTenantResolver->resolve('localhost') +#2 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'localhost') +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#11 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#13 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#29 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#30 {main} +"} +[2026-01-29 15:22:00] local.ERROR: Tenant could not be identified on domain localhost {"exception":"[object] (Stancl\\Tenancy\\Exceptions\\TenantCouldNotBeIdentifiedOnDomainException(code: 0): Tenant could not be identified on domain localhost at /var/www/html/vendor/stancl/tenancy/src/Resolvers/DomainTenantResolver.php:48) +[stacktrace] +#0 /var/www/html/vendor/stancl/tenancy/src/Resolvers/Contracts/CachedTenantResolver.php(34): Stancl\\Tenancy\\Resolvers\\DomainTenantResolver->resolveWithoutCache('localhost') +#1 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(26): Stancl\\Tenancy\\Resolvers\\Contracts\\CachedTenantResolver->resolve('localhost') +#2 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'localhost') +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#11 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#13 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#29 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#30 {main} +"} +[2026-01-29 15:25:07] local.ERROR: Tenant could not be identified on domain localhost {"exception":"[object] (Stancl\\Tenancy\\Exceptions\\TenantCouldNotBeIdentifiedOnDomainException(code: 0): Tenant could not be identified on domain localhost at /var/www/html/vendor/stancl/tenancy/src/Resolvers/DomainTenantResolver.php:48) +[stacktrace] +#0 /var/www/html/vendor/stancl/tenancy/src/Resolvers/Contracts/CachedTenantResolver.php(34): Stancl\\Tenancy\\Resolvers\\DomainTenantResolver->resolveWithoutCache('localhost') +#1 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(26): Stancl\\Tenancy\\Resolvers\\Contracts\\CachedTenantResolver->resolve('localhost') +#2 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'localhost') +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#11 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#13 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#29 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#30 {main} +"} +[2026-01-29 15:25:55] local.ERROR: Tenant could not be identified on domain localhost {"exception":"[object] (Stancl\\Tenancy\\Exceptions\\TenantCouldNotBeIdentifiedOnDomainException(code: 0): Tenant could not be identified on domain localhost at /var/www/html/vendor/stancl/tenancy/src/Resolvers/DomainTenantResolver.php:48) +[stacktrace] +#0 /var/www/html/vendor/stancl/tenancy/src/Resolvers/Contracts/CachedTenantResolver.php(34): Stancl\\Tenancy\\Resolvers\\DomainTenantResolver->resolveWithoutCache('localhost') +#1 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(26): Stancl\\Tenancy\\Resolvers\\Contracts\\CachedTenantResolver->resolve('localhost') +#2 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'localhost') +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#11 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#13 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#29 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#30 {main} +"} +[2026-01-29 15:34:43] local.ERROR: Tenant could not be identified on domain localhost {"exception":"[object] (Stancl\\Tenancy\\Exceptions\\TenantCouldNotBeIdentifiedOnDomainException(code: 0): Tenant could not be identified on domain localhost at /var/www/html/vendor/stancl/tenancy/src/Resolvers/DomainTenantResolver.php:48) +[stacktrace] +#0 /var/www/html/vendor/stancl/tenancy/src/Resolvers/Contracts/CachedTenantResolver.php(34): Stancl\\Tenancy\\Resolvers\\DomainTenantResolver->resolveWithoutCache('localhost') +#1 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(26): Stancl\\Tenancy\\Resolvers\\Contracts\\CachedTenantResolver->resolve('localhost') +#2 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'localhost') +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#11 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#13 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#29 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#30 {main} +"} +[2026-01-29 15:34:49] local.ERROR: Tenant could not be identified on domain localhost {"exception":"[object] (Stancl\\Tenancy\\Exceptions\\TenantCouldNotBeIdentifiedOnDomainException(code: 0): Tenant could not be identified on domain localhost at /var/www/html/vendor/stancl/tenancy/src/Resolvers/DomainTenantResolver.php:48) +[stacktrace] +#0 /var/www/html/vendor/stancl/tenancy/src/Resolvers/Contracts/CachedTenantResolver.php(34): Stancl\\Tenancy\\Resolvers\\DomainTenantResolver->resolveWithoutCache('localhost') +#1 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(26): Stancl\\Tenancy\\Resolvers\\Contracts\\CachedTenantResolver->resolve('localhost') +#2 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'localhost') +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#11 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#13 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#29 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#30 {main} +"} +[2026-01-29 15:37:07] local.ERROR: Tenant could not be identified on domain localhost {"exception":"[object] (Stancl\\Tenancy\\Exceptions\\TenantCouldNotBeIdentifiedOnDomainException(code: 0): Tenant could not be identified on domain localhost at /var/www/html/vendor/stancl/tenancy/src/Resolvers/DomainTenantResolver.php:48) +[stacktrace] +#0 /var/www/html/vendor/stancl/tenancy/src/Resolvers/Contracts/CachedTenantResolver.php(34): Stancl\\Tenancy\\Resolvers\\DomainTenantResolver->resolveWithoutCache('localhost') +#1 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(26): Stancl\\Tenancy\\Resolvers\\Contracts\\CachedTenantResolver->resolve('localhost') +#2 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'localhost') +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#11 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#13 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#29 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#30 {main} +"} +[2026-01-29 15:37:11] local.ERROR: Tenant could not be identified on domain localhost {"exception":"[object] (Stancl\\Tenancy\\Exceptions\\TenantCouldNotBeIdentifiedOnDomainException(code: 0): Tenant could not be identified on domain localhost at /var/www/html/vendor/stancl/tenancy/src/Resolvers/DomainTenantResolver.php:48) +[stacktrace] +#0 /var/www/html/vendor/stancl/tenancy/src/Resolvers/Contracts/CachedTenantResolver.php(34): Stancl\\Tenancy\\Resolvers\\DomainTenantResolver->resolveWithoutCache('localhost') +#1 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(26): Stancl\\Tenancy\\Resolvers\\Contracts\\CachedTenantResolver->resolve('localhost') +#2 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'localhost') +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#11 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#13 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#29 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#30 {main} +"} +[2026-01-29 15:42:53] local.ERROR: Tenant could not be identified on domain localhost {"exception":"[object] (Stancl\\Tenancy\\Exceptions\\TenantCouldNotBeIdentifiedOnDomainException(code: 0): Tenant could not be identified on domain localhost at /var/www/html/vendor/stancl/tenancy/src/Resolvers/DomainTenantResolver.php:48) +[stacktrace] +#0 /var/www/html/vendor/stancl/tenancy/src/Resolvers/Contracts/CachedTenantResolver.php(34): Stancl\\Tenancy\\Resolvers\\DomainTenantResolver->resolveWithoutCache('localhost') +#1 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(26): Stancl\\Tenancy\\Resolvers\\Contracts\\CachedTenantResolver->resolve('localhost') +#2 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'localhost') +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#11 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#13 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#29 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#30 {main} +"} +[2026-01-29 16:07:29] local.ERROR: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'channel_code' in 'field list' (Connection: tenant, SQL: insert into `core_config` (`code`, `value`, `channel_code`, `locale_code`) values (general.general.locale.code, pt_BR, ?, ?)) {"exception":"[object] (Illuminate\\Database\\QueryException(code: 42S22): SQLSTATE[42S22]: Column not found: 1054 Unknown column 'channel_code' in 'field list' (Connection: tenant, SQL: insert into `core_config` (`code`, `value`, `channel_code`, `locale_code`) values (general.general.locale.code, pt_BR, ?, ?)) at /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php:829) +[stacktrace] +#0 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(783): Illuminate\\Database\\Connection->runQueryCallback('insert into `co...', Array, Object(Closure)) +#1 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/MySqlConnection.php(34): Illuminate\\Database\\Connection->run('insert into `co...', Array, Object(Closure)) +#2 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3498): Illuminate\\Database\\MySqlConnection->insert('insert into `co...', Array) +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3638): Illuminate\\Database\\Query\\Builder->insert(Array) +#4 /var/www/html/fix-locale.php(36): Illuminate\\Database\\Query\\Builder->updateOrInsert(Array, Array) +#5 {main} + +[previous exception] [object] (PDOException(code: 42S22): SQLSTATE[42S22]: Column not found: 1054 Unknown column 'channel_code' in 'field list' at /var/www/html/vendor/laravel/framework/src/Illuminate/Database/MySqlConnection.php:39) +[stacktrace] +#0 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/MySqlConnection.php(39): PDO->prepare('insert into `co...') +#1 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(816): Illuminate\\Database\\MySqlConnection->Illuminate\\Database\\{closure}('insert into `co...', Array) +#2 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(783): Illuminate\\Database\\Connection->runQueryCallback('insert into `co...', Array, Object(Closure)) +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/MySqlConnection.php(34): Illuminate\\Database\\Connection->run('insert into `co...', Array, Object(Closure)) +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3498): Illuminate\\Database\\MySqlConnection->insert('insert into `co...', Array) +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3638): Illuminate\\Database\\Query\\Builder->insert(Array) +#6 /var/www/html/fix-locale.php(36): Illuminate\\Database\\Query\\Builder->updateOrInsert(Array, Array) +#7 {main} +"} +[2026-01-30 12:00:58] local.ERROR: Tenant could not be identified on domain localhost {"exception":"[object] (Stancl\\Tenancy\\Exceptions\\TenantCouldNotBeIdentifiedOnDomainException(code: 0): Tenant could not be identified on domain localhost at /var/www/html/vendor/stancl/tenancy/src/Resolvers/DomainTenantResolver.php:48) +[stacktrace] +#0 /var/www/html/vendor/stancl/tenancy/src/Resolvers/Contracts/CachedTenantResolver.php(34): Stancl\\Tenancy\\Resolvers\\DomainTenantResolver->resolveWithoutCache('localhost') +#1 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(26): Stancl\\Tenancy\\Resolvers\\Contracts\\CachedTenantResolver->resolve('localhost') +#2 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'localhost') +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#11 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#13 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#29 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#30 {main} +"} +[2026-01-30 14:17:29] local.ERROR: Debugbar exception: Database connection [tenant] not configured. +[2026-01-30 15:15:02] local.ERROR: file_put_contents(/var/www/html/storage/tenanttenant1/framework/cache/repository-cache-keys.json): Failed to open stream: No such file or directory +[2026-01-30 15:27:14] local.ERROR: file_put_contents(/var/www/html/storage/tenanttenant2/framework/cache/repository-cache-keys.json): Failed to open stream: No such file or directory +[2026-01-30 15:44:27] local.INFO: Core Config Keys: general, general.general, general.general.locale_settings, general.general.admin_logo, general.settings, general.settings.footer, general.settings.menu, general.settings.menu_color, general.magic_ai, general.magic_ai.settings, general.magic_ai.doc_generation, email, email.imap, email.imap.account +[2026-02-02 09:14:24] local.ERROR: file_put_contents(/var/www/html/storage/tenanttenant1/framework/cache/repository-cache-keys.json): Failed to open stream: No such file or directory +[2026-02-02 09:14:27] local.ERROR: file_put_contents(/var/www/html/storage/tenanttenant1/framework/cache/repository-cache-keys.json): Failed to open stream: No such file or directory +[2026-02-02 09:14:30] local.ERROR: file_put_contents(/var/www/html/storage/tenanttenant1/framework/cache/repository-cache-keys.json): Failed to open stream: No such file or directory +[2026-02-02 09:30:37] local.ERROR: file_put_contents(/var/www/html/storage/tenanttenant2/framework/cache/repository-cache-keys.json): Failed to open stream: No such file or directory +[2026-02-02 09:37:18] local.ERROR: file_put_contents(/var/www/html/storage/tenanttenant1/framework/cache/repository-cache-keys.json): Failed to open stream: No such file or directory +[2026-02-02 09:37:27] local.ERROR: file_put_contents(/var/www/html/storage/tenanttenant1/framework/cache/repository-cache-keys.json): Failed to open stream: No such file or directory +[2026-02-02 09:40:50] local.ERROR: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'tenant_tenant2.tenants' doesn't exist (Connection: tenant, SQL: select count(*) as aggregate from `tenants` where `id` = tenant3) {"userId":1,"exception":"[object] (Illuminate\\Database\\QueryException(code: 42S02): SQLSTATE[42S02]: Base table or view not found: 1146 Table 'tenant_tenant2.tenants' doesn't exist (Connection: tenant, SQL: select count(*) as aggregate from `tenants` where `id` = tenant3) at /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php:829) +[stacktrace] +#0 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(783): Illuminate\\Database\\Connection->runQueryCallback('select count(*)...', Array, Object(Closure)) +#1 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(414): Illuminate\\Database\\Connection->run('select count(*)...', Array, Object(Closure)) +#2 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2913): Illuminate\\Database\\Connection->select('select count(*)...', Array, false) +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2902): Illuminate\\Database\\Query\\Builder->runSelect() +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3456): Illuminate\\Database\\Query\\Builder->Illuminate\\Database\\Query\\{closure}() +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2901): Illuminate\\Database\\Query\\Builder->onceWithColumns(Array, Object(Closure)) +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3383): Illuminate\\Database\\Query\\Builder->get(Array) +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3311): Illuminate\\Database\\Query\\Builder->aggregate('count', Array) +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/DatabasePresenceVerifier.php(54): Illuminate\\Database\\Query\\Builder->count() +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Concerns/ValidatesAttributes.php(948): Illuminate\\Validation\\DatabasePresenceVerifier->getCount('tenants', 'id', 'tenant3', NULL, NULL, Array) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Validator.php(660): Illuminate\\Validation\\Validator->validateUnique('id', 'tenant3', Array, Object(Illuminate\\Validation\\Validator)) +#11 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Validator.php(459): Illuminate\\Validation\\Validator->validateAttribute('id', 'Unique') +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Validator.php(494): Illuminate\\Validation\\Validator->passes() +#13 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Validator.php(536): Illuminate\\Validation\\Validator->fails() +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Providers/FoundationServiceProvider.php(124): Illuminate\\Validation\\Validator->validate() +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Macroable/Traits/Macroable.php(123): Illuminate\\Http\\Request->Illuminate\\Foundation\\Providers\\{closure}(Array) +#16 /var/www/html/app/Http/Controllers/SuperAdmin/TenantController.php(24): Illuminate\\Http\\Request->__call('validate', Array) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): App\\Http\\Controllers\\SuperAdmin\\TenantController->store(Object(Illuminate\\Http\\Request)) +#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(43): Illuminate\\Routing\\Controller->callAction('store', Array) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Route.php(259): Illuminate\\Routing\\ControllerDispatcher->dispatch(Object(Illuminate\\Routing\\Route), Object(App\\Http\\Controllers\\SuperAdmin\\TenantController), 'store') +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Route.php(205): Illuminate\\Routing\\Route->runController() +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(806): Illuminate\\Routing\\Route->run() +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request)) +#23 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(78): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#29 /var/www/html/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#30 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\View\\Middleware\\ShareErrorsFromSession->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#31 /var/www/html/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(121): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#32 /var/www/html/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(64): Illuminate\\Session\\Middleware\\StartSession->handleStatefulRequest(Object(Illuminate\\Http\\Request), Object(Illuminate\\Session\\Store), Object(Closure)) +#33 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Session\\Middleware\\StartSession->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#34 /var/www/html/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#35 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#36 /var/www/html/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(67): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#37 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Cookie\\Middleware\\EncryptCookies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#38 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(36): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#39 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'tenant2.localho...') +#40 /var/www/html/app/Http/Middleware/UniversalTenancy.php(20): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#41 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): App\\Http\\Middleware\\UniversalTenancy->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#42 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#43 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#44 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#45 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#46 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#47 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#48 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#49 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#50 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#51 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#52 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#53 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#54 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#55 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#56 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#57 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#58 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#59 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#60 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#61 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#62 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#63 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#64 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#65 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#66 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#67 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#68 {main} + +[previous exception] [object] (PDOException(code: 42S02): SQLSTATE[42S02]: Base table or view not found: 1146 Table 'tenant_tenant2.tenants' doesn't exist at /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php:423) +[stacktrace] +#0 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(423): PDO->prepare('select count(*)...') +#1 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(816): Illuminate\\Database\\Connection->Illuminate\\Database\\{closure}('select count(*)...', Array) +#2 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(783): Illuminate\\Database\\Connection->runQueryCallback('select count(*)...', Array, Object(Closure)) +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(414): Illuminate\\Database\\Connection->run('select count(*)...', Array, Object(Closure)) +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2913): Illuminate\\Database\\Connection->select('select count(*)...', Array, false) +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2902): Illuminate\\Database\\Query\\Builder->runSelect() +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3456): Illuminate\\Database\\Query\\Builder->Illuminate\\Database\\Query\\{closure}() +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2901): Illuminate\\Database\\Query\\Builder->onceWithColumns(Array, Object(Closure)) +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3383): Illuminate\\Database\\Query\\Builder->get(Array) +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3311): Illuminate\\Database\\Query\\Builder->aggregate('count', Array) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/DatabasePresenceVerifier.php(54): Illuminate\\Database\\Query\\Builder->count() +#11 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Concerns/ValidatesAttributes.php(948): Illuminate\\Validation\\DatabasePresenceVerifier->getCount('tenants', 'id', 'tenant3', NULL, NULL, Array) +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Validator.php(660): Illuminate\\Validation\\Validator->validateUnique('id', 'tenant3', Array, Object(Illuminate\\Validation\\Validator)) +#13 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Validator.php(459): Illuminate\\Validation\\Validator->validateAttribute('id', 'Unique') +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Validator.php(494): Illuminate\\Validation\\Validator->passes() +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Validator.php(536): Illuminate\\Validation\\Validator->fails() +#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Providers/FoundationServiceProvider.php(124): Illuminate\\Validation\\Validator->validate() +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Macroable/Traits/Macroable.php(123): Illuminate\\Http\\Request->Illuminate\\Foundation\\Providers\\{closure}(Array) +#18 /var/www/html/app/Http/Controllers/SuperAdmin/TenantController.php(24): Illuminate\\Http\\Request->__call('validate', Array) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): App\\Http\\Controllers\\SuperAdmin\\TenantController->store(Object(Illuminate\\Http\\Request)) +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(43): Illuminate\\Routing\\Controller->callAction('store', Array) +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Route.php(259): Illuminate\\Routing\\ControllerDispatcher->dispatch(Object(Illuminate\\Routing\\Route), Object(App\\Http\\Controllers\\SuperAdmin\\TenantController), 'store') +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Route.php(205): Illuminate\\Routing\\Route->runController() +#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(806): Illuminate\\Routing\\Route->run() +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request)) +#25 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#29 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(78): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#30 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#31 /var/www/html/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#32 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\View\\Middleware\\ShareErrorsFromSession->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#33 /var/www/html/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(121): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#34 /var/www/html/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(64): Illuminate\\Session\\Middleware\\StartSession->handleStatefulRequest(Object(Illuminate\\Http\\Request), Object(Illuminate\\Session\\Store), Object(Closure)) +#35 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Session\\Middleware\\StartSession->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#36 /var/www/html/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#37 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#38 /var/www/html/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(67): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#39 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Cookie\\Middleware\\EncryptCookies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#40 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(36): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#41 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'tenant2.localho...') +#42 /var/www/html/app/Http/Middleware/UniversalTenancy.php(20): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#43 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): App\\Http\\Middleware\\UniversalTenancy->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#44 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#45 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#46 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#47 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#48 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#49 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#50 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#51 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#52 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#53 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#54 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#55 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#56 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#57 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#58 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#59 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#60 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#61 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#62 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#63 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#64 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#65 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#66 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#67 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#68 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#69 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#70 {main} +"} +[2026-02-02 09:41:05] local.ERROR: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'tenant_tenant2.tenants' doesn't exist (Connection: tenant, SQL: select count(*) as aggregate from `tenants` where `id` = tenant3) {"userId":1,"exception":"[object] (Illuminate\\Database\\QueryException(code: 42S02): SQLSTATE[42S02]: Base table or view not found: 1146 Table 'tenant_tenant2.tenants' doesn't exist (Connection: tenant, SQL: select count(*) as aggregate from `tenants` where `id` = tenant3) at /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php:829) +[stacktrace] +#0 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(783): Illuminate\\Database\\Connection->runQueryCallback('select count(*)...', Array, Object(Closure)) +#1 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(414): Illuminate\\Database\\Connection->run('select count(*)...', Array, Object(Closure)) +#2 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2913): Illuminate\\Database\\Connection->select('select count(*)...', Array, false) +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2902): Illuminate\\Database\\Query\\Builder->runSelect() +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3456): Illuminate\\Database\\Query\\Builder->Illuminate\\Database\\Query\\{closure}() +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2901): Illuminate\\Database\\Query\\Builder->onceWithColumns(Array, Object(Closure)) +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3383): Illuminate\\Database\\Query\\Builder->get(Array) +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3311): Illuminate\\Database\\Query\\Builder->aggregate('count', Array) +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/DatabasePresenceVerifier.php(54): Illuminate\\Database\\Query\\Builder->count() +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Concerns/ValidatesAttributes.php(948): Illuminate\\Validation\\DatabasePresenceVerifier->getCount('tenants', 'id', 'tenant3', NULL, NULL, Array) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Validator.php(660): Illuminate\\Validation\\Validator->validateUnique('id', 'tenant3', Array, Object(Illuminate\\Validation\\Validator)) +#11 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Validator.php(459): Illuminate\\Validation\\Validator->validateAttribute('id', 'Unique') +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Validator.php(494): Illuminate\\Validation\\Validator->passes() +#13 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Validator.php(536): Illuminate\\Validation\\Validator->fails() +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Providers/FoundationServiceProvider.php(124): Illuminate\\Validation\\Validator->validate() +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Macroable/Traits/Macroable.php(123): Illuminate\\Http\\Request->Illuminate\\Foundation\\Providers\\{closure}(Array) +#16 /var/www/html/app/Http/Controllers/SuperAdmin/TenantController.php(24): Illuminate\\Http\\Request->__call('validate', Array) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): App\\Http\\Controllers\\SuperAdmin\\TenantController->store(Object(Illuminate\\Http\\Request)) +#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(43): Illuminate\\Routing\\Controller->callAction('store', Array) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Route.php(259): Illuminate\\Routing\\ControllerDispatcher->dispatch(Object(Illuminate\\Routing\\Route), Object(App\\Http\\Controllers\\SuperAdmin\\TenantController), 'store') +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Route.php(205): Illuminate\\Routing\\Route->runController() +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(806): Illuminate\\Routing\\Route->run() +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request)) +#23 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(78): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#29 /var/www/html/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#30 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\View\\Middleware\\ShareErrorsFromSession->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#31 /var/www/html/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(121): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#32 /var/www/html/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(64): Illuminate\\Session\\Middleware\\StartSession->handleStatefulRequest(Object(Illuminate\\Http\\Request), Object(Illuminate\\Session\\Store), Object(Closure)) +#33 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Session\\Middleware\\StartSession->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#34 /var/www/html/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#35 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#36 /var/www/html/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(67): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#37 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Cookie\\Middleware\\EncryptCookies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#38 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(36): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#39 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'tenant2.localho...') +#40 /var/www/html/app/Http/Middleware/UniversalTenancy.php(20): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#41 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): App\\Http\\Middleware\\UniversalTenancy->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#42 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#43 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#44 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#45 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#46 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#47 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#48 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#49 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#50 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#51 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#52 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#53 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#54 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#55 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#56 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#57 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#58 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#59 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#60 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#61 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#62 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#63 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#64 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#65 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#66 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#67 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#68 {main} + +[previous exception] [object] (PDOException(code: 42S02): SQLSTATE[42S02]: Base table or view not found: 1146 Table 'tenant_tenant2.tenants' doesn't exist at /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php:423) +[stacktrace] +#0 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(423): PDO->prepare('select count(*)...') +#1 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(816): Illuminate\\Database\\Connection->Illuminate\\Database\\{closure}('select count(*)...', Array) +#2 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(783): Illuminate\\Database\\Connection->runQueryCallback('select count(*)...', Array, Object(Closure)) +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(414): Illuminate\\Database\\Connection->run('select count(*)...', Array, Object(Closure)) +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2913): Illuminate\\Database\\Connection->select('select count(*)...', Array, false) +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2902): Illuminate\\Database\\Query\\Builder->runSelect() +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3456): Illuminate\\Database\\Query\\Builder->Illuminate\\Database\\Query\\{closure}() +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2901): Illuminate\\Database\\Query\\Builder->onceWithColumns(Array, Object(Closure)) +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3383): Illuminate\\Database\\Query\\Builder->get(Array) +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3311): Illuminate\\Database\\Query\\Builder->aggregate('count', Array) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/DatabasePresenceVerifier.php(54): Illuminate\\Database\\Query\\Builder->count() +#11 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Concerns/ValidatesAttributes.php(948): Illuminate\\Validation\\DatabasePresenceVerifier->getCount('tenants', 'id', 'tenant3', NULL, NULL, Array) +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Validator.php(660): Illuminate\\Validation\\Validator->validateUnique('id', 'tenant3', Array, Object(Illuminate\\Validation\\Validator)) +#13 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Validator.php(459): Illuminate\\Validation\\Validator->validateAttribute('id', 'Unique') +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Validator.php(494): Illuminate\\Validation\\Validator->passes() +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Validator.php(536): Illuminate\\Validation\\Validator->fails() +#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Providers/FoundationServiceProvider.php(124): Illuminate\\Validation\\Validator->validate() +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Macroable/Traits/Macroable.php(123): Illuminate\\Http\\Request->Illuminate\\Foundation\\Providers\\{closure}(Array) +#18 /var/www/html/app/Http/Controllers/SuperAdmin/TenantController.php(24): Illuminate\\Http\\Request->__call('validate', Array) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): App\\Http\\Controllers\\SuperAdmin\\TenantController->store(Object(Illuminate\\Http\\Request)) +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(43): Illuminate\\Routing\\Controller->callAction('store', Array) +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Route.php(259): Illuminate\\Routing\\ControllerDispatcher->dispatch(Object(Illuminate\\Routing\\Route), Object(App\\Http\\Controllers\\SuperAdmin\\TenantController), 'store') +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Route.php(205): Illuminate\\Routing\\Route->runController() +#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(806): Illuminate\\Routing\\Route->run() +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request)) +#25 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#29 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(78): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#30 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#31 /var/www/html/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#32 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\View\\Middleware\\ShareErrorsFromSession->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#33 /var/www/html/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(121): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#34 /var/www/html/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(64): Illuminate\\Session\\Middleware\\StartSession->handleStatefulRequest(Object(Illuminate\\Http\\Request), Object(Illuminate\\Session\\Store), Object(Closure)) +#35 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Session\\Middleware\\StartSession->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#36 /var/www/html/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#37 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#38 /var/www/html/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(67): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#39 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Cookie\\Middleware\\EncryptCookies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#40 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(36): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#41 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'tenant2.localho...') +#42 /var/www/html/app/Http/Middleware/UniversalTenancy.php(20): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#43 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): App\\Http\\Middleware\\UniversalTenancy->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#44 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#45 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#46 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#47 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#48 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#49 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#50 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#51 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#52 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#53 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#54 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#55 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#56 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#57 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#58 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#59 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#60 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#61 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#62 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#63 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#64 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#65 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#66 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#67 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#68 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#69 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#70 {main} +"} +[2026-02-02 12:15:13] local.ERROR: file_put_contents(/var/www/html/storage/framework/views/455eceb602548652aae99ec6afb7fa77.php): Failed to open stream: Permission denied {"userId":1,"exception":"[object] (ErrorException(code: 0): file_put_contents(/var/www/html/storage/framework/views/455eceb602548652aae99ec6afb7fa77.php): Failed to open stream: Permission denied at /var/www/html/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php:204) +[stacktrace] +#0 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(255): Illuminate\\Foundation\\Bootstrap\\HandleExceptions->handleError(2, 'file_put_conten...', '/var/www/html/v...', 204) +#1 [internal function]: Illuminate\\Foundation\\Bootstrap\\HandleExceptions->Illuminate\\Foundation\\Bootstrap\\{closure}(2, 'file_put_conten...', '/var/www/html/v...', 204) +#2 /var/www/html/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php(204): file_put_contents('/var/www/html/s...', 's...', 0) +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/View/Compilers/BladeCompiler.php(194): Illuminate\\Filesystem\\Filesystem->put('/var/www/html/s...', 's...') +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/View/Engines/CompilerEngine.php(64): Illuminate\\View\\Compilers\\BladeCompiler->compile('/var/www/html/r...') +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/View/View.php(207): Illuminate\\View\\Engines\\CompilerEngine->get('/var/www/html/r...', Array) +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/View/View.php(190): Illuminate\\View\\View->getContents() +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/View/View.php(159): Illuminate\\View\\View->renderContents() +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Response.php(69): Illuminate\\View\\View->render() +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Response.php(35): Illuminate\\Http\\Response->setContent(Object(Illuminate\\View\\View)) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(918): Illuminate\\Http\\Response->__construct(Object(Illuminate\\View\\View), 200, Array) +#11 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(885): Illuminate\\Routing\\Router::toResponse(Object(Illuminate\\Http\\Request), Object(Illuminate\\View\\View)) +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Routing\\Router->prepareResponse(Object(Illuminate\\Http\\Request), Object(Illuminate\\View\\View)) +#13 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request)) +#14 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(78): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\View\\Middleware\\ShareErrorsFromSession->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(121): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(64): Illuminate\\Session\\Middleware\\StartSession->handleStatefulRequest(Object(Illuminate\\Http\\Request), Object(Illuminate\\Session\\Store), Object(Closure)) +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Session\\Middleware\\StartSession->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(67): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Cookie\\Middleware\\EncryptCookies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#29 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(36): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#30 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'tenant1.localho...') +#31 /var/www/html/app/Http/Middleware/UniversalTenancy.php(20): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#32 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): App\\Http\\Middleware\\UniversalTenancy->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#33 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#34 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#35 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#36 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#37 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#38 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#39 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#40 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#41 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#42 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#43 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#44 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#45 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#46 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#47 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#48 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#49 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#50 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#51 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#52 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#53 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#54 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#55 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#56 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#57 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#58 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#59 {main} +"} +[2026-02-02 12:18:15] local.ERROR: could not find driver (Connection: mysql, SQL: select table_name as `name`, (data_length + index_length) as `size`, table_comment as `comment`, engine as `engine`, table_collation as `collation` from information_schema.tables where table_schema = 'laravel-crm' and table_type in ('BASE TABLE', 'SYSTEM VERSIONED') order by table_name) {"exception":"[object] (Illuminate\\Database\\QueryException(code: 0): could not find driver (Connection: mysql, SQL: select table_name as `name`, (data_length + index_length) as `size`, table_comment as `comment`, engine as `engine`, table_collation as `collation` from information_schema.tables where table_schema = 'laravel-crm' and table_type in ('BASE TABLE', 'SYSTEM VERSIONED') order by table_name) at /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php:829) +[stacktrace] +#0 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(783): Illuminate\\Database\\Connection->runQueryCallback() +#1 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(414): Illuminate\\Database\\Connection->run() +#2 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(401): Illuminate\\Database\\Connection->select() +#3 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Schema/MySqlBuilder.php(41): Illuminate\\Database\\Connection->selectFromWriteConnection() +#4 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Schema/Builder.php(165): Illuminate\\Database\\Schema\\MySqlBuilder->getTables() +#5 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Migrations/DatabaseMigrationRepository.php(184): Illuminate\\Database\\Schema\\Builder->hasTable() +#6 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php(727): Illuminate\\Database\\Migrations\\DatabaseMigrationRepository->repositoryExists() +#7 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php(140): Illuminate\\Database\\Migrations\\Migrator->repositoryExists() +#8 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Support/helpers.php(261): Illuminate\\Database\\Console\\Migrations\\MigrateCommand->{closure:Illuminate\\Database\\Console\\Migrations\\MigrateCommand::repositoryExists():140}() +#9 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php(140): retry() +#10 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php(116): Illuminate\\Database\\Console\\Migrations\\MigrateCommand->repositoryExists() +#11 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php(84): Illuminate\\Database\\Console\\Migrations\\MigrateCommand->prepareDatabase() +#12 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php(641): Illuminate\\Database\\Console\\Migrations\\MigrateCommand->{closure:Illuminate\\Database\\Console\\Migrations\\MigrateCommand::handle():83}() +#13 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php(83): Illuminate\\Database\\Migrations\\Migrator->usingConnection() +#14 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Illuminate\\Database\\Console\\Migrations\\MigrateCommand->handle() +#15 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/Util.php(41): Illuminate\\Container\\BoundMethod::{closure:Illuminate\\Container\\BoundMethod::call():35}() +#16 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\\Container\\Util::unwrapIfClosure() +#17 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(35): Illuminate\\Container\\BoundMethod::callBoundMethod() +#18 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/Container.php(662): Illuminate\\Container\\BoundMethod::call() +#19 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Console/Command.php(211): Illuminate\\Container\\Container->call() +#20 /home/farelos/compor/krayin/vendor/symfony/console/Command/Command.php(326): Illuminate\\Console\\Command->execute() +#21 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Console/Command.php(180): Symfony\\Component\\Console\\Command\\Command->run() +#22 /home/farelos/compor/krayin/vendor/symfony/console/Application.php(1096): Illuminate\\Console\\Command->run() +#23 /home/farelos/compor/krayin/vendor/symfony/console/Application.php(324): Symfony\\Component\\Console\\Application->doRunCommand() +#24 /home/farelos/compor/krayin/vendor/symfony/console/Application.php(175): Symfony\\Component\\Console\\Application->doRun() +#25 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(201): Symfony\\Component\\Console\\Application->run() +#26 /home/farelos/compor/krayin/artisan(35): Illuminate\\Foundation\\Console\\Kernel->handle() +#27 {main} + +[previous exception] [object] (PDOException(code: 0): could not find driver at /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:65) +[stacktrace] +#0 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php(65): PDO->__construct() +#1 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php(44): Illuminate\\Database\\Connectors\\Connector->createPdoConnection() +#2 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connectors/MySqlConnector.php(24): Illuminate\\Database\\Connectors\\Connector->createConnection() +#3 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php(184): Illuminate\\Database\\Connectors\\MySqlConnector->connect() +#4 [internal function]: Illuminate\\Database\\Connectors\\ConnectionFactory->{closure:Illuminate\\Database\\Connectors\\ConnectionFactory::createPdoResolverWithHosts():179}() +#5 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(1339): call_user_func() +#6 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(528): Illuminate\\Database\\Connection->getPdo() +#7 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(423): Illuminate\\Database\\Connection->getPdoForSelect() +#8 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(816): Illuminate\\Database\\Connection->{closure:Illuminate\\Database\\Connection::select():414}() +#9 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(783): Illuminate\\Database\\Connection->runQueryCallback() +#10 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(414): Illuminate\\Database\\Connection->run() +#11 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(401): Illuminate\\Database\\Connection->select() +#12 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Schema/MySqlBuilder.php(41): Illuminate\\Database\\Connection->selectFromWriteConnection() +#13 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Schema/Builder.php(165): Illuminate\\Database\\Schema\\MySqlBuilder->getTables() +#14 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Migrations/DatabaseMigrationRepository.php(184): Illuminate\\Database\\Schema\\Builder->hasTable() +#15 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php(727): Illuminate\\Database\\Migrations\\DatabaseMigrationRepository->repositoryExists() +#16 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php(140): Illuminate\\Database\\Migrations\\Migrator->repositoryExists() +#17 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Support/helpers.php(261): Illuminate\\Database\\Console\\Migrations\\MigrateCommand->{closure:Illuminate\\Database\\Console\\Migrations\\MigrateCommand::repositoryExists():140}() +#18 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php(140): retry() +#19 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php(116): Illuminate\\Database\\Console\\Migrations\\MigrateCommand->repositoryExists() +#20 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php(84): Illuminate\\Database\\Console\\Migrations\\MigrateCommand->prepareDatabase() +#21 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php(641): Illuminate\\Database\\Console\\Migrations\\MigrateCommand->{closure:Illuminate\\Database\\Console\\Migrations\\MigrateCommand::handle():83}() +#22 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php(83): Illuminate\\Database\\Migrations\\Migrator->usingConnection() +#23 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Illuminate\\Database\\Console\\Migrations\\MigrateCommand->handle() +#24 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/Util.php(41): Illuminate\\Container\\BoundMethod::{closure:Illuminate\\Container\\BoundMethod::call():35}() +#25 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\\Container\\Util::unwrapIfClosure() +#26 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(35): Illuminate\\Container\\BoundMethod::callBoundMethod() +#27 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/Container.php(662): Illuminate\\Container\\BoundMethod::call() +#28 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Console/Command.php(211): Illuminate\\Container\\Container->call() +#29 /home/farelos/compor/krayin/vendor/symfony/console/Command/Command.php(326): Illuminate\\Console\\Command->execute() +#30 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Console/Command.php(180): Symfony\\Component\\Console\\Command\\Command->run() +#31 /home/farelos/compor/krayin/vendor/symfony/console/Application.php(1096): Illuminate\\Console\\Command->run() +#32 /home/farelos/compor/krayin/vendor/symfony/console/Application.php(324): Symfony\\Component\\Console\\Application->doRunCommand() +#33 /home/farelos/compor/krayin/vendor/symfony/console/Application.php(175): Symfony\\Component\\Console\\Application->doRun() +#34 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(201): Symfony\\Component\\Console\\Application->run() +#35 /home/farelos/compor/krayin/artisan(35): Illuminate\\Foundation\\Console\\Kernel->handle() +#36 {main} +"} +[2026-02-02 12:18:19] local.ERROR: could not find driver (Connection: mysql, SQL: select * from `users` where (`email` = admin@example.com) limit 1) {"exception":"[object] (Illuminate\\Database\\QueryException(code: 0): could not find driver (Connection: mysql, SQL: select * from `users` where (`email` = admin@example.com) limit 1) at /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php:829) +[stacktrace] +#0 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(783): Illuminate\\Database\\Connection->runQueryCallback() +#1 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(414): Illuminate\\Database\\Connection->run() +#2 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2913): Illuminate\\Database\\Connection->select() +#3 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2902): Illuminate\\Database\\Query\\Builder->runSelect() +#4 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3456): Illuminate\\Database\\Query\\Builder->{closure:Illuminate\\Database\\Query\\Builder::get():2901}() +#5 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2901): Illuminate\\Database\\Query\\Builder->onceWithColumns() +#6 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(739): Illuminate\\Database\\Query\\Builder->get() +#7 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(723): Illuminate\\Database\\Eloquent\\Builder->getModels() +#8 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Concerns/BuildsQueries.php(333): Illuminate\\Database\\Eloquent\\Builder->get() +#9 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(568): Illuminate\\Database\\Eloquent\\Builder->first() +#10 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Support/Traits/ForwardsCalls.php(23): Illuminate\\Database\\Eloquent\\Builder->firstOrCreate() +#11 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(2335): Illuminate\\Database\\Eloquent\\Model->forwardCallTo() +#12 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(2347): Illuminate\\Database\\Eloquent\\Model->__call() +#13 /home/farelos/compor/krayin/database/seeders/SuperAdminSeeder.php(14): Illuminate\\Database\\Eloquent\\Model::__callStatic() +#14 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Database\\Seeders\\SuperAdminSeeder->run() +#15 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/Util.php(41): Illuminate\\Container\\BoundMethod::{closure:Illuminate\\Container\\BoundMethod::call():35}() +#16 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\\Container\\Util::unwrapIfClosure() +#17 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(35): Illuminate\\Container\\BoundMethod::callBoundMethod() +#18 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/Container.php(662): Illuminate\\Container\\BoundMethod::call() +#19 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Seeder.php(184): Illuminate\\Container\\Container->call() +#20 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Seeder.php(193): Illuminate\\Database\\Seeder->{closure:Illuminate\\Database\\Seeder::__invoke():183}() +#21 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Console/Seeds/SeedCommand.php(70): Illuminate\\Database\\Seeder->__invoke() +#22 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/GuardsAttributes.php(155): Illuminate\\Database\\Console\\Seeds\\SeedCommand->{closure:Illuminate\\Database\\Console\\Seeds\\SeedCommand::handle():69}() +#23 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Console/Seeds/SeedCommand.php(69): Illuminate\\Database\\Eloquent\\Model::unguarded() +#24 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Illuminate\\Database\\Console\\Seeds\\SeedCommand->handle() +#25 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/Util.php(41): Illuminate\\Container\\BoundMethod::{closure:Illuminate\\Container\\BoundMethod::call():35}() +#26 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\\Container\\Util::unwrapIfClosure() +#27 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(35): Illuminate\\Container\\BoundMethod::callBoundMethod() +#28 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/Container.php(662): Illuminate\\Container\\BoundMethod::call() +#29 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Console/Command.php(211): Illuminate\\Container\\Container->call() +#30 /home/farelos/compor/krayin/vendor/symfony/console/Command/Command.php(326): Illuminate\\Console\\Command->execute() +#31 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Console/Command.php(180): Symfony\\Component\\Console\\Command\\Command->run() +#32 /home/farelos/compor/krayin/vendor/symfony/console/Application.php(1096): Illuminate\\Console\\Command->run() +#33 /home/farelos/compor/krayin/vendor/symfony/console/Application.php(324): Symfony\\Component\\Console\\Application->doRunCommand() +#34 /home/farelos/compor/krayin/vendor/symfony/console/Application.php(175): Symfony\\Component\\Console\\Application->doRun() +#35 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(201): Symfony\\Component\\Console\\Application->run() +#36 /home/farelos/compor/krayin/artisan(35): Illuminate\\Foundation\\Console\\Kernel->handle() +#37 {main} + +[previous exception] [object] (PDOException(code: 0): could not find driver at /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:65) +[stacktrace] +#0 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php(65): PDO->__construct() +#1 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php(44): Illuminate\\Database\\Connectors\\Connector->createPdoConnection() +#2 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connectors/MySqlConnector.php(24): Illuminate\\Database\\Connectors\\Connector->createConnection() +#3 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php(184): Illuminate\\Database\\Connectors\\MySqlConnector->connect() +#4 [internal function]: Illuminate\\Database\\Connectors\\ConnectionFactory->{closure:Illuminate\\Database\\Connectors\\ConnectionFactory::createPdoResolverWithHosts():179}() +#5 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(1339): call_user_func() +#6 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(1375): Illuminate\\Database\\Connection->getPdo() +#7 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(528): Illuminate\\Database\\Connection->getReadPdo() +#8 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(423): Illuminate\\Database\\Connection->getPdoForSelect() +#9 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(816): Illuminate\\Database\\Connection->{closure:Illuminate\\Database\\Connection::select():414}() +#10 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(783): Illuminate\\Database\\Connection->runQueryCallback() +#11 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(414): Illuminate\\Database\\Connection->run() +#12 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2913): Illuminate\\Database\\Connection->select() +#13 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2902): Illuminate\\Database\\Query\\Builder->runSelect() +#14 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3456): Illuminate\\Database\\Query\\Builder->{closure:Illuminate\\Database\\Query\\Builder::get():2901}() +#15 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2901): Illuminate\\Database\\Query\\Builder->onceWithColumns() +#16 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(739): Illuminate\\Database\\Query\\Builder->get() +#17 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(723): Illuminate\\Database\\Eloquent\\Builder->getModels() +#18 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Concerns/BuildsQueries.php(333): Illuminate\\Database\\Eloquent\\Builder->get() +#19 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(568): Illuminate\\Database\\Eloquent\\Builder->first() +#20 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Support/Traits/ForwardsCalls.php(23): Illuminate\\Database\\Eloquent\\Builder->firstOrCreate() +#21 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(2335): Illuminate\\Database\\Eloquent\\Model->forwardCallTo() +#22 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(2347): Illuminate\\Database\\Eloquent\\Model->__call() +#23 /home/farelos/compor/krayin/database/seeders/SuperAdminSeeder.php(14): Illuminate\\Database\\Eloquent\\Model::__callStatic() +#24 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Database\\Seeders\\SuperAdminSeeder->run() +#25 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/Util.php(41): Illuminate\\Container\\BoundMethod::{closure:Illuminate\\Container\\BoundMethod::call():35}() +#26 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\\Container\\Util::unwrapIfClosure() +#27 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(35): Illuminate\\Container\\BoundMethod::callBoundMethod() +#28 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/Container.php(662): Illuminate\\Container\\BoundMethod::call() +#29 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Seeder.php(184): Illuminate\\Container\\Container->call() +#30 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Seeder.php(193): Illuminate\\Database\\Seeder->{closure:Illuminate\\Database\\Seeder::__invoke():183}() +#31 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Console/Seeds/SeedCommand.php(70): Illuminate\\Database\\Seeder->__invoke() +#32 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/GuardsAttributes.php(155): Illuminate\\Database\\Console\\Seeds\\SeedCommand->{closure:Illuminate\\Database\\Console\\Seeds\\SeedCommand::handle():69}() +#33 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Console/Seeds/SeedCommand.php(69): Illuminate\\Database\\Eloquent\\Model::unguarded() +#34 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Illuminate\\Database\\Console\\Seeds\\SeedCommand->handle() +#35 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/Util.php(41): Illuminate\\Container\\BoundMethod::{closure:Illuminate\\Container\\BoundMethod::call():35}() +#36 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\\Container\\Util::unwrapIfClosure() +#37 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(35): Illuminate\\Container\\BoundMethod::callBoundMethod() +#38 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/Container.php(662): Illuminate\\Container\\BoundMethod::call() +#39 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Console/Command.php(211): Illuminate\\Container\\Container->call() +#40 /home/farelos/compor/krayin/vendor/symfony/console/Command/Command.php(326): Illuminate\\Console\\Command->execute() +#41 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Console/Command.php(180): Symfony\\Component\\Console\\Command\\Command->run() +#42 /home/farelos/compor/krayin/vendor/symfony/console/Application.php(1096): Illuminate\\Console\\Command->run() +#43 /home/farelos/compor/krayin/vendor/symfony/console/Application.php(324): Symfony\\Component\\Console\\Application->doRunCommand() +#44 /home/farelos/compor/krayin/vendor/symfony/console/Application.php(175): Symfony\\Component\\Console\\Application->doRun() +#45 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(201): Symfony\\Component\\Console\\Application->run() +#46 /home/farelos/compor/krayin/artisan(35): Illuminate\\Foundation\\Console\\Kernel->handle() +#47 {main} +"} diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..421b569 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,11 @@ +import { defineConfig } from 'vite'; +import laravel from 'laravel-vite-plugin'; + +export default defineConfig({ + plugins: [ + laravel({ + input: ['resources/css/app.css', 'resources/js/app.js'], + refresh: true, + }), + ], +});