crud voucher import listing done
parent
5a3bfa0be1
commit
90639050f9
@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\LocationProfile;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class LocationProfileController extends Controller
|
||||
{
|
||||
public function index(Request $request)
|
||||
{
|
||||
$query = LocationProfile::with(['location'])->orderBy('updated_at', 'desc');
|
||||
|
||||
if ($request->q != '') {
|
||||
$query->where('name', 'like', "%$request->q%")
|
||||
->orWhere('display_note', 'like', "%$request->q%")
|
||||
->orWhereHas('location', fn ($q) => $q->where('name', 'like', "%$request->q%"));
|
||||
}
|
||||
|
||||
return $query->limit(100)->get();
|
||||
}
|
||||
}
|
@ -1,20 +1,20 @@
|
||||
import React from "react";
|
||||
import { HiSearch } from "react-icons/hi";
|
||||
import React from 'react'
|
||||
import { HiSearch } from 'react-icons/hi'
|
||||
|
||||
export default function SearchInput({ onChange, value }) {
|
||||
return (
|
||||
<div className="relative w-full">
|
||||
<div className="absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none">
|
||||
<HiSearch className='text-base dark:text-white'/>
|
||||
<HiSearch className="text-base dark:text-white" />
|
||||
</div>
|
||||
<input
|
||||
type="text"
|
||||
className="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full pl-10 p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
|
||||
placeholder="Search"
|
||||
<input
|
||||
type="text"
|
||||
className="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full pl-10 p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
|
||||
placeholder="Search"
|
||||
onChange={onChange}
|
||||
value={value}
|
||||
autoComplete="off"
|
||||
/>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -1,21 +1,25 @@
|
||||
export const filterOpenMenu = (user, item) => {
|
||||
const isAdmin = +user.is_superadmin === 1
|
||||
const isAdmin = user.role === null
|
||||
if ('items' in item) {
|
||||
let items = []
|
||||
if (isAdmin) {
|
||||
items = item.items
|
||||
} else {
|
||||
items = item.items.filter(item => user.role.permissions.find(p => p.name === item.permission) ? item : null)
|
||||
items = item.items.filter((item) =>
|
||||
user.role.permissions.find((p) => p.name === item.permission)
|
||||
? item
|
||||
: null
|
||||
)
|
||||
}
|
||||
|
||||
if (items.length > 0) {
|
||||
let activeItem = items.map(item => route().current(item.active))
|
||||
let activeItem = items.map((item) => route().current(item.active))
|
||||
item.open = activeItem.includes(true)
|
||||
item.items = items.filter(item => item.show ? item : null)
|
||||
item.items = items.filter((item) => (item.show ? item : null))
|
||||
return item
|
||||
}
|
||||
}
|
||||
if (isAdmin) {
|
||||
return item
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,269 @@
|
||||
import React, { useRef, useEffect, useState } from 'react'
|
||||
import { useDebounce } from '@/hooks'
|
||||
import { usePage } from '@inertiajs/react'
|
||||
import axios from 'axios'
|
||||
import { HiChevronDown, HiChevronUp, HiX } from 'react-icons/hi'
|
||||
import { Spinner } from 'flowbite-react'
|
||||
|
||||
export default function SelectionInput(props) {
|
||||
const ref = useRef()
|
||||
const {
|
||||
props: { auth },
|
||||
} = usePage()
|
||||
|
||||
const {
|
||||
label = '',
|
||||
itemSelected = null,
|
||||
onItemSelected = () => {},
|
||||
disabled = false,
|
||||
placeholder = '',
|
||||
error = '',
|
||||
all = 0,
|
||||
} = props
|
||||
|
||||
const [showItems, setShowItem] = useState([])
|
||||
|
||||
const [isSelected, setIsSelected] = useState(true)
|
||||
const [selected, setSelected] = useState(null)
|
||||
|
||||
const [query, setQuery] = useState('')
|
||||
const q = useDebounce(query, 300)
|
||||
|
||||
const [isOpen, setIsOpen] = useState(false)
|
||||
const [loading, setLoading] = useState(false)
|
||||
|
||||
const toggle = () => {
|
||||
setQuery('')
|
||||
setIsOpen(!isOpen)
|
||||
}
|
||||
|
||||
const onInputMouseDown = () => {
|
||||
setIsSelected(false)
|
||||
setQuery('')
|
||||
setIsOpen(!isOpen)
|
||||
}
|
||||
|
||||
const handleSelectItem = (item) => {
|
||||
setIsSelected(true)
|
||||
onItemSelected(item.id)
|
||||
setSelected(`${item.location.name} - ${item.name}`)
|
||||
setIsOpen(false)
|
||||
}
|
||||
|
||||
const removeItem = () => {
|
||||
setIsSelected(false)
|
||||
setSelected('')
|
||||
onItemSelected(null)
|
||||
}
|
||||
|
||||
const filterItems = (value) => {
|
||||
setIsSelected(false)
|
||||
setQuery(value)
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
if (isOpen === true) {
|
||||
const checkIfClickedOutside = (e) => {
|
||||
if (isOpen && ref.current && !ref.current.contains(e.target)) {
|
||||
setIsOpen(false)
|
||||
if (selected !== null) {
|
||||
setIsSelected(true)
|
||||
}
|
||||
}
|
||||
}
|
||||
document.addEventListener('mousedown', checkIfClickedOutside)
|
||||
return () => {
|
||||
document.removeEventListener('mousedown', checkIfClickedOutside)
|
||||
}
|
||||
}
|
||||
}, [isOpen])
|
||||
|
||||
const fetch = (q = '') => {
|
||||
setLoading(true)
|
||||
axios
|
||||
.get(route('api.location-profile.index', { q: q, all: all }), {
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
// Authorization: 'Bearer ' + auth.user.jwt_token,
|
||||
},
|
||||
})
|
||||
.then((response) => {
|
||||
setShowItem(response.data)
|
||||
})
|
||||
.catch((err) => {
|
||||
alert(err)
|
||||
})
|
||||
.finally(() => setLoading(false))
|
||||
}
|
||||
|
||||
// every select item open
|
||||
useEffect(() => {
|
||||
if (isOpen) {
|
||||
fetch(q)
|
||||
}
|
||||
}, [q, isOpen])
|
||||
|
||||
// once page load
|
||||
useEffect(() => {
|
||||
fetch()
|
||||
}, [])
|
||||
|
||||
useEffect(() => {
|
||||
if (disabled) {
|
||||
setSelected('')
|
||||
}
|
||||
}, [disabled])
|
||||
|
||||
useEffect(() => {
|
||||
if (itemSelected !== null) {
|
||||
const item = showItems.find((item) => item.id === itemSelected)
|
||||
if (item) {
|
||||
setSelected(`${item.location.name} - ${item.name}`)
|
||||
setIsSelected(true)
|
||||
}
|
||||
return
|
||||
}
|
||||
setIsSelected(false)
|
||||
}, [itemSelected, loading])
|
||||
|
||||
useEffect(() => {
|
||||
if (isSelected && selected === '') {
|
||||
setSelected('')
|
||||
setIsSelected(false)
|
||||
}
|
||||
}, [isSelected])
|
||||
|
||||
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 relative">
|
||||
{label !== '' && (
|
||||
<label
|
||||
htmlFor="first_name"
|
||||
className="mb-2 block text-sm font-medium text-gray-900 dark:text-white"
|
||||
>
|
||||
{label}
|
||||
</label>
|
||||
)}
|
||||
<div className="w-full">
|
||||
<div
|
||||
className={`p-1.5 bg-gray-50 dark:bg-gray-700 flex border rounded-lg
|
||||
${
|
||||
error
|
||||
? 'border-red-500'
|
||||
: 'border-gray-300 dark:border-gray-600'
|
||||
}
|
||||
${disabled ? 'bg-gray-50' : ''}`}
|
||||
>
|
||||
<input
|
||||
className="block w-full text-sm bg-gray-50 text-gray-900 dark:border-gray-700 border cursor-pointer dark:text-gray-300 outline-none border-transparent dark:bg-gray-700 dark:placeholder-gray-400 px-1"
|
||||
onMouseDown={onInputMouseDown}
|
||||
placeholder={placeholder}
|
||||
value={`${
|
||||
isSelected
|
||||
? selected === null
|
||||
? ''
|
||||
: selected
|
||||
: query
|
||||
}`}
|
||||
onChange={(e) =>
|
||||
filterItems(e.target.value)
|
||||
}
|
||||
disabled={disabled}
|
||||
/>
|
||||
{isSelected && (
|
||||
<div
|
||||
onClick={
|
||||
disabled ? () => {} : removeItem
|
||||
}
|
||||
>
|
||||
<button className="cursor-pointer w-6 h-6 text-red-300 outline-none focus:outline-none">
|
||||
<HiX />
|
||||
</button>
|
||||
</div>
|
||||
)}
|
||||
<div onClick={disabled ? () => {} : toggle}>
|
||||
<button className="cursor-pointer w-6 h-6 text-gray-300 outline-none focus:outline-none">
|
||||
{isOpen ? (
|
||||
<HiChevronUp />
|
||||
) : (
|
||||
<HiChevronDown />
|
||||
)}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
{error && (
|
||||
<p className="mb-2 text-sm text-red-600 dark:text-red-500">
|
||||
{error}
|
||||
</p>
|
||||
)}
|
||||
</div>
|
||||
{isOpen && (
|
||||
<div
|
||||
className="absolute mt-1 shadow-lg bg-gray-50 dark:bg-gray-700 dark:text-gray-200 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">
|
||||
<Spinner className="mr-2" />
|
||||
<span>Loading...</span>
|
||||
</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-400 bg-opacity-10 dark:hover:bg-gray-200 dark:hover:bg-opacity-10 dark:hover:text-gray-100">
|
||||
<div className="w-full items-center flex">
|
||||
<div className="mx-2">
|
||||
<span>
|
||||
{
|
||||
item
|
||||
.location
|
||||
.name
|
||||
}{' '}
|
||||
-{' '}
|
||||
{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>
|
||||
)
|
||||
}
|
@ -1,27 +1,23 @@
|
||||
import React from 'react';
|
||||
import AuthenticatedLayout from '@/Layouts/AuthenticatedLayout';
|
||||
import { Head } from '@inertiajs/react';
|
||||
import { HiFire } from 'react-icons/hi';
|
||||
import React from 'react'
|
||||
import AuthenticatedLayout from '@/Layouts/AuthenticatedLayout'
|
||||
import { Head } from '@inertiajs/react'
|
||||
import { HiFire } from 'react-icons/hi'
|
||||
|
||||
export default function Maintance(props) {
|
||||
return (
|
||||
<AuthenticatedLayout
|
||||
auth={props.auth}
|
||||
errors={props.errors}
|
||||
flash={props.flash}
|
||||
page={"Page"}
|
||||
action={"Development Mode"}
|
||||
>
|
||||
<AuthenticatedLayout page={'Page'} action={'Development Mode'}>
|
||||
<Head title="Masih Dalam Pengembangan" />
|
||||
|
||||
<div>
|
||||
<div className="mx-auto sm:px-6 lg:px-8 text-center">
|
||||
<div className="overflow-hidden py-40 shadow-sm sm:rounded-lg bg-white dark:bg-gray-800 flex justify-center items-center flex-col">
|
||||
<HiFire className='text-center dark:text-white w-40 h-40'/>
|
||||
<div className="p-6 dark:text-gray-100 text-3xl">Fitur Dalam Pengembangan</div>
|
||||
<HiFire className="text-center dark:text-white w-40 h-40" />
|
||||
<div className="p-6 dark:text-gray-100 text-3xl">
|
||||
Fitur Dalam Pengembangan
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</AuthenticatedLayout>
|
||||
);
|
||||
}
|
||||
)
|
||||
}
|
||||
|
@ -0,0 +1,102 @@
|
||||
import React, { useEffect, useState } from 'react'
|
||||
import { router, Link } from '@inertiajs/react'
|
||||
import { usePrevious } from 'react-use'
|
||||
import { Head } from '@inertiajs/react'
|
||||
import { Button } from 'flowbite-react'
|
||||
|
||||
import AuthenticatedLayout from '@/Layouts/AuthenticatedLayout'
|
||||
import Pagination from '@/Components/Pagination'
|
||||
import SearchInput from '@/Components/SearchInput'
|
||||
import { hasPermission } from '@/utils'
|
||||
|
||||
export default function Index(props) {
|
||||
const {
|
||||
query: { links, data },
|
||||
auth,
|
||||
} = props
|
||||
|
||||
const [search, setSearch] = useState('')
|
||||
const preValue = usePrevious(`${search}`)
|
||||
|
||||
const params = { q: search }
|
||||
useEffect(() => {
|
||||
if (preValue) {
|
||||
router.get(
|
||||
route(route().current()),
|
||||
{ q: search },
|
||||
{
|
||||
replace: true,
|
||||
preserveState: true,
|
||||
}
|
||||
)
|
||||
}
|
||||
}, [search])
|
||||
|
||||
const canCreate = hasPermission(auth, 'create-voucher')
|
||||
|
||||
return (
|
||||
<AuthenticatedLayout page={'Voucher'} action={''}>
|
||||
<Head title="Voucher" />
|
||||
|
||||
<div>
|
||||
<div className="mx-auto sm:px-6 lg:px-8 ">
|
||||
<div className="p-6 overflow-hidden shadow-sm sm:rounded-lg bg-gray-200 dark:bg-gray-800 space-y-4">
|
||||
<div className="flex flex-col lg:flex-row gap-1 justify-between">
|
||||
{canCreate && (
|
||||
<div className="flex flex-row space-x-2">
|
||||
<Link href={route('voucher.create')}>
|
||||
<Button size="sm">Tambah</Button>
|
||||
</Link>
|
||||
<Link href={route('voucher.import')}>
|
||||
<Button size="sm" outline>
|
||||
Import
|
||||
</Button>
|
||||
</Link>
|
||||
</div>
|
||||
)}
|
||||
<div className="flex flex-col md:flex-row gap-1 items-center">
|
||||
<div className="w-full max-w-md">
|
||||
<SearchInput
|
||||
onChange={(e) =>
|
||||
setSearch(e.target.value)
|
||||
}
|
||||
value={search}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="overflow-auto">
|
||||
<div className="grid grid-cols-2 lg:grid-cols-4 gap-2 mb-4">
|
||||
{data.map((location) => (
|
||||
<Link
|
||||
key={location.name}
|
||||
href={route(
|
||||
'voucher.profile',
|
||||
location
|
||||
)}
|
||||
className="px-4 py-6 bg-white flex flex-col md:flex-row justify-between items-center rounded-md shadow border hover:underline hover:bg-gray-100"
|
||||
>
|
||||
<div className="text-xl font-bold hover:underline">
|
||||
{location.name}
|
||||
</div>
|
||||
<div
|
||||
className={`${location.count_vouchers.color} px-2 rounded border`}
|
||||
>
|
||||
{
|
||||
location.count_vouchers
|
||||
.unsold_count
|
||||
}
|
||||
</div>
|
||||
</Link>
|
||||
))}
|
||||
</div>
|
||||
<div className="w-full flex items-center justify-center">
|
||||
<Pagination links={links} params={params} />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</AuthenticatedLayout>
|
||||
)
|
||||
}
|
@ -0,0 +1,159 @@
|
||||
import React, { useEffect, useState } from 'react'
|
||||
import { router, Link } from '@inertiajs/react'
|
||||
import { usePrevious } from 'react-use'
|
||||
import { Head } from '@inertiajs/react'
|
||||
import { Button } from 'flowbite-react'
|
||||
|
||||
import AuthenticatedLayout from '@/Layouts/AuthenticatedLayout'
|
||||
import Pagination from '@/Components/Pagination'
|
||||
import SearchInput from '@/Components/SearchInput'
|
||||
import { formatIDR, hasPermission } from '@/utils'
|
||||
|
||||
export default function Index(props) {
|
||||
const {
|
||||
query: { links, data },
|
||||
location,
|
||||
stats,
|
||||
auth,
|
||||
} = props
|
||||
|
||||
const [search, setSearch] = useState('')
|
||||
const preValue = usePrevious(`${search}`)
|
||||
|
||||
const params = { q: search }
|
||||
useEffect(() => {
|
||||
if (preValue) {
|
||||
router.get(
|
||||
route(route().current()),
|
||||
{ q: search },
|
||||
{
|
||||
replace: true,
|
||||
preserveState: true,
|
||||
}
|
||||
)
|
||||
}
|
||||
}, [search])
|
||||
|
||||
const canCreate = hasPermission(auth, 'create-voucher')
|
||||
|
||||
return (
|
||||
<AuthenticatedLayout
|
||||
page={'Voucher'}
|
||||
action={[location.name]}
|
||||
parent={route('voucher.location')}
|
||||
>
|
||||
<Head title="Voucher" />
|
||||
|
||||
<div>
|
||||
<div className="mx-auto sm:px-6 lg:px-8 ">
|
||||
<div className="w-full grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-2 mb-2">
|
||||
<div className="border rounded-md shadow bg-white px-4 py-2 flex flex-col">
|
||||
<div className="text-gray-600 text-lg">
|
||||
Total Voucher
|
||||
</div>
|
||||
<div className="font-bold text-xl pt-2">
|
||||
{formatIDR(stats.count_voucher_total)} PCS
|
||||
</div>
|
||||
</div>
|
||||
<div className="border rounded-md shadow bg-white px-4 py-2 flex flex-col">
|
||||
<div className="text-gray-600 text-lg">
|
||||
Total Voucher
|
||||
</div>
|
||||
<div className="font-bold text-xl pt-2">
|
||||
Rp. {formatIDR(stats.sum_voucher_total)}
|
||||
</div>
|
||||
</div>
|
||||
<div className="border rounded-md shadow bg-white px-4 py-2 flex flex-col">
|
||||
<div className="text-gray-600 text-lg">
|
||||
Total Voucher sudah terjual
|
||||
</div>
|
||||
<div className="font-bold text-xl pt-2">
|
||||
{formatIDR(stats.count_voucher_sold)} PCS
|
||||
</div>
|
||||
</div>
|
||||
<div className="border rounded-md shadow bg-white px-4 py-2 flex flex-col">
|
||||
<div className="text-gray-600 text-lg">
|
||||
Jumlah Voucher sudah terjual
|
||||
</div>
|
||||
<div className="font-bold text-xl pt-2">
|
||||
Rp. {formatIDR(stats.sum_voucher_sold)}
|
||||
</div>
|
||||
</div>
|
||||
<div className="border rounded-md shadow bg-white px-4 py-2 flex flex-col">
|
||||
<div className="text-gray-600 text-lg">
|
||||
Total Voucher belum terjual
|
||||
</div>
|
||||
<div className="font-bold text-xl pt-2">
|
||||
{formatIDR(stats.count_voucher_unsold)} PCS
|
||||
</div>
|
||||
</div>
|
||||
<div className="border rounded-md shadow bg-white px-4 py-2 flex flex-col">
|
||||
<div className="text-gray-600 text-lg">
|
||||
Jumlah Voucher belum terjual
|
||||
</div>
|
||||
<div className="font-bold text-xl pt-2">
|
||||
Rp. {formatIDR(stats.sum_voucher_unsold)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="p-6 overflow-hidden shadow-sm sm:rounded-lg bg-gray-200 dark:bg-gray-800 space-y-4">
|
||||
<div className="flex flex-col lg:flex-row gap-1 justify-between">
|
||||
{canCreate && (
|
||||
<div className="flex flex-row space-x-2">
|
||||
<Link href={route('voucher.create')}>
|
||||
<Button size="sm">Tambah</Button>
|
||||
</Link>
|
||||
<Link href={route('voucher.import')}>
|
||||
<Button size="sm" outline>
|
||||
Import
|
||||
</Button>
|
||||
</Link>
|
||||
</div>
|
||||
)}
|
||||
<div className="flex flex-col md:flex-row gap-1 items-center">
|
||||
<div className="w-full max-w-md">
|
||||
<SearchInput
|
||||
onChange={(e) =>
|
||||
setSearch(e.target.value)
|
||||
}
|
||||
value={search}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="overflow-auto">
|
||||
<div className="grid grid-cols-2 lg:grid-cols-4 gap-2 mb-4">
|
||||
{data.map((profile) => (
|
||||
<Link
|
||||
key={profile.name}
|
||||
href={route('voucher.index', {
|
||||
location,
|
||||
profile,
|
||||
})}
|
||||
className="px-4 py-6 bg-white flex flex-col md:flex-row justify-between items-center rounded-md shadow border hover:bg-gray-100"
|
||||
>
|
||||
<div className="text-xl font-bold hover:underline">
|
||||
{profile.name}
|
||||
</div>
|
||||
<div
|
||||
className={`${profile.count_vouchers.color} px-2 rounded border`}
|
||||
>
|
||||
{
|
||||
profile.count_vouchers
|
||||
.unsold_count
|
||||
}
|
||||
</div>
|
||||
</Link>
|
||||
))}
|
||||
</div>
|
||||
<div className="w-full flex items-center justify-center">
|
||||
<Pagination links={links} params={params} />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</AuthenticatedLayout>
|
||||
)
|
||||
}
|
@ -1,22 +1,23 @@
|
||||
const defaultTheme = require('tailwindcss/defaultTheme');
|
||||
const defaultTheme = require('tailwindcss/defaultTheme')
|
||||
|
||||
/** @type {import('tailwindcss').Config} */
|
||||
module.exports = {
|
||||
content: [
|
||||
"./vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php",
|
||||
"./resources/views/**/*.blade.php",
|
||||
"./resources/js/**/*.jsx",
|
||||
"./node_modules/flowbite/**/*.js",
|
||||
"./node_modules/flowbite-react/**/*.{js,jsx,ts,tsx}",
|
||||
'./vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
|
||||
'./resources/views/**/*.blade.php',
|
||||
'./app/Models/*.php',
|
||||
'./resources/js/**/*.jsx',
|
||||
'./node_modules/flowbite/**/*.js',
|
||||
'./node_modules/flowbite-react/**/*.{js,jsx,ts,tsx}',
|
||||
],
|
||||
|
||||
theme: {
|
||||
extend: {
|
||||
fontFamily: {
|
||||
sans: ["Nunito", ...defaultTheme.fontFamily.sans],
|
||||
sans: ['Nunito', ...defaultTheme.fontFamily.sans],
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
plugins: [require("@tailwindcss/forms"), require("flowbite/plugin")],
|
||||
};
|
||||
plugins: [require('@tailwindcss/forms'), require('flowbite/plugin')],
|
||||
}
|
||||
|
Loading…
Reference in New Issue