pull/1/head
Aji Kamaludin 3 years ago
parent 61efcdb870
commit e6d86840c1
No known key found for this signature in database
GPG Key ID: 670E1F26AD5A8099

@ -16,6 +16,7 @@ class Kernel extends ConsoleKernel
protected function schedule(Schedule $schedule) protected function schedule(Schedule $schedule)
{ {
// $schedule->command('inspire')->hourly(); // $schedule->command('inspire')->hourly();
$schedule->command('telescope:prune')->daily();
} }
/** /**

@ -0,0 +1,18 @@
<?php
namespace App\Http\Controllers\Api;
use App\Models\Category;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class CategoriesQuery extends Controller
{
public function __invoke(Request $request)
{
if ($request->q != null) {
return Category::where('name', 'like', '%'.$request->q.'%')->limit(10)->get();
}
return Category::limit(10)->get();
}
}

@ -6,6 +6,7 @@ use DB;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Models\Transaction; use App\Models\Transaction;
use App\Models\Category; use App\Models\Category;
use App\Models\Budget;
class ExpenseController extends Controller class ExpenseController extends Controller
{ {
@ -13,7 +14,6 @@ class ExpenseController extends Controller
{ {
return inertia('Transaction', [ return inertia('Transaction', [
'transactions' => Transaction::with(['category:name,id'])->orderBy('date', 'desc')->paginate(10), 'transactions' => Transaction::with(['category:name,id'])->orderBy('date', 'desc')->paginate(10),
'categories' => Category::all()
]); ]);
} }
@ -62,8 +62,7 @@ class ExpenseController extends Controller
]); ]);
DB::beginTransaction(); DB::beginTransaction();
// return when it create if ($transaction->is_income == 0) {
if ($transaction->is_income == 0) { // pasti ada
$budget = $transaction->category->budgets()->where('end_date', null)->first(); $budget = $transaction->category->budgets()->where('end_date', null)->first();
$budget->update(['total_used' => $budget->total_used - $transaction->amount]); $budget->update(['total_used' => $budget->total_used - $transaction->amount]);
if ($transaction->income_type == 1) { if ($transaction->income_type == 1) {
@ -79,9 +78,11 @@ class ExpenseController extends Controller
$transaction->update($request->input()); $transaction->update($request->input());
// add new
if ($transaction->is_income == 0) { if ($transaction->is_income == 0) {
$budget = $transaction->category->budgets()->where('end_date', null)->first(); $budget = Budget::where([
['end_date', '=', null],
['category_id', '=', $transaction->category_id]
])->first();
$budget->update(['total_used' => $budget->total_used + $request->amount]); $budget->update(['total_used' => $budget->total_used + $request->amount]);
if ($request->income_type == 1) { if ($request->income_type == 1) {
$budget->update([ $budget->update([
@ -101,8 +102,7 @@ class ExpenseController extends Controller
public function destroy(Transaction $transaction) public function destroy(Transaction $transaction)
{ {
DB::beginTransaction(); DB::beginTransaction();
// return when it create if ($transaction->is_income == 0 && $transaction->category->deleted_at == null) {
if ($transaction->is_income == 0 && $transaction->category->deleted_at == null) { // pasti ada
$budget = $transaction->category->budgets()->where('end_date', null)->first(); $budget = $transaction->category->budgets()->where('end_date', null)->first();
$budget->update(['total_used' => $budget->total_used - $transaction->amount]); $budget->update(['total_used' => $budget->total_used - $transaction->amount]);
if ($transaction->income_type == 1) { if ($transaction->income_type == 1) {

@ -2,6 +2,8 @@
namespace App\Providers; namespace App\Providers;
use DB;
use Log;
use Illuminate\Support\ServiceProvider; use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider class AppServiceProvider extends ServiceProvider
@ -23,6 +25,12 @@ class AppServiceProvider extends ServiceProvider
*/ */
public function boot() public function boot()
{ {
// DB::listen(function ($query) {
Log::info(
$query->sql,
$query->bindings,
$query->time
);
});
} }
} }

@ -0,0 +1,71 @@
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Gate;
use Laravel\Telescope\IncomingEntry;
use Laravel\Telescope\Telescope;
use Laravel\Telescope\TelescopeApplicationServiceProvider;
class TelescopeServiceProvider extends TelescopeApplicationServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
// Telescope::night();
$this->hideSensitiveRequestDetails();
Telescope::filter(function (IncomingEntry $entry) {
if ($this->app->environment('local')) {
return true;
}
return $entry->isReportableException() ||
$entry->isFailedRequest() ||
$entry->isFailedJob() ||
$entry->isScheduledTask() ||
$entry->hasMonitoredTag();
});
}
/**
* Prevent sensitive request details from being logged by Telescope.
*
* @return void
*/
protected function hideSensitiveRequestDetails()
{
if ($this->app->environment('local')) {
return;
}
Telescope::hideRequestParameters(['_token']);
Telescope::hideRequestHeaders([
'cookie',
'x-csrf-token',
'x-xsrf-token',
]);
}
/**
* Register the Telescope gate.
*
* This gate determines who can access Telescope in non-local environments.
*
* @return void
*/
protected function gate()
{
Gate::define('viewTelescope', function ($user) {
return in_array($user->email, [
//
]);
});
}
}

@ -11,6 +11,7 @@
"inertiajs/inertia-laravel": "^0.3.5", "inertiajs/inertia-laravel": "^0.3.5",
"laravel/framework": "^8.65", "laravel/framework": "^8.65",
"laravel/sanctum": "^2.6", "laravel/sanctum": "^2.6",
"laravel/telescope": "^4.6",
"laravel/tinker": "^2.5", "laravel/tinker": "^2.5",
"maatwebsite/excel": "^3.1", "maatwebsite/excel": "^3.1",
"tightenco/ziggy": "^1.0" "tightenco/ziggy": "^1.0"

