wip on visa/master payment

This commit is contained in:
2024-09-05 16:27:58 +05:00
parent 837d2a4704
commit 0939b59ec3
6 changed files with 415 additions and 26 deletions

View File

@@ -35,24 +35,18 @@ class VisaMasterPaymentOrder extends Model implements HasMedia
'payment_reciever' => 'array',
];
/**
* Media conversions
*
* @param Media|null $media
*/
public function registerMediaConversions(?Media $media = null): void
{
$this->addMediaConversion('thumb')
->width(200)
->height(200);
}
/**
* Media collections
*/
public function registerMediaCollections(): void
{
$this->addMediaCollection('main');
foreach (static::reciverFiles() as $reciverFile) {
$this->addMediaCollection($reciverFile['code'])->singleFile();
}
foreach (static::senderFiles() as $senderFile) {
$this->addMediaCollection($senderFile['code'])->singleFile();
}
}
/**
@@ -73,4 +67,87 @@ class VisaMasterPaymentOrder extends Model implements HasMedia
'master' => __('Master'),
];
}
/**
* Required files
*/
public static function reciverFiles(): array
{
return [
[
'required' => true,
'code' => 'requisite',
'name' => 'Talyba degişli walýuta “VISA” kartyň rekwizitleri',
],
[
'required' => false,
'code' => 'document_stating_he_is_studying',
'name' => 'Talybyň daşary ýurt döwletiniň ýokary okuw mekdebinde okaýandygy baradaky güwänamasy',
],
[
'required' => false,
'code' => 'passport_local',
'name' => 'Talyba degişli Türkmenistanyň raýatynyň (içki milli) pasportynyň asyl görnüşi we göçürmesi',
],
[
'required' => false,
'code' => 'passport_international',
'name' => 'Talybyň Türkmenistandan çykmak we Türkmenistana girmek üçin (zagran) pasportynyň göçürmesi',
],
[
'required' => false,
'code' => 'visa',
'name' => 'Talybyň Türkmenistandan çykmak we Türkmenistana girmek üçin pasportyndaky daşary ýurtda galyp okap bilýändigi baradaky berlen möhleti hereket edýän rugsatnamasynyň (wizasynyň) bellenen sahypasynyň göçürmesi',
],
[
'required' => false,
'code' => 'travel_stamp_on_passport',
'name' => 'Talybyň Türkmenistandan çykmak we Türkmenistana girmek üçin pasportyndaky Türkmenistandan çykandygy we daşary ýurt döwletine girendigi baradaky ştamplaryň (seneli ştampyň) bellenen sahypasynyň göçürmesi',
],
[
'required' => false,
'code' => 'document_stating_he_is_studying_2',
'name' => 'Talybyň daşary ýurt döwletiniň ýokary okuw mekdebinde okaýandygy baradaky güwänamasyndaky maglumatyň doly takyk däl ýagdaýynda takyk däl maglumatyň sebäpleri baradaky daşary ýurt döwletiniň ýokary okuw mekdebinden haty',
],
];
}
/**
* Sender files
*/
public static function senderFiles(): array
{
return [
[
'required' => true,
'code' => 'passport_local',
'name' => 'ugradyja degişli Türkmenistanyň raýatynyň (içki milli) pasportynyň asyl görnüşi we göçürmesi',
],
[
'required' => false,
'code' => 'passport_international',
'name' => 'ugradyja degişli Türkmenistandan çykmak we Türkmenistana girmek üçin pasportynyň asyl görnüşi we göçürmesi',
],
[
'required' => false,
'code' => 'travel_stamp_on_passport',
'name' => 'ugradyja degişli Türkmenistandan çykmak we Türkmenistana girmek üçin pasportyndaky daşary döwletine gidendigi we daşary döwlete barandygy baradaky (ştampyň) bellenen sahypasynyň göçürmesi',
],
[
'required' => true,
'code' => 'proof_of_kinship',
'name' => 'ugradyjynyň we kabul edijiniň (talybyň) özara garyndaşlyk derejesini tassyklaýjy resminamalarynyň göçürmesi',
],
[
'required' => false,
'code' => 'passport_local_old',
'name' => 'ugradyjy we kabul ediji (talyp) 2015-nji ýyldan soňra Türkmenistanyň raýatynyň pasportyny ikinji gezek alan bolsa, onda birinji gezek alan pasportynyň seriýasy baradaky maglumat',
],
[
'required' => false,
'code' => 'passport_local_old_replacement',
'name' => 'ugradyjy we kabul ediji (talyp) 2015-nji ýyldan soňra Türkmenistanyň raýatynyň pasportyny ikinji gezek alandan soňra birinji gezek alan pasportynyň seriýasy baradaky maglumaty bilmeýän ,bolsa onda polisiýanyň degişli edaralaryndan birinji alan pasportynyň seriýasy baradaky güwänamasy',
],
];
}
}

