diff --git a/addons/default/visiosoft/advs-module/resources/js/list.js b/addons/default/visiosoft/advs-module/resources/js/list.js index a5099a2fe..fa86de6d9 100644 --- a/addons/default/visiosoft/advs-module/resources/js/list.js +++ b/addons/default/visiosoft/advs-module/resources/js/list.js @@ -146,11 +146,32 @@ $(document).ready(function () { }); // Country filter - $("select[name=filter_country]").select2({ + const locationFilter = $("select[name=filter_country]") + locationFilter.select2({ placeholder: $('select[name=filter_country] option:first-child').text() }); + locationFilter.change(function () { + if ($(this).val()) { + getCities($(this).val()) + } + }).trigger('change'); + + // City filter + $("select[name=filter_City]").select2({ + placeholder: $('select[name=filter_City] option:first-child').text() + }); }); +function getCities(country) { + return crudAjax(`id=${country}`, '/ajax/getCities', 'POST', () => {}, true) + .then(function (cities) { + $('select[name="filter_City"]').html(""); + $.each(cities, function (index, value) { + $('select[name="filter_City"]').append(""); + }); + }) +} + $("#listFilterForm").submit(function(e) { // Disable unselected inputs const inputs = $('#listFilterForm :input'); diff --git a/addons/default/visiosoft/advs-module/resources/lang/en/button.php b/addons/default/visiosoft/advs-module/resources/lang/en/button.php index 88b42946a..c37d791c5 100644 --- a/addons/default/visiosoft/advs-module/resources/lang/en/button.php +++ b/addons/default/visiosoft/advs-module/resources/lang/en/button.php @@ -44,4 +44,5 @@ return [ 'publish' => 'Publish', 'import' => 'Import', 'new_status' => 'New Status', + 'fast_edit' => 'Fast Edit', ]; diff --git a/addons/default/visiosoft/advs-module/resources/lang/en/field.php b/addons/default/visiosoft/advs-module/resources/lang/en/field.php index ee3c61e7f..c7bf94723 100644 --- a/addons/default/visiosoft/advs-module/resources/lang/en/field.php +++ b/addons/default/visiosoft/advs-module/resources/lang/en/field.php @@ -279,6 +279,17 @@ return [ 'yes' => [ 'name' => 'Yes' ], + 'no' => [ + 'name' => 'No' + ], + 'is_system' => [ + 'name' => 'Is System', + 'instructions' => 'System status are required and should not be changed', + ], + 'user_access' => [ + 'name' => 'User Access', + 'instructions' => 'Can a user use this status on his ads?', + ], "no_location" => "No location is selected.", "continue" => 'Continue', "gallery" => 'Gallery', diff --git a/addons/default/visiosoft/advs-module/resources/lang/en/message.php b/addons/default/visiosoft/advs-module/resources/lang/en/message.php index 60f9ffec9..64e9a67a5 100644 --- a/addons/default/visiosoft/advs-module/resources/lang/en/message.php +++ b/addons/default/visiosoft/advs-module/resources/lang/en/message.php @@ -30,4 +30,5 @@ return [ 'approve_status_change' => "Your Ad's Status Has Been Set to Active!", 'passive_status_change' => "Your Ad's Status Has Been Set to Passive!", 'sold_status_change' => "Your Ad's Status Has Been Set to Sold!", + 'status_change' => "Your Ad's Status Has Been Set to :status!", ]; diff --git a/addons/default/visiosoft/advs-module/src/Adv/AdvModel.php b/addons/default/visiosoft/advs-module/src/Adv/AdvModel.php index e7d270457..e8a84f42b 100644 --- a/addons/default/visiosoft/advs-module/src/Adv/AdvModel.php +++ b/addons/default/visiosoft/advs-module/src/Adv/AdvModel.php @@ -411,4 +411,9 @@ class AdvModel extends AdvsAdvsEntryModel implements AdvInterface 'publish_at' => date('Y-m-d H:i:s') ]); } + + public function changeStatus($status) + { + $this->update(['status' => $status]); + } } diff --git a/addons/default/visiosoft/advs-module/src/Adv/AdvObserver.php b/addons/default/visiosoft/advs-module/src/Adv/AdvObserver.php index 5ed6b67af..55f23f0c8 100644 --- a/addons/default/visiosoft/advs-module/src/Adv/AdvObserver.php +++ b/addons/default/visiosoft/advs-module/src/Adv/AdvObserver.php @@ -1,5 +1,6 @@ dispatch(new AddSlug($entry)); + + parent::updating($entry); + } + public function deleting(EntryInterface $entry) { $this->dispatch(new DeleteOptionConfiguration($entry)); diff --git a/addons/default/visiosoft/advs-module/src/Adv/Command/AddSlug.php b/addons/default/visiosoft/advs-module/src/Adv/Command/AddSlug.php new file mode 100644 index 000000000..cfc6c42e5 --- /dev/null +++ b/addons/default/visiosoft/advs-module/src/Adv/Command/AddSlug.php @@ -0,0 +1,23 @@ +ad = $ad; + } + + public function handle() + { + if (!$this->ad->slug && $this->ad->name) { + $this->ad->update([ + 'slug' => Str::slug($this->ad->name) + ]); + } + } +} diff --git a/addons/default/visiosoft/advs-module/src/Adv/Contract/AdvInterface.php b/addons/default/visiosoft/advs-module/src/Adv/Contract/AdvInterface.php index 3c6374283..06f037a75 100644 --- a/addons/default/visiosoft/advs-module/src/Adv/Contract/AdvInterface.php +++ b/addons/default/visiosoft/advs-module/src/Adv/Contract/AdvInterface.php @@ -87,4 +87,6 @@ interface AdvInterface extends EntryInterface public function getStatus(); public function approve(); + + public function changeStatus($status); } diff --git a/addons/default/visiosoft/advs-module/src/Adv/Form/AdvFormBuilder.php b/addons/default/visiosoft/advs-module/src/Adv/Form/AdvFormBuilder.php index ef1e7e90e..99ff60fc1 100644 --- a/addons/default/visiosoft/advs-module/src/Adv/Form/AdvFormBuilder.php +++ b/addons/default/visiosoft/advs-module/src/Adv/Form/AdvFormBuilder.php @@ -63,7 +63,9 @@ class AdvFormBuilder extends FormBuilder protected $rules = []; - protected $skips = []; + protected $skips = [ + 'slug' + ]; protected $actions = []; diff --git a/addons/default/visiosoft/advs-module/src/Adv/Form/SimpleAdvFormFields.php b/addons/default/visiosoft/advs-module/src/Adv/Form/SimpleAdvFormFields.php index 2b519de33..d6f737e10 100644 --- a/addons/default/visiosoft/advs-module/src/Adv/Form/SimpleAdvFormFields.php +++ b/addons/default/visiosoft/advs-module/src/Adv/Form/SimpleAdvFormFields.php @@ -1,11 +1,14 @@ all()->pluck('name', 'slug')->all(); + $form_fields = [ 'name', 'price', @@ -23,6 +26,13 @@ class SimpleAdvFormFields 'cat10', 'is_get_adv', 'stock', + 'status' => [ + 'type' => 'anomaly.field_type.select', + "config" => [ + "options" => $statuses, + "mode" => "search", + ] + ], 'files', ]; diff --git a/addons/default/visiosoft/advs-module/src/Adv/Form/SimpleAdvFormHandler.php b/addons/default/visiosoft/advs-module/src/Adv/Form/SimpleAdvFormHandler.php index c78c58c3f..176bc5632 100644 --- a/addons/default/visiosoft/advs-module/src/Adv/Form/SimpleAdvFormHandler.php +++ b/addons/default/visiosoft/advs-module/src/Adv/Form/SimpleAdvFormHandler.php @@ -18,7 +18,7 @@ class SimpleAdvFormHandler $builder->saveForm(); $ad = $advRepository->find($builder->getFormEntryId()); - if ($ad->status !== 'approved') { + if (!$builder->getFormValue('status') && $ad->status !== 'approved') { $ad->approve(); } diff --git a/addons/default/visiosoft/advs-module/src/Adv/Table/AdvTableButtons.php b/addons/default/visiosoft/advs-module/src/Adv/Table/AdvTableButtons.php index 11dbe6196..52fa90443 100644 --- a/addons/default/visiosoft/advs-module/src/Adv/Table/AdvTableButtons.php +++ b/addons/default/visiosoft/advs-module/src/Adv/Table/AdvTableButtons.php @@ -25,11 +25,19 @@ class AdvTableButtons return ($entry->getStatus() == 'approved') ? "danger" : "success"; }, ], - 'edit', 'settings' => [ 'text' => false, 'href' => false, 'dropdown' => [ + 'edit' => [ + 'icon' => null, + 'href' => function (EntryInterface $entry) { + return route('visiosoft.module.advs::edit_adv', [$entry->id]); + }, + ], + 'fast_edit' => [ + 'href' => '/admin/advs/edit/{entry.id}' + ], 'change_owner' => [ 'data-toggle' => 'modal', 'data-target' => '#modal', diff --git a/addons/default/visiosoft/advs-module/src/AdvsModuleSeeder.php b/addons/default/visiosoft/advs-module/src/AdvsModuleSeeder.php index 3af51f7f2..c66b4ace5 100644 --- a/addons/default/visiosoft/advs-module/src/AdvsModuleSeeder.php +++ b/addons/default/visiosoft/advs-module/src/AdvsModuleSeeder.php @@ -1,10 +1,12 @@ call(StatusSeeder::class); } } \ No newline at end of file diff --git a/addons/default/visiosoft/advs-module/src/AdvsModuleServiceProvider.php b/addons/default/visiosoft/advs-module/src/AdvsModuleServiceProvider.php index 538657d81..ccfcbb300 100644 --- a/addons/default/visiosoft/advs-module/src/AdvsModuleServiceProvider.php +++ b/addons/default/visiosoft/advs-module/src/AdvsModuleServiceProvider.php @@ -3,6 +3,7 @@ use Anomaly\FilesModule\File\FileModel; use Anomaly\Streams\Platform\Addon\AddonCollection; use Anomaly\Streams\Platform\Addon\AddonServiceProvider; +use Anomaly\Streams\Platform\Model\Advs\AdvsStatusEntryModel; use Anomaly\Streams\Platform\Model\Location\LocationVillageEntryModel; use Anomaly\Streams\Platform\Ui\Table\Event\TableIsQuerying; use Visiosoft\AdvsModule\Adv\Contract\AdvRepositoryInterface; @@ -21,6 +22,9 @@ use Visiosoft\AdvsModule\Productoption\Contract\ProductoptionRepositoryInterface use Visiosoft\AdvsModule\Productoption\ProductoptionRepository; use Visiosoft\AdvsModule\ProductoptionsValue\Contract\ProductoptionsValueRepositoryInterface; use Visiosoft\AdvsModule\ProductoptionsValue\ProductoptionsValueRepository; +use Visiosoft\AdvsModule\Status\Contract\StatusRepositoryInterface; +use Visiosoft\AdvsModule\Status\StatusModel; +use Visiosoft\AdvsModule\Status\StatusRepository; use Visiosoft\LocationModule\Village\Contract\VillageRepositoryInterface; use Visiosoft\LocationModule\Village\VillageRepository; use Visiosoft\LocationModule\Village\VillageModel; @@ -229,6 +233,12 @@ class AdvsModuleServiceProvider extends AddonServiceProvider 'admin/advs/product_options' => 'Visiosoft\AdvsModule\Http\Controller\Admin\ProductoptionsController@index', 'admin/advs/product_options/create' => 'Visiosoft\AdvsModule\Http\Controller\Admin\ProductoptionsController@create', 'admin/advs/product_options/edit/{id}' => 'Visiosoft\AdvsModule\Http\Controller\Admin\ProductoptionsController@edit', + + // StatusController + 'ad/{ad_id}/change-status/{status_id}' => [ + 'as' => 'visiosoft.module.advs::ad.change.status', + 'uses' => 'Visiosoft\AdvsModule\Http\Controller\StatusController@change' + ], ]; protected $middleware = [ @@ -245,6 +255,7 @@ class AdvsModuleServiceProvider extends AddonServiceProvider protected $bindings = [ LocationVillageEntryModel::class => VillageModel::class, AdvsAdvsEntryModel::class => AdvModel::class, + AdvsStatusEntryModel::class => StatusModel::class, 'my_form' => AdvFormBuilder::class, ]; @@ -257,6 +268,7 @@ class AdvsModuleServiceProvider extends AddonServiceProvider ProductoptionRepositoryInterface::class => ProductoptionRepository::class, OptionConfigurationRepositoryInterface::class => OptionConfigurationRepository::class, ProductoptionsValueRepositoryInterface::class => ProductoptionsValueRepository::class, + StatusRepositoryInterface::class => StatusRepository::class, ]; public function boot(AddonCollection $addonCollection, FileModel $fileModel) diff --git a/addons/default/visiosoft/advs-module/src/Http/Controller/Admin/StatusController.php b/addons/default/visiosoft/advs-module/src/Http/Controller/Admin/StatusController.php index e61072dd4..6dfe80dd2 100644 --- a/addons/default/visiosoft/advs-module/src/Http/Controller/Admin/StatusController.php +++ b/addons/default/visiosoft/advs-module/src/Http/Controller/Admin/StatusController.php @@ -1,43 +1,32 @@ render(); } - /** - * Create a new entry. - * - * @param StatusFormBuilder $form - * @return \Symfony\Component\HttpFoundation\Response - */ public function create(StatusFormBuilder $form) { return $form->render(); } - /** - * Edit an existing entry. - * - * @param StatusFormBuilder $form - * @param $id - * @return \Symfony\Component\HttpFoundation\Response - */ - public function edit(StatusFormBuilder $form, $id) + public function edit(StatusFormBuilder $form, StatusRepositoryInterface $statusRepository, $id) { + $status = $statusRepository->find($id); + + if ($status->is_system) { + $form->skipField('user_access'); + } + + $form->skipField('slug'); + return $form->render($id); } } diff --git a/addons/default/visiosoft/advs-module/src/Http/Controller/StatusController.php b/addons/default/visiosoft/advs-module/src/Http/Controller/StatusController.php new file mode 100644 index 000000000..2ba44ab41 --- /dev/null +++ b/addons/default/visiosoft/advs-module/src/Http/Controller/StatusController.php @@ -0,0 +1,37 @@ +advRepository = $advRepository; + $this->statusRepository = $statusRepository; + } + + public function change($adID, $statusID) + { + $ad = $this->advRepository->find($adID); + $status = $this->statusRepository->find($statusID); + + if (!$ad || !$status) { + abort(404); + } + + $ad->changeStatus($status->slug); + + $this->messages->success(trans( + 'visiosoft.module.advs::message.status_change', + ['status' => $status->name] + )); + + return redirect()->back(); + } +} diff --git a/addons/default/visiosoft/advs-module/src/Http/Controller/advsController.php b/addons/default/visiosoft/advs-module/src/Http/Controller/advsController.php index 75cd98210..a5a7a9389 100644 --- a/addons/default/visiosoft/advs-module/src/Http/Controller/advsController.php +++ b/addons/default/visiosoft/advs-module/src/Http/Controller/advsController.php @@ -1,6 +1,5 @@ model = $model; } + + public function getUserAccessibleStatuses() + { + return $this->newQuery()->where(['is_system' => 0, 'user_access' => 1])->get(); + } } diff --git a/addons/default/visiosoft/advs-module/src/Status/StatusSeeder.php b/addons/default/visiosoft/advs-module/src/Status/StatusSeeder.php index bb2748686..cd0a290c7 100644 --- a/addons/default/visiosoft/advs-module/src/Status/StatusSeeder.php +++ b/addons/default/visiosoft/advs-module/src/Status/StatusSeeder.php @@ -1,15 +1,41 @@ 'Approved', + 'slug' => 'approved', + ], + [ + 'name' => 'Declined', + 'slug' => 'declined', + ], + [ + 'name' => 'Passive', + 'slug' => 'passive', + ], + [ + 'name' => 'Pending User', + 'slug' => 'pending_user', + ], + ]; + + foreach ($systemStatuses as $status) { + if (!$statusRepository->findBy('slug', $status['slug'])) { + $statusRepository->create([ + 'name' => $status['name'], + 'slug' => $status['slug'], + 'is_system' => true, + 'user_access' => false, + ]); + } + } } } diff --git a/addons/default/visiosoft/advs-module/src/Status/Table/StatusTableBuilder.php b/addons/default/visiosoft/advs-module/src/Status/Table/StatusTableBuilder.php index 950e729f0..a9f061c9a 100644 --- a/addons/default/visiosoft/advs-module/src/Status/Table/StatusTableBuilder.php +++ b/addons/default/visiosoft/advs-module/src/Status/Table/StatusTableBuilder.php @@ -4,60 +4,11 @@ use Anomaly\Streams\Platform\Ui\Table\TableBuilder; class StatusTableBuilder extends TableBuilder { - - /** - * The table views. - * - * @var array|string - */ - protected $views = []; - - /** - * The table filters. - * - * @var array|string - */ - protected $filters = []; - - /** - * The table columns. - * - * @var array|string - */ - protected $columns = [ - 'name', - ]; - - /** - * The table buttons. - * - * @var array|string - */ protected $buttons = [ 'edit' ]; - /** - * The table actions. - * - * @var array|string - */ protected $actions = [ 'delete' ]; - - /** - * The table options. - * - * @var array - */ - protected $options = []; - - /** - * The table assets. - * - * @var array - */ - protected $assets = []; - } diff --git a/addons/default/visiosoft/advs-module/src/Status/Table/StatusTableColumns.php b/addons/default/visiosoft/advs-module/src/Status/Table/StatusTableColumns.php new file mode 100644 index 000000000..9184d4381 --- /dev/null +++ b/addons/default/visiosoft/advs-module/src/Status/Table/StatusTableColumns.php @@ -0,0 +1,28 @@ + [ + 'value' => function (EntryInterface $entry) use ($yes, $no) { + return $entry->is_system ? $yes : $no; + } + ], + 'user_access' => [ + 'value' => function (EntryInterface $entry) use ($yes, $no) { + return $entry->user_access ? $yes : $no; + } + ], + ]; + + $builder->setColumns($columns); + } +} diff --git a/addons/default/visiosoft/profile-module/resources/assets/js/ads.js b/addons/default/visiosoft/profile-module/resources/assets/js/ads.js index 67a85f9d0..da2b03ed9 100644 --- a/addons/default/visiosoft/profile-module/resources/assets/js/ads.js +++ b/addons/default/visiosoft/profile-module/resources/assets/js/ads.js @@ -164,6 +164,29 @@ function dropdownRow(id, type) { extend_ad + "\n"; + if (Object.keys(userStatus).length) { + let statusItems = '' + for (const status in userStatus) { + statusItems += ` +