69
composer.lock generated

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "805ff3dd2c036c3a345bdd624cee8b95", "content-hash": "794603a9432e7255408172a9fa828720",
"packages": [ "packages": [
{ {
"name": "asm89/stack-cors", "name": "asm89/stack-cors",
@ -1372,6 +1372,73 @@
}, },
"time": "2021-11-30T15:53:04+00:00" "time": "2021-11-30T15:53:04+00:00"
}, },
{
"name": "laravel/telescope",
"version": "v4.6.9",
"source": {
"type": "git",
"url": "https://github.com/laravel/telescope.git",
"reference": "848d32cbeb4eca82cacea821dd59cc4df10f4182"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/telescope/zipball/848d32cbeb4eca82cacea821dd59cc4df10f4182",
"reference": "848d32cbeb4eca82cacea821dd59cc4df10f4182",
"shasum": ""
},
"require": {
"ext-json": "*",
"laravel/framework": "^8.29",
"php": "^7.3|^8.0",
"symfony/var-dumper": "^5.0"
},
"require-dev": {
"ext-gd": "*",
"orchestra/testbench": "^6.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.x-dev"
},
"laravel": {
"providers": [
"Laravel\\Telescope\\TelescopeServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Laravel\\Telescope\\": "src/",
"Laravel\\Telescope\\Database\\Factories\\": "database/factories/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Taylor Otwell",
"email": "taylor@laravel.com"
},
{
"name": "Mohamed Said",
"email": "mohamed@laravel.com"
}
],
"description": "An elegant debug assistant for the Laravel framework.",
"keywords": [
"debugging",
"laravel",
"monitoring"
],
"support": {
"issues": "https://github.com/laravel/telescope/issues",
"source": "https://github.com/laravel/telescope/tree/v4.6.9"
},
"time": "2021-12-07T16:37:53+00:00"
},
{ {
"name": "laravel/tinker", "name": "laravel/tinker",
"version": "v2.6.3", "version": "v2.6.3",

@ -174,6 +174,7 @@ return [
// App\Providers\BroadcastServiceProvider::class, // App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class, App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class, App\Providers\RouteServiceProvider::class,
App\Providers\TelescopeServiceProvider::class,
], ],

@ -0,0 +1,171 @@
<?php
use Laravel\Telescope\Http\Middleware\Authorize;
use Laravel\Telescope\Watchers;
return [
/*
|--------------------------------------------------------------------------
| Telescope Domain
|--------------------------------------------------------------------------
|
| This is the subdomain where Telescope will be accessible from. If the
| setting is null, Telescope will reside under the same domain as the
| application. Otherwise, this value will be used as the subdomain.
|
*/
'domain' => env('TELESCOPE_DOMAIN', null),
/*
|--------------------------------------------------------------------------
| Telescope Path
|--------------------------------------------------------------------------
|
| This is the URI path where Telescope will be accessible from. Feel free
| to change this path to anything you like. Note that the URI will not
| affect the paths of its internal API that aren't exposed to users.
|
*/
'path' => env('TELESCOPE_PATH', 'telescope'),
/*
|--------------------------------------------------------------------------
| Telescope Storage Driver
|--------------------------------------------------------------------------
|
| This configuration options determines the storage driver that will
| be used to store Telescope's data. In addition, you may set any
| custom options as needed by the particular driver you choose.
|
*/
'driver' => env('TELESCOPE_DRIVER', 'database'),
'storage' => [
'database' => [
'connection' => env('DB_CONNECTION', 'mysql'),
'chunk' => 1000,
],
],
/*
|--------------------------------------------------------------------------
| Telescope Master Switch
|--------------------------------------------------------------------------
|
| This option may be used to disable all Telescope watchers regardless
| of their individual configuration, which simply provides a single
| and convenient way to enable or disable Telescope data storage.
|
*/
'enabled' => env('TELESCOPE_ENABLED', true),
/*
|--------------------------------------------------------------------------
| Telescope Route Middleware
|--------------------------------------------------------------------------
|
| These middleware will be assigned to every Telescope route, giving you
| the chance to add your own middleware to this list or change any of
| the existing middleware. Or, you can simply stick with this list.
|
*/
'middleware' => [
'web',
Authorize::class,
],
/*
|--------------------------------------------------------------------------
| Allowed / Ignored Paths & Commands
|--------------------------------------------------------------------------
|
| The following array lists the URI paths and Artisan commands that will
| not be watched by Telescope. In addition to this list, some Laravel
| commands, like migrations and queue commands, are always ignored.
|
*/
'only_paths' => [
// 'api/*'
],
'ignore_paths' => [
'nova-api*',
],
'ignore_commands' => [
//
],
/*
|--------------------------------------------------------------------------
| Telescope Watchers
|--------------------------------------------------------------------------
|
| The following array lists the "watchers" that will be registered with
| Telescope. The watchers gather the application's profile data when
| a request or task is executed. Feel free to customize this list.
|
*/
'watchers' => [
Watchers\BatchWatcher::class => env('TELESCOPE_BATCH_WATCHER', true),
Watchers\CacheWatcher::class => env('TELESCOPE_CACHE_WATCHER', true),
Watchers\ClientRequestWatcher::class => env('TELESCOPE_CLIENT_REQUEST_WATCHER', true),
Watchers\CommandWatcher::class => [
'enabled' => env('TELESCOPE_COMMAND_WATCHER', true),
'ignore' => [],
],
Watchers\DumpWatcher::class => env('TELESCOPE_DUMP_WATCHER', true),
Watchers\EventWatcher::class => [
'enabled' => env('TELESCOPE_EVENT_WATCHER', true),
'ignore' => [],
],
Watchers\ExceptionWatcher::class => env('TELESCOPE_EXCEPTION_WATCHER', true),
Watchers\GateWatcher::class => [
'enabled' => env('TELESCOPE_GATE_WATCHER', true),
'ignore_abilities' => [],
'ignore_packages' => true,
],
Watchers\JobWatcher::class => env('TELESCOPE_JOB_WATCHER', true),
Watchers\LogWatcher::class => env('TELESCOPE_LOG_WATCHER', true),
Watchers\MailWatcher::class => env('TELESCOPE_MAIL_WATCHER', true),
Watchers\ModelWatcher::class => [
'enabled' => env('TELESCOPE_MODEL_WATCHER', true),
'events' => ['eloquent.*'],
'hydrations' => true,
],
Watchers\NotificationWatcher::class => env('TELESCOPE_NOTIFICATION_WATCHER', true),
Watchers\QueryWatcher::class => [
'enabled' => env('TELESCOPE_QUERY_WATCHER', true),
'ignore_packages' => true,
'slow' => 100,
],
Watchers\RedisWatcher::class => env('TELESCOPE_REDIS_WATCHER', true),
Watchers\RequestWatcher::class => [
'enabled' => env('TELESCOPE_REQUEST_WATCHER', true),
'size_limit' => env('TELESCOPE_RESPONSE_SIZE_LIMIT', 64),
'ignore_status_codes' => [],
],
Watchers\ScheduleWatcher::class => env('TELESCOPE_SCHEDULE_WATCHER', true),
Watchers\ViewWatcher::class => env('TELESCOPE_VIEW_WATCHER', true),
],
];

Binary file not shown.

9975
package-lock.json generated

File diff suppressed because it is too large Load Diff

701
public/css/app.css vendored

File diff suppressed because it is too large Load Diff

625
public/js/app.js vendored

@ -2151,6 +2151,275 @@ function Button(_ref) {
/***/ }), /***/ }),
/***/ "./resources/js/Components/CategorySelectInput.js":
/*!********************************************************!*\
!*** ./resources/js/Components/CategorySelectInput.js ***!
\********************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (/* binding */ CategorySelectInput)
/* harmony export */ });
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
/* harmony import */ var _Hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/Hooks */ "./resources/js/Hooks/index.js");
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js");
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
/*
Select Input Common React Component
Inspired By: react-select , https://codepen.io/dixie0704/pen/jOVxGXL, and others
Created By: Aji Kamaludin <aji19kamaludin@gmail.com>
*/
function CategorySelectInput(props) {
var _props$value = props.value,
value = _props$value === void 0 ? '' : _props$value,
_props$onItemSelected = props.onItemSelected,
onItemSelected = _props$onItemSelected === void 0 ? null : _props$onItemSelected,
_props$disabled = props.disabled,
disabled = _props$disabled === void 0 ? false : _props$disabled,
_props$createNew = props.createNew,
createNew = _props$createNew === void 0 ? null : _props$createNew,
_props$invalid = props.invalid,
invalid = _props$invalid === void 0 ? false : _props$invalid;
var ref = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)();
var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]),
_useState2 = _slicedToArray(_useState, 2),
showItems = _useState2[0],
setShowItem = _useState2[1];
var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true),
_useState4 = _slicedToArray(_useState3, 2),
isSelected = _useState4[0],
setIsSelected = _useState4[1];
var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(value),
_useState6 = _slicedToArray(_useState5, 2),
selected = _useState6[0],
setSelected = _useState6[1];
var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(''),
_useState8 = _slicedToArray(_useState7, 2),
query = _useState8[0],
setQuery = _useState8[1];
var q = (0,_Hooks__WEBPACK_IMPORTED_MODULE_1__.useDebounce)(query, 300);
var _useState9 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),
_useState10 = _slicedToArray(_useState9, 2),
isOpen = _useState10[0],
setIsOpen = _useState10[1];
var _useState11 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),
_useState12 = _slicedToArray(_useState11, 2),
loading = _useState12[0],
setLoading = _useState12[1];
var toggle = function toggle() {
setIsSelected(false);
setQuery('');
setIsOpen(!isOpen);
};
var onInputMouseDown = function onInputMouseDown() {
setIsSelected(false);
setQuery('');
setIsOpen(true);
};
var handleSelectItem = function handleSelectItem(item) {
setIsSelected(true);
onItemSelected(item);
setSelected(item.name);
setIsOpen(false);
};
var filterItems = function filterItems(value) {
setIsSelected(false);
setQuery(value);
};
(0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {
var checkIfClickedOutside = function checkIfClickedOutside(e) {
if (isOpen && ref.current && !ref.current.contains(e.target)) {
setIsOpen(false);
}
};
document.addEventListener('mousedown', checkIfClickedOutside);
return function () {
document.removeEventListener('mousedown', checkIfClickedOutside);
};
}, [isOpen]);
(0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {
setLoading(true);
fetch("".concat(route('api.categories.query'), "?q=").concat(q)).then(function (res) {
return res.json();
}).then(function (json) {
setShowItem(json);
})["catch"](function (err) {
alert(err);
})["finally"](function () {
return setLoading(false);
});
}, [q]);
(0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {
setSelected('');
}, [disabled]);
(0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {
setSelected(value);
}, [value]);
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("div", {
className: "flex flex-col items-center",
ref: ref,
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("div", {
className: "w-full flex flex-col items-center",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("div", {
className: "w-full",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsxs)("div", {
className: "flex flex-col items-center relative",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("div", {
className: "w-full",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsxs)("div", {
className: "my-2 p-1 bg-white flex border rounded-lg \n ".concat(invalid ? 'border-red-500' : 'border-gray-300', "\n ").concat(disabled ? 'bg-gray-50' : ''),
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("input", {
className: "p-1 px-2 appearance-none outline-none w-full text-gray-800",
onMouseDown: onInputMouseDown,
placeholder: "select category...",
value: isSelected ? selected : query,
onChange: function onChange(e) {
return filterItems(e.target.value);
},
disabled: disabled
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("div", {
onClick: disabled ? function () {} : toggle,
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("button", {
className: "cursor-pointer w-6 h-6 text-gray-600 outline-none focus:outline-none",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("svg", {
xmlns: "http://www.w3.org/2000/svg",
width: "100%",
height: "100%",
fill: "none",
viewBox: "0 0 24 24",
stroke: "currentColor",
strokeWidth: "2",
strokeLinecap: "round",
strokeLinejoin: "round",
children: isOpen ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("polyline", {
points: "18 15 12 9 6 15"
}) : /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("polyline", {
points: "18 15 12 20 6 15"
})
})
})
})]
})
}), isOpen && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("div", {
className: "absolute shadow-lg bg-white top-100 z-40 w-full lef-0 rounded overflow-y-auto",
style: {
maxHeight: '300px',
top: '100%'
},
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("div", {
className: "flex flex-col w-full",
children: loading ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("div", {
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("div", {
className: "flex w-full items-center p-2 pl-2 border-transparent border-l-2 relative hover:border-neutral-content",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("div", {
className: "w-full items-center justify-center flex",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("div", {
className: "mx-2 my-5",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("span", {
children: "Loading..."
})
})
})
})
}) : /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.Fragment, {
children: [createNew !== null && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("div", {
className: "bordered",
onClick: createNew,
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("div", {
className: "flex w-full items-center justify-center p-2 pl-2 border-transparent border-l-2 relative hover:bg-gray-600 hover:text-white",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsxs)("div", {
className: "w-full items-center justify-center flex space-x-2",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("svg", {
xmlns: "http://www.w3.org/2000/svg",
className: "h-6 w-6",
fill: "none",
viewBox: "0 0 24 24",
stroke: "currentColor",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("path", {
strokeLinecap: "round",
strokeLinejoin: "round",
strokeWidth: 2,
d: "M12 9v3m0 0v3m0-3h3m-3 0H9m12 0a9 9 0 11-18 0 9 9 0 0118 0z"
})
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("div", {
children: "New"
})]
})
})
}), showItems.map(function (item, index) {
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("div", {
onClick: function onClick() {
return handleSelectItem(item);
},
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("div", {
className: "flex w-full items-center p-2 pl-2 border-transparent border-l-2 relative hover:border-neutral-content hover:bg-gray-300",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("div", {
className: "w-full items-center flex",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("div", {
className: "mx-2",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("span", {
children: item.name
})
})
})
})
}, index);
}), showItems.length <= 0 && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("div", {
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("div", {
className: "flex w-full items-center p-2 pl-2 border-transparent border-l-2 relative hover:border-neutral-content",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("div", {
className: "w-full items-center justify-center flex",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("div", {
className: "mx-2 my-5",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)("span", {
children: "No Items Found"
})
})
})
})
})]
})
})
})]
})
})
})
});
}
/***/ }),
/***/ "./resources/js/Components/Checkbox.js": /***/ "./resources/js/Components/Checkbox.js":
/*!*********************************************!*\ /*!*********************************************!*\
!*** ./resources/js/Components/Checkbox.js ***! !*** ./resources/js/Components/Checkbox.js ***!
@ -2442,6 +2711,50 @@ function ValidationErrors(_ref) {
/***/ }), /***/ }),
/***/ "./resources/js/Hooks/index.js":
/*!*************************************!*\
!*** ./resources/js/Hooks/index.js ***!
\*************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "useDebounce": () => (/* binding */ useDebounce)
/* harmony export */ });
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
function useDebounce(value, delay) {
var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(value),
_useState2 = _slicedToArray(_useState, 2),
debouncedValue = _useState2[0],
setDebouncedValue = _useState2[1];
(0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {
var handler = setTimeout(function () {
setDebouncedValue(value);
}, delay);
return function () {
clearTimeout(handler);
};
}, [value, delay]);
return debouncedValue;
}
/***/ }),
/***/ "./resources/js/Layouts/Authenticated.js": /***/ "./resources/js/Layouts/Authenticated.js":
/*!***********************************************!*\ /*!***********************************************!*\
!*** ./resources/js/Layouts/Authenticated.js ***! !*** ./resources/js/Layouts/Authenticated.js ***!
@ -3825,10 +4138,11 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_5__);
/* harmony import */ var react_number_format__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react-number-format */ "./node_modules/react-number-format/dist/react-number-format.es.js"); /* harmony import */ var react_number_format__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react-number-format */ "./node_modules/react-number-format/dist/react-number-format.es.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/utils */ "./resources/js/utils.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/utils */ "./resources/js/utils.js");
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); /* harmony import */ var _Components_CategorySelectInput__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/Components/CategorySelectInput */ "./resources/js/Components/CategorySelectInput.js");
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js");
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
@ -3854,11 +4168,11 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
function Transaction(props) { function Transaction(props) {
var _transactions$data, _jsx2; var _transactions$data, _jsx2;
var categories = props.categories, var transactions = props.transactions;
transactions = props.transactions;
var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null), var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),
_useState2 = _slicedToArray(_useState, 2), _useState2 = _slicedToArray(_useState, 2),
@ -3871,6 +4185,7 @@ function Transaction(props) {
setShowForm = _useState4[1]; setShowForm = _useState4[1];
var _useForm = (0,_inertiajs_inertia_react__WEBPACK_IMPORTED_MODULE_3__.useForm)({ var _useForm = (0,_inertiajs_inertia_react__WEBPACK_IMPORTED_MODULE_3__.useForm)({
category_name: '',
category_id: '', category_id: '',
description: '', description: '',
amount: 0, amount: 0,
@ -3910,13 +4225,11 @@ function Transaction(props) {
})); }));
}; };
var handleSelectedcategory = function handleSelectedcategory(e) { var handleSelectedcategory = function handleSelectedcategory(category) {
var category = categories.find(function (cat) {
return +cat.id === +e.target.value;
});
setData(_objectSpread(_objectSpread({}, data), {}, { setData(_objectSpread(_objectSpread({}, data), {}, {
description: category.description, description: category.description,
category_id: e.target.value category_id: category.id,
category_name: category.name
})); }));
}; };
@ -3950,8 +4263,11 @@ function Transaction(props) {
}; };
var handleEdit = function handleEdit(transaction) { var handleEdit = function handleEdit(transaction) {
var _transaction$category;
setTransaction(transaction); setTransaction(transaction);
setData({ setData({
category_name: (_transaction$category = transaction.category) === null || _transaction$category === void 0 ? void 0 : _transaction$category.name,
category_id: transaction.category_id === null ? '' : transaction.category_id, category_id: transaction.category_id === null ? '' : transaction.category_id,
description: transaction.description, description: transaction.description,
amount: transaction.amount, amount: transaction.amount,
@ -3980,89 +4296,89 @@ function Transaction(props) {
}); });
}; };
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsxs)(_Layouts_Authenticated__WEBPACK_IMPORTED_MODULE_2__["default"], { return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)(_Layouts_Authenticated__WEBPACK_IMPORTED_MODULE_2__["default"], {
errors: props.errors, errors: props.errors,
header: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("h2", { header: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("h2", {
className: "font-semibold text-xl text-gray-800 leading-tight", className: "font-semibold text-xl text-gray-800 leading-tight",
children: "Transaction" children: "Transaction"
}), }),
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)(_inertiajs_inertia_react__WEBPACK_IMPORTED_MODULE_3__.Head, { children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(_inertiajs_inertia_react__WEBPACK_IMPORTED_MODULE_3__.Head, {
title: "Transaction" title: "Transaction"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("div", { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("div", {
className: "flex flex-col space-y-2 py-12", className: "flex flex-col space-y-2 py-12",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("div", { children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("div", {
className: "w-full px-6 md:pr-8", className: "w-full px-6 md:pr-8",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("div", { children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("div", {
className: "card bg-white", className: "card bg-white",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsxs)("div", { children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)("div", {
className: "card-body", className: "card-body",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("div", { children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("div", {
className: "btn btn-secondary max-w-min my-2", className: "btn btn-secondary max-w-min my-2",
onClick: function onClick() { onClick: function onClick() {
return toggleForm(); return toggleForm();
}, },
children: "Add" children: "Add"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("div", { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("div", {
className: "overflow-x-auto", className: "overflow-x-auto",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsxs)("table", { children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)("table", {
className: "table w-full table-zebra", className: "table w-full table-zebra",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("thead", { children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("thead", {
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsxs)("tr", { children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)("tr", {
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("th", { children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("th", {
children: "Date" children: "Date"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("th", { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("th", {
children: "Type" children: "Type"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("th", { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("th", {
children: "Category Name" children: "Category Name"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("th", { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("th", {
className: "w-32", className: "w-32",
children: "Cash In/Out" children: "Cash In/Out"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("th", { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("th", {
children: "Description" children: "Description"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("th", { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("th", {
children: "Amount" children: "Amount"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("th", { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("th", {
className: "w-52" className: "w-52"
})] })]
}) })
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("tbody", { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("tbody", {
className: processing ? "opacity-70" : "", className: processing ? 'opacity-70' : '',
children: transactions === null || transactions === void 0 ? void 0 : (_transactions$data = transactions.data) === null || _transactions$data === void 0 ? void 0 : _transactions$data.map(function (transaction) { children: transactions === null || transactions === void 0 ? void 0 : (_transactions$data = transactions.data) === null || _transactions$data === void 0 ? void 0 : _transactions$data.map(function (transaction) {
var _transaction$category; var _transaction$category2;
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsxs)("tr", { return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)("tr", {
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("td", { children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("td", {
children: moment__WEBPACK_IMPORTED_MODULE_5___default()(transaction.date).format('DD/MM/yyyy') children: moment__WEBPACK_IMPORTED_MODULE_5___default()(transaction.date).format('DD/MM/yyyy')
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("td", { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("td", {
children: +transaction.is_income === 0 ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("div", { children: +transaction.is_income === 0 ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("div", {
className: "badge badge-secondary", className: "badge badge-secondary",
children: "Expense" children: "Expense"
}) : /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("div", { }) : /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("div", {
className: "badge badge-primary", className: "badge badge-primary",
children: "Income" children: "Income"
}) })
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("td", { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("td", {
children: transaction === null || transaction === void 0 ? void 0 : (_transaction$category = transaction.category) === null || _transaction$category === void 0 ? void 0 : _transaction$category.name children: transaction === null || transaction === void 0 ? void 0 : (_transaction$category2 = transaction.category) === null || _transaction$category2 === void 0 ? void 0 : _transaction$category2.name
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("td", { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("td", {
children: +transaction.income_type === 0 ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("div", { children: +transaction.income_type === 0 ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("div", {
className: "badge badge-secondary", className: "badge badge-secondary",
children: "Cash Out" children: "Cash Out"
}) : /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("div", { }) : /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("div", {
className: "badge badge-accent", className: "badge badge-accent",
children: "Cash In" children: "Cash In"
}) })
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("td", { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("td", {
children: transaction.description children: transaction.description
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("td", { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("td", {
children: (0,_utils__WEBPACK_IMPORTED_MODULE_7__.formatIDR)(transaction.amount) children: (0,_utils__WEBPACK_IMPORTED_MODULE_7__.formatIDR)(transaction.amount)
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsxs)("td", { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)("td", {
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("div", { children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("div", {
className: "btn btn-warning mx-1", className: "btn btn-warning mx-1",
onClick: function onClick() { onClick: function onClick() {
return toggleForm(transaction); return toggleForm(transaction);
}, },
children: "Edit" children: "Edit"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("div", { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("div", {
className: "btn btn-error mx-1", className: "btn btn-error mx-1",
onClick: function onClick() { onClick: function onClick() {
return handleDelete(transaction); return handleDelete(transaction);
@ -4074,13 +4390,13 @@ function Transaction(props) {
}) })
})] })]
}) })
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)(_Components_Pagination__WEBPACK_IMPORTED_MODULE_1__["default"], { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(_Components_Pagination__WEBPACK_IMPORTED_MODULE_1__["default"], {
links: transactions === null || transactions === void 0 ? void 0 : transactions.links links: transactions === null || transactions === void 0 ? void 0 : transactions.links
})] })]
}) })
}) })
}) })
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("div", { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("div", {
id: "create-modal", id: "create-modal",
className: "modal", className: "modal",
style: showForm ? { style: showForm ? {
@ -4088,106 +4404,93 @@ function Transaction(props) {
pointerEvents: 'auto', pointerEvents: 'auto',
visibility: 'visible' visibility: 'visible'
} : {}, } : {},
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsxs)("div", { children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)("div", {
className: "modal-box", className: "modal-box",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsxs)("div", { children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)("div", {
className: "form-control", className: "form-control",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("label", { children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("label", {
className: "label", className: "label",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("span", { children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("span", {
className: "label-text", className: "label-text",
children: "Date" children: "Date"
}) })
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("input", { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("input", {
type: "date", type: "date",
className: "input input-bordered ".concat(errors.date ? 'input-error' : ''), className: "input input-bordered ".concat(errors.date ? 'input-error' : ''),
id: "date", id: "date",
value: data.date, value: data.date,
onChange: handleChange onChange: handleChange
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("label", { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("label", {
className: "label", className: "label",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("span", { children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("span", {
className: "label-text-alt", className: "label-text-alt",
children: errors.date children: errors.date
}) })
})] })]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("div", { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("div", {
className: "form-control", className: "form-control",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsxs)("label", { children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)("label", {
className: "cursor-pointer label", className: "cursor-pointer label",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("input", { children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("input", {
type: "checkbox", type: "checkbox",
checked: data.is_income === 1 ? true : false, checked: data.is_income === 1 ? true : false,
onChange: toggleIncome, onChange: toggleIncome,
className: "checkbox checkbox-primary" className: "checkbox checkbox-primary"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("span", { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("span", {
className: "label-text font-bold", className: "label-text font-bold",
children: "Income" children: "Income"
})] })]
}) })
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsxs)("div", { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)("div", {
className: "form-control", className: "form-control",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("label", { children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("label", {
className: "label", className: "label",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("span", { children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("span", {
className: "label-text", className: "label-text",
children: "Category" children: "Category"
}) })
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsxs)("select", { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(_Components_CategorySelectInput__WEBPACK_IMPORTED_MODULE_8__["default"], {
className: "select select-bordered w-full ".concat(errors.category_id && 'select-error'), value: data.category_name,
id: "category_id", onItemSelected: handleSelectedcategory,
onChange: handleSelectedcategory,
disabled: data.is_income === 1, disabled: data.is_income === 1,
value: data.category_id, invalid: errors.category_id ? true : false
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("option", { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("label", {
disabled: "disabled",
selected: '' === data.category_id,
value: "",
children: "Choose your category"
}), categories.map(function (category) {
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("option", {
value: category.id,
selected: category.id === data.category_id,
children: category.name
}, category.id);
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("label", {
className: "label", className: "label",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("span", { children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("span", {
className: "label-text-alt", className: "label-text-alt",
children: errors.category_id children: errors.category_id
}) })
})] })]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsxs)("div", { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)("div", {
className: "form-control", className: "form-control",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("label", { children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("label", {
className: "label", className: "label",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("span", { children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("span", {
className: "label-text", className: "label-text",
children: "Description" children: "Description"
}) })
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("input", { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("input", {
type: "text", type: "text",
placeholder: "Description", placeholder: "Description",
className: "input input-bordered ".concat(errors.description ? 'input-error' : ''), className: "input input-bordered ".concat(errors.description ? 'input-error' : ''),
id: "description", id: "description",
value: data.description, value: data.description,
onChange: handleChange onChange: handleChange
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("label", { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("label", {
className: "label", className: "label",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("span", { children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("span", {
className: "label-text-alt", className: "label-text-alt",
children: errors.description children: errors.description
}) })
})] })]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("div", { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("div", {
className: "form-control", className: "form-control",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsxs)("label", { children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)("label", {
className: "cursor-pointer label", className: "cursor-pointer label",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("span", { children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("span", {
className: "label-text font-bold", className: "label-text font-bold",
children: data.income_type === 0 ? 'Cash Out' : 'Cash In' children: data.income_type === 0 ? 'Cash Out' : 'Cash In'
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("input", { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("input", {
type: "checkbox", type: "checkbox",
checked: data.income_type === 0 ? true : false, checked: data.income_type === 0 ? true : false,
disabled: data.is_income === 1, disabled: data.is_income === 1,
@ -4195,41 +4498,41 @@ function Transaction(props) {
onChange: toggleCashType onChange: toggleCashType
})] })]
}) })
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsxs)("div", { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)("div", {
className: "form-control", className: "form-control",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("label", { children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("label", {
className: "label", className: "label",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("span", { children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("span", {
className: "label-text", className: "label-text",
children: "Amount" children: "Amount"
}) })
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)(react_number_format__WEBPACK_IMPORTED_MODULE_6__["default"], (_jsx2 = { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(react_number_format__WEBPACK_IMPORTED_MODULE_6__["default"], (_jsx2 = {
thousandSeparator: true, thousandSeparator: true,
className: "input input-bordered ".concat(errors.amount ? 'input-error' : ''), className: "input input-bordered ".concat(errors.amount ? 'input-error' : ''),
value: data.amount value: data.amount
}, _defineProperty(_jsx2, "thousandSeparator", "."), _defineProperty(_jsx2, "decimalSeparator", ","), _defineProperty(_jsx2, "onValueChange", function onValueChange(_ref) { }, _defineProperty(_jsx2, "thousandSeparator", "."), _defineProperty(_jsx2, "decimalSeparator", ","), _defineProperty(_jsx2, "onValueChange", function onValueChange(_ref) {
var value = _ref.value; var value = _ref.value;
return setData('amount', value); return setData('amount', value);
}), _jsx2)), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("label", { }), _jsx2)), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("label", {
className: "label", className: "label",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("span", { children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("span", {
className: "label-text-alt", className: "label-text-alt",
children: errors.amount children: errors.amount
}) })
})] })]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsxs)("div", { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)("div", {
className: "modal-action", className: "modal-action",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("button", { children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("button", {
className: "btn btn-primary ".concat(processing && 'animate-spin'), className: "btn btn-primary ".concat(processing && 'animate-spin'),
onClick: handleSubmit, onClick: handleSubmit,
disabled: processing, disabled: processing,
children: "Add" children: "Add"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("button", { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("button", {
className: "btn btn-secondary", className: "btn btn-secondary",
onClick: handleReset, onClick: handleReset,
disabled: processing, disabled: processing,
children: "Clear" children: "Clear"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)("button", { }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)("button", {
className: "btn btn-outline btn-secondary", className: "btn btn-outline btn-secondary",
onClick: function onClick() { onClick: function onClick() {
return toggleForm(); return toggleForm();
@ -4261,9 +4564,9 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js"); /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js");
var _window$document$getE; var _window$document$getE;
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
@ -5310,19 +5613,6 @@ var bind = __webpack_require__(/*! function-bind */ "./node_modules/function-bin
module.exports = bind.call(Function.call, Object.prototype.hasOwnProperty); module.exports = bind.call(Function.call, Object.prototype.hasOwnProperty);
/***/ }),
/***/ "./resources/css/app.css":
/*!*******************************!*\
!*** ./resources/css/app.css ***!
\*******************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
__webpack_require__.r(__webpack_exports__);
// extracted by mini-css-extract-plugin
/***/ }), /***/ }),
/***/ "./node_modules/lodash.isequal/index.js": /***/ "./node_modules/lodash.isequal/index.js":
@ -24394,6 +24684,19 @@ var __WEBPACK_AMD_DEFINE_RESULT__;/**
}.call(this)); }.call(this));
/***/ }),
/***/ "./resources/css/app.css":
/*!*******************************!*\
!*** ./resources/css/app.css ***!
\*******************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
__webpack_require__.r(__webpack_exports__);
// extracted by mini-css-extract-plugin
/***/ }), /***/ }),
/***/ "./node_modules/moment/locale/af.js": /***/ "./node_modules/moment/locale/af.js":
@ -46440,16 +46743,7 @@ var weakRefDeref = hasWeakRef ? WeakRef.prototype.deref : null;
var booleanValueOf = Boolean.prototype.valueOf; var booleanValueOf = Boolean.prototype.valueOf;
var objectToString = Object.prototype.toString; var objectToString = Object.prototype.toString;
var functionToString = Function.prototype.toString; var functionToString = Function.prototype.toString;
var $match = String.prototype.match; var match = String.prototype.match;
var $slice = String.prototype.slice;
var $replace = String.prototype.replace;
var $toUpperCase = String.prototype.toUpperCase;
var $toLowerCase = String.prototype.toLowerCase;
var $test = RegExp.prototype.test;
var $concat = Array.prototype.concat;
var $join = Array.prototype.join;
var $arrSlice = Array.prototype.slice;
var $floor = Math.floor;
var bigIntValueOf = typeof BigInt === 'function' ? BigInt.prototype.valueOf : null; var bigIntValueOf = typeof BigInt === 'function' ? BigInt.prototype.valueOf : null;
var gOPS = Object.getOwnPropertySymbols; var gOPS = Object.getOwnPropertySymbols;
var symToString = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? Symbol.prototype.toString : null; var symToString = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? Symbol.prototype.toString : null;
@ -46468,28 +46762,6 @@ var gPO = (typeof Reflect === 'function' ? Reflect.getPrototypeOf : Object.getPr
: null : null
); );
function addNumericSeparator(num, str) {
if (
num === Infinity
|| num === -Infinity
|| num !== num
|| (num && num > -1000 && num < 1000)
|| $test.call(/e/, str)
) {
return str;
}
var sepRegex = /[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;
if (typeof num === 'number') {
var int = num < 0 ? -$floor(-num) : $floor(num); // trunc(num)
if (int !== num) {
var intStr = String(int);
var dec = $slice.call(str, intStr.length + 1);
return $replace.call(intStr, sepRegex, '$&_') + '.' + $replace.call($replace.call(dec, /([0-9]{3})/g, '$&_'), /_$/, '');
}
}
return $replace.call(str, sepRegex, '$&_');
}
var inspectCustom = (__webpack_require__(/*! ./util.inspect */ "?2128").custom); var inspectCustom = (__webpack_require__(/*! ./util.inspect */ "?2128").custom);
var inspectSymbol = inspectCustom && isSymbol(inspectCustom) ? inspectCustom : null; var inspectSymbol = inspectCustom && isSymbol(inspectCustom) ? inspectCustom : null;
@ -46518,12 +46790,8 @@ module.exports = function inspect_(obj, options, depth, seen) {
&& opts.indent !== '\t' && opts.indent !== '\t'
&& !(parseInt(opts.indent, 10) === opts.indent && opts.indent > 0) && !(parseInt(opts.indent, 10) === opts.indent && opts.indent > 0)
) { ) {
throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`'); throw new TypeError('options "indent" must be "\\t", an integer > 0, or `null`');
} }
if (has(opts, 'numericSeparator') && typeof opts.numericSeparator !== 'boolean') {
throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');
}
var numericSeparator = opts.numericSeparator;
if (typeof obj === 'undefined') { if (typeof obj === 'undefined') {
return 'undefined'; return 'undefined';
@ -46542,12 +46810,10 @@ module.exports = function inspect_(obj, options, depth, seen) {
if (obj === 0) { if (obj === 0) {
return Infinity / obj > 0 ? '0' : '-0'; return Infinity / obj > 0 ? '0' : '-0';
} }
var str = String(obj); return String(obj);
return numericSeparator ? addNumericSeparator(obj, str) : str;
} }
if (typeof obj === 'bigint') { if (typeof obj === 'bigint') {
var bigIntStr = String(obj) + 'n'; return String(obj) + 'n';
return numericSeparator ? addNumericSeparator(obj, bigIntStr) : bigIntStr;
} }
var maxDepth = typeof opts.depth === 'undefined' ? 5 : opts.depth; var maxDepth = typeof opts.depth === 'undefined' ? 5 : opts.depth;
@ -46566,7 +46832,7 @@ module.exports = function inspect_(obj, options, depth, seen) {
function inspect(value, from, noIndent) { function inspect(value, from, noIndent) {
if (from) { if (from) {
seen = $arrSlice.call(seen); seen = seen.slice();
seen.push(from); seen.push(from);
} }
if (noIndent) { if (noIndent) {
@ -46584,21 +46850,21 @@ module.exports = function inspect_(obj, options, depth, seen) {
if (typeof obj === 'function') { if (typeof obj === 'function') {
var name = nameOf(obj); var name = nameOf(obj);
var keys = arrObjKeys(obj, inspect); var keys = arrObjKeys(obj, inspect);
return '[Function' + (name ? ': ' + name : ' (anonymous)') + ']' + (keys.length > 0 ? ' { ' + $join.call(keys, ', ') + ' }' : ''); return '[Function' + (name ? ': ' + name : ' (anonymous)') + ']' + (keys.length > 0 ? ' { ' + keys.join(', ') + ' }' : '');
} }
if (isSymbol(obj)) { if (isSymbol(obj)) {
var symString = hasShammedSymbols ? $replace.call(String(obj), /^(Symbol\(.*\))_[^)]*$/, '$1') : symToString.call(obj); var symString = hasShammedSymbols ? String(obj).replace(/^(Symbol\(.*\))_[^)]*$/, '$1') : symToString.call(obj);
return typeof obj === 'object' && !hasShammedSymbols ? markBoxed(symString) : symString; return typeof obj === 'object' && !hasShammedSymbols ? markBoxed(symString) : symString;
} }
if (isElement(obj)) { if (isElement(obj)) {
var s = '<' + $toLowerCase.call(String(obj.nodeName)); var s = '<' + String(obj.nodeName).toLowerCase();
var attrs = obj.attributes || []; var attrs = obj.attributes || [];
for (var i = 0; i < attrs.length; i++) { for (var i = 0; i < attrs.length; i++) {
s += ' ' + attrs[i].name + '=' + wrapQuotes(quote(attrs[i].value), 'double', opts); s += ' ' + attrs[i].name + '=' + wrapQuotes(quote(attrs[i].value), 'double', opts);
} }
s += '>'; s += '>';
if (obj.childNodes && obj.childNodes.length) { s += '...'; } if (obj.childNodes && obj.childNodes.length) { s += '...'; }
s += '</' + $toLowerCase.call(String(obj.nodeName)) + '>'; s += '</' + String(obj.nodeName).toLowerCase() + '>';
return s; return s;
} }
if (isArray(obj)) { if (isArray(obj)) {
@ -46607,15 +46873,12 @@ module.exports = function inspect_(obj, options, depth, seen) {
if (indent && !singleLineValues(xs)) { if (indent && !singleLineValues(xs)) {
return '[' + indentedJoin(xs, indent) + ']'; return '[' + indentedJoin(xs, indent) + ']';
} }
return '[ ' + $join.call(xs, ', ') + ' ]'; return '[ ' + xs.join(', ') + ' ]';
} }
if (isError(obj)) { if (isError(obj)) {
var parts = arrObjKeys(obj, inspect); var parts = arrObjKeys(obj, inspect);
if ('cause' in obj && !isEnumerable.call(obj, 'cause')) {
return '{ [' + String(obj) + '] ' + $join.call($concat.call('[cause]: ' + inspect(obj.cause), parts), ', ') + ' }';
}
if (parts.length === 0) { return '[' + String(obj) + ']'; } if (parts.length === 0) { return '[' + String(obj) + ']'; }
return '{ [' + String(obj) + '] ' + $join.call(parts, ', ') + ' }'; return '{ [' + String(obj) + '] ' + parts.join(', ') + ' }';
} }
if (typeof obj === 'object' && customInspect) { if (typeof obj === 'object' && customInspect) {
if (inspectSymbol && typeof obj[inspectSymbol] === 'function') { if (inspectSymbol && typeof obj[inspectSymbol] === 'function') {
@ -46663,14 +46926,14 @@ module.exports = function inspect_(obj, options, depth, seen) {
var ys = arrObjKeys(obj, inspect); var ys = arrObjKeys(obj, inspect);
var isPlainObject = gPO ? gPO(obj) === Object.prototype : obj instanceof Object || obj.constructor === Object; var isPlainObject = gPO ? gPO(obj) === Object.prototype : obj instanceof Object || obj.constructor === Object;
var protoTag = obj instanceof Object ? '' : 'null prototype'; var protoTag = obj instanceof Object ? '' : 'null prototype';
var stringTag = !isPlainObject && toStringTag && Object(obj) === obj && toStringTag in obj ? $slice.call(toStr(obj), 8, -1) : protoTag ? 'Object' : ''; var stringTag = !isPlainObject && toStringTag && Object(obj) === obj && toStringTag in obj ? toStr(obj).slice(8, -1) : protoTag ? 'Object' : '';
var constructorTag = isPlainObject || typeof obj.constructor !== 'function' ? '' : obj.constructor.name ? obj.constructor.name + ' ' : ''; var constructorTag = isPlainObject || typeof obj.constructor !== 'function' ? '' : obj.constructor.name ? obj.constructor.name + ' ' : '';
var tag = constructorTag + (stringTag || protoTag ? '[' + $join.call($concat.call([], stringTag || [], protoTag || []), ': ') + '] ' : ''); var tag = constructorTag + (stringTag || protoTag ? '[' + [].concat(stringTag || [], protoTag || []).join(': ') + '] ' : '');
if (ys.length === 0) { return tag + '{}'; } if (ys.length === 0) { return tag + '{}'; }
if (indent) { if (indent) {
return tag + '{' + indentedJoin(ys, indent) + '}'; return tag + '{' + indentedJoin(ys, indent) + '}';
} }
return tag + '{ ' + $join.call(ys, ', ') + ' }'; return tag + '{ ' + ys.join(', ') + ' }';
} }
return String(obj); return String(obj);
}; };
@ -46681,7 +46944,7 @@ function wrapQuotes(s, defaultStyle, opts) {
} }
function quote(s) { function quote(s) {
return $replace.call(String(s), /"/g, '&quot;'); return String(s).replace(/"/g, '&quot;');
} }
function isArray(obj) { return toStr(obj) === '[object Array]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } function isArray(obj) { return toStr(obj) === '[object Array]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
@ -46732,7 +46995,7 @@ function toStr(obj) {
function nameOf(f) { function nameOf(f) {
if (f.name) { return f.name; } if (f.name) { return f.name; }
var m = $match.call(functionToString.call(f), /^function\s*([\w$]+)/); var m = match.call(functionToString.call(f), /^function\s*([\w$]+)/);
if (m) { return m[1]; } if (m) { return m[1]; }
return null; return null;
} }
@ -46832,10 +47095,10 @@ function inspectString(str, opts) {
if (str.length > opts.maxStringLength) { if (str.length > opts.maxStringLength) {
var remaining = str.length - opts.maxStringLength; var remaining = str.length - opts.maxStringLength;
var trailer = '... ' + remaining + ' more character' + (remaining > 1 ? 's' : ''); var trailer = '... ' + remaining + ' more character' + (remaining > 1 ? 's' : '');
return inspectString($slice.call(str, 0, opts.maxStringLength), opts) + trailer; return inspectString(str.slice(0, opts.maxStringLength), opts) + trailer;
} }
// eslint-disable-next-line no-control-regex // eslint-disable-next-line no-control-regex
var s = $replace.call($replace.call(str, /(['\\])/g, '\\$1'), /[\x00-\x1f]/g, lowbyte); var s = str.replace(/(['\\])/g, '\\$1').replace(/[\x00-\x1f]/g, lowbyte);
return wrapQuotes(s, 'single', opts); return wrapQuotes(s, 'single', opts);
} }
@ -46849,7 +47112,7 @@ function lowbyte(c) {
13: 'r' 13: 'r'
}[n]; }[n];
if (x) { return '\\' + x; } if (x) { return '\\' + x; }
return '\\x' + (n < 0x10 ? '0' : '') + $toUpperCase.call(n.toString(16)); return '\\x' + (n < 0x10 ? '0' : '') + n.toString(16).toUpperCase();
} }
function markBoxed(str) { function markBoxed(str) {
@ -46861,7 +47124,7 @@ function weakCollectionOf(type) {
} }
function collectionOf(type, size, entries, indent) { function collectionOf(type, size, entries, indent) {
var joinedEntries = indent ? indentedJoin(entries, indent) : $join.call(entries, ', '); var joinedEntries = indent ? indentedJoin(entries, indent) : entries.join(', ');
return type + ' (' + size + ') {' + joinedEntries + '}'; return type + ' (' + size + ') {' + joinedEntries + '}';
} }
@ -46879,20 +47142,20 @@ function getIndent(opts, depth) {
if (opts.indent === '\t') { if (opts.indent === '\t') {
baseIndent = '\t'; baseIndent = '\t';
} else if (typeof opts.indent === 'number' && opts.indent > 0) { } else if (typeof opts.indent === 'number' && opts.indent > 0) {
baseIndent = $join.call(Array(opts.indent + 1), ' '); baseIndent = Array(opts.indent + 1).join(' ');
} else { } else {
return null; return null;
} }
return { return {
base: baseIndent, base: baseIndent,
prev: $join.call(Array(depth + 1), baseIndent) prev: Array(depth + 1).join(baseIndent)
}; };
} }
function indentedJoin(xs, indent) { function indentedJoin(xs, indent) {
if (xs.length === 0) { return ''; } if (xs.length === 0) { return ''; }
var lineJoiner = '\n' + indent.prev + indent.base; var lineJoiner = '\n' + indent.prev + indent.base;
return lineJoiner + $join.call(xs, ',' + lineJoiner) + '\n' + indent.prev; return lineJoiner + xs.join(',' + lineJoiner) + '\n' + indent.prev;
} }
function arrObjKeys(obj, inspect) { function arrObjKeys(obj, inspect) {
@ -46919,7 +47182,7 @@ function arrObjKeys(obj, inspect) {
if (hasShammedSymbols && symMap['$' + key] instanceof Symbol) { if (hasShammedSymbols && symMap['$' + key] instanceof Symbol) {
// this is to prevent shammed Symbols, which are stored as strings, from being included in the string key section // this is to prevent shammed Symbols, which are stored as strings, from being included in the string key section
continue; // eslint-disable-line no-restricted-syntax, no-continue continue; // eslint-disable-line no-restricted-syntax, no-continue
} else if ($test.call(/[^\w$]/, key)) { } else if ((/[^\w$]/).test(key)) {
xs.push(inspect(key, obj) + ': ' + inspect(obj[key], obj)); xs.push(inspect(key, obj) + ': ' + inspect(obj[key], obj));
} else { } else {
xs.push(key + ': ' + inspect(obj[key], obj)); xs.push(key + ': ' + inspect(obj[key], obj));

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

@ -0,0 +1,5 @@
{
"/app.js": "/app.js?id=d3ff915bff3de87b87cc",
"/app-dark.css": "/app-dark.css?id=3ae28ef5f7b987d68dc6",
"/app.css": "/app.css?id=7c970f699ed9cf60d80b"
}

@ -0,0 +1,215 @@
/*
Select Input Common React Component
Inspired By: react-select , https://codepen.io/dixie0704/pen/jOVxGXL, and others
Created By: Aji Kamaludin <aji19kamaludin@gmail.com>
*/
import React, { useRef, useEffect, useState } from 'react'
import { useDebounce } from '@/Hooks'
export default function CategorySelectInput(props) {
const { value = '', onItemSelected = null, disabled = false, createNew = null, invalid = false} = props
const ref = useRef()
const [showItems, setShowItem] = useState([])
const [isSelected, setIsSelected] = useState(true)
const [selected, setSelected] = useState(value)
const [query, setQuery] = useState('')
const q = useDebounce(query, 300)
const [isOpen, setIsOpen] = useState(false)
const [loading, setLoading] = useState(false)
const toggle = () => {
setIsSelected(false)
setQuery('')
setIsOpen(!isOpen)
}
const onInputMouseDown = () => {
setIsSelected(false)
setQuery('')
setIsOpen(true)
}
const handleSelectItem = (item) => {
setIsSelected(true)
onItemSelected(item)
setSelected(item.name)
setIsOpen(false)
}
const filterItems = (value) => {
setIsSelected(false)
setQuery(value)
}
useEffect(() => {
const checkIfClickedOutside = (e) => {
if (isOpen && ref.current && !ref.current.contains(e.target)) {
setIsOpen(false)
}
}
document.addEventListener('mousedown', checkIfClickedOutside)
return () => {
document.removeEventListener('mousedown', checkIfClickedOutside)
}
}, [isOpen])
useEffect(() => {
setLoading(true)
fetch(`${route('api.categories.query')}?q=${q}`)
.then((res) => res.json())
.then((json) => {
setShowItem(json)
})
.catch((err) => {
alert(err)
})
.finally(() => setLoading(false))
}, [q])
useEffect(() => {
setSelected('')
}, [disabled])
useEffect(() => {
setSelected(value)
}, [value])
return (
<div className="flex flex-col items-center" ref={ref}>
<div className="w-full flex flex-col items-center">
<div className="w-full">
<div className="flex flex-col items-center relative">
<div className="w-full">
<div
className={`my-2 p-1 bg-white flex border rounded-lg
${
invalid
? 'border-red-500'
: 'border-gray-300'
}
${disabled ? 'bg-gray-50' : ''}`}
>
<input
className="p-1 px-2 appearance-none outline-none w-full text-gray-800"
onMouseDown={onInputMouseDown}
placeholder="select category..."
value={isSelected ? selected : query}
onChange={(e) => filterItems(e.target.value)}
disabled={disabled}
/>
<div onClick={disabled ? () => {} : toggle}>
<button className="cursor-pointer w-6 h-6 text-gray-600 outline-none focus:outline-none">
<svg
xmlns="http://www.w3.org/2000/svg"
width="100%"
height="100%"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
>
{isOpen ? (
<polyline points="18 15 12 9 6 15"></polyline>
) : (
<polyline points="18 15 12 20 6 15"></polyline>
)}
</svg>
</button>
</div>
</div>
</div>
{isOpen && (
<div
className="absolute shadow-lg bg-white top-100 z-40 w-full lef-0 rounded overflow-y-auto"
style={{ maxHeight: '300px', top: '100%' }}
>
<div className="flex flex-col w-full">
{loading ? (
<div>
<div className="flex w-full items-center p-2 pl-2 border-transparent border-l-2 relative hover:border-neutral-content">
<div className="w-full items-center justify-center flex">
<div className="mx-2 my-5">
<span>Loading...</span>
</div>
</div>
</div>
</div>
) : (
<>
{createNew !== null && (
<div
className="bordered"
onClick={createNew}
>
<div className="flex w-full items-center justify-center p-2 pl-2 border-transparent border-l-2 relative hover:bg-gray-600 hover:text-white">
<div className="w-full items-center justify-center flex space-x-2">
<svg
xmlns="http://www.w3.org/2000/svg"
className="h-6 w-6"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth={
2
}
d="M12 9v3m0 0v3m0-3h3m-3 0H9m12 0a9 9 0 11-18 0 9 9 0 0118 0z"
/>
</svg>
<div>New</div>
</div>
</div>
</div>
)}
{showItems.map((item, index) => (
<div
key={index}
onClick={() =>
handleSelectItem(item)
}
>
<div className="flex w-full items-center p-2 pl-2 border-transparent border-l-2 relative hover:border-neutral-content hover:bg-gray-300">
<div className="w-full items-center flex">
<div className="mx-2">
<span>
{item.name}
</span>
</div>
</div>
</div>
</div>
))}
{showItems.length <= 0 && (
<div>
<div className="flex w-full items-center p-2 pl-2 border-transparent border-l-2 relative hover:border-neutral-content">
<div className="w-full items-center justify-center flex">
<div className="mx-2 my-5">
<span>
No Items Found
</span>
</div>
</div>
</div>
</div>
)}
</>
)}
</div>
</div>
)}
</div>
</div>
</div>
</div>
)
}

@ -0,0 +1,178 @@
/*
Select Input Common React Component
Inspired By: react-select , https://codepen.io/dixie0704/pen/jOVxGXL, and others
Created By: Aji Kamaludin <aji19kamaludin@gmail.com>
*/
import React, { useRef, useEffect, useState } from 'react'
export default function SelectInput(props) {
const ref = useRef()
const items = [
'rahayuheni3@gmail.com',
'inovacell04@gmail.com',
'Btg33@gmail.com',
'nikolampo96@gmail.com',
'grinaldifoc@gmail.com',
'nienha_tj26@yahoo.com',
'rizkitriwhyuni139@gmail.com',
'wahyu.saputro6982@gmail.com',
'fariyath315@gmail.com',
'suryaningsihworo@gmail.com',
'andiyanayudi@gmail.com',
'hoshos2303@gmail.com',
'emailnaontehiyeu@gmail.com',
'surahmanomez@gmail.com',
'mmainah172@gmail.com',
'kiosbuuyun@gmail.com',
]
const [showItems, setShowItem] = useState(items)
const [selected, setSelected] = useState('')
const [isOpen, setIsOpen] = useState(false)
const [createNew] = useState(true)
const disable = false
const toggle = () => {
setSelected('')
setShowItem(items)
setIsOpen(!isOpen)
}
const onInputMouseDown = () => {
setSelected('')
setShowItem(items)
setIsOpen(true)
}
const handleSelectItem = (item) => {
setSelected(item)
setIsOpen(false)
}
const filterItems = (value) => {
setSelected(value)
setShowItem(items.filter(item => item.toLowerCase().includes(value)))
}
useEffect(() => {
const checkIfClickedOutside = (e) => {
if (isOpen && ref.current && !ref.current.contains(e.target)) {
setIsOpen(false)
}
}
document.addEventListener('mousedown', checkIfClickedOutside)
return () => {
document.removeEventListener('mousedown', checkIfClickedOutside)
}
}, [isOpen])
return (
<div className="flex flex-col items-center" ref={ref}>
<div className="w-full flex flex-col items-center">
<div className="w-full">
<div className="flex flex-col items-center relative">
<div className="w-full">
<div className="my-2 p-1 bg-white flex border border-gray-300 rounded-lg">
<input
className="p-1 px-2 appearance-none outline-none w-full text-gray-800"
onMouseDown={onInputMouseDown}
placeholder="select category..."
value={selected}
onChange={(e) => filterItems(e.target.value)}
disabled={disable}
/>
<div
onClick={disable ? () => {} : toggle}
className={`text-gray-300 w-8 py-1 pl-2 pr-1 border-l flex items-center border-gray-200 ${
disable ? 'bg-gray-50' : ''
}`}
>
<button className="cursor-pointer w-6 h-6 text-gray-600 outline-none focus:outline-none">
<svg
xmlns="http://www.w3.org/2000/svg"
width="100%"
height="100%"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
>
{isOpen ? (
<polyline points="18 15 12 9 6 15"></polyline>
) : (
<polyline points="18 15 12 20 6 15"></polyline>
)}
</svg>
</button>
</div>
</div>
</div>
{isOpen && (
<div
className="absolute shadow-lg bg-white top-100 z-40 w-full lef-0 rounded overflow-y-auto"
style={{ maxHeight: '300px', top: '100%' }}
>
<div className="flex flex-col w-full">
{createNew && (
<div className="bordered">
<div className="flex w-full items-center justify-center p-2 pl-2 border-transparent border-l-2 relative hover:bg-gray-600 hover:text-white">
<div className="w-full items-center justify-center flex space-x-2">
<svg
xmlns="http://www.w3.org/2000/svg"
className="h-6 w-6"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth={2}
d="M12 9v3m0 0v3m0-3h3m-3 0H9m12 0a9 9 0 11-18 0 9 9 0 0118 0z"
/>
</svg>
<div>New</div>
</div>
</div>
</div>
)}
{showItems.map((item, index) => (
<div
key={index}
onClick={() => handleSelectItem(item)}
>
<div className="flex w-full items-center p-2 pl-2 border-transparent border-l-2 relative hover:border-neutral-content hover:bg-gray-300">
<div className="w-full items-center flex">
<div className="mx-2">
<span>{item}</span>
</div>
</div>
</div>
</div>
))}
{showItems.length <= 0 && (
<div>
<div className="flex w-full items-center p-2 pl-2 border-transparent border-l-2 relative hover:border-neutral-content">
<div className="w-full items-center justify-center flex">
<div className="mx-2 my-5">
<span>
No Items Found
</span>
</div>
</div>
</div>
</div>
)}
</div>
</div>
)}
</div>
</div>
</div>
</div>
)
}

@ -0,0 +1,14 @@
import { useState, useEffect } from 'react'
export function useDebounce(value, delay) {
const [debouncedValue, setDebouncedValue] = useState(value)
useEffect(() => {
const handler = setTimeout(() => {
setDebouncedValue(value)
}, delay)
return () => {
clearTimeout(handler)
}
}, [value, delay])
return debouncedValue
}

@ -6,12 +6,14 @@ import { toast } from 'react-toastify';
import moment from 'moment'; import moment from 'moment';
import NumberFormat from 'react-number-format'; import NumberFormat from 'react-number-format';
import { formatIDR } from '@/utils'; import { formatIDR } from '@/utils';
import SelectInput from '@/Components/CategorySelectInput';
export default function Transaction(props) { export default function Transaction(props) {
const { categories, transactions } = props const { transactions } = props
const [transaction, setTransaction] = useState(null) const [transaction, setTransaction] = useState(null)
const [showForm, setShowForm] = useState(false) const [showForm, setShowForm] = useState(false)
const { data, setData, errors, post, put, processing, delete: destroy } = useForm({ const { data, setData, errors, post, put, processing, delete: destroy } = useForm({
category_name: '',
category_id: '', category_id: '',
description: '', description: '',
amount: 0, amount: 0,
@ -43,12 +45,12 @@ export default function Transaction(props) {
}) })
} }
const handleSelectedcategory = (e) => { const handleSelectedcategory = (category) => {
const category = categories.find(cat => +cat.id === +e.target.value)
setData({ setData({
...data, ...data,
description: category.description, description: category.description,
category_id: e.target.value category_id: category.id,
category_name: category.name
}) })
} }
@ -83,6 +85,7 @@ export default function Transaction(props) {
const handleEdit = (transaction) => { const handleEdit = (transaction) => {
setTransaction(transaction) setTransaction(transaction)
setData({ setData({
category_name: transaction.category?.name,
category_id: transaction.category_id === null ? '' : transaction.category_id, category_id: transaction.category_id === null ? '' : transaction.category_id,
description: transaction.description, description: transaction.description,
amount: transaction.amount, amount: transaction.amount,
@ -115,160 +118,260 @@ export default function Transaction(props) {
return ( return (
<Authenticated <Authenticated
errors={props.errors} errors={props.errors}
header={<h2 className="font-semibold text-xl text-gray-800 leading-tight">Transaction</h2>} header={
<h2 className="font-semibold text-xl text-gray-800 leading-tight">
Transaction
</h2>
}
> >
<Head title="Transaction" /> <Head title="Transaction" />
<div className="flex flex-col space-y-2 py-12"> <div className="flex flex-col space-y-2 py-12">
<div className="w-full px-6 md:pr-8"> <div className="w-full px-6 md:pr-8">
<div className="card bg-white"> <div className="card bg-white">
<div className="card-body"> <div className="card-body">
<div className="btn btn-secondary max-w-min my-2" onClick={() => toggleForm()}>Add</div> <div
<div className="overflow-x-auto"> className="btn btn-secondary max-w-min my-2"
<table className="table w-full table-zebra"> onClick={() => toggleForm()}
<thead> >
<tr> Add
<th>Date</th> </div>
<th>Type</th> <div className="overflow-x-auto">
<th>Category Name</th> <table className="table w-full table-zebra">
<th className="w-32">Cash In/Out</th> <thead>
<th>Description</th> <tr>
<th>Amount</th> <th>Date</th>
<th className="w-52"></th> <th>Type</th>
</tr> <th>Category Name</th>
</thead> <th className="w-32">Cash In/Out</th>
<tbody className={processing ? "opacity-70" : ""}> <th>Description</th>
{transactions?.data?.map(transaction => ( <th>Amount</th>
<tr key={transaction.id}> <th className="w-52"></th>
<td>{moment(transaction.date).format('DD/MM/yyyy')}</td> </tr>
<td> </thead>
{+transaction.is_income === 0 ? ( <tbody
<div className="badge badge-secondary">Expense</div> className={processing ? 'opacity-70' : ''}
) : ( >
<div className="badge badge-primary">Income</div> {transactions?.data?.map(
)} (transaction) => (
</td> <tr key={transaction.id}>
<td>{transaction?.category?.name}</td> <td>
<td> {moment(
{+transaction.income_type === 0 ? ( transaction.date
<div className="badge badge-secondary">Cash Out</div> ).format('DD/MM/yyyy')}
) : ( </td>
<div className="badge badge-accent">Cash In</div> <td>
)} {+transaction.is_income ===
</td> 0 ? (
<td>{transaction.description}</td> <div className="badge badge-secondary">
<td>{formatIDR(transaction.amount)}</td> Expense
<td> </div>
<div className="btn btn-warning mx-1" onClick={() => toggleForm(transaction)}>Edit</div> ) : (
<div className="btn btn-error mx-1" onClick={() => handleDelete(transaction)}>Delete</div> <div className="badge badge-primary">
</td> Income
</tr> </div>
))} )}
</tbody> </td>
</table> <td>
{
transaction?.category
?.name
}
</td>
<td>
{+transaction.income_type ===
0 ? (
<div className="badge badge-secondary">
Cash Out
</div>
) : (
<div className="badge badge-accent">
Cash In
</div>
)}
</td>
<td>
{transaction.description}
</td>
<td>
{formatIDR(
transaction.amount
)}
</td>
<td>
<div
className="btn btn-warning mx-1"
onClick={() =>
toggleForm(
transaction
)
}
>
Edit
</div>
<div
className="btn btn-error mx-1"
onClick={() =>
handleDelete(
transaction
)
}
>
Delete
</div>
</td>
</tr>
)
)}
</tbody>
</table>
</div>
<Pagination links={transactions?.links} />
</div>
</div> </div>
<Pagination links={transactions?.links} />
</div>
</div> </div>
</div>
</div> </div>
<div id="create-modal" className="modal" style={showForm ? {opacity: 1, pointerEvents: 'auto', visibility: 'visible'} : {}}> <div
<div className="modal-box"> id="create-modal"
<div className="form-control"> className="modal"
<label className="label"> style={
<span className="label-text">Date</span> showForm
</label> ? {
<input opacity: 1,
type="date" pointerEvents: 'auto',
className={`input input-bordered ${errors.date ? 'input-error' : ''}`} visibility: 'visible',
id="date" }
value={data.date} : {}
onChange={handleChange} }
/> >
<label className="label"> <div className="modal-box">
<span className="label-text-alt"> <div className="form-control">
{errors.date} <label className="label">
</span> <span className="label-text">Date</span>
</label> </label>
</div> <input
<div className="form-control"> type="date"
<label className="cursor-pointer label"> className={`input input-bordered ${
<input type="checkbox" checked={data.is_income === 1 ? true : false} onChange={toggleIncome} className="checkbox checkbox-primary"/> errors.date ? 'input-error' : ''
<span className="label-text font-bold">Income</span> }`}
</label> id="date"
</div> value={data.date}
<div className="form-control"> onChange={handleChange}
<label className="label"> />
<span className="label-text">Category</span> <label className="label">
</label> <span className="label-text-alt">{errors.date}</span>
<select </label>
className={`select select-bordered w-full ${errors.category_id && 'select-error'}`} </div>
id="category_id" <div className="form-control">
onChange={handleSelectedcategory} <label className="cursor-pointer label">
disabled={data.is_income === 1} <input
value={data.category_id} type="checkbox"
> checked={data.is_income === 1 ? true : false}
<option disabled="disabled" selected={'' === data.category_id} value=''>Choose your category</option> onChange={toggleIncome}
{categories.map(category => ( className="checkbox checkbox-primary"
<option key={category.id} value={category.id} selected={category.id === data.category_id}>{category.name}</option> />
) <span className="label-text font-bold">Income</span>
)} </label>
</select> </div>
<label className="label"> <div className="form-control">
<span className="label-text-alt"> <label className="label">
{errors.category_id} <span className="label-text">Category</span>
</span> </label>
</label> <SelectInput
</div> value={data.category_name}
<div className="form-control"> onItemSelected={handleSelectedcategory}
<label className="label"> disabled={data.is_income === 1}
<span className="label-text">Description</span> invalid={errors.category_id ? true : false}
</label> />
<input <label className="label">
type="text" <span className="label-text-alt">
placeholder="Description" {errors.category_id}
className={`input input-bordered ${errors.description ? 'input-error' : ''}`} </span>
id="description" </label>
value={data.description} </div>
onChange={handleChange} <div className="form-control">
/> <label className="label">
<label className="label"> <span className="label-text">Description</span>
<span className="label-text-alt"> </label>
{errors.description} <input
</span> type="text"
</label> placeholder="Description"
</div> className={`input input-bordered ${
<div className="form-control"> errors.description ? 'input-error' : ''
<label className="cursor-pointer label"> }`}
<span className="label-text font-bold">{data.income_type === 0 ? 'Cash Out' : 'Cash In'}</span> id="description"
<input type="checkbox" checked={data.income_type === 0 ? true : false} disabled={data.is_income === 1} className="toggle" onChange={toggleCashType}/> value={data.description}
</label> onChange={handleChange}
</div> />
<div className="form-control"> <label className="label">
<label className="label"> <span className="label-text-alt">
<span className="label-text">Amount</span> {errors.description}
</label> </span>
<NumberFormat </label>
thousandSeparator={true} </div>
className={`input input-bordered ${errors.amount ? 'input-error' : ''}`} <div className="form-control">
value={data.amount} <label className="cursor-pointer label">
thousandSeparator="." <span className="label-text font-bold">
decimalSeparator="," {data.income_type === 0 ? 'Cash Out' : 'Cash In'}
onValueChange={({value}) => setData('amount', value)} </span>
/> <input
<label className="label"> type="checkbox"
<span className="label-text-alt"> checked={data.income_type === 0 ? true : false}
{errors.amount} disabled={data.is_income === 1}
</span> className="toggle"
</label> onChange={toggleCashType}
</div> />
<div className="modal-action"> </label>
<button className={`btn btn-primary ${processing && 'animate-spin'}`} onClick={handleSubmit} disabled={processing}>Add</button> </div>
<button className="btn btn-secondary" onClick={handleReset} disabled={processing}>Clear</button> <div className="form-control">
<button className="btn btn-outline btn-secondary" onClick={() => toggleForm()} disabled={processing}>Close</button> <label className="label">
<span className="label-text">Amount</span>
</label>
<NumberFormat
thousandSeparator={true}
className={`input input-bordered ${
errors.amount ? 'input-error' : ''
}`}
value={data.amount}
thousandSeparator="."
decimalSeparator=","
onValueChange={({ value }) =>
setData('amount', value)
}
/>
<label className="label">
<span className="label-text-alt">
{errors.amount}
</span>
</label>
</div>
<div className="modal-action">
<button
className={`btn btn-primary ${
processing && 'animate-spin'
}`}
onClick={handleSubmit}
disabled={processing}
>
Add
</button>
<button
className="btn btn-secondary"
onClick={handleReset}
disabled={processing}
>
Clear
</button>
<button
className="btn btn-outline btn-secondary"
onClick={() => toggleForm()}
disabled={processing}
>
Close
</button>
</div>
</div> </div>
</div>
</div> </div>
</Authenticated> </Authenticated>
); )
} }

@ -2,6 +2,7 @@
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Api\CategoriesQuery;
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
@ -14,6 +15,7 @@ use Illuminate\Support\Facades\Route;
| |
*/ */
Route::get('/categories', CategoriesQuery::class)->name('api.categories.query');
Route::middleware('auth:sanctum')->get('/user', function (Request $request) { Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
return $request->user(); return $request->user();
}); });

Loading…
Cancel
Save