View File

@@ -11,7 +11,6 @@ use App\Repos\Order\OrderRepo;
use App\Repos\System\Nova\NovaRepo;
use App\Repos\System\Settings\Legal\PassportRepo;
use App\Repos\System\Settings\Location\RegionRepo;
use Ebess\AdvancedNovaMediaLibrary\Fields\Files;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;
use Laravel\Nova\Fields\Badge;
@@ -104,13 +103,14 @@ class NovaVisaMasterPaymentOrder extends Resource
public function fields(NovaRequest $request): array
{
return [
ID::hidden(),
new Panel(__('New :resource', ['resource' => $this->singularLabel()]), [
ID::make()
->hideFromDetail(),
Hidden::make('user_id')
->default(auth()->id())
->hideWhenUpdating(),
new Panel(__('New :resource', ['resource' => $this->singularLabel()]), [
Text::make(__('ID'), 'unique_id')
->exceptOnForms(),
@@ -229,13 +229,10 @@ class NovaVisaMasterPaymentOrder extends Resource
attribute: 'full_name'
),
])->maxRows(1)->minRows(1)->rules('required'),
Files::make('Talap edilýän resminamalar', 'main')
->conversionOnIndexView('thumb')
->rules('required')
->required()
->hideFromIndex(),
]),
// new Panel(__('Reciver files'), VisaMasterPaymentOrderFileFields::reciverFiles()),
// new Panel(__('Sender files'), VisaMasterPaymentOrderFileFields::senderFiles()),
];
}
}

View File

@@ -0,0 +1,45 @@
<?php
namespace App\Modules\VisaMasterPaymentOrder\Nova\Resources;
use App\Modules\VisaMasterPaymentOrder\Models\VisaMasterPaymentOrder;
use Ebess\AdvancedNovaMediaLibrary\Fields\Files;
use Laravel\Nova\Fields\File;
class VisaMasterPaymentOrderFileFields
{
/**
* Reciver files
*/
public static function reciverFiles(): array
{
return collect(VisaMasterPaymentOrder::reciverFiles())
->map(fn (array $file) => Files::make(__($file['name']), $file['code'])
->size('w-1/2')
->rules($file['required'] ? 'required' : 'nullable')
->required($file['required'])
)
->toArray();
}
/**
* Sender files
*/
public static function senderFiles(): array
{
return collect(VisaMasterPaymentOrder::senderFiles())
->map(fn (array $file) => Files::make(__($file['name']), $file['code'])
->size('w-1/2')
->rules($file['required'] ? 'required' : 'nullable')
->required($file['required'])
)
->toArray();
}
}
// File::make(__($file['name']), $file['code'])
// ->size('w-1/2')
// ->deletable(false)
// ->rules('max:2048', 'mimes:jpg,png,jpeg')
// ->creationRules($file['required'] ? 'required' : 'nullable')
// ->updateRules('nullable')

42
index.html Normal file
View File

@@ -0,0 +1,42 @@
<div id="app">
<div v-for="(step, index) in steps" :key="index" v-show="currentStep === index">
<h2>Step {{ index + 1 }}</h2>
<div v-html="step.content"></div>
<button v-if="currentStep > 0" @click="prevStep">Previous</button>
<button v-if="currentStep < steps.length - 1" @click="nextStep">Next</button>
<button v-if="currentStep === steps.length - 1" @click="submitForm">Submit</button>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
<script>
new Vue({
el: '#app',
data: {
currentStep: 0,
steps: [
{ content: '<div>Step 1 content goes here</div>' },
{ content: '<div>Step 2 content goes here</div>' },
{ content: '<div>Step 3 content goes here</div>' },
{ content: '<div>Step 4 content goes here</div>' },
{ content: '<div>Step 5 content goes here</div>' },
{ content: '<div>Step 6 content goes here</div>' }
]
},
methods: {
nextStep() {
if (this.currentStep < this.steps.length - 1) {
this.currentStep++;
}
},
prevStep() {
if (this.currentStep > 0) {
this.currentStep--;
}
},
submitForm() {
alert('Form submitted!');
}
}
});
</script>

View File

@@ -0,0 +1,168 @@
// window.LaravelNovaWizardStore = {
// data: {
// steps: 0,
// currentStep: 1,
// },
// fields: {
// buttonsContainerElement: {},
// cancelFormButton: {},
// createFormButton: {},
// prevButtonElement: {},
// nextButtonElement: {},
// },
// nextStep() {
// if (this.data.steps > 0 && this.data.currentStep < this.data.steps) {
// document.querySelector(`div[wizard-step="${this.data.currentStep}"]`).style.display = 'none';
// this.data.currentStep++;
// document.querySelector(`div[wizard-step="${this.data.currentStep}"]`).style.display = 'inherit';
// return;
// }
// if (this.data.currentStep === this.data.steps) {
// this.hideNextButton()
// this.showFormSubmitButton()
// } else {
// this.hideFormSubmitButton()
// this.showNextButton()
// }
// },
// prevStep() {
// if (this.data.currentStep > 1) {
// document.querySelector(`div[wizard-step="${this.data.currentStep}"]`).style.display = 'none';
// this.data.currentStep--;
// document.querySelector(`div[wizard-step="${this.data.currentStep}"]`).style.display = 'inherit';
// }
// },
// hideNovaFormButtons() {
// this.fields.cancelFormButton = document.querySelector('button[dusk="cancel-create-button"]');
// this.fields.createFormButton = document.querySelector('button[dusk="create-button"]');
// this.fields.buttonsContainerElement = this.fields.createFormButton.parentNode;
// this.hideFormSubmitButton();
// this.hideFormCancelButton();
// },
// addWizardButtons() {
// this.fields.buttonsContainerElement.insertAdjacentHTML('afterbegin', this.nextButtonTemplate());
// this.fields.buttonsContainerElement.insertAdjacentHTML('afterbegin', this.prevButtonTemplate());
// this.fields.nextButtonElement = document.getElementById('laravel-nova-wizard-next-button');
// this.fields.prevButtonElement = document.getElementById('laravel-nova-wizard-prev-button');
// this.fields.nextButtonElement.addEventListener('click', () => {
// this.nextStep()
// })
// this.fields.prevButtonElement.addEventListener('click', () => {
// this.prevStep()
// })
// },
// nextButtonTemplate() {
// return `
// <button type="button" id="laravel-nova-wizard-next-button" class="border text-left appearance-none cursor-pointer rounded text-sm font-bold focus:outline-none focus:ring ring-primary-200 dark:ring-gray-600 relative disabled:cursor-not-allowed inline-flex items-center justify-center shadow h-9 px-3 bg-primary-500 border-primary-500 hover:[&amp;:not(:disabled)]:bg-primary-400 hover:[&amp;:not(:disabled)]:border-primary-400 text-white dark:text-gray-900">
// <span class="flex items-center gap-1">Next</span>
// </button>
// `;
// },
// prevButtonTemplate() {
// return `
// <button type="button" id="laravel-nova-wizard-prev-button" class="border text-left appearance-none cursor-pointer rounded text-sm font-bold focus:outline-none focus:ring ring-primary-200 dark:ring-gray-600 relative disabled:cursor-not-allowed inline-flex items-center justify-center shadow h-9 px-3 bg-red-500 border-red-500 hover:[&amp;:not(:disabled)]:border-primary-400 text-white dark:text-gray-900">
// <span class="flex items-center gap-1">Previus</span>
// </button>
// `;
// },
// hidePrevButton() {
// this.fields.prevButtonElement.style.display = 'none'
// },
// showPrevButton() {
// this.fields.prevButtonElement.style.display = 'inherit'
// },
// hideNextButton() {
// this.fields.nextButtonElement.style.display = 'none'
// },
// showNextButton() {
// this.fields.nextButtonElement.style.display = 'inherit'
// },
// showFormSubmitButton() {
// this.fields.createFormButton.style.display = 'inherit';
// },
// hideFormSubmitButton() {
// this.fields.createFormButton.style.display = 'none';
// },
// hideFormCancelButton() {
// this.fields.cancelFormButton.style.display = 'none';
// }
// };
// function setupMultiStepWizard() {
// let refreshIntervalId = setInterval(() => {
// let formElement = document.querySelector('form');
// if (formElement) {
// clearInterval(refreshIntervalId)
// // Div container
// let fieldsContainerElement = formElement.firstChild;
// // Div elements
// let fieldElements = Array.from(fieldsContainerElement.children);
// // if there a less than 2 divs, no need to wizard it!
// if (fieldElements.length < 2) {
// return;
// }
// LaravelNovaWizardStore.data.steps = fieldElements.length;
// LaravelNovaWizardStore.hideNovaFormButtons()
// LaravelNovaWizardStore.addWizardButtons()
// let loopCount = 0;
// fieldElements.forEach(item => {
// loopCount++;
// item.setAttribute('wizard-step', loopCount)
// if (loopCount === 1) {
// return;
// }
// item.style.display = 'none'
// })
// }
// }, 300);
// }
// Nova.$on('liftedOff', () => {
// if (Nova.$router.page.component === 'Nova.Create') {
// setupMultiStepWizard()
// }
// })
// Nova.$router.on('success', (event) => {
// if (event.detail.page.component === 'Nova.Create') {
// setupMultiStepWizard()
// }
// })
// document.addEventListener('inertia:navigate', () => {
// console.log('page is updating')
// })
// when app is booting
// Nova.booting((app, store) => {})

View File

@@ -0,0 +1,60 @@
<!DOCTYPE html>
<html lang="{{ $locale = \Laravel\Nova\Nova::resolveUserLocale(request()) }}" dir="{{ \Laravel\Nova\Nova::rtlEnabled() ? 'rtl' : 'ltr' }}" class="h-full font-sans antialiased">
<head>
<meta name="theme-color" content="#fff">
<meta charset="utf-8">
<meta name="csrf-token" content="{{ csrf_token() }}">
<meta name="viewport" content="width=device-width"/>
<meta name="locale" content="{{ $locale }}"/>
<meta name="robots" content="noindex">
@include('nova::partials.meta')
<!-- Styles -->
<link rel="stylesheet" href="{{ mix('app.css', 'vendor/nova') }}">
@if ($styles = \Laravel\Nova\Nova::availableStyles(request()))
<!-- Tool Styles -->
@foreach($styles as $asset)
<link rel="stylesheet" href="{!! $asset->url() !!}">
@endforeach
@endif
<script>
if (localStorage.novaTheme === 'dark' || (!('novaTheme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
document.documentElement.classList.add('dark')
} else {
document.documentElement.classList.remove('dark')
}
</script>
</head>
<body class="min-w-site text-sm font-medium min-h-full text-gray-500 dark:text-gray-400 bg-gray-100 dark:bg-gray-900">
@inertia
<!-- Scripts -->
<script src="{{ mix('manifest.js', 'vendor/nova') }}"></script>
<script src="{{ mix('vendor.js', 'vendor/nova') }}"></script>
<script src="{{ mix('app.js', 'vendor/nova') }}"></script>
<!-- Build Nova Instance -->
<script>
const config = @json(\Laravel\Nova\Nova::jsonVariables(request()));
window.Nova = createNovaApp(config)
Nova.countdown()
</script>
@if ($scripts = \Laravel\Nova\Nova::availableScripts(request()))
<!-- Tool Scripts -->
@foreach ($scripts as $asset)
<script src="{!! $asset->url() !!}"></script>
@endforeach
@endif
<!-- Start Nova -->
<script defer>
Nova.liftOff()
Nova.$emit('liftedOff')
</script>
</body>
</html>