mirror of
https://github.com/crater-invoice/crater.git
synced 2025-10-28 12:11:08 -04:00
Compare commits
1 Commits
dark-cust-
...
dependabot
| Author | SHA1 | Date | |
|---|---|---|---|
| 59f433dd00 |
162
.github/workflows/uffizzi-build.yml
vendored
162
.github/workflows/uffizzi-build.yml
vendored
@ -1,162 +0,0 @@
|
|||||||
name: Build PR Image
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
types: [opened,synchronize,reopened,closed]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
|
|
||||||
build-application:
|
|
||||||
name: Build and Push `application`
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }}
|
|
||||||
outputs:
|
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
|
||||||
steps:
|
|
||||||
- name: Checkout git repo
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v2
|
|
||||||
- name: Generate UUID image name
|
|
||||||
id: uuid
|
|
||||||
run: echo "UUID_TAG_APP=$(uuidgen)" >> $GITHUB_ENV
|
|
||||||
- name: Docker metadata
|
|
||||||
id: meta
|
|
||||||
uses: docker/metadata-action@v3
|
|
||||||
with:
|
|
||||||
images: registry.uffizzi.com/${{ env.UUID_TAG_APP }}
|
|
||||||
tags: type=raw,value=60d
|
|
||||||
- name: Build and Push Image to registry.uffizzi.com ephemeral registry
|
|
||||||
uses: docker/build-push-action@v2
|
|
||||||
with:
|
|
||||||
push: true
|
|
||||||
context: ./
|
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
|
||||||
file: ./uffizzi/Dockerfile
|
|
||||||
cache-from: type=gha
|
|
||||||
cache-to: type=gha,mode=max
|
|
||||||
|
|
||||||
|
|
||||||
build-nginx:
|
|
||||||
name: Build and Push `nginx`
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }}
|
|
||||||
outputs:
|
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
|
||||||
steps:
|
|
||||||
- name: Checkout git repo
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v2
|
|
||||||
- name: Generate UUID image name
|
|
||||||
id: uuid
|
|
||||||
run: echo "UUID_TAG_NGINX=$(uuidgen)" >> $GITHUB_ENV
|
|
||||||
- name: Docker metadata
|
|
||||||
id: meta
|
|
||||||
uses: docker/metadata-action@v3
|
|
||||||
with:
|
|
||||||
images: registry.uffizzi.com/${{ env.UUID_TAG_NGINX }}
|
|
||||||
tags: type=raw,value=60d
|
|
||||||
- name: Build and Push Image to Uffizzi ephemeral registry
|
|
||||||
uses: docker/build-push-action@v2
|
|
||||||
with:
|
|
||||||
push: true
|
|
||||||
context: ./
|
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
|
||||||
file: ./uffizzi/nginx/Dockerfile
|
|
||||||
cache-from: type=gha
|
|
||||||
cache-to: type=gha,mode=max
|
|
||||||
|
|
||||||
|
|
||||||
build-crond:
|
|
||||||
name: Build and Push `crond`
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }}
|
|
||||||
outputs:
|
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
|
||||||
steps:
|
|
||||||
- name: Checkout git repo
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v2
|
|
||||||
- name: Generate UUID image name
|
|
||||||
id: uuid
|
|
||||||
run: echo "UUID_TAG_CROND=$(uuidgen)" >> $GITHUB_ENV
|
|
||||||
- name: Docker metadata
|
|
||||||
id: meta
|
|
||||||
uses: docker/metadata-action@v3
|
|
||||||
with:
|
|
||||||
images: registry.uffizzi.com/${{ env.UUID_TAG_CROND }}
|
|
||||||
tags: type=raw,value=60d
|
|
||||||
- name: Build and Push Image to registry.uffizzi.com ephemeral registry
|
|
||||||
uses: docker/build-push-action@v2
|
|
||||||
with:
|
|
||||||
push: true
|
|
||||||
context: ./
|
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
|
||||||
file: ./uffizzi/crond/Dockerfile
|
|
||||||
cache-from: type=gha
|
|
||||||
cache-to: type=gha,mode=max
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
render-compose-file:
|
|
||||||
name: Render Docker Compose File
|
|
||||||
# Pass output of this workflow to another triggered by `workflow_run` event.
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
compose-file-cache-key: ${{ steps.hash.outputs.hash }}
|
|
||||||
needs:
|
|
||||||
- build-application
|
|
||||||
- build-nginx
|
|
||||||
- build-crond
|
|
||||||
steps:
|
|
||||||
- name: Checkout git repo
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
- name: Render Compose File
|
|
||||||
run: |
|
|
||||||
APP_IMAGE=$(echo ${{ needs.build-application.outputs.tags }})
|
|
||||||
export APP_IMAGE
|
|
||||||
NGINX_IMAGE=$(echo ${{ needs.build-nginx.outputs.tags }})
|
|
||||||
export NGINX_IMAGE
|
|
||||||
CROND_IMAGE=$(echo ${{ needs.build-crond.outputs.tags }})
|
|
||||||
export CROND_IMAGE
|
|
||||||
# Render simple template from environment variables.
|
|
||||||
envsubst < ./uffizzi/docker-compose.uffizzi.yml > docker-compose.rendered.yml
|
|
||||||
cat docker-compose.rendered.yml
|
|
||||||
- name: Upload Rendered Compose File as Artifact
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: preview-spec
|
|
||||||
path: docker-compose.rendered.yml
|
|
||||||
retention-days: 2
|
|
||||||
- name: Serialize PR Event to File
|
|
||||||
run: |
|
|
||||||
cat << EOF > event.json
|
|
||||||
${{ toJSON(github.event) }}
|
|
||||||
|
|
||||||
EOF
|
|
||||||
- name: Upload PR Event as Artifact
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: preview-spec
|
|
||||||
path: event.json
|
|
||||||
retention-days: 2
|
|
||||||
|
|
||||||
delete-preview:
|
|
||||||
name: Call for Preview Deletion
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: ${{ github.event.action == 'closed' }}
|
|
||||||
steps:
|
|
||||||
# If this PR is closing, we will not render a compose file nor pass it to the next workflow.
|
|
||||||
- name: Serialize PR Event to File
|
|
||||||
run: echo '${{ toJSON(github.event) }}' > event.json
|
|
||||||
- name: Upload PR Event as Artifact
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: preview-spec
|
|
||||||
path: event.json
|
|
||||||
retention-days: 2
|
|
||||||
|
|
||||||
84
.github/workflows/uffizzi-preview.yml
vendored
84
.github/workflows/uffizzi-preview.yml
vendored
@ -1,84 +0,0 @@
|
|||||||
name: Deploy Uffizzi Preview
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_run:
|
|
||||||
workflows:
|
|
||||||
- "Build PR Image"
|
|
||||||
types:
|
|
||||||
- completed
|
|
||||||
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
cache-compose-file:
|
|
||||||
name: Cache Compose File
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
compose-file-cache-key: ${{ env.COMPOSE_FILE_HASH }}
|
|
||||||
pr-number: ${{ env.PR_NUMBER }}
|
|
||||||
steps:
|
|
||||||
- name: 'Download artifacts'
|
|
||||||
# Fetch output (zip archive) from the workflow run that triggered this workflow.
|
|
||||||
uses: actions/github-script@v6
|
|
||||||
with:
|
|
||||||
script: |
|
|
||||||
let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
run_id: context.payload.workflow_run.id,
|
|
||||||
});
|
|
||||||
let matchArtifact = allArtifacts.data.artifacts.filter((artifact) => {
|
|
||||||
return artifact.name == "preview-spec"
|
|
||||||
})[0];
|
|
||||||
let download = await github.rest.actions.downloadArtifact({
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
artifact_id: matchArtifact.id,
|
|
||||||
archive_format: 'zip',
|
|
||||||
});
|
|
||||||
let fs = require('fs');
|
|
||||||
fs.writeFileSync(`${process.env.GITHUB_WORKSPACE}/preview-spec.zip`, Buffer.from(download.data));
|
|
||||||
- name: 'Unzip artifact'
|
|
||||||
run: unzip preview-spec.zip
|
|
||||||
- name: Read Event into ENV
|
|
||||||
run: |
|
|
||||||
echo 'EVENT_JSON<<EOF' >> $GITHUB_ENV
|
|
||||||
cat event.json >> $GITHUB_ENV
|
|
||||||
echo 'EOF' >> $GITHUB_ENV
|
|
||||||
- name: Hash Rendered Compose File
|
|
||||||
id: hash
|
|
||||||
# If the previous workflow was triggered by a PR close event, we will not have a compose file artifact.
|
|
||||||
if: ${{ fromJSON(env.EVENT_JSON).action != 'closed' }}
|
|
||||||
run: echo "COMPOSE_FILE_HASH=$(md5sum docker-compose.rendered.yml | awk '{ print $1 }')" >> $GITHUB_ENV
|
|
||||||
- name: Cache Rendered Compose File
|
|
||||||
if: ${{ fromJSON(env.EVENT_JSON).action != 'closed' }}
|
|
||||||
uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: docker-compose.rendered.yml
|
|
||||||
key: ${{ env.COMPOSE_FILE_HASH }}
|
|
||||||
|
|
||||||
- name: Read PR Number From Event Object
|
|
||||||
id: pr
|
|
||||||
run: echo "PR_NUMBER=${{ fromJSON(env.EVENT_JSON).number }}" >> $GITHUB_ENV
|
|
||||||
|
|
||||||
- name: DEBUG - Print Job Outputs
|
|
||||||
if: ${{ runner.debug }}
|
|
||||||
run: |
|
|
||||||
echo "PR number: ${{ env.PR_NUMBER }}"
|
|
||||||
echo "Compose file hash: ${{ env.COMPOSE_FILE_HASH }}"
|
|
||||||
cat event.json
|
|
||||||
deploy-uffizzi-preview:
|
|
||||||
name: Use Remote Workflow to Preview on Uffizzi
|
|
||||||
needs:
|
|
||||||
- cache-compose-file
|
|
||||||
uses: UffizziCloud/preview-action/.github/workflows/reusable.yaml@v2.6.1
|
|
||||||
with:
|
|
||||||
# If this workflow was triggered by a PR close event, cache-key will be an empty string
|
|
||||||
# and this reusable workflow will delete the preview deployment.
|
|
||||||
compose-file-cache-key: ${{ needs.cache-compose-file.outputs.compose-file-cache-key }}
|
|
||||||
compose-file-cache-path: docker-compose.rendered.yml
|
|
||||||
server: https://app.uffizzi.com/
|
|
||||||
pr-number: ${{ needs.cache-compose-file.outputs.pr-number }}
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
pull-requests: write
|
|
||||||
id-token: write
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
FROM php:8.1-fpm
|
FROM php:7.4-fpm
|
||||||
|
|
||||||
# Arguments defined in docker-compose.yml
|
# Arguments defined in docker-compose.yml
|
||||||
ARG user
|
ARG user
|
||||||
|
|||||||
@ -103,7 +103,6 @@ class CustomerStatsController extends Controller
|
|||||||
)
|
)
|
||||||
->whereCompany()
|
->whereCompany()
|
||||||
->whereCustomer($customer->id)
|
->whereCustomer($customer->id)
|
||||||
->where('status', '<>', Invoice::STATUS_DRAFT)
|
|
||||||
->sum('total');
|
->sum('total');
|
||||||
$totalReceipts = Payment::whereBetween(
|
$totalReceipts = Payment::whereBetween(
|
||||||
'payment_date',
|
'payment_date',
|
||||||
|
|||||||
@ -104,7 +104,6 @@ class DashboardController extends Controller
|
|||||||
'invoice_date',
|
'invoice_date',
|
||||||
[$startDate->format('Y-m-d'), $start->format('Y-m-d')]
|
[$startDate->format('Y-m-d'), $start->format('Y-m-d')]
|
||||||
)
|
)
|
||||||
->where('status', '<>', Invoice::STATUS_DRAFT)
|
|
||||||
->whereCompany()
|
->whereCompany()
|
||||||
->sum('base_total');
|
->sum('base_total');
|
||||||
|
|
||||||
@ -142,7 +141,6 @@ class DashboardController extends Controller
|
|||||||
$recent_due_invoices = Invoice::with('customer')
|
$recent_due_invoices = Invoice::with('customer')
|
||||||
->whereCompany()
|
->whereCompany()
|
||||||
->where('base_due_amount', '>', 0)
|
->where('base_due_amount', '>', 0)
|
||||||
->where('status', '<>', Invoice::STATUS_DRAFT)
|
|
||||||
->take(5)
|
->take(5)
|
||||||
->latest()
|
->latest()
|
||||||
->get();
|
->get();
|
||||||
|
|||||||
@ -24,7 +24,6 @@ class InvoicesController extends Controller
|
|||||||
$limit = $request->has('limit') ? $request->limit : 10;
|
$limit = $request->has('limit') ? $request->limit : 10;
|
||||||
|
|
||||||
$invoices = Invoice::whereCompany()
|
$invoices = Invoice::whereCompany()
|
||||||
->whereTabFilters($request->tab_status)
|
|
||||||
->join('customers', 'customers.id', '=', 'invoices.customer_id')
|
->join('customers', 'customers.id', '=', 'invoices.customer_id')
|
||||||
->applyFilters($request->all())
|
->applyFilters($request->all())
|
||||||
->select('invoices.*', 'customers.name')
|
->select('invoices.*', 'customers.name')
|
||||||
|
|||||||
@ -2,15 +2,14 @@
|
|||||||
|
|
||||||
namespace Crater\Http\Controllers\V1\Admin\Report;
|
namespace Crater\Http\Controllers\V1\Admin\Report;
|
||||||
|
|
||||||
use PDF;
|
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
|
use Crater\Http\Controllers\Controller;
|
||||||
use Crater\Models\Company;
|
use Crater\Models\Company;
|
||||||
use Crater\Models\Currency;
|
use Crater\Models\CompanySetting;
|
||||||
use Crater\Models\Customer;
|
use Crater\Models\Customer;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Crater\Models\CompanySetting;
|
|
||||||
use Illuminate\Support\Facades\App;
|
use Illuminate\Support\Facades\App;
|
||||||
use Crater\Http\Controllers\Controller;
|
use PDF;
|
||||||
|
|
||||||
class CustomerSalesReportController extends Controller
|
class CustomerSalesReportController extends Controller
|
||||||
{
|
{
|
||||||
@ -57,7 +56,6 @@ class CustomerSalesReportController extends Controller
|
|||||||
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
||||||
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
||||||
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
||||||
$currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id));
|
|
||||||
|
|
||||||
$colors = [
|
$colors = [
|
||||||
'primary_text_color',
|
'primary_text_color',
|
||||||
@ -82,7 +80,6 @@ class CustomerSalesReportController extends Controller
|
|||||||
'company' => $company,
|
'company' => $company,
|
||||||
'from_date' => $from_date,
|
'from_date' => $from_date,
|
||||||
'to_date' => $to_date,
|
'to_date' => $to_date,
|
||||||
'currency' => $currency,
|
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$pdf = PDF::loadView('app.pdf.reports.sales-customers');
|
$pdf = PDF::loadView('app.pdf.reports.sales-customers');
|
||||||
|
|||||||
@ -2,15 +2,14 @@
|
|||||||
|
|
||||||
namespace Crater\Http\Controllers\V1\Admin\Report;
|
namespace Crater\Http\Controllers\V1\Admin\Report;
|
||||||
|
|
||||||
use PDF;
|
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use Crater\Models\Company;
|
|
||||||
use Crater\Models\Expense;
|
|
||||||
use Crater\Models\Currency;
|
|
||||||
use Illuminate\Http\Request;
|
|
||||||
use Crater\Models\CompanySetting;
|
|
||||||
use Illuminate\Support\Facades\App;
|
|
||||||
use Crater\Http\Controllers\Controller;
|
use Crater\Http\Controllers\Controller;
|
||||||
|
use Crater\Models\Company;
|
||||||
|
use Crater\Models\CompanySetting;
|
||||||
|
use Crater\Models\Expense;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Facades\App;
|
||||||
|
use PDF;
|
||||||
|
|
||||||
class ExpensesReportController extends Controller
|
class ExpensesReportController extends Controller
|
||||||
{
|
{
|
||||||
@ -44,7 +43,6 @@ class ExpensesReportController extends Controller
|
|||||||
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
||||||
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
||||||
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
||||||
$currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id));
|
|
||||||
|
|
||||||
$colors = [
|
$colors = [
|
||||||
'primary_text_color',
|
'primary_text_color',
|
||||||
@ -68,7 +66,6 @@ class ExpensesReportController extends Controller
|
|||||||
'company' => $company,
|
'company' => $company,
|
||||||
'from_date' => $from_date,
|
'from_date' => $from_date,
|
||||||
'to_date' => $to_date,
|
'to_date' => $to_date,
|
||||||
'currency' => $currency,
|
|
||||||
]);
|
]);
|
||||||
$pdf = PDF::loadView('app.pdf.reports.expenses');
|
$pdf = PDF::loadView('app.pdf.reports.expenses');
|
||||||
|
|
||||||
|
|||||||
@ -2,15 +2,14 @@
|
|||||||
|
|
||||||
namespace Crater\Http\Controllers\V1\Admin\Report;
|
namespace Crater\Http\Controllers\V1\Admin\Report;
|
||||||
|
|
||||||
use PDF;
|
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use Crater\Models\Company;
|
|
||||||
use Crater\Models\Currency;
|
|
||||||
use Illuminate\Http\Request;
|
|
||||||
use Crater\Models\InvoiceItem;
|
|
||||||
use Crater\Models\CompanySetting;
|
|
||||||
use Illuminate\Support\Facades\App;
|
|
||||||
use Crater\Http\Controllers\Controller;
|
use Crater\Http\Controllers\Controller;
|
||||||
|
use Crater\Models\Company;
|
||||||
|
use Crater\Models\CompanySetting;
|
||||||
|
use Crater\Models\InvoiceItem;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Facades\App;
|
||||||
|
use PDF;
|
||||||
|
|
||||||
class ItemSalesReportController extends Controller
|
class ItemSalesReportController extends Controller
|
||||||
{
|
{
|
||||||
@ -44,7 +43,6 @@ class ItemSalesReportController extends Controller
|
|||||||
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
||||||
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
||||||
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
||||||
$currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id));
|
|
||||||
|
|
||||||
$colors = [
|
$colors = [
|
||||||
'primary_text_color',
|
'primary_text_color',
|
||||||
@ -68,7 +66,6 @@ class ItemSalesReportController extends Controller
|
|||||||
'company' => $company,
|
'company' => $company,
|
||||||
'from_date' => $from_date,
|
'from_date' => $from_date,
|
||||||
'to_date' => $to_date,
|
'to_date' => $to_date,
|
||||||
'currency' => $currency,
|
|
||||||
]);
|
]);
|
||||||
$pdf = PDF::loadView('app.pdf.reports.sales-items');
|
$pdf = PDF::loadView('app.pdf.reports.sales-items');
|
||||||
|
|
||||||
|
|||||||
@ -2,16 +2,15 @@
|
|||||||
|
|
||||||
namespace Crater\Http\Controllers\V1\Admin\Report;
|
namespace Crater\Http\Controllers\V1\Admin\Report;
|
||||||
|
|
||||||
use PDF;
|
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
|
use Crater\Http\Controllers\Controller;
|
||||||
use Crater\Models\Company;
|
use Crater\Models\Company;
|
||||||
|
use Crater\Models\CompanySetting;
|
||||||
use Crater\Models\Expense;
|
use Crater\Models\Expense;
|
||||||
use Crater\Models\Payment;
|
use Crater\Models\Payment;
|
||||||
use Crater\Models\Currency;
|
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Crater\Models\CompanySetting;
|
|
||||||
use Illuminate\Support\Facades\App;
|
use Illuminate\Support\Facades\App;
|
||||||
use Crater\Http\Controllers\Controller;
|
use PDF;
|
||||||
|
|
||||||
class ProfitLossReportController extends Controller
|
class ProfitLossReportController extends Controller
|
||||||
{
|
{
|
||||||
@ -50,8 +49,6 @@ class ProfitLossReportController extends Controller
|
|||||||
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
||||||
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
||||||
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
||||||
$currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id));
|
|
||||||
|
|
||||||
|
|
||||||
$colors = [
|
$colors = [
|
||||||
'primary_text_color',
|
'primary_text_color',
|
||||||
@ -77,7 +74,6 @@ class ProfitLossReportController extends Controller
|
|||||||
'company' => $company,
|
'company' => $company,
|
||||||
'from_date' => $from_date,
|
'from_date' => $from_date,
|
||||||
'to_date' => $to_date,
|
'to_date' => $to_date,
|
||||||
'currency' => $currency,
|
|
||||||
]);
|
]);
|
||||||
$pdf = PDF::loadView('app.pdf.reports.profit-loss');
|
$pdf = PDF::loadView('app.pdf.reports.profit-loss');
|
||||||
|
|
||||||
|
|||||||
@ -2,15 +2,14 @@
|
|||||||
|
|
||||||
namespace Crater\Http\Controllers\V1\Admin\Report;
|
namespace Crater\Http\Controllers\V1\Admin\Report;
|
||||||
|
|
||||||
use PDF;
|
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use Crater\Models\Tax;
|
|
||||||
use Crater\Models\Company;
|
|
||||||
use Crater\Models\Currency;
|
|
||||||
use Illuminate\Http\Request;
|
|
||||||
use Crater\Models\CompanySetting;
|
|
||||||
use Illuminate\Support\Facades\App;
|
|
||||||
use Crater\Http\Controllers\Controller;
|
use Crater\Http\Controllers\Controller;
|
||||||
|
use Crater\Models\Company;
|
||||||
|
use Crater\Models\CompanySetting;
|
||||||
|
use Crater\Models\Tax;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Facades\App;
|
||||||
|
use PDF;
|
||||||
|
|
||||||
class TaxSummaryReportController extends Controller
|
class TaxSummaryReportController extends Controller
|
||||||
{
|
{
|
||||||
@ -45,8 +44,6 @@ class TaxSummaryReportController extends Controller
|
|||||||
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
$dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id);
|
||||||
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
$from_date = Carbon::createFromFormat('Y-m-d', $request->from_date)->format($dateFormat);
|
||||||
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
$to_date = Carbon::createFromFormat('Y-m-d', $request->to_date)->format($dateFormat);
|
||||||
$currency = Currency::findOrFail(CompanySetting::getSetting('currency', $company->id));
|
|
||||||
|
|
||||||
|
|
||||||
$colors = [
|
$colors = [
|
||||||
'primary_text_color',
|
'primary_text_color',
|
||||||
@ -71,7 +68,6 @@ class TaxSummaryReportController extends Controller
|
|||||||
'company' => $company,
|
'company' => $company,
|
||||||
'from_date' => $from_date,
|
'from_date' => $from_date,
|
||||||
'to_date' => $to_date,
|
'to_date' => $to_date,
|
||||||
'currency' => $currency,
|
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$pdf = PDF::loadView('app.pdf.reports.tax-summary');
|
$pdf = PDF::loadView('app.pdf.reports.tax-summary');
|
||||||
|
|||||||
@ -3,6 +3,7 @@
|
|||||||
namespace Crater\Http\Requests;
|
namespace Crater\Http\Requests;
|
||||||
|
|
||||||
use Illuminate\Foundation\Http\FormRequest;
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
use Illuminate\Support\Str;
|
||||||
use Illuminate\Validation\Rule;
|
use Illuminate\Validation\Rule;
|
||||||
|
|
||||||
class CompaniesRequest extends FormRequest
|
class CompaniesRequest extends FormRequest
|
||||||
@ -33,10 +34,6 @@ class CompaniesRequest extends FormRequest
|
|||||||
'currency' => [
|
'currency' => [
|
||||||
'required'
|
'required'
|
||||||
],
|
],
|
||||||
'slug' => [
|
|
||||||
'required',
|
|
||||||
Rule::unique('companies')
|
|
||||||
],
|
|
||||||
'address.name' => [
|
'address.name' => [
|
||||||
'nullable',
|
'nullable',
|
||||||
],
|
],
|
||||||
@ -71,11 +68,11 @@ class CompaniesRequest extends FormRequest
|
|||||||
{
|
{
|
||||||
return collect($this->validated())
|
return collect($this->validated())
|
||||||
->only([
|
->only([
|
||||||
'name',
|
'name'
|
||||||
'slug'
|
|
||||||
])
|
])
|
||||||
->merge([
|
->merge([
|
||||||
'owner_id' => $this->user()->id
|
'owner_id' => $this->user()->id,
|
||||||
|
'slug' => Str::slug($this->name)
|
||||||
])
|
])
|
||||||
->toArray();
|
->toArray();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -30,8 +30,7 @@ class CompanyRequest extends FormRequest
|
|||||||
Rule::unique('companies')->ignore($this->header('company'), 'id'),
|
Rule::unique('companies')->ignore($this->header('company'), 'id'),
|
||||||
],
|
],
|
||||||
'slug' => [
|
'slug' => [
|
||||||
'required',
|
'nullable'
|
||||||
Rule::unique('companies')->ignore($this->header('company'), 'id'),
|
|
||||||
],
|
],
|
||||||
'address.country_id' => [
|
'address.country_id' => [
|
||||||
'required',
|
'required',
|
||||||
|
|||||||
@ -23,7 +23,7 @@ class EstimateResource extends JsonResource
|
|||||||
'reference_number' => $this->reference_number,
|
'reference_number' => $this->reference_number,
|
||||||
'tax_per_item' => $this->tax_per_item,
|
'tax_per_item' => $this->tax_per_item,
|
||||||
'discount_per_item' => $this->discount_per_item,
|
'discount_per_item' => $this->discount_per_item,
|
||||||
'notes' => $this->notes,
|
'notes' => $this->getNotes(),
|
||||||
'discount' => $this->discount,
|
'discount' => $this->discount,
|
||||||
'discount_type' => $this->discount_type,
|
'discount_type' => $this->discount_type,
|
||||||
'discount_val' => $this->discount_val,
|
'discount_val' => $this->discount_val,
|
||||||
|
|||||||
@ -18,7 +18,7 @@ class PaymentResource extends JsonResource
|
|||||||
'id' => $this->id,
|
'id' => $this->id,
|
||||||
'payment_number' => $this->payment_number,
|
'payment_number' => $this->payment_number,
|
||||||
'payment_date' => $this->payment_date,
|
'payment_date' => $this->payment_date,
|
||||||
'notes' => $this->notes,
|
'notes' => $this->getNotes(),
|
||||||
'amount' => $this->amount,
|
'amount' => $this->amount,
|
||||||
'unique_hash' => $this->unique_hash,
|
'unique_hash' => $this->unique_hash,
|
||||||
'invoice_id' => $this->invoice_id,
|
'invoice_id' => $this->invoice_id,
|
||||||
|
|||||||
@ -217,7 +217,7 @@ class Company extends Model implements HasMedia
|
|||||||
'estimate_billing_address_format' => $billingAddressFormat,
|
'estimate_billing_address_format' => $billingAddressFormat,
|
||||||
'payment_company_address_format' => $companyAddressFormat,
|
'payment_company_address_format' => $companyAddressFormat,
|
||||||
'payment_from_customer_address_format' => $paymentFromCustomerAddress,
|
'payment_from_customer_address_format' => $paymentFromCustomerAddress,
|
||||||
'currency' => request()->currency ?? 1,
|
'currency' => request()->currency ?? 13,
|
||||||
'time_zone' => 'Asia/Kolkata',
|
'time_zone' => 'Asia/Kolkata',
|
||||||
'language' => 'en',
|
'language' => 'en',
|
||||||
'fiscal_year' => '1-12',
|
'fiscal_year' => '1-12',
|
||||||
|
|||||||
@ -483,8 +483,7 @@ class Estimate extends Model implements HasMedia
|
|||||||
'{ESTIMATE_DATE}' => $this->formattedEstimateDate,
|
'{ESTIMATE_DATE}' => $this->formattedEstimateDate,
|
||||||
'{ESTIMATE_EXPIRY_DATE}' => $this->formattedExpiryDate,
|
'{ESTIMATE_EXPIRY_DATE}' => $this->formattedExpiryDate,
|
||||||
'{ESTIMATE_NUMBER}' => $this->estimate_number,
|
'{ESTIMATE_NUMBER}' => $this->estimate_number,
|
||||||
'{PDF_LINK}' => $this->estimatePdfUrl,
|
'{ESTIMATE_REF_NUMBER}' => $this->reference_number,
|
||||||
'{TOTAL_AMOUNT}' => format_money_pdf($this->total, $this->customer->currency)
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -240,7 +240,7 @@ class Expense extends Model implements HasMedia
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ($request->hasFile('attachment_receipt')) {
|
if ($request->hasFile('attachment_receipt')) {
|
||||||
$expense->addMediaFromRequest('attachment_receipt')->toMediaCollection('receipts', 'local');
|
$expense->addMediaFromRequest('attachment_receipt')->toMediaCollection('receipts');
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($request->customFields) {
|
if ($request->customFields) {
|
||||||
@ -262,12 +262,12 @@ class Expense extends Model implements HasMedia
|
|||||||
ExchangeRateLog::addExchangeRateLog($this);
|
ExchangeRateLog::addExchangeRateLog($this);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($request->is_attachment_receipt_removed) && $request->is_attachment_receipt_removed == "true") {
|
if (isset($request->is_attachment_receipt_removed) && (bool) $request->is_attachment_receipt_removed) {
|
||||||
$this->clearMediaCollection('receipts');
|
$this->clearMediaCollection('receipts');
|
||||||
}
|
}
|
||||||
if ($request->hasFile('attachment_receipt')) {
|
if ($request->hasFile('attachment_receipt')) {
|
||||||
$this->clearMediaCollection('receipts');
|
$this->clearMediaCollection('receipts');
|
||||||
$this->addMediaFromRequest('attachment_receipt')->toMediaCollection('receipts', 'local');
|
$this->addMediaFromRequest('attachment_receipt')->toMediaCollection('receipts');
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($request->customFields) {
|
if ($request->customFields) {
|
||||||
|
|||||||
@ -187,6 +187,16 @@ class Invoice extends Model implements HasMedia
|
|||||||
return Carbon::parse($this->invoice_date)->format($dateFormat);
|
return Carbon::parse($this->invoice_date)->format($dateFormat);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function scopeWhereStatus($query, $status)
|
||||||
|
{
|
||||||
|
return $query->where('invoices.status', $status);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function scopeWherePaidStatus($query, $status)
|
||||||
|
{
|
||||||
|
return $query->where('invoices.paid_status', $status);
|
||||||
|
}
|
||||||
|
|
||||||
public function scopeWhereDueStatus($query, $status)
|
public function scopeWhereDueStatus($query, $status)
|
||||||
{
|
{
|
||||||
return $query->whereIn('invoices.paid_status', [
|
return $query->whereIn('invoices.paid_status', [
|
||||||
@ -224,40 +234,6 @@ class Invoice extends Model implements HasMedia
|
|||||||
$query->orderBy($orderByField, $orderBy);
|
$query->orderBy($orderByField, $orderBy);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function scopeWhereStatus($query, $status)
|
|
||||||
{
|
|
||||||
return $query->where('invoices.status', $status);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function scopeWherePaidStatus($query, $status)
|
|
||||||
{
|
|
||||||
return $query->where('invoices.paid_status', $status);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function scopeWhereTabFilters($query, $status)
|
|
||||||
{
|
|
||||||
if ($status == "DRAFT") {
|
|
||||||
return $query->where('invoices.status', $status);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($status == "SENT") {
|
|
||||||
return $query->whereIn('invoices.status', [
|
|
||||||
self::STATUS_SENT,
|
|
||||||
self::STATUS_VIEWED,
|
|
||||||
self::STATUS_COMPLETED
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($status == 'DUE') {
|
|
||||||
return $query->whereIn('invoices.paid_status', [
|
|
||||||
self::STATUS_UNPAID,
|
|
||||||
self::STATUS_PARTIALLY_PAID,
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function scopeApplyFilters($query, array $filters)
|
public function scopeApplyFilters($query, array $filters)
|
||||||
{
|
{
|
||||||
$filters = collect($filters);
|
$filters = collect($filters);
|
||||||
@ -273,11 +249,17 @@ class Invoice extends Model implements HasMedia
|
|||||||
$filters->get('status') == self::STATUS_PAID
|
$filters->get('status') == self::STATUS_PAID
|
||||||
) {
|
) {
|
||||||
$query->wherePaidStatus($filters->get('status'));
|
$query->wherePaidStatus($filters->get('status'));
|
||||||
|
} elseif ($filters->get('status') == 'DUE') {
|
||||||
|
$query->whereDueStatus($filters->get('status'));
|
||||||
} else {
|
} else {
|
||||||
$query->whereStatus($filters->get('status'));
|
$query->whereStatus($filters->get('status'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($filters->get('paid_status')) {
|
||||||
|
$query->wherePaidStatus($filters->get('status'));
|
||||||
|
}
|
||||||
|
|
||||||
if ($filters->get('invoice_id')) {
|
if ($filters->get('invoice_id')) {
|
||||||
$query->whereInvoice($filters->get('invoice_id'));
|
$query->whereInvoice($filters->get('invoice_id'));
|
||||||
}
|
}
|
||||||
@ -669,9 +651,7 @@ class Invoice extends Model implements HasMedia
|
|||||||
'{INVOICE_DATE}' => $this->formattedInvoiceDate,
|
'{INVOICE_DATE}' => $this->formattedInvoiceDate,
|
||||||
'{INVOICE_DUE_DATE}' => $this->formattedDueDate,
|
'{INVOICE_DUE_DATE}' => $this->formattedDueDate,
|
||||||
'{INVOICE_NUMBER}' => $this->invoice_number,
|
'{INVOICE_NUMBER}' => $this->invoice_number,
|
||||||
'{PDF_LINK}' => $this->invoicePdfUrl,
|
'{INVOICE_REF_NUMBER}' => $this->reference_number,
|
||||||
'{DUE_AMOUNT}' => format_money_pdf($this->due_amount, $this->customer->currency),
|
|
||||||
'{TOTAL_AMOUNT}' => format_money_pdf($this->total, $this->customer->currency)
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -435,8 +435,7 @@ class Payment extends Model implements HasMedia
|
|||||||
'{PAYMENT_DATE}' => $this->formattedPaymentDate,
|
'{PAYMENT_DATE}' => $this->formattedPaymentDate,
|
||||||
'{PAYMENT_MODE}' => $this->paymentMethod ? $this->paymentMethod->name : null,
|
'{PAYMENT_MODE}' => $this->paymentMethod ? $this->paymentMethod->name : null,
|
||||||
'{PAYMENT_NUMBER}' => $this->payment_number,
|
'{PAYMENT_NUMBER}' => $this->payment_number,
|
||||||
'{PDF_LINK}' => $this->paymentPdfUrl,
|
'{PAYMENT_AMOUNT}' => $this->reference_number,
|
||||||
'{PAYMENT_AMOUNT}' => format_money_pdf($this->amount, $this->customer->currency)
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -38,7 +38,7 @@
|
|||||||
"barryvdh/laravel-ide-helper": "^2.6",
|
"barryvdh/laravel-ide-helper": "^2.6",
|
||||||
"beyondcode/laravel-dump-server": "^1.0",
|
"beyondcode/laravel-dump-server": "^1.0",
|
||||||
"facade/ignition": "^2.3.6",
|
"facade/ignition": "^2.3.6",
|
||||||
"friendsofphp/php-cs-fixer": "^3.8",
|
"friendsofphp/php-cs-fixer": "^3.0",
|
||||||
"fakerphp/faker": "^1.9.1",
|
"fakerphp/faker": "^1.9.1",
|
||||||
"mockery/mockery": "^1.3.1",
|
"mockery/mockery": "^1.3.1",
|
||||||
"nunomaduro/collision": "^5.0",
|
"nunomaduro/collision": "^5.0",
|
||||||
@ -81,10 +81,7 @@
|
|||||||
"config": {
|
"config": {
|
||||||
"optimize-autoloader": true,
|
"optimize-autoloader": true,
|
||||||
"preferred-install": "dist",
|
"preferred-install": "dist",
|
||||||
"sort-packages": true,
|
"sort-packages": true
|
||||||
"allow-plugins": {
|
|
||||||
"pestphp/pest-plugin": true
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"extra": {
|
"extra": {
|
||||||
"laravel": {
|
"laravel": {
|
||||||
|
|||||||
2345
composer.lock
generated
2345
composer.lock
generated
File diff suppressed because it is too large
Load Diff
483
package-lock.json
generated
483
package-lock.json
generated
@ -65,6 +65,13 @@
|
|||||||
"to-fast-properties": "^2.0.0"
|
"to-fast-properties": "^2.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@esbuild/linux-loong64": {
|
||||||
|
"version": "0.14.54",
|
||||||
|
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz",
|
||||||
|
"integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
"@eslint/eslintrc": {
|
"@eslint/eslintrc": {
|
||||||
"version": "0.4.3",
|
"version": "0.4.3",
|
||||||
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz",
|
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz",
|
||||||
@ -214,6 +221,23 @@
|
|||||||
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.3.tgz",
|
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.3.tgz",
|
||||||
"integrity": "sha512-xDu17cEfh7Kid/d95kB6tZsLOmSWKCZKtprnhVepjsSaCij+lM3mItSJDuuHDMbCWTh8Ejmebwb+KONcCJ0eXQ=="
|
"integrity": "sha512-xDu17cEfh7Kid/d95kB6tZsLOmSWKCZKtprnhVepjsSaCij+lM3mItSJDuuHDMbCWTh8Ejmebwb+KONcCJ0eXQ=="
|
||||||
},
|
},
|
||||||
|
"@rvxlab/tailwind-plugin-ios-full-height": {
|
||||||
|
"version": "1.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@rvxlab/tailwind-plugin-ios-full-height/-/tailwind-plugin-ios-full-height-1.1.0.tgz",
|
||||||
|
"integrity": "sha512-jPIxXn0raN/YTk8nXesqM+JbS2WWd5XaUk/MbaAgVDDPyYtsPfeN3B26xIhSa2oE2+JB66tegPUMSOmixzroXg==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"@stripe/stripe-js": {
|
||||||
|
"version": "1.35.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@stripe/stripe-js/-/stripe-js-1.35.0.tgz",
|
||||||
|
"integrity": "sha512-UIuzpbJqgXCTvJhY/aZYvBtaKdMfQgnIv6kkLlfRJ9smZcC4zoPvq3j7k9wobYI+idHAWP4BRiPnqA8lvzJCtg=="
|
||||||
|
},
|
||||||
|
"@tailwindcss/aspect-ratio": {
|
||||||
|
"version": "0.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tailwindcss/aspect-ratio/-/aspect-ratio-0.4.0.tgz",
|
||||||
|
"integrity": "sha512-WJu0I4PpqNPuutpaA9zDUq2JXR+lorZ7PbLcKNLmb6GL9/HLfC7w3CRsMhJF4BbYd/lkY6CfXOvkYpuGnZfkpQ==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"@tailwindcss/forms": {
|
"@tailwindcss/forms": {
|
||||||
"version": "0.4.0",
|
"version": "0.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.4.0.tgz",
|
||||||
@ -223,6 +247,22 @@
|
|||||||
"mini-svg-data-uri": "^1.2.3"
|
"mini-svg-data-uri": "^1.2.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@tailwindcss/line-clamp": {
|
||||||
|
"version": "0.3.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tailwindcss/line-clamp/-/line-clamp-0.3.1.tgz",
|
||||||
|
"integrity": "sha512-pNr0T8LAc3TUx/gxCfQZRe9NB2dPEo/cedPHzUGIPxqDMhgjwNm6jYxww4W5l0zAsAddxr+XfZcqttGiFDgrGg=="
|
||||||
|
},
|
||||||
|
"@tailwindcss/typography": {
|
||||||
|
"version": "0.5.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.4.tgz",
|
||||||
|
"integrity": "sha512-QEdg40EmGvE7kKoDei8zr5sf4D1pIayHj4R31bH3lX8x2BtTiR+jNejYPOkhbmy3DXgkMF9jC8xqNiGFAuL9Sg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"lodash.castarray": "^4.4.0",
|
||||||
|
"lodash.isplainobject": "^4.0.6",
|
||||||
|
"lodash.merge": "^4.6.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"@tiptap/core": {
|
"@tiptap/core": {
|
||||||
"version": "2.0.0-beta.99",
|
"version": "2.0.0-beta.99",
|
||||||
"resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.0.0-beta.99.tgz",
|
"resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.0.0-beta.99.tgz",
|
||||||
@ -386,6 +426,11 @@
|
|||||||
"resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.0.0-beta.13.tgz",
|
"resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.0.0-beta.13.tgz",
|
||||||
"integrity": "sha512-0EtAwuRldCAoFaL/iXgkRepEeOd55rPg5N4FQUN1xTwZT7PDofukP0DG/2jff/Uj17x4uTaJAa9qlFWuNnDvjw=="
|
"integrity": "sha512-0EtAwuRldCAoFaL/iXgkRepEeOd55rPg5N4FQUN1xTwZT7PDofukP0DG/2jff/Uj17x4uTaJAa9qlFWuNnDvjw=="
|
||||||
},
|
},
|
||||||
|
"@tiptap/extension-text-align": {
|
||||||
|
"version": "2.0.0-beta.31",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tiptap/extension-text-align/-/extension-text-align-2.0.0-beta.31.tgz",
|
||||||
|
"integrity": "sha512-gSJqi57piiMPc2r6WEkXv7ZgQIogigsRUhmlnZC/7s3zzOvjXrexWnV0Ctt/9A7BKcM7OHMykpZyoewvk6QRTw=="
|
||||||
|
},
|
||||||
"@tiptap/starter-kit": {
|
"@tiptap/starter-kit": {
|
||||||
"version": "2.0.0-beta.97",
|
"version": "2.0.0-beta.97",
|
||||||
"resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.0.0-beta.97.tgz",
|
"resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.0.0-beta.97.tgz",
|
||||||
@ -537,6 +582,12 @@
|
|||||||
"@types/prosemirror-transform": "*"
|
"@types/prosemirror-transform": "*"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@vitejs/plugin-vue": {
|
||||||
|
"version": "1.10.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-1.10.2.tgz",
|
||||||
|
"integrity": "sha512-/QJ0Z9qfhAFtKRY+r57ziY4BSbGUTGsPRMpB/Ron3QPwBZM4OZAZHdTa4a8PafCwU5DTatXG8TMDoP8z+oDqJw==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"@vue/compiler-core": {
|
"@vue/compiler-core": {
|
||||||
"version": "3.2.4",
|
"version": "3.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.4.tgz",
|
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.4.tgz",
|
||||||
@ -558,6 +609,70 @@
|
|||||||
"@vue/shared": "3.2.4"
|
"@vue/shared": "3.2.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@vue/compiler-sfc": {
|
||||||
|
"version": "3.2.38",
|
||||||
|
"resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.38.tgz",
|
||||||
|
"integrity": "sha512-KZjrW32KloMYtTcHAFuw3CqsyWc5X6seb8KbkANSWt3Cz9p2qA8c1GJpSkksFP9ABb6an0FLCFl46ZFXx3kKpg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@babel/parser": "^7.16.4",
|
||||||
|
"@vue/compiler-core": "3.2.38",
|
||||||
|
"@vue/compiler-dom": "3.2.38",
|
||||||
|
"@vue/compiler-ssr": "3.2.38",
|
||||||
|
"@vue/reactivity-transform": "3.2.38",
|
||||||
|
"@vue/shared": "3.2.38",
|
||||||
|
"estree-walker": "^2.0.2",
|
||||||
|
"magic-string": "^0.25.7",
|
||||||
|
"postcss": "^8.1.10",
|
||||||
|
"source-map": "^0.6.1"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@babel/parser": {
|
||||||
|
"version": "7.18.13",
|
||||||
|
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.13.tgz",
|
||||||
|
"integrity": "sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"@vue/compiler-core": {
|
||||||
|
"version": "3.2.38",
|
||||||
|
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.38.tgz",
|
||||||
|
"integrity": "sha512-/FsvnSu7Z+lkd/8KXMa4yYNUiqQrI22135gfsQYVGuh5tqEgOB0XqrUdb/KnCLa5+TmQLPwvyUnKMyCpu+SX3Q==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@babel/parser": "^7.16.4",
|
||||||
|
"@vue/shared": "3.2.38",
|
||||||
|
"estree-walker": "^2.0.2",
|
||||||
|
"source-map": "^0.6.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@vue/compiler-dom": {
|
||||||
|
"version": "3.2.38",
|
||||||
|
"resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.38.tgz",
|
||||||
|
"integrity": "sha512-zqX4FgUbw56kzHlgYuEEJR8mefFiiyR3u96498+zWPsLeh1WKvgIReoNE+U7gG8bCUdvsrJ0JRmev0Ky6n2O0g==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@vue/compiler-core": "3.2.38",
|
||||||
|
"@vue/shared": "3.2.38"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@vue/compiler-ssr": {
|
||||||
|
"version": "3.2.38",
|
||||||
|
"resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.38.tgz",
|
||||||
|
"integrity": "sha512-bm9jOeyv1H3UskNm4S6IfueKjUNFmi2kRweFIGnqaGkkRePjwEcfCVqyS3roe7HvF4ugsEkhf4+kIvDhip6XzQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@vue/compiler-dom": "3.2.38",
|
||||||
|
"@vue/shared": "3.2.38"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@vue/shared": {
|
||||||
|
"version": "3.2.38",
|
||||||
|
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.38.tgz",
|
||||||
|
"integrity": "sha512-dTyhTIRmGXBjxJE+skC8tTWCGLCVc4wQgRRLt8+O9p5ewBAjoBwtCAkLPrtToSr1xltoe3st21Pv953aOZ7alg==",
|
||||||
|
"dev": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"@vue/compiler-ssr": {
|
"@vue/compiler-ssr": {
|
||||||
"version": "3.2.19",
|
"version": "3.2.19",
|
||||||
"resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.19.tgz",
|
"resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.19.tgz",
|
||||||
@ -607,6 +722,45 @@
|
|||||||
"@vue/shared": "3.2.4"
|
"@vue/shared": "3.2.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@vue/reactivity-transform": {
|
||||||
|
"version": "3.2.38",
|
||||||
|
"resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.38.tgz",
|
||||||
|
"integrity": "sha512-3SD3Jmi1yXrDwiNJqQ6fs1x61WsDLqVk4NyKVz78mkaIRh6d3IqtRnptgRfXn+Fzf+m6B1KxBYWq1APj6h4qeA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@babel/parser": "^7.16.4",
|
||||||
|
"@vue/compiler-core": "3.2.38",
|
||||||
|
"@vue/shared": "3.2.38",
|
||||||
|
"estree-walker": "^2.0.2",
|
||||||
|
"magic-string": "^0.25.7"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@babel/parser": {
|
||||||
|
"version": "7.18.13",
|
||||||
|
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.13.tgz",
|
||||||
|
"integrity": "sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"@vue/compiler-core": {
|
||||||
|
"version": "3.2.38",
|
||||||
|
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.38.tgz",
|
||||||
|
"integrity": "sha512-/FsvnSu7Z+lkd/8KXMa4yYNUiqQrI22135gfsQYVGuh5tqEgOB0XqrUdb/KnCLa5+TmQLPwvyUnKMyCpu+SX3Q==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@babel/parser": "^7.16.4",
|
||||||
|
"@vue/shared": "3.2.38",
|
||||||
|
"estree-walker": "^2.0.2",
|
||||||
|
"source-map": "^0.6.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@vue/shared": {
|
||||||
|
"version": "3.2.38",
|
||||||
|
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.38.tgz",
|
||||||
|
"integrity": "sha512-dTyhTIRmGXBjxJE+skC8tTWCGLCVc4wQgRRLt8+O9p5ewBAjoBwtCAkLPrtToSr1xltoe3st21Pv953aOZ7alg==",
|
||||||
|
"dev": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"@vue/ref-transform": {
|
"@vue/ref-transform": {
|
||||||
"version": "3.2.19",
|
"version": "3.2.19",
|
||||||
"resolved": "https://registry.npmjs.org/@vue/ref-transform/-/ref-transform-3.2.19.tgz",
|
"resolved": "https://registry.npmjs.org/@vue/ref-transform/-/ref-transform-3.2.19.tgz",
|
||||||
@ -677,6 +831,44 @@
|
|||||||
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.4.tgz",
|
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.4.tgz",
|
||||||
"integrity": "sha512-j2j1MRmjalVKr3YBTxl/BClSIc8UQ8NnPpLYclxerK65JIowI4O7n8O8lElveEtEoHxy1d7BelPUDI0Q4bumqg=="
|
"integrity": "sha512-j2j1MRmjalVKr3YBTxl/BClSIc8UQ8NnPpLYclxerK65JIowI4O7n8O8lElveEtEoHxy1d7BelPUDI0Q4bumqg=="
|
||||||
},
|
},
|
||||||
|
"@vuelidate/components": {
|
||||||
|
"version": "1.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@vuelidate/components/-/components-1.2.1.tgz",
|
||||||
|
"integrity": "sha512-xaFGcKVQbST0l7yQufuLAbRUwC/5SR4Z8+s7fwF3B1BtQQwlttftAZg1lTm9I30EYsBdslk38XC4z3sDC8Nm4w==",
|
||||||
|
"requires": {
|
||||||
|
"@vuelidate/core": "^2.0.0-alpha.44"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@vuelidate/core": {
|
||||||
|
"version": "2.0.0-alpha.44",
|
||||||
|
"resolved": "https://registry.npmjs.org/@vuelidate/core/-/core-2.0.0-alpha.44.tgz",
|
||||||
|
"integrity": "sha512-3DlCe3E0RRXbB+OfPacUetKhLmXzmnjeHkzjnbkc03p06mKm6h9pXR5pd6Mv4s4tus4sieuKDb2YWNmKK6rQeA==",
|
||||||
|
"requires": {
|
||||||
|
"vue-demi": "^0.13.4"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"vue-demi": {
|
||||||
|
"version": "0.13.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz",
|
||||||
|
"integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A=="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@vuelidate/validators": {
|
||||||
|
"version": "2.0.0-alpha.31",
|
||||||
|
"resolved": "https://registry.npmjs.org/@vuelidate/validators/-/validators-2.0.0-alpha.31.tgz",
|
||||||
|
"integrity": "sha512-+MFA9nZ7Y9zCpq383/voPDk/hiAmu6KqiJJhLOYB/FmrUPVoyKnuKnI9Bwiq8ok9GZlVkI8BnIrKPKGj9QpwiQ==",
|
||||||
|
"requires": {
|
||||||
|
"vue-demi": "^0.13.4"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"vue-demi": {
|
||||||
|
"version": "0.13.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz",
|
||||||
|
"integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A=="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"@vueuse/core": {
|
"@vueuse/core": {
|
||||||
"version": "6.0.0",
|
"version": "6.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/@vueuse/core/-/core-6.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/@vueuse/core/-/core-6.0.0.tgz",
|
||||||
@ -1240,6 +1432,175 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"esbuild": {
|
||||||
|
"version": "0.14.54",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz",
|
||||||
|
"integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@esbuild/linux-loong64": "0.14.54",
|
||||||
|
"esbuild-android-64": "0.14.54",
|
||||||
|
"esbuild-android-arm64": "0.14.54",
|
||||||
|
"esbuild-darwin-64": "0.14.54",
|
||||||
|
"esbuild-darwin-arm64": "0.14.54",
|
||||||
|
"esbuild-freebsd-64": "0.14.54",
|
||||||
|
"esbuild-freebsd-arm64": "0.14.54",
|
||||||
|
"esbuild-linux-32": "0.14.54",
|
||||||
|
"esbuild-linux-64": "0.14.54",
|
||||||
|
"esbuild-linux-arm": "0.14.54",
|
||||||
|
"esbuild-linux-arm64": "0.14.54",
|
||||||
|
"esbuild-linux-mips64le": "0.14.54",
|
||||||
|
"esbuild-linux-ppc64le": "0.14.54",
|
||||||
|
"esbuild-linux-riscv64": "0.14.54",
|
||||||
|
"esbuild-linux-s390x": "0.14.54",
|
||||||
|
"esbuild-netbsd-64": "0.14.54",
|
||||||
|
"esbuild-openbsd-64": "0.14.54",
|
||||||
|
"esbuild-sunos-64": "0.14.54",
|
||||||
|
"esbuild-windows-32": "0.14.54",
|
||||||
|
"esbuild-windows-64": "0.14.54",
|
||||||
|
"esbuild-windows-arm64": "0.14.54"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"esbuild-android-64": {
|
||||||
|
"version": "0.14.54",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz",
|
||||||
|
"integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-android-arm64": {
|
||||||
|
"version": "0.14.54",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz",
|
||||||
|
"integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-darwin-64": {
|
||||||
|
"version": "0.14.54",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz",
|
||||||
|
"integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-darwin-arm64": {
|
||||||
|
"version": "0.14.54",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz",
|
||||||
|
"integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-freebsd-64": {
|
||||||
|
"version": "0.14.54",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz",
|
||||||
|
"integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-freebsd-arm64": {
|
||||||
|
"version": "0.14.54",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz",
|
||||||
|
"integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-linux-32": {
|
||||||
|
"version": "0.14.54",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz",
|
||||||
|
"integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-linux-64": {
|
||||||
|
"version": "0.14.54",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz",
|
||||||
|
"integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-linux-arm": {
|
||||||
|
"version": "0.14.54",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz",
|
||||||
|
"integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-linux-arm64": {
|
||||||
|
"version": "0.14.54",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz",
|
||||||
|
"integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-linux-mips64le": {
|
||||||
|
"version": "0.14.54",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz",
|
||||||
|
"integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-linux-ppc64le": {
|
||||||
|
"version": "0.14.54",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz",
|
||||||
|
"integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-linux-riscv64": {
|
||||||
|
"version": "0.14.54",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz",
|
||||||
|
"integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-linux-s390x": {
|
||||||
|
"version": "0.14.54",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz",
|
||||||
|
"integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-netbsd-64": {
|
||||||
|
"version": "0.14.54",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz",
|
||||||
|
"integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-openbsd-64": {
|
||||||
|
"version": "0.14.54",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz",
|
||||||
|
"integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-sunos-64": {
|
||||||
|
"version": "0.14.54",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz",
|
||||||
|
"integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-windows-32": {
|
||||||
|
"version": "0.14.54",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz",
|
||||||
|
"integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-windows-64": {
|
||||||
|
"version": "0.14.54",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz",
|
||||||
|
"integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-windows-arm64": {
|
||||||
|
"version": "0.14.54",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz",
|
||||||
|
"integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
"escalade": {
|
"escalade": {
|
||||||
"version": "3.1.1",
|
"version": "3.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
|
||||||
@ -1947,12 +2308,24 @@
|
|||||||
"resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
|
"resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
|
||||||
"integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
|
"integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
|
||||||
},
|
},
|
||||||
|
"lodash.castarray": {
|
||||||
|
"version": "4.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz",
|
||||||
|
"integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"lodash.clonedeep": {
|
"lodash.clonedeep": {
|
||||||
"version": "4.5.0",
|
"version": "4.5.0",
|
||||||
"resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
|
||||||
"integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
|
"integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"lodash.isplainobject": {
|
||||||
|
"version": "4.0.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
|
||||||
|
"integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"lodash.merge": {
|
"lodash.merge": {
|
||||||
"version": "4.6.2",
|
"version": "4.6.2",
|
||||||
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
|
||||||
@ -2205,6 +2578,22 @@
|
|||||||
"integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
|
"integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"pinia": {
|
||||||
|
"version": "2.0.21",
|
||||||
|
"resolved": "https://registry.npmjs.org/pinia/-/pinia-2.0.21.tgz",
|
||||||
|
"integrity": "sha512-6ol04PtL29O0Z6JHI47O3JUSoyOJ7Og0rstXrHVMZSP4zAldsQBXJCNF0i/H7m8vp/Hjd/CSmuPl7C5QAwpeWQ==",
|
||||||
|
"requires": {
|
||||||
|
"@vue/devtools-api": "^6.2.1",
|
||||||
|
"vue-demi": "*"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@vue/devtools-api": {
|
||||||
|
"version": "6.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.2.1.tgz",
|
||||||
|
"integrity": "sha512-OEgAMeQXvCoJ+1x8WyQuVZzFo0wcyCmUR3baRVLmKBo1LmYZWMlRiXlux5jd0fqVJu6PfDbOrZItVqUEzLobeQ=="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"postcss": {
|
"postcss": {
|
||||||
"version": "8.4.5",
|
"version": "8.4.5",
|
||||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz",
|
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz",
|
||||||
@ -2508,6 +2897,15 @@
|
|||||||
"glob": "^7.1.3"
|
"glob": "^7.1.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"rollup": {
|
||||||
|
"version": "2.78.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz",
|
||||||
|
"integrity": "sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"fsevents": "~2.3.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"rope-sequence": {
|
"rope-sequence": {
|
||||||
"version": "1.3.2",
|
"version": "1.3.2",
|
||||||
"resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.2.tgz",
|
"resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.2.tgz",
|
||||||
@ -2668,6 +3066,12 @@
|
|||||||
"has-flag": "^3.0.0"
|
"has-flag": "^3.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"supports-preserve-symlinks-flag": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"version": "6.7.2",
|
"version": "6.7.2",
|
||||||
"resolved": "https://registry.npmjs.org/table/-/table-6.7.2.tgz",
|
"resolved": "https://registry.npmjs.org/table/-/table-6.7.2.tgz",
|
||||||
@ -2934,12 +3338,86 @@
|
|||||||
"resolved": "https://registry.npmjs.org/v-money3/-/v-money3-3.16.1.tgz",
|
"resolved": "https://registry.npmjs.org/v-money3/-/v-money3-3.16.1.tgz",
|
||||||
"integrity": "sha512-U0GjmdybvEwfxCpZiTUbKugSglJbX6wxlyMeg0YJdLTAKlnjMRDph3hpNJlTlg5Gs8MQRpDVdaLysBjV749HLg=="
|
"integrity": "sha512-U0GjmdybvEwfxCpZiTUbKugSglJbX6wxlyMeg0YJdLTAKlnjMRDph3hpNJlTlg5Gs8MQRpDVdaLysBjV749HLg=="
|
||||||
},
|
},
|
||||||
|
"v-tooltip": {
|
||||||
|
"version": "4.0.0-beta.17",
|
||||||
|
"resolved": "https://registry.npmjs.org/v-tooltip/-/v-tooltip-4.0.0-beta.17.tgz",
|
||||||
|
"integrity": "sha512-d7v/6KEXQOtcj3NT3Z1LpbDv8SBh8JgbsD+3s/zGIGCxiXC2SoVW6wGV4X0MlCo97PiosibcSe+VKbFiy4AKnQ==",
|
||||||
|
"requires": {
|
||||||
|
"@popperjs/core": "^2.11.0",
|
||||||
|
"vue-resize": "^2.0.0-alpha.1"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@popperjs/core": {
|
||||||
|
"version": "2.11.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz",
|
||||||
|
"integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw=="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"v8-compile-cache": {
|
"v8-compile-cache": {
|
||||||
"version": "2.3.0",
|
"version": "2.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
|
||||||
"integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
|
"integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"vite": {
|
||||||
|
"version": "2.9.13",
|
||||||
|
"resolved": "https://registry.npmjs.org/vite/-/vite-2.9.13.tgz",
|
||||||
|
"integrity": "sha512-AsOBAaT0AD7Mhe8DuK+/kE4aWYFMx/i0ZNi98hJclxb4e0OhQcZYUrvLjIaQ8e59Ui7txcvKMiJC1yftqpQoDw==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"esbuild": "^0.14.27",
|
||||||
|
"fsevents": "~2.3.2",
|
||||||
|
"postcss": "^8.4.13",
|
||||||
|
"resolve": "^1.22.0",
|
||||||
|
"rollup": "^2.59.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"is-core-module": {
|
||||||
|
"version": "2.10.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz",
|
||||||
|
"integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"has": "^1.0.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nanoid": {
|
||||||
|
"version": "3.3.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
|
||||||
|
"integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"postcss": {
|
||||||
|
"version": "8.4.16",
|
||||||
|
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz",
|
||||||
|
"integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"nanoid": "^3.3.4",
|
||||||
|
"picocolors": "^1.0.0",
|
||||||
|
"source-map-js": "^1.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"resolve": {
|
||||||
|
"version": "1.22.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
|
||||||
|
"integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"is-core-module": "^2.9.0",
|
||||||
|
"path-parse": "^1.0.7",
|
||||||
|
"supports-preserve-symlinks-flag": "^1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"source-map-js": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
|
||||||
|
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
|
||||||
|
"dev": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"vue": {
|
"vue": {
|
||||||
"version": "3.2.4",
|
"version": "3.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/vue/-/vue-3.2.4.tgz",
|
"resolved": "https://registry.npmjs.org/vue/-/vue-3.2.4.tgz",
|
||||||
@ -3002,6 +3480,11 @@
|
|||||||
"@vue/devtools-api": "^6.0.0-beta.7"
|
"@vue/devtools-api": "^6.0.0-beta.7"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"vue-resize": {
|
||||||
|
"version": "2.0.0-alpha.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/vue-resize/-/vue-resize-2.0.0-alpha.1.tgz",
|
||||||
|
"integrity": "sha512-7+iqOueLU7uc9NrMfrzbG8hwMqchfVfSzpVlCMeJQe4pyibqyoifDNbKTZvwxZKDvGkB+PdFeKvnGZMoEb8esg=="
|
||||||
|
},
|
||||||
"vue-router": {
|
"vue-router": {
|
||||||
"version": "4.0.11",
|
"version": "4.0.11",
|
||||||
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.11.tgz",
|
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.11.tgz",
|
||||||
|
|||||||
@ -24,10 +24,10 @@
|
|||||||
"sass": "^1.32.12",
|
"sass": "^1.32.12",
|
||||||
"tailwind-scrollbar": "^1.3.1",
|
"tailwind-scrollbar": "^1.3.1",
|
||||||
"tailwindcss": "^3.0.6",
|
"tailwindcss": "^3.0.6",
|
||||||
"vite": "^2.6.1"
|
"vite": "^2.9.13"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@headlessui/vue": "^1.5.0",
|
"@headlessui/vue": "^1.4.0",
|
||||||
"@heroicons/vue": "^1.0.1",
|
"@heroicons/vue": "^1.0.1",
|
||||||
"@popperjs/core": "^2.9.2",
|
"@popperjs/core": "^2.9.2",
|
||||||
"@stripe/stripe-js": "^1.21.2",
|
"@stripe/stripe-js": "^1.21.2",
|
||||||
@ -48,8 +48,7 @@
|
|||||||
"mini-svg-data-uri": "^1.3.3",
|
"mini-svg-data-uri": "^1.3.3",
|
||||||
"moment": "^2.29.1",
|
"moment": "^2.29.1",
|
||||||
"pinia": "^2.0.4",
|
"pinia": "^2.0.4",
|
||||||
"v-calendar": "3.0.0-alpha.8",
|
"v-money3": "^3.13.5",
|
||||||
"v-money3": "3.16.1",
|
|
||||||
"v-tooltip": "^4.0.0-alpha.1",
|
"v-tooltip": "^4.0.0-alpha.1",
|
||||||
"vue": "^3.2.0-beta.5",
|
"vue": "^3.2.0-beta.5",
|
||||||
"vue-flatpickr-component": "^9.0.3",
|
"vue-flatpickr-component": "^9.0.3",
|
||||||
|
|||||||
@ -7,7 +7,6 @@
|
|||||||
py-2
|
py-2
|
||||||
rounded-lg
|
rounded-lg
|
||||||
bg-opacity-40 bg-gray-300
|
bg-opacity-40 bg-gray-300
|
||||||
dark:bg-gray-700 dark:border-gray-600
|
|
||||||
whitespace-nowrap
|
whitespace-nowrap
|
||||||
flex-col
|
flex-col
|
||||||
mt-1
|
mt-1
|
||||||
@ -20,7 +19,6 @@
|
|||||||
text-sm
|
text-sm
|
||||||
font-medium
|
font-medium
|
||||||
text-black
|
text-black
|
||||||
dark:text-white
|
|
||||||
truncate
|
truncate
|
||||||
select-all select-color
|
select-all select-color
|
||||||
"
|
"
|
||||||
|
|||||||
@ -43,12 +43,6 @@
|
|||||||
max-w-full
|
max-w-full
|
||||||
left-0
|
left-0
|
||||||
top-3
|
top-3
|
||||||
bg-white
|
|
||||||
dark:border
|
|
||||||
dark:border-white/10
|
|
||||||
dark:text-white
|
|
||||||
dark:bg-gray-800
|
|
||||||
dark:shadow-glass
|
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
@ -59,7 +53,7 @@
|
|||||||
ring-1 ring-black ring-opacity-5
|
ring-1 ring-black ring-opacity-5
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<div class="relative grid bg-white dark:bg-gray-800">
|
<div class="relative grid bg-white">
|
||||||
<div class="relative p-4">
|
<div class="relative p-4">
|
||||||
<BaseInput
|
<BaseInput
|
||||||
v-model="textSearch"
|
v-model="textSearch"
|
||||||
@ -72,7 +66,7 @@
|
|||||||
|
|
||||||
<div
|
<div
|
||||||
v-if="filteredNotes.length > 0"
|
v-if="filteredNotes.length > 0"
|
||||||
class="relative flex flex-col overflow-auto list max-h-36 dark:border-white/10"
|
class="relative flex flex-col overflow-auto list max-h-36"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
v-for="(note, index) in filteredNotes"
|
v-for="(note, index) in filteredNotes"
|
||||||
@ -85,8 +79,6 @@
|
|||||||
cursor-pointer
|
cursor-pointer
|
||||||
hover:bg-gray-100 hover:cursor-pointer
|
hover:bg-gray-100 hover:cursor-pointer
|
||||||
last:border-b-0
|
last:border-b-0
|
||||||
dark:border-gray-600
|
|
||||||
dark:border-white/10 dark:hover:bg-gray-700/30
|
|
||||||
"
|
"
|
||||||
@click="selectNote(index, close)"
|
@click="selectNote(index, close)"
|
||||||
>
|
>
|
||||||
@ -99,7 +91,6 @@
|
|||||||
leading-tight
|
leading-tight
|
||||||
text-gray-700
|
text-gray-700
|
||||||
cursor-pointer
|
cursor-pointer
|
||||||
dark:text-gray-400
|
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
{{ note.name }}
|
{{ note.name }}
|
||||||
@ -127,10 +118,6 @@
|
|||||||
bg-gray-200
|
bg-gray-200
|
||||||
border-none
|
border-none
|
||||||
outline-none
|
outline-none
|
||||||
dark:bg-gray-600/70
|
|
||||||
dark:backdrop-blur-xl
|
|
||||||
dark:shadow-glass
|
|
||||||
dark:hover:bg-gray-600/80
|
|
||||||
"
|
"
|
||||||
@click="openNoteModal"
|
@click="openNoteModal"
|
||||||
>
|
>
|
||||||
|
|||||||
@ -6,17 +6,8 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import Chart from 'chart.js'
|
import Chart from 'chart.js'
|
||||||
import {
|
import { ref, reactive, computed, onMounted, watchEffect, inject } from 'vue'
|
||||||
ref,
|
|
||||||
reactive,
|
|
||||||
computed,
|
|
||||||
onMounted,
|
|
||||||
watchEffect,
|
|
||||||
inject,
|
|
||||||
watch,
|
|
||||||
} from 'vue'
|
|
||||||
import { useCompanyStore } from '@/scripts/admin/stores/company'
|
import { useCompanyStore } from '@/scripts/admin/stores/company'
|
||||||
import { useGlobalStore } from '@/scripts/admin/stores/global'
|
|
||||||
|
|
||||||
const utils = inject('utils')
|
const utils = inject('utils')
|
||||||
|
|
||||||
@ -53,11 +44,9 @@ const props = defineProps({
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
const isDarkModeOn = document.documentElement.classList.contains('dark')
|
|
||||||
let myLineChart = null
|
let myLineChart = null
|
||||||
const graph = ref(null)
|
const graph = ref(null)
|
||||||
const companyStore = useCompanyStore()
|
const companyStore = useCompanyStore()
|
||||||
const globalStore = useGlobalStore()
|
|
||||||
const defaultCurrency = computed(() => {
|
const defaultCurrency = computed(() => {
|
||||||
return companyStore.selectedCompanyCurrency
|
return companyStore.selectedCompanyCurrency
|
||||||
})
|
})
|
||||||
@ -71,14 +60,6 @@ watchEffect(() => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
watch(
|
|
||||||
() => globalStore.isDarkModeOn,
|
|
||||||
() => {
|
|
||||||
myLineChart.reset()
|
|
||||||
updateColors()
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
let context = graph.value.getContext('2d')
|
let context = graph.value.getContext('2d')
|
||||||
let options = reactive({
|
let options = reactive({
|
||||||
@ -100,8 +81,6 @@ onMounted(() => {
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
const salesColor = globalStore.isDarkModeOn ? '#ffffff' : '#040405'
|
|
||||||
|
|
||||||
let data = reactive({
|
let data = reactive({
|
||||||
labels: props.labels,
|
labels: props.labels,
|
||||||
datasets: [
|
datasets: [
|
||||||
@ -110,16 +89,16 @@ onMounted(() => {
|
|||||||
fill: false,
|
fill: false,
|
||||||
lineTension: 0.3,
|
lineTension: 0.3,
|
||||||
backgroundColor: 'rgba(230, 254, 249)',
|
backgroundColor: 'rgba(230, 254, 249)',
|
||||||
borderColor: salesColor,
|
borderColor: '#040405',
|
||||||
borderCapStyle: 'butt',
|
borderCapStyle: 'butt',
|
||||||
borderDash: [],
|
borderDash: [],
|
||||||
borderDashOffset: 0.0,
|
borderDashOffset: 0.0,
|
||||||
borderJoinStyle: 'miter',
|
borderJoinStyle: 'miter',
|
||||||
pointBorderColor: salesColor,
|
pointBorderColor: '#040405',
|
||||||
pointBackgroundColor: '#fff',
|
pointBackgroundColor: '#fff',
|
||||||
pointBorderWidth: 1,
|
pointBorderWidth: 1,
|
||||||
pointHoverRadius: 5,
|
pointHoverRadius: 5,
|
||||||
pointHoverBackgroundColor: salesColor,
|
pointHoverBackgroundColor: '#040405',
|
||||||
pointHoverBorderColor: 'rgba(220,220,220,1)',
|
pointHoverBorderColor: 'rgba(220,220,220,1)',
|
||||||
pointHoverBorderWidth: 2,
|
pointHoverBorderWidth: 2,
|
||||||
pointRadius: 4,
|
pointRadius: 4,
|
||||||
@ -215,12 +194,4 @@ function update() {
|
|||||||
lazy: true,
|
lazy: true,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateColors() {
|
|
||||||
const newColor = globalStore.isDarkModeOn ? '#ffffff' : '#040405'
|
|
||||||
|
|
||||||
myLineChart.data.datasets[0].borderColor = newColor
|
|
||||||
myLineChart.data.datasets[0].pointBorderColor = newColor
|
|
||||||
myLineChart.data.datasets[0].pointHoverBackgroundColor = newColor
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@ -50,11 +50,21 @@
|
|||||||
</BaseInputGroup>
|
</BaseInputGroup>
|
||||||
</template>
|
</template>
|
||||||
</ValidateEach>
|
</ValidateEach>
|
||||||
<BaseModalFooter>
|
<div
|
||||||
|
slot="footer"
|
||||||
|
class="
|
||||||
|
z-0
|
||||||
|
flex
|
||||||
|
justify-end
|
||||||
|
mt-4
|
||||||
|
pt-4
|
||||||
|
border-t border-gray-200 border-solid border-modal-bg
|
||||||
|
"
|
||||||
|
>
|
||||||
<BaseButton :loading="isSaving" variant="primary" type="submit">
|
<BaseButton :loading="isSaving" variant="primary" type="submit">
|
||||||
{{ $t('general.save') }}
|
{{ $t('general.save') }}
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
</BaseModalFooter>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</BaseCard>
|
</BaseCard>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -64,7 +64,7 @@ function mergeExistingValues() {
|
|||||||
if (props.isEdit) {
|
if (props.isEdit) {
|
||||||
props.store[props.storeProp].fields.forEach((field) => {
|
props.store[props.storeProp].fields.forEach((field) => {
|
||||||
const existingIndex = props.store[props.storeProp].customFields.findIndex(
|
const existingIndex = props.store[props.storeProp].customFields.findIndex(
|
||||||
(f) => f.id == field.custom_field_id
|
(f) => f.id === field.custom_field_id
|
||||||
)
|
)
|
||||||
|
|
||||||
if (existingIndex > -1) {
|
if (existingIndex > -1) {
|
||||||
|
|||||||
@ -9,7 +9,7 @@ import { computed } from 'vue'
|
|||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
modelValue: {
|
modelValue: {
|
||||||
type: String,
|
type: String,
|
||||||
default: moment().format('YYYY-MM-DD HH:mm'),
|
default: moment().format('YYYY-MM-DD hh:MM'),
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@ -7,12 +7,11 @@
|
|||||||
<!-- edit customField -->
|
<!-- edit customField -->
|
||||||
<BaseDropdownItem
|
<BaseDropdownItem
|
||||||
v-if="userStore.hasAbilities(abilities.EDIT_CUSTOM_FIELDS)"
|
v-if="userStore.hasAbilities(abilities.EDIT_CUSTOM_FIELDS)"
|
||||||
v-slot="slotProps"
|
|
||||||
@click="editCustomField(row.id)"
|
@click="editCustomField(row.id)"
|
||||||
>
|
>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="PencilIcon"
|
name="PencilIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('general.edit') }}
|
{{ $t('general.edit') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
@ -20,12 +19,11 @@
|
|||||||
<!-- delete customField -->
|
<!-- delete customField -->
|
||||||
<BaseDropdownItem
|
<BaseDropdownItem
|
||||||
v-if="userStore.hasAbilities(abilities.DELETE_CUSTOM_FIELDS)"
|
v-if="userStore.hasAbilities(abilities.DELETE_CUSTOM_FIELDS)"
|
||||||
v-slot="slotProps"
|
|
||||||
@click="removeCustomField(row.id)"
|
@click="removeCustomField(row.id)"
|
||||||
>
|
>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="TrashIcon"
|
name="TrashIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('general.delete') }}
|
{{ $t('general.delete') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
|
|||||||
@ -12,10 +12,10 @@
|
|||||||
v-if="userStore.hasAbilities(abilities.EDIT_CUSTOMER)"
|
v-if="userStore.hasAbilities(abilities.EDIT_CUSTOMER)"
|
||||||
:to="`/admin/customers/${row.id}/edit`"
|
:to="`/admin/customers/${row.id}/edit`"
|
||||||
>
|
>
|
||||||
<BaseDropdownItem v-slot="slotProps">
|
<BaseDropdownItem>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="PencilIcon"
|
name="PencilIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('general.edit') }}
|
{{ $t('general.edit') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
@ -29,10 +29,10 @@
|
|||||||
"
|
"
|
||||||
:to="`customers/${row.id}/view`"
|
:to="`customers/${row.id}/view`"
|
||||||
>
|
>
|
||||||
<BaseDropdownItem v-slot="slotProps">
|
<BaseDropdownItem>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="EyeIcon"
|
name="EyeIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('general.view') }}
|
{{ $t('general.view') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
@ -41,12 +41,11 @@
|
|||||||
<!-- Delete Customer -->
|
<!-- Delete Customer -->
|
||||||
<BaseDropdownItem
|
<BaseDropdownItem
|
||||||
v-if="userStore.hasAbilities(abilities.DELETE_CUSTOMER)"
|
v-if="userStore.hasAbilities(abilities.DELETE_CUSTOMER)"
|
||||||
v-slot="slotProps"
|
|
||||||
@click="removeCustomer(row.id)"
|
@click="removeCustomer(row.id)"
|
||||||
>
|
>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="TrashIcon"
|
name="TrashIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('general.delete') }}
|
{{ $t('general.delete') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
|
|||||||
@ -10,12 +10,11 @@
|
|||||||
<!-- Copy PDF url -->
|
<!-- Copy PDF url -->
|
||||||
<BaseDropdownItem
|
<BaseDropdownItem
|
||||||
v-if="route.name === 'estimates.view'"
|
v-if="route.name === 'estimates.view'"
|
||||||
v-slot="slotProps"
|
|
||||||
@click="copyPdfUrl"
|
@click="copyPdfUrl"
|
||||||
>
|
>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="LinkIcon"
|
name="LinkIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('general.copy_pdf_url') }}
|
{{ $t('general.copy_pdf_url') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
@ -25,10 +24,10 @@
|
|||||||
v-if="userStore.hasAbilities(abilities.EDIT_ESTIMATE)"
|
v-if="userStore.hasAbilities(abilities.EDIT_ESTIMATE)"
|
||||||
:to="`/admin/estimates/${row.id}/edit`"
|
:to="`/admin/estimates/${row.id}/edit`"
|
||||||
>
|
>
|
||||||
<BaseDropdownItem v-slot="slotProps">
|
<BaseDropdownItem>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="PencilIcon"
|
name="PencilIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('general.edit') }}
|
{{ $t('general.edit') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
@ -37,12 +36,11 @@
|
|||||||
<!-- Delete Estimate -->
|
<!-- Delete Estimate -->
|
||||||
<BaseDropdownItem
|
<BaseDropdownItem
|
||||||
v-if="userStore.hasAbilities(abilities.DELETE_ESTIMATE)"
|
v-if="userStore.hasAbilities(abilities.DELETE_ESTIMATE)"
|
||||||
v-slot="slotProps"
|
|
||||||
@click="removeEstimate(row.id)"
|
@click="removeEstimate(row.id)"
|
||||||
>
|
>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="TrashIcon"
|
name="TrashIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('general.delete') }}
|
{{ $t('general.delete') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
@ -55,10 +53,10 @@
|
|||||||
"
|
"
|
||||||
:to="`estimates/${row.id}/view`"
|
:to="`estimates/${row.id}/view`"
|
||||||
>
|
>
|
||||||
<BaseDropdownItem v-slot="slotProps">
|
<BaseDropdownItem>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="EyeIcon"
|
name="EyeIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('general.view') }}
|
{{ $t('general.view') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
@ -67,12 +65,11 @@
|
|||||||
<!-- Convert into Invoice -->
|
<!-- Convert into Invoice -->
|
||||||
<BaseDropdownItem
|
<BaseDropdownItem
|
||||||
v-if="userStore.hasAbilities(abilities.CREATE_INVOICE)"
|
v-if="userStore.hasAbilities(abilities.CREATE_INVOICE)"
|
||||||
v-slot="slotProps"
|
|
||||||
@click="convertInToinvoice(row.id)"
|
@click="convertInToinvoice(row.id)"
|
||||||
>
|
>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="DocumentTextIcon"
|
name="DocumentTextIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('estimates.convert_to_invoice') }}
|
{{ $t('estimates.convert_to_invoice') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
@ -84,12 +81,11 @@
|
|||||||
route.name !== 'estimates.view' &&
|
route.name !== 'estimates.view' &&
|
||||||
userStore.hasAbilities(abilities.SEND_ESTIMATE)
|
userStore.hasAbilities(abilities.SEND_ESTIMATE)
|
||||||
"
|
"
|
||||||
v-slot="slotProps"
|
|
||||||
@click="onMarkAsSent(row.id)"
|
@click="onMarkAsSent(row.id)"
|
||||||
>
|
>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="CheckCircleIcon"
|
name="CheckCircleIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('estimates.mark_as_sent') }}
|
{{ $t('estimates.mark_as_sent') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
@ -101,21 +97,20 @@
|
|||||||
route.name !== 'estimates.view' &&
|
route.name !== 'estimates.view' &&
|
||||||
userStore.hasAbilities(abilities.SEND_ESTIMATE)
|
userStore.hasAbilities(abilities.SEND_ESTIMATE)
|
||||||
"
|
"
|
||||||
v-slot="slotProps"
|
|
||||||
@click="sendEstimate(row)"
|
@click="sendEstimate(row)"
|
||||||
>
|
>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="PaperAirplaneIcon"
|
name="PaperAirplaneIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('estimates.send_estimate') }}
|
{{ $t('estimates.send_estimate') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
|
|
||||||
<!-- Resend Estimate -->
|
<!-- Resend Estimate -->
|
||||||
<BaseDropdownItem v-if="canResendEstimate(row)" v-slot="slotProps" @click="sendEstimate(row)">
|
<BaseDropdownItem v-if="canResendEstimate(row)" @click="sendEstimate(row)">
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="PaperAirplaneIcon"
|
name="PaperAirplaneIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('estimates.resend_estimate') }}
|
{{ $t('estimates.resend_estimate') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
@ -126,12 +121,11 @@
|
|||||||
row.status !== 'ACCEPTED' &&
|
row.status !== 'ACCEPTED' &&
|
||||||
userStore.hasAbilities(abilities.EDIT_ESTIMATE)
|
userStore.hasAbilities(abilities.EDIT_ESTIMATE)
|
||||||
"
|
"
|
||||||
v-slot="slotProps"
|
|
||||||
@click="onMarkAsAccepted(row.id)"
|
@click="onMarkAsAccepted(row.id)"
|
||||||
>
|
>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="CheckCircleIcon"
|
name="CheckCircleIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('estimates.mark_as_accepted') }}
|
{{ $t('estimates.mark_as_accepted') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
@ -142,12 +136,11 @@
|
|||||||
row.status !== 'REJECTED' &&
|
row.status !== 'REJECTED' &&
|
||||||
userStore.hasAbilities(abilities.EDIT_ESTIMATE)
|
userStore.hasAbilities(abilities.EDIT_ESTIMATE)
|
||||||
"
|
"
|
||||||
v-slot="slotProps"
|
|
||||||
@click="onMarkAsRejected(row.id)"
|
@click="onMarkAsRejected(row.id)"
|
||||||
>
|
>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="XCircleIcon"
|
name="XCircleIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('estimates.mark_as_rejected') }}
|
{{ $t('estimates.mark_as_rejected') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
|
|||||||
@ -13,12 +13,11 @@
|
|||||||
<!-- edit expenseCategory -->
|
<!-- edit expenseCategory -->
|
||||||
<BaseDropdownItem
|
<BaseDropdownItem
|
||||||
v-if="userStore.hasAbilities(abilities.EDIT_EXPENSE)"
|
v-if="userStore.hasAbilities(abilities.EDIT_EXPENSE)"
|
||||||
v-slot="slotProps"
|
|
||||||
@click="editExpenseCategory(row.id)"
|
@click="editExpenseCategory(row.id)"
|
||||||
>
|
>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="PencilIcon"
|
name="PencilIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('general.edit') }}
|
{{ $t('general.edit') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
@ -26,12 +25,11 @@
|
|||||||
<!-- delete expenseCategory -->
|
<!-- delete expenseCategory -->
|
||||||
<BaseDropdownItem
|
<BaseDropdownItem
|
||||||
v-if="userStore.hasAbilities(abilities.DELETE_EXPENSE)"
|
v-if="userStore.hasAbilities(abilities.DELETE_EXPENSE)"
|
||||||
v-slot="slotProps"
|
|
||||||
@click="removeExpenseCategory(row.id)"
|
@click="removeExpenseCategory(row.id)"
|
||||||
>
|
>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="TrashIcon"
|
name="TrashIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('general.delete') }}
|
{{ $t('general.delete') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
|
|||||||
@ -12,10 +12,10 @@
|
|||||||
v-if="userStore.hasAbilities(abilities.EDIT_EXPENSE)"
|
v-if="userStore.hasAbilities(abilities.EDIT_EXPENSE)"
|
||||||
:to="`/admin/expenses/${row.id}/edit`"
|
:to="`/admin/expenses/${row.id}/edit`"
|
||||||
>
|
>
|
||||||
<BaseDropdownItem v-slot="slotProps">
|
<BaseDropdownItem>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="PencilIcon"
|
name="PencilIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('general.edit') }}
|
{{ $t('general.edit') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
@ -24,12 +24,11 @@
|
|||||||
<!-- delete expense -->
|
<!-- delete expense -->
|
||||||
<BaseDropdownItem
|
<BaseDropdownItem
|
||||||
v-if="userStore.hasAbilities(abilities.DELETE_EXPENSE)"
|
v-if="userStore.hasAbilities(abilities.DELETE_EXPENSE)"
|
||||||
v-slot="slotProps"
|
|
||||||
@click="removeExpense(row.id)"
|
@click="removeExpense(row.id)"
|
||||||
>
|
>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="TrashIcon"
|
name="TrashIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('general.delete') }}
|
{{ $t('general.delete') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
|
|||||||
@ -12,20 +12,20 @@
|
|||||||
v-if="userStore.hasAbilities(abilities.EDIT_INVOICE)"
|
v-if="userStore.hasAbilities(abilities.EDIT_INVOICE)"
|
||||||
:to="`/admin/invoices/${row.id}/edit`"
|
:to="`/admin/invoices/${row.id}/edit`"
|
||||||
>
|
>
|
||||||
<BaseDropdownItem v-show="row.allow_edit" v-slot="slotProps">
|
<BaseDropdownItem v-show="row.allow_edit">
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="PencilIcon"
|
name="PencilIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('general.edit') }}
|
{{ $t('general.edit') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
</router-link>
|
</router-link>
|
||||||
|
|
||||||
<!-- Copy PDF url -->
|
<!-- Copy PDF url -->
|
||||||
<BaseDropdownItem v-if="route.name === 'invoices.view'" v-slot="slotProps" @click="copyPdfUrl">
|
<BaseDropdownItem v-if="route.name === 'invoices.view'" @click="copyPdfUrl">
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="LinkIcon"
|
name="LinkIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('general.copy_pdf_url') }}
|
{{ $t('general.copy_pdf_url') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
@ -38,29 +38,29 @@
|
|||||||
"
|
"
|
||||||
:to="`/admin/invoices/${row.id}/view`"
|
:to="`/admin/invoices/${row.id}/view`"
|
||||||
>
|
>
|
||||||
<BaseDropdownItem v-slot="slotProps">
|
<BaseDropdownItem>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="EyeIcon"
|
name="EyeIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('general.view') }}
|
{{ $t('general.view') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
</router-link>
|
</router-link>
|
||||||
|
|
||||||
<!-- Send Invoice Mail -->
|
<!-- Send Invoice Mail -->
|
||||||
<BaseDropdownItem v-if="canSendInvoice(row)" v-slot="slotProps" @click="sendInvoice(row)">
|
<BaseDropdownItem v-if="canSendInvoice(row)" @click="sendInvoice(row)">
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="PaperAirplaneIcon"
|
name="PaperAirplaneIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('invoices.send_invoice') }}
|
{{ $t('invoices.send_invoice') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
|
|
||||||
<!-- Resend Invoice -->
|
<!-- Resend Invoice -->
|
||||||
<BaseDropdownItem v-if="canReSendInvoice(row)" v-slot="slotProps" @click="sendInvoice(row)">
|
<BaseDropdownItem v-if="canReSendInvoice(row)" @click="sendInvoice(row)">
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="PaperAirplaneIcon"
|
name="PaperAirplaneIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('invoices.resend_invoice') }}
|
{{ $t('invoices.resend_invoice') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
@ -69,21 +69,20 @@
|
|||||||
<router-link :to="`/admin/payments/${row.id}/create`">
|
<router-link :to="`/admin/payments/${row.id}/create`">
|
||||||
<BaseDropdownItem
|
<BaseDropdownItem
|
||||||
v-if="row.status == 'SENT' && route.name !== 'invoices.view'"
|
v-if="row.status == 'SENT' && route.name !== 'invoices.view'"
|
||||||
v-slot="slotProps"
|
|
||||||
>
|
>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="CreditCardIcon"
|
name="CreditCardIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('invoices.record_payment') }}
|
{{ $t('invoices.record_payment') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
</router-link>
|
</router-link>
|
||||||
|
|
||||||
<!-- Mark as sent Invoice -->
|
<!-- Mark as sent Invoice -->
|
||||||
<BaseDropdownItem v-if="canSendInvoice(row)" v-slot="slotProps" @click="onMarkAsSent(row.id)">
|
<BaseDropdownItem v-if="canSendInvoice(row)" @click="onMarkAsSent(row.id)">
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="CheckCircleIcon"
|
name="CheckCircleIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('invoices.mark_as_sent') }}
|
{{ $t('invoices.mark_as_sent') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
@ -91,12 +90,11 @@
|
|||||||
<!-- Clone Invoice into new invoice -->
|
<!-- Clone Invoice into new invoice -->
|
||||||
<BaseDropdownItem
|
<BaseDropdownItem
|
||||||
v-if="userStore.hasAbilities(abilities.CREATE_INVOICE)"
|
v-if="userStore.hasAbilities(abilities.CREATE_INVOICE)"
|
||||||
v-slot="slotProps"
|
|
||||||
@click="cloneInvoiceData(row)"
|
@click="cloneInvoiceData(row)"
|
||||||
>
|
>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="DocumentTextIcon"
|
name="DocumentTextIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('invoices.clone_invoice') }}
|
{{ $t('invoices.clone_invoice') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
@ -104,12 +102,11 @@
|
|||||||
<!-- Delete Invoice -->
|
<!-- Delete Invoice -->
|
||||||
<BaseDropdownItem
|
<BaseDropdownItem
|
||||||
v-if="userStore.hasAbilities(abilities.DELETE_INVOICE)"
|
v-if="userStore.hasAbilities(abilities.DELETE_INVOICE)"
|
||||||
v-slot="slotProps"
|
|
||||||
@click="removeInvoice(row.id)"
|
@click="removeInvoice(row.id)"
|
||||||
>
|
>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="TrashIcon"
|
name="TrashIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('general.delete') }}
|
{{ $t('general.delete') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
|
|||||||
@ -12,8 +12,11 @@
|
|||||||
v-if="userStore.hasAbilities(abilities.EDIT_ITEM)"
|
v-if="userStore.hasAbilities(abilities.EDIT_ITEM)"
|
||||||
:to="`/admin/items/${row.id}/edit`"
|
:to="`/admin/items/${row.id}/edit`"
|
||||||
>
|
>
|
||||||
<BaseDropdownItem v-slot="slotProps">
|
<BaseDropdownItem>
|
||||||
<BaseIcon name="PencilIcon" :class="slotProps.class" />
|
<BaseIcon
|
||||||
|
name="PencilIcon"
|
||||||
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
|
/>
|
||||||
{{ $t('general.edit') }}
|
{{ $t('general.edit') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
</router-link>
|
</router-link>
|
||||||
@ -21,10 +24,12 @@
|
|||||||
<!-- delete item -->
|
<!-- delete item -->
|
||||||
<BaseDropdownItem
|
<BaseDropdownItem
|
||||||
v-if="userStore.hasAbilities(abilities.DELETE_ITEM)"
|
v-if="userStore.hasAbilities(abilities.DELETE_ITEM)"
|
||||||
v-slot="slotProps"
|
|
||||||
@click="removeItem(row.id)"
|
@click="removeItem(row.id)"
|
||||||
>
|
>
|
||||||
<BaseIcon name="TrashIcon" :class="slotProps.class" />
|
<BaseIcon
|
||||||
|
name="TrashIcon"
|
||||||
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
|
/>
|
||||||
{{ $t('general.delete') }}
|
{{ $t('general.delete') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
</BaseDropdown>
|
</BaseDropdown>
|
||||||
|
|||||||
@ -10,12 +10,11 @@
|
|||||||
<!-- edit note -->
|
<!-- edit note -->
|
||||||
<BaseDropdownItem
|
<BaseDropdownItem
|
||||||
v-if="userStore.hasAbilities(abilities.MANAGE_NOTE)"
|
v-if="userStore.hasAbilities(abilities.MANAGE_NOTE)"
|
||||||
v-slot="slotProps"
|
|
||||||
@click="editNote(row.id)"
|
@click="editNote(row.id)"
|
||||||
>
|
>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="PencilIcon"
|
name="PencilIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('general.edit') }}
|
{{ $t('general.edit') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
@ -23,12 +22,11 @@
|
|||||||
<!-- delete note -->
|
<!-- delete note -->
|
||||||
<BaseDropdownItem
|
<BaseDropdownItem
|
||||||
v-if="userStore.hasAbilities(abilities.MANAGE_NOTE)"
|
v-if="userStore.hasAbilities(abilities.MANAGE_NOTE)"
|
||||||
v-slot="slotProps"
|
|
||||||
@click="removeNote(row.id)"
|
@click="removeNote(row.id)"
|
||||||
>
|
>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="TrashIcon"
|
name="TrashIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('general.delete') }}
|
{{ $t('general.delete') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
|
|||||||
@ -8,31 +8,30 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<!-- Copy pdf url -->
|
<!-- Copy pdf url -->
|
||||||
<BaseDropdownItem
|
<BaseDropdown-item
|
||||||
v-if="
|
v-if="
|
||||||
route.name === 'payments.view' &&
|
route.name === 'payments.view' &&
|
||||||
userStore.hasAbilities(abilities.VIEW_PAYMENT)
|
userStore.hasAbilities(abilities.VIEW_PAYMENT)
|
||||||
"
|
"
|
||||||
v-slot="slotProps"
|
|
||||||
class="rounded-md"
|
class="rounded-md"
|
||||||
@click="copyPdfUrl"
|
@click="copyPdfUrl"
|
||||||
>
|
>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="LinkIcon"
|
name="LinkIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('general.copy_pdf_url') }}
|
{{ $t('general.copy_pdf_url') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdown-item>
|
||||||
|
|
||||||
<!-- edit payment -->
|
<!-- edit payment -->
|
||||||
<router-link
|
<router-link
|
||||||
v-if="userStore.hasAbilities(abilities.EDIT_PAYMENT)"
|
v-if="userStore.hasAbilities(abilities.EDIT_PAYMENT)"
|
||||||
:to="`/admin/payments/${row.id}/edit`"
|
:to="`/admin/payments/${row.id}/edit`"
|
||||||
>
|
>
|
||||||
<BaseDropdownItem v-slot="slotProps">
|
<BaseDropdownItem>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="PencilIcon"
|
name="PencilIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('general.edit') }}
|
{{ $t('general.edit') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
@ -46,10 +45,10 @@
|
|||||||
"
|
"
|
||||||
:to="`/admin/payments/${row.id}/view`"
|
:to="`/admin/payments/${row.id}/view`"
|
||||||
>
|
>
|
||||||
<BaseDropdownItem v-slot="slotProps">
|
<BaseDropdownItem>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="EyeIcon"
|
name="EyeIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('general.view') }}
|
{{ $t('general.view') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
@ -62,12 +61,11 @@
|
|||||||
route.name !== 'payments.view' &&
|
route.name !== 'payments.view' &&
|
||||||
userStore.hasAbilities(abilities.SEND_PAYMENT)
|
userStore.hasAbilities(abilities.SEND_PAYMENT)
|
||||||
"
|
"
|
||||||
v-slot="slotProps"
|
|
||||||
@click="sendPayment(row)"
|
@click="sendPayment(row)"
|
||||||
>
|
>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="PaperAirplaneIcon"
|
name="PaperAirplaneIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('payments.send_payment') }}
|
{{ $t('payments.send_payment') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
@ -75,12 +73,11 @@
|
|||||||
<!-- delete payment -->
|
<!-- delete payment -->
|
||||||
<BaseDropdownItem
|
<BaseDropdownItem
|
||||||
v-if="userStore.hasAbilities(abilities.DELETE_PAYMENT)"
|
v-if="userStore.hasAbilities(abilities.DELETE_PAYMENT)"
|
||||||
v-slot="slotProps"
|
|
||||||
@click="removePayment(row.id)"
|
@click="removePayment(row.id)"
|
||||||
>
|
>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="TrashIcon"
|
name="TrashIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('general.delete') }}
|
{{ $t('general.delete') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
|
|||||||
@ -8,19 +8,19 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<!-- edit paymentMode -->
|
<!-- edit paymentMode -->
|
||||||
<BaseDropdownItem v-slot="slotProps" @click="editPaymentMode(row.id)">
|
<BaseDropdownItem @click="editPaymentMode(row.id)">
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="PencilIcon"
|
name="PencilIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('general.edit') }}
|
{{ $t('general.edit') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
|
|
||||||
<!-- delete paymentMode -->
|
<!-- delete paymentMode -->
|
||||||
<BaseDropdownItem v-slot="slotProps" @click="removePaymentMode(row.id)">
|
<BaseDropdownItem @click="removePaymentMode(row.id)">
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="TrashIcon"
|
name="TrashIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('general.delete') }}
|
{{ $t('general.delete') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
|
|||||||
@ -15,10 +15,10 @@
|
|||||||
v-if="userStore.hasAbilities(abilities.EDIT_RECURRING_INVOICE)"
|
v-if="userStore.hasAbilities(abilities.EDIT_RECURRING_INVOICE)"
|
||||||
:to="`/admin/recurring-invoices/${row.id}/edit`"
|
:to="`/admin/recurring-invoices/${row.id}/edit`"
|
||||||
>
|
>
|
||||||
<BaseDropdownItem v-slot="slotProps">
|
<BaseDropdownItem>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="PencilIcon"
|
name="PencilIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('general.edit') }}
|
{{ $t('general.edit') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
@ -32,10 +32,10 @@
|
|||||||
"
|
"
|
||||||
:to="`recurring-invoices/${row.id}/view`"
|
:to="`recurring-invoices/${row.id}/view`"
|
||||||
>
|
>
|
||||||
<BaseDropdownItem v-slot="slotProps">
|
<BaseDropdownItem>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="EyeIcon"
|
name="EyeIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('general.view') }}
|
{{ $t('general.view') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
@ -44,12 +44,11 @@
|
|||||||
<!-- Delete Recurring Invoice -->
|
<!-- Delete Recurring Invoice -->
|
||||||
<BaseDropdownItem
|
<BaseDropdownItem
|
||||||
v-if="userStore.hasAbilities(abilities.DELETE_RECURRING_INVOICE)"
|
v-if="userStore.hasAbilities(abilities.DELETE_RECURRING_INVOICE)"
|
||||||
v-slot="slotProps"
|
|
||||||
@click="removeMultipleRecurringInvoices(row.id)"
|
@click="removeMultipleRecurringInvoices(row.id)"
|
||||||
>
|
>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="TrashIcon"
|
name="TrashIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('general.delete') }}
|
{{ $t('general.delete') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
|
|||||||
@ -10,12 +10,11 @@
|
|||||||
<!-- edit role -->
|
<!-- edit role -->
|
||||||
<BaseDropdownItem
|
<BaseDropdownItem
|
||||||
v-if="userStore.currentUser.is_owner"
|
v-if="userStore.currentUser.is_owner"
|
||||||
v-slot="slotProps"
|
|
||||||
@click="editRole(row.id)"
|
@click="editRole(row.id)"
|
||||||
>
|
>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="PencilIcon"
|
name="PencilIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('general.edit') }}
|
{{ $t('general.edit') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
@ -23,12 +22,11 @@
|
|||||||
<!-- delete role -->
|
<!-- delete role -->
|
||||||
<BaseDropdownItem
|
<BaseDropdownItem
|
||||||
v-if="userStore.currentUser.is_owner"
|
v-if="userStore.currentUser.is_owner"
|
||||||
v-slot="slotProps"
|
|
||||||
@click="removeRole(row.id)"
|
@click="removeRole(row.id)"
|
||||||
>
|
>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="TrashIcon"
|
name="TrashIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('general.delete') }}
|
{{ $t('general.delete') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
|
|||||||
@ -10,12 +10,11 @@
|
|||||||
<!-- edit tax-type -->
|
<!-- edit tax-type -->
|
||||||
<BaseDropdownItem
|
<BaseDropdownItem
|
||||||
v-if="userStore.hasAbilities(abilities.EDIT_TAX_TYPE)"
|
v-if="userStore.hasAbilities(abilities.EDIT_TAX_TYPE)"
|
||||||
v-slot="slotProps"
|
|
||||||
@click="editTaxType(row.id)"
|
@click="editTaxType(row.id)"
|
||||||
>
|
>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="PencilIcon"
|
name="PencilIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('general.edit') }}
|
{{ $t('general.edit') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
@ -23,12 +22,11 @@
|
|||||||
<!-- delete tax-type -->
|
<!-- delete tax-type -->
|
||||||
<BaseDropdownItem
|
<BaseDropdownItem
|
||||||
v-if="userStore.hasAbilities(abilities.DELETE_TAX_TYPE)"
|
v-if="userStore.hasAbilities(abilities.DELETE_TAX_TYPE)"
|
||||||
v-slot="slotProps"
|
|
||||||
@click="removeTaxType(row.id)"
|
@click="removeTaxType(row.id)"
|
||||||
>
|
>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="TrashIcon"
|
name="TrashIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('general.delete') }}
|
{{ $t('general.delete') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
|
|||||||
@ -9,20 +9,20 @@
|
|||||||
|
|
||||||
<!-- edit user -->
|
<!-- edit user -->
|
||||||
<router-link :to="`/admin/users/${row.id}/edit`">
|
<router-link :to="`/admin/users/${row.id}/edit`">
|
||||||
<BaseDropdownItem v-slot="slotProps">
|
<BaseDropdownItem>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="PencilIcon"
|
name="PencilIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('general.edit') }}
|
{{ $t('general.edit') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
</router-link>
|
</router-link>
|
||||||
|
|
||||||
<!-- delete user -->
|
<!-- delete user -->
|
||||||
<BaseDropdownItem v-slot="slotProps" @click="removeUser(row.id)">
|
<BaseDropdownItem @click="removeUser(row.id)">
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="TrashIcon"
|
name="TrashIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
/>
|
/>
|
||||||
{{ $t('general.delete') }}
|
{{ $t('general.delete') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
|
|||||||
@ -1,13 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<tr
|
<tr class="box-border bg-white border border-gray-200 border-solid rounded-b">
|
||||||
class="
|
|
||||||
box-border
|
|
||||||
bg-white
|
|
||||||
border border-gray-200 border-solid
|
|
||||||
rounded-b
|
|
||||||
dark:shadow-glass dark:border dark:border-white/10 dark:bg-gray-800/70
|
|
||||||
"
|
|
||||||
>
|
|
||||||
<td colspan="5" class="p-0 text-left align-top">
|
<td colspan="5" class="p-0 text-left align-top">
|
||||||
<table class="w-full">
|
<table class="w-full">
|
||||||
<colgroup>
|
<colgroup>
|
||||||
@ -25,7 +17,18 @@
|
|||||||
<td class="px-5 py-4 text-left align-top">
|
<td class="px-5 py-4 text-left align-top">
|
||||||
<div class="flex justify-start">
|
<div class="flex justify-start">
|
||||||
<div
|
<div
|
||||||
class="flex items-center justify-center w-5 h-5 mt-2 mr-2 text-gray-300 cursor-move handle"
|
class="
|
||||||
|
flex
|
||||||
|
items-center
|
||||||
|
justify-center
|
||||||
|
w-5
|
||||||
|
h-5
|
||||||
|
mt-2
|
||||||
|
text-gray-300
|
||||||
|
cursor-move
|
||||||
|
handle
|
||||||
|
mr-2
|
||||||
|
"
|
||||||
>
|
>
|
||||||
<DragIcon />
|
<DragIcon />
|
||||||
</div>
|
</div>
|
||||||
@ -105,7 +108,7 @@
|
|||||||
|
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="ChevronDownIcon"
|
name="ChevronDownIcon"
|
||||||
class="w-4 h-4 ml-1 text-gray-500"
|
class="w-4 h-4 text-gray-500 ml-1"
|
||||||
/>
|
/>
|
||||||
</span>
|
</span>
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
@ -138,7 +141,7 @@
|
|||||||
<div class="flex items-center justify-center w-6 h-10 mx-2">
|
<div class="flex items-center justify-center w-6 h-10 mx-2">
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
v-if="showRemoveButton"
|
v-if="showRemoveButton"
|
||||||
class="h-5 dark:text-red-400 cursor-pointer"
|
class="h-5 text-gray-700 cursor-pointer"
|
||||||
name="TrashIcon"
|
name="TrashIcon"
|
||||||
@click="store.removeItem(index)"
|
@click="store.removeItem(index)"
|
||||||
/>
|
/>
|
||||||
@ -152,7 +155,7 @@
|
|||||||
<BaseContentPlaceholders v-if="loading">
|
<BaseContentPlaceholders v-if="loading">
|
||||||
<BaseContentPlaceholdersText
|
<BaseContentPlaceholdersText
|
||||||
:lines="1"
|
:lines="1"
|
||||||
class="w-24 h-8 border rounded-md"
|
class="w-24 h-8 rounded-md border"
|
||||||
/>
|
/>
|
||||||
</BaseContentPlaceholders>
|
</BaseContentPlaceholders>
|
||||||
|
|
||||||
@ -172,7 +175,6 @@
|
|||||||
:ability="abilities.CREATE_INVOICE"
|
:ability="abilities.CREATE_INVOICE"
|
||||||
:store="store"
|
:store="store"
|
||||||
:store-prop="storeProp"
|
:store-prop="storeProp"
|
||||||
:discount="discount"
|
|
||||||
@update="updateTax"
|
@update="updateTax"
|
||||||
/>
|
/>
|
||||||
</td>
|
</td>
|
||||||
|
|||||||
@ -30,13 +30,24 @@
|
|||||||
<template v-if="userStore.hasAbilities(ability)" #action>
|
<template v-if="userStore.hasAbilities(ability)" #action>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
class="flex items-center justify-center w-full px-2 py-2 bg-gray-200 border-none outline-none cursor-pointer "
|
class="
|
||||||
|
flex
|
||||||
|
items-center
|
||||||
|
justify-center
|
||||||
|
w-full
|
||||||
|
px-2
|
||||||
|
cursor-pointer
|
||||||
|
py-2
|
||||||
|
bg-gray-200
|
||||||
|
border-none
|
||||||
|
outline-none
|
||||||
|
"
|
||||||
@click="openTaxModal"
|
@click="openTaxModal"
|
||||||
>
|
>
|
||||||
<BaseIcon name="CheckCircleIcon" class="h-5 text-primary-400" />
|
<BaseIcon name="CheckCircleIcon" class="h-5 text-primary-400" />
|
||||||
|
|
||||||
<label
|
<label
|
||||||
class="ml-2 text-sm leading-none cursor-pointer text-primary-400"
|
class="ml-2 text-sm leading-none text-primary-400 cursor-pointer"
|
||||||
>{{ $t('invoices.add_new_tax') }}</label
|
>{{ $t('invoices.add_new_tax') }}</label
|
||||||
>
|
>
|
||||||
</button>
|
</button>
|
||||||
@ -104,10 +115,6 @@ const props = defineProps({
|
|||||||
type: Number,
|
type: Number,
|
||||||
default: 0,
|
default: 0,
|
||||||
},
|
},
|
||||||
discountedTotal: {
|
|
||||||
type: Number,
|
|
||||||
default: 0,
|
|
||||||
},
|
|
||||||
currency: {
|
currency: {
|
||||||
type: [Object, String],
|
type: [Object, String],
|
||||||
required: true,
|
required: true,
|
||||||
@ -146,19 +153,19 @@ const filteredTypes = computed(() => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
const taxAmount = computed(() => {
|
const taxAmount = computed(() => {
|
||||||
if (localTax.compound_tax && props.discountedTotal) {
|
if (localTax.compound_tax && props.total) {
|
||||||
return ((props.discountedTotal + props.totalTax) * localTax.percent) / 100
|
return ((props.total + props.totalTax) * localTax.percent) / 100
|
||||||
}
|
}
|
||||||
|
|
||||||
if (props.discountedTotal && localTax.percent) {
|
if (props.total && localTax.percent) {
|
||||||
return (props.discountedTotal * localTax.percent) / 100
|
return (props.total * localTax.percent) / 100
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
})
|
})
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
() => props.discountedTotal,
|
() => props.total,
|
||||||
() => {
|
() => {
|
||||||
updateRowTax()
|
updateRowTax()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,4 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="relative" >
|
|
||||||
<BaseDarkHighlight class="z-[-1]" />
|
|
||||||
<table class="text-center item-table min-w-full">
|
<table class="text-center item-table min-w-full">
|
||||||
<colgroup>
|
<colgroup>
|
||||||
<col style="width: 40%; min-width: 280px" />
|
<col style="width: 40%; min-width: 280px" />
|
||||||
@ -12,15 +10,20 @@
|
|||||||
/>
|
/>
|
||||||
<col style="width: 15%; min-width: 120px" />
|
<col style="width: 15%; min-width: 120px" />
|
||||||
</colgroup>
|
</colgroup>
|
||||||
<thead
|
<thead class="bg-white border border-gray-200 border-solid">
|
||||||
|
<tr>
|
||||||
|
<th
|
||||||
class="
|
class="
|
||||||
bg-white
|
px-5
|
||||||
border border-gray-200 border-solid
|
py-3
|
||||||
dark:shadow-glass dark:border dark:border-white/10 dark:bg-gray-800/70
|
text-sm
|
||||||
|
not-italic
|
||||||
|
font-medium
|
||||||
|
leading-5
|
||||||
|
text-left text-gray-700
|
||||||
|
border-t border-b border-gray-200 border-solid
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<tr>
|
|
||||||
<th class="text-left" :class="theadClass">
|
|
||||||
<BaseContentPlaceholders v-if="isLoading">
|
<BaseContentPlaceholders v-if="isLoading">
|
||||||
<BaseContentPlaceholdersText :lines="1" class="w-16 h-5" />
|
<BaseContentPlaceholdersText :lines="1" class="w-16 h-5" />
|
||||||
</BaseContentPlaceholders>
|
</BaseContentPlaceholders>
|
||||||
@ -28,7 +31,18 @@
|
|||||||
{{ $tc('items.item', 2) }}
|
{{ $tc('items.item', 2) }}
|
||||||
</span>
|
</span>
|
||||||
</th>
|
</th>
|
||||||
<th class="text-right" :class="theadClass">
|
<th
|
||||||
|
class="
|
||||||
|
px-5
|
||||||
|
py-3
|
||||||
|
text-sm
|
||||||
|
not-italic
|
||||||
|
font-medium
|
||||||
|
leading-5
|
||||||
|
text-right text-gray-700
|
||||||
|
border-t border-b border-gray-200 border-solid
|
||||||
|
"
|
||||||
|
>
|
||||||
<BaseContentPlaceholders v-if="isLoading">
|
<BaseContentPlaceholders v-if="isLoading">
|
||||||
<BaseContentPlaceholdersText :lines="1" class="w-16 h-5" />
|
<BaseContentPlaceholdersText :lines="1" class="w-16 h-5" />
|
||||||
</BaseContentPlaceholders>
|
</BaseContentPlaceholders>
|
||||||
@ -36,7 +50,18 @@
|
|||||||
{{ $t('invoices.item.quantity') }}
|
{{ $t('invoices.item.quantity') }}
|
||||||
</span>
|
</span>
|
||||||
</th>
|
</th>
|
||||||
<th class="text-left" :class="theadClass">
|
<th
|
||||||
|
class="
|
||||||
|
px-5
|
||||||
|
py-3
|
||||||
|
text-sm
|
||||||
|
not-italic
|
||||||
|
font-medium
|
||||||
|
leading-5
|
||||||
|
text-left text-gray-700
|
||||||
|
border-t border-b border-gray-200 border-solid
|
||||||
|
"
|
||||||
|
>
|
||||||
<BaseContentPlaceholders v-if="isLoading">
|
<BaseContentPlaceholders v-if="isLoading">
|
||||||
<BaseContentPlaceholdersText :lines="1" class="w-16 h-5" />
|
<BaseContentPlaceholdersText :lines="1" class="w-16 h-5" />
|
||||||
</BaseContentPlaceholders>
|
</BaseContentPlaceholders>
|
||||||
@ -45,9 +70,17 @@
|
|||||||
</span>
|
</span>
|
||||||
</th>
|
</th>
|
||||||
<th
|
<th
|
||||||
v-if="store[storeProp].discount_per_item_enabled"
|
v-if="store[storeProp].discount_per_item === 'YES'"
|
||||||
class="text-left"
|
class="
|
||||||
:class="theadClass"
|
px-5
|
||||||
|
py-3
|
||||||
|
text-sm
|
||||||
|
not-italic
|
||||||
|
font-medium
|
||||||
|
leading-5
|
||||||
|
text-left text-gray-700
|
||||||
|
border-t border-b border-gray-200 border-solid
|
||||||
|
"
|
||||||
>
|
>
|
||||||
<BaseContentPlaceholders v-if="isLoading">
|
<BaseContentPlaceholders v-if="isLoading">
|
||||||
<BaseContentPlaceholdersText :lines="1" class="w-16 h-5" />
|
<BaseContentPlaceholdersText :lines="1" class="w-16 h-5" />
|
||||||
@ -56,7 +89,18 @@
|
|||||||
{{ $t('invoices.item.discount') }}
|
{{ $t('invoices.item.discount') }}
|
||||||
</span>
|
</span>
|
||||||
</th>
|
</th>
|
||||||
<th class="text-right" :class="theadClass">
|
<th
|
||||||
|
class="
|
||||||
|
px-5
|
||||||
|
py-3
|
||||||
|
text-sm
|
||||||
|
not-italic
|
||||||
|
font-medium
|
||||||
|
leading-5
|
||||||
|
text-right text-gray-700
|
||||||
|
border-t border-b border-gray-200 border-solid
|
||||||
|
"
|
||||||
|
>
|
||||||
<BaseContentPlaceholders v-if="isLoading">
|
<BaseContentPlaceholders v-if="isLoading">
|
||||||
<BaseContentPlaceholdersText :lines="1" class="w-16 h-5" />
|
<BaseContentPlaceholdersText :lines="1" class="w-16 h-5" />
|
||||||
</BaseContentPlaceholders>
|
</BaseContentPlaceholders>
|
||||||
@ -101,14 +145,12 @@
|
|||||||
cursor-pointer
|
cursor-pointer
|
||||||
text-primary-400
|
text-primary-400
|
||||||
hover:bg-primary-100
|
hover:bg-primary-100
|
||||||
dark:bg-gray-900/50 dark:border-white/10 dark:hover:bg-gray-900/80
|
|
||||||
"
|
"
|
||||||
@click="store.addItem"
|
@click="store.addItem"
|
||||||
>
|
>
|
||||||
<BaseIcon name="PlusCircleIcon" class="mr-2" />
|
<BaseIcon name="PlusCircleIcon" class="mr-2" />
|
||||||
{{ $t('general.add_new_item') }}
|
{{ $t('general.add_new_item') }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
@ -138,11 +180,6 @@ const props = defineProps({
|
|||||||
type: String,
|
type: String,
|
||||||
default: '',
|
default: '',
|
||||||
},
|
},
|
||||||
theadClass: {
|
|
||||||
type: String,
|
|
||||||
default: `px-5 py-3 text-sm not-italic font-medium leading-5
|
|
||||||
text-gray-700 border-t border-b border-gray-200 border-solid dark:text-white dark:border-white/10`
|
|
||||||
},
|
|
||||||
})
|
})
|
||||||
|
|
||||||
const companyStore = useCompanyStore()
|
const companyStore = useCompanyStore()
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
>
|
>
|
||||||
<SelectNotePopup :type="type" @select="onSelectNote" />
|
<SelectNotePopup :type="type" @select="onSelectNote" />
|
||||||
</div>
|
</div>
|
||||||
<label class="text-gray-800 font-medium mb-4 text-sm dark:text-gray-300">
|
<label class="text-gray-800 font-medium mb-4 text-sm">
|
||||||
{{ $t('invoices.notes') }}
|
{{ $t('invoices.notes') }}
|
||||||
</label>
|
</label>
|
||||||
<BaseCustomInput
|
<BaseCustomInput
|
||||||
|
|||||||
@ -6,7 +6,6 @@
|
|||||||
mt-6
|
mt-6
|
||||||
bg-white
|
bg-white
|
||||||
border border-gray-200 border-solid
|
border border-gray-200 border-solid
|
||||||
dark:bg-gray-800/50 dark:border-white/10
|
|
||||||
rounded
|
rounded
|
||||||
md:min-w-[390px]
|
md:min-w-[390px]
|
||||||
min-w-[300px]
|
min-w-[300px]
|
||||||
@ -35,9 +34,7 @@
|
|||||||
items-center
|
items-center
|
||||||
justify-center
|
justify-center
|
||||||
m-0
|
m-0
|
||||||
text-lg
|
text-lg text-black
|
||||||
text-black
|
|
||||||
dark:text-white
|
|
||||||
uppercase
|
uppercase
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
@ -74,9 +71,7 @@
|
|||||||
items-center
|
items-center
|
||||||
justify-center
|
justify-center
|
||||||
m-0
|
m-0
|
||||||
text-lg
|
text-lg text-black
|
||||||
text-black
|
|
||||||
dark:text-white
|
|
||||||
uppercase
|
uppercase
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
@ -103,7 +98,7 @@
|
|||||||
<BaseContentPlaceholders v-if="isLoading">
|
<BaseContentPlaceholders v-if="isLoading">
|
||||||
<BaseContentPlaceholdersText
|
<BaseContentPlaceholdersText
|
||||||
:lines="1"
|
:lines="1"
|
||||||
class="w-24 h-8 border rounded-md"
|
class="w-24 h-8 rounded-md border"
|
||||||
/>
|
/>
|
||||||
</BaseContentPlaceholders>
|
</BaseContentPlaceholders>
|
||||||
<div v-else class="flex" style="width: 140px" role="group">
|
<div v-else class="flex" style="width: 140px" role="group">
|
||||||
@ -119,7 +114,7 @@
|
|||||||
<BaseDropdown position="bottom-end">
|
<BaseDropdown position="bottom-end">
|
||||||
<template #activator>
|
<template #activator>
|
||||||
<BaseButton
|
<BaseButton
|
||||||
class="p-2 rounded-none rounded-tr-md rounded-br-md"
|
class="rounded-tr-md rounded-br-md p-2 rounded-none"
|
||||||
type="button"
|
type="button"
|
||||||
variant="white"
|
variant="white"
|
||||||
>
|
>
|
||||||
@ -132,7 +127,7 @@
|
|||||||
|
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="ChevronDownIcon"
|
name="ChevronDownIcon"
|
||||||
class="w-4 h-4 ml-1 text-gray-500"
|
class="w-4 h-4 text-gray-500 ml-1"
|
||||||
/>
|
/>
|
||||||
</span>
|
</span>
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
@ -193,7 +188,6 @@
|
|||||||
pt-2
|
pt-2
|
||||||
mt-5
|
mt-5
|
||||||
border-t border-gray-200 border-solid
|
border-t border-gray-200 border-solid
|
||||||
dark:border-gray-600
|
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<BaseContentPlaceholders v-if="isLoading">
|
<BaseContentPlaceholders v-if="isLoading">
|
||||||
@ -201,7 +195,7 @@
|
|||||||
</BaseContentPlaceholders>
|
</BaseContentPlaceholders>
|
||||||
<label
|
<label
|
||||||
v-else
|
v-else
|
||||||
class="m-0 text-sm font-semibold leading-5 text-gray-400 uppercase dark:text-gray-400"
|
class="m-0 text-sm font-semibold leading-5 text-gray-400 uppercase"
|
||||||
>{{ $t('estimates.total') }} {{ $t('estimates.amount') }}:</label
|
>{{ $t('estimates.total') }} {{ $t('estimates.amount') }}:</label
|
||||||
>
|
>
|
||||||
|
|
||||||
@ -210,7 +204,14 @@
|
|||||||
</BaseContentPlaceholders>
|
</BaseContentPlaceholders>
|
||||||
<label
|
<label
|
||||||
v-else
|
v-else
|
||||||
class="flex items-center justify-center text-lg uppercase text-primary-400"
|
class="
|
||||||
|
flex
|
||||||
|
items-center
|
||||||
|
justify-center
|
||||||
|
text-lg
|
||||||
|
uppercase
|
||||||
|
text-primary-400
|
||||||
|
"
|
||||||
>
|
>
|
||||||
<BaseFormatMoney :amount="store.getTotal" :currency="defaultCurrency" />
|
<BaseFormatMoney :amount="store.getTotal" :currency="defaultCurrency" />
|
||||||
</label>
|
</label>
|
||||||
@ -333,7 +334,6 @@ function selectPercentage() {
|
|||||||
|
|
||||||
function onSelectTax(selectedTax) {
|
function onSelectTax(selectedTax) {
|
||||||
let amount = 0
|
let amount = 0
|
||||||
|
|
||||||
if (selectedTax.compound_tax && props.store.getSubtotalWithDiscount) {
|
if (selectedTax.compound_tax && props.store.getSubtotalWithDiscount) {
|
||||||
amount = Math.round(
|
amount = Math.round(
|
||||||
((props.store.getSubtotalWithDiscount + props.store.getTotalSimpleTax) *
|
((props.store.getSubtotalWithDiscount + props.store.getTotalSimpleTax) *
|
||||||
|
|||||||
@ -1,23 +1,14 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="flex items-center justify-between w-full mt-2 text-sm">
|
<div class="flex items-center justify-between w-full mt-2 text-sm">
|
||||||
<label class="font-semibold leading-5 text-gray-500 uppercase dark:text-gray-300">
|
<label class="font-semibold leading-5 text-gray-500 uppercase">
|
||||||
{{ tax.name }} ({{ tax.percent }} %)
|
{{ tax.name }} ({{ tax.percent }} %)
|
||||||
</label>
|
</label>
|
||||||
<label
|
<label class="flex items-center justify-center text-lg text-black">
|
||||||
class="
|
|
||||||
flex
|
|
||||||
items-center
|
|
||||||
justify-center
|
|
||||||
text-lg
|
|
||||||
text-black
|
|
||||||
dark:text-white
|
|
||||||
"
|
|
||||||
>
|
|
||||||
<BaseFormatMoney :amount="tax.amount" :currency="currency" />
|
<BaseFormatMoney :amount="tax.amount" :currency="currency" />
|
||||||
|
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="TrashIcon"
|
name="TrashIcon"
|
||||||
class="h-5 ml-2 cursor-pointer dark:text-red-400"
|
class="h-5 ml-2 cursor-pointer"
|
||||||
@click="$emit('remove', tax.id)"
|
@click="$emit('remove', tax.id)"
|
||||||
/>
|
/>
|
||||||
</label>
|
</label>
|
||||||
|
|||||||
@ -44,7 +44,7 @@
|
|||||||
>
|
>
|
||||||
<!-- Tax Search Input -->
|
<!-- Tax Search Input -->
|
||||||
|
|
||||||
<div class="relative bg-white dark:bg-gray-800">
|
<div class="relative bg-white">
|
||||||
<div class="relative p-4">
|
<div class="relative p-4">
|
||||||
<BaseInput
|
<BaseInput
|
||||||
v-model="textSearch"
|
v-model="textSearch"
|
||||||
@ -65,14 +65,13 @@
|
|||||||
list
|
list
|
||||||
max-h-36
|
max-h-36
|
||||||
border-t border-gray-200
|
border-t border-gray-200
|
||||||
dark:border-gray-600
|
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
v-for="(taxType, index) in filteredTaxType"
|
v-for="(taxType, index) in filteredTaxType"
|
||||||
:key="index"
|
:key="index"
|
||||||
:class="{
|
:class="{
|
||||||
'bg-gray-100 cursor-not-allowed opacity-50 pointer-events-none dark:bg-gray-900':
|
'bg-gray-100 cursor-not-allowed opacity-50 pointer-events-none':
|
||||||
taxes.find((val) => {
|
taxes.find((val) => {
|
||||||
return val.tax_type_id === taxType.id
|
return val.tax_type_id === taxType.id
|
||||||
}),
|
}),
|
||||||
@ -85,7 +84,6 @@
|
|||||||
cursor-pointer
|
cursor-pointer
|
||||||
hover:bg-gray-100 hover:cursor-pointer
|
hover:bg-gray-100 hover:cursor-pointer
|
||||||
last:border-b-0
|
last:border-b-0
|
||||||
dark:border-gray-600 dark:hover:bg-gray-700/20
|
|
||||||
"
|
"
|
||||||
@click="selectTaxType(taxType, close)"
|
@click="selectTaxType(taxType, close)"
|
||||||
>
|
>
|
||||||
@ -98,7 +96,6 @@
|
|||||||
leading-tight
|
leading-tight
|
||||||
text-gray-700
|
text-gray-700
|
||||||
cursor-pointer
|
cursor-pointer
|
||||||
dark:text-gray-300
|
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
{{ taxType.name }}
|
{{ taxType.name }}
|
||||||
@ -111,7 +108,6 @@
|
|||||||
font-semibold
|
font-semibold
|
||||||
text-gray-700
|
text-gray-700
|
||||||
cursor-pointer
|
cursor-pointer
|
||||||
dark:text-gray-300
|
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
{{ taxType.percent }} %
|
{{ taxType.percent }} %
|
||||||
@ -142,10 +138,6 @@
|
|||||||
bg-gray-200
|
bg-gray-200
|
||||||
border-none
|
border-none
|
||||||
outline-none
|
outline-none
|
||||||
dark:bg-gray-600/70
|
|
||||||
dark:backdrop-blur-xl
|
|
||||||
dark:shadow-glass
|
|
||||||
dark:hover:bg-gray-600/80
|
|
||||||
"
|
"
|
||||||
@click="openTaxTypeModal"
|
@click="openTaxTypeModal"
|
||||||
>
|
>
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<label class="flex text-gray-800 font-medium text-sm mb-2 dark:text-gray-300">
|
<label class="flex text-gray-800 font-medium text-sm mb-2">
|
||||||
{{ $t('general.select_template') }}
|
{{ $t('general.select_template') }}
|
||||||
<span class="text-sm text-red-500"> *</span>
|
<span class="text-sm text-red-500"> *</span>
|
||||||
</label>
|
</label>
|
||||||
|
|||||||
@ -57,7 +57,9 @@
|
|||||||
</BaseInputGroup>
|
</BaseInputGroup>
|
||||||
</BaseInputGrid>
|
</BaseInputGrid>
|
||||||
</div>
|
</div>
|
||||||
<BaseModalFooter>
|
<div
|
||||||
|
class="z-0 flex justify-end p-4 border-t border-gray-200 border-solid"
|
||||||
|
>
|
||||||
<BaseButton
|
<BaseButton
|
||||||
class="mr-3"
|
class="mr-3"
|
||||||
variant="primary-outline"
|
variant="primary-outline"
|
||||||
@ -82,7 +84,7 @@
|
|||||||
</template>
|
</template>
|
||||||
{{ $t('general.create') }}
|
{{ $t('general.create') }}
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
</BaseModalFooter>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</BaseModal>
|
</BaseModal>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -47,7 +47,15 @@
|
|||||||
</BaseInputGrid>
|
</BaseInputGrid>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<BaseModalFooter>
|
<div
|
||||||
|
class="
|
||||||
|
z-0
|
||||||
|
flex
|
||||||
|
justify-end
|
||||||
|
p-4
|
||||||
|
border-t border-gray-200 border-solid border-modal-bg
|
||||||
|
"
|
||||||
|
>
|
||||||
<BaseButton
|
<BaseButton
|
||||||
type="button"
|
type="button"
|
||||||
variant="primary-outline"
|
variant="primary-outline"
|
||||||
@ -72,7 +80,7 @@
|
|||||||
</template>
|
</template>
|
||||||
{{ categoryStore.isEdit ? $t('general.update') : $t('general.save') }}
|
{{ categoryStore.isEdit ? $t('general.update') : $t('general.save') }}
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
</BaseModalFooter>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</BaseModal>
|
</BaseModal>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -48,24 +48,6 @@
|
|||||||
/>
|
/>
|
||||||
</BaseInputGroup>
|
</BaseInputGroup>
|
||||||
|
|
||||||
<BaseInputGroup
|
|
||||||
:label="$tc('settings.company_info.company_slug')"
|
|
||||||
:help-text="$t('settings.company_info.company_slug_help_text')"
|
|
||||||
:error="
|
|
||||||
v$.newCompanyForm.slug.$error &&
|
|
||||||
v$.newCompanyForm.slug.$errors[0].$message
|
|
||||||
"
|
|
||||||
:content-loading="isFetchingInitialData"
|
|
||||||
required
|
|
||||||
>
|
|
||||||
<BaseInput
|
|
||||||
v-model="newCompanyForm.slug"
|
|
||||||
:invalid="v$.newCompanyForm.slug.$error"
|
|
||||||
:content-loading="isFetchingInitialData"
|
|
||||||
@input="v$.newCompanyForm.slug.$touch()"
|
|
||||||
/>
|
|
||||||
</BaseInputGroup>
|
|
||||||
|
|
||||||
<BaseInputGroup
|
<BaseInputGroup
|
||||||
:content-loading="isFetchingInitialData"
|
:content-loading="isFetchingInitialData"
|
||||||
:label="$tc('settings.company_info.country')"
|
:label="$tc('settings.company_info.country')"
|
||||||
@ -116,7 +98,7 @@
|
|||||||
</BaseInputGrid>
|
</BaseInputGrid>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<BaseModalFooter>
|
<div class="z-0 flex justify-end p-4 bg-gray-50 border-modal-bg">
|
||||||
<BaseButton
|
<BaseButton
|
||||||
class="mr-3 text-sm"
|
class="mr-3 text-sm"
|
||||||
variant="primary-outline"
|
variant="primary-outline"
|
||||||
@ -141,14 +123,14 @@
|
|||||||
</template>
|
</template>
|
||||||
{{ $t('general.save') }}
|
{{ $t('general.save') }}
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
</BaseModalFooter>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</BaseModal>
|
</BaseModal>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { useModalStore } from '@/scripts/stores/modal'
|
import { useModalStore } from '@/scripts/stores/modal'
|
||||||
import { computed, onMounted, ref, reactive, watch } from 'vue'
|
import { computed, onMounted, ref, reactive } from 'vue'
|
||||||
import { useI18n } from 'vue-i18n'
|
import { useI18n } from 'vue-i18n'
|
||||||
import { required, minLength, helpers } from '@vuelidate/validators'
|
import { required, minLength, helpers } from '@vuelidate/validators'
|
||||||
import { useVuelidate } from '@vuelidate/core'
|
import { useVuelidate } from '@vuelidate/core'
|
||||||
@ -170,7 +152,6 @@ let companyLogoName = ref(null)
|
|||||||
|
|
||||||
const newCompanyForm = reactive({
|
const newCompanyForm = reactive({
|
||||||
name: null,
|
name: null,
|
||||||
slug: null,
|
|
||||||
currency: '',
|
currency: '',
|
||||||
address: {
|
address: {
|
||||||
country_id: null,
|
country_id: null,
|
||||||
@ -181,9 +162,6 @@ const modalActive = computed(() => {
|
|||||||
return modalStore.active && modalStore.componentName === 'CompanyModal'
|
return modalStore.active && modalStore.componentName === 'CompanyModal'
|
||||||
})
|
})
|
||||||
|
|
||||||
const slugValidator = (value) => {
|
|
||||||
return value == slugify(value)
|
|
||||||
}
|
|
||||||
const rules = {
|
const rules = {
|
||||||
newCompanyForm: {
|
newCompanyForm: {
|
||||||
name: {
|
name: {
|
||||||
@ -193,17 +171,6 @@ const rules = {
|
|||||||
minLength(3)
|
minLength(3)
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
slug: {
|
|
||||||
required: helpers.withMessage(t('validation.required'), required),
|
|
||||||
minLength: helpers.withMessage(
|
|
||||||
t('validation.name_min_length', { count: 3 }),
|
|
||||||
minLength(3)
|
|
||||||
),
|
|
||||||
slugValidator: helpers.withMessage(
|
|
||||||
t('validation.invalid_slug'),
|
|
||||||
slugValidator
|
|
||||||
),
|
|
||||||
},
|
|
||||||
address: {
|
address: {
|
||||||
country_id: {
|
country_id: {
|
||||||
required: helpers.withMessage(t('validation.required'), required),
|
required: helpers.withMessage(t('validation.required'), required),
|
||||||
@ -276,7 +243,6 @@ async function submitCompanyData() {
|
|||||||
|
|
||||||
function resetNewCompanyForm() {
|
function resetNewCompanyForm() {
|
||||||
newCompanyForm.name = ''
|
newCompanyForm.name = ''
|
||||||
newCompanyForm.slug = ''
|
|
||||||
newCompanyForm.currency = ''
|
newCompanyForm.currency = ''
|
||||||
newCompanyForm.address.country_id = ''
|
newCompanyForm.address.country_id = ''
|
||||||
|
|
||||||
@ -291,24 +257,4 @@ function closeCompanyModal() {
|
|||||||
v$.value.$reset()
|
v$.value.$reset()
|
||||||
}, 300)
|
}, 300)
|
||||||
}
|
}
|
||||||
|
|
||||||
// watcher for if change company name then auto fill company slug value
|
|
||||||
watch(
|
|
||||||
() => newCompanyForm.name,
|
|
||||||
(currentValue) => {
|
|
||||||
newCompanyForm.slug = slugify(currentValue)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
function slugify(string) {
|
|
||||||
return string
|
|
||||||
.toString()
|
|
||||||
.trim()
|
|
||||||
.toLowerCase()
|
|
||||||
.replace(/\s+/g, '-')
|
|
||||||
.replace(/[^\w\-]+/g, '')
|
|
||||||
.replace(/\-\-+/g, '-')
|
|
||||||
.replace(/^-+/, '')
|
|
||||||
.replace(/-+$/, '')
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@ -122,7 +122,7 @@
|
|||||||
<BaseTab :title="$t('customers.portal_access')">
|
<BaseTab :title="$t('customers.portal_access')">
|
||||||
<BaseInputGrid class="col-span-5 lg:col-span-4">
|
<BaseInputGrid class="col-span-5 lg:col-span-4">
|
||||||
<div class="md:col-span-2">
|
<div class="md:col-span-2">
|
||||||
<p class="text-sm text-gray-500 dark:text-gray-300">
|
<p class="text-sm text-gray-500">
|
||||||
{{ $t('customers.portal_access_text') }}
|
{{ $t('customers.portal_access_text') }}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
@ -425,7 +425,9 @@
|
|||||||
</BaseTabGroup>
|
</BaseTabGroup>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<BaseModalFooter>
|
<div
|
||||||
|
class="z-0 flex justify-end p-4 border-t border-gray-200 border-solid"
|
||||||
|
>
|
||||||
<BaseButton
|
<BaseButton
|
||||||
class="mr-3 text-sm"
|
class="mr-3 text-sm"
|
||||||
type="button"
|
type="button"
|
||||||
@ -445,7 +447,7 @@
|
|||||||
</template>
|
</template>
|
||||||
{{ $t('general.save') }}
|
{{ $t('general.save') }}
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
</BaseModalFooter>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</BaseModal>
|
</BaseModal>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -38,7 +38,7 @@
|
|||||||
</BaseInputGroup>
|
</BaseInputGroup>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<BaseModalFooter>
|
<div class="z-0 flex justify-end p-4 bg-gray-50 border-modal-bg">
|
||||||
<BaseButton
|
<BaseButton
|
||||||
class="mr-3 text-sm"
|
class="mr-3 text-sm"
|
||||||
variant="primary-outline"
|
variant="primary-outline"
|
||||||
@ -63,7 +63,7 @@
|
|||||||
</template>
|
</template>
|
||||||
{{ $t('general.delete') }}
|
{{ $t('general.delete') }}
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
</BaseModalFooter>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</BaseModal>
|
</BaseModal>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -150,7 +150,9 @@
|
|||||||
@Remove="removeUsedSelectedCurrencies"
|
@Remove="removeUsedSelectedCurrencies"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<BaseModalFooter>
|
<div
|
||||||
|
class="z-0 flex justify-end p-4 border-t border-gray-200 border-solid"
|
||||||
|
>
|
||||||
<BaseButton
|
<BaseButton
|
||||||
class="mr-3"
|
class="mr-3"
|
||||||
variant="primary-outline"
|
variant="primary-outline"
|
||||||
@ -177,7 +179,7 @@
|
|||||||
exchangeRateStore.isEdit ? $t('general.update') : $t('general.save')
|
exchangeRateStore.isEdit ? $t('general.update') : $t('general.save')
|
||||||
}}
|
}}
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
</BaseModalFooter>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</BaseModal>
|
</BaseModal>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -20,7 +20,15 @@
|
|||||||
@submit="createNewDisk"
|
@submit="createNewDisk"
|
||||||
>
|
>
|
||||||
<template #default="slotProps">
|
<template #default="slotProps">
|
||||||
<BaseModalFooter>
|
<div
|
||||||
|
class="
|
||||||
|
z-0
|
||||||
|
flex
|
||||||
|
justify-end
|
||||||
|
p-4
|
||||||
|
border-t border-solid border-gray-light
|
||||||
|
"
|
||||||
|
>
|
||||||
<BaseButton
|
<BaseButton
|
||||||
class="mr-3 text-sm"
|
class="mr-3 text-sm"
|
||||||
variant="primary-outline"
|
variant="primary-outline"
|
||||||
@ -44,7 +52,7 @@
|
|||||||
|
|
||||||
{{ $t('general.save') }}
|
{{ $t('general.save') }}
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
</BaseModalFooter>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</component>
|
</component>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -89,7 +89,9 @@
|
|||||||
</BaseInputGroup>
|
</BaseInputGroup>
|
||||||
</BaseInputGrid>
|
</BaseInputGrid>
|
||||||
</div>
|
</div>
|
||||||
<BaseModalFooter>
|
<div
|
||||||
|
class="z-0 flex justify-end p-4 border-t border-gray-200 border-solid"
|
||||||
|
>
|
||||||
<BaseButton
|
<BaseButton
|
||||||
class="mr-3"
|
class="mr-3"
|
||||||
variant="primary-outline"
|
variant="primary-outline"
|
||||||
@ -109,7 +111,7 @@
|
|||||||
</template>
|
</template>
|
||||||
{{ itemStore.isEdit ? $t('general.update') : $t('general.save') }}
|
{{ itemStore.isEdit ? $t('general.update') : $t('general.save') }}
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
</BaseModalFooter>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</BaseModal>
|
</BaseModal>
|
||||||
|
|||||||
@ -31,7 +31,15 @@
|
|||||||
</BaseInputGroup>
|
</BaseInputGroup>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<BaseModalFooter>
|
<div
|
||||||
|
class="
|
||||||
|
z-0
|
||||||
|
flex
|
||||||
|
justify-end
|
||||||
|
p-4
|
||||||
|
border-t border-gray-200 border-solid border-modal-bg
|
||||||
|
"
|
||||||
|
>
|
||||||
<BaseButton
|
<BaseButton
|
||||||
type="button"
|
type="button"
|
||||||
variant="primary-outline"
|
variant="primary-outline"
|
||||||
@ -58,7 +66,7 @@
|
|||||||
itemStore.isItemUnitEdit ? $t('general.update') : $t('general.save')
|
itemStore.isItemUnitEdit ? $t('general.update') : $t('general.save')
|
||||||
}}
|
}}
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
</BaseModalFooter>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</BaseModal>
|
</BaseModal>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -62,7 +62,9 @@
|
|||||||
</BaseInputGroup>
|
</BaseInputGroup>
|
||||||
</BaseInputGrid>
|
</BaseInputGrid>
|
||||||
</div>
|
</div>
|
||||||
<BaseModalFooter>
|
<div
|
||||||
|
class="z-0 flex justify-end p-4 border-t border-gray-200 border-solid"
|
||||||
|
>
|
||||||
<BaseButton
|
<BaseButton
|
||||||
variant="primary-outline"
|
variant="primary-outline"
|
||||||
type="button"
|
type="button"
|
||||||
@ -82,7 +84,7 @@
|
|||||||
</template>
|
</template>
|
||||||
{{ $t('general.send') }}
|
{{ $t('general.send') }}
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
</BaseModalFooter>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</BaseModal>
|
</BaseModal>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -63,7 +63,16 @@
|
|||||||
</BaseInputGroup>
|
</BaseInputGroup>
|
||||||
</BaseInputGrid>
|
</BaseInputGrid>
|
||||||
</div>
|
</div>
|
||||||
<BaseModalFooter>
|
<div
|
||||||
|
class="
|
||||||
|
z-0
|
||||||
|
flex
|
||||||
|
justify-end
|
||||||
|
px-4
|
||||||
|
py-4
|
||||||
|
border-t border-solid border-gray-light
|
||||||
|
"
|
||||||
|
>
|
||||||
<BaseButton
|
<BaseButton
|
||||||
class="mr-2"
|
class="mr-2"
|
||||||
variant="primary-outline"
|
variant="primary-outline"
|
||||||
@ -84,7 +93,7 @@
|
|||||||
</template>
|
</template>
|
||||||
{{ noteStore.isEdit ? $t('general.update') : $t('general.save') }}
|
{{ noteStore.isEdit ? $t('general.update') : $t('general.save') }}
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
</BaseModalFooter>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</BaseModal>
|
</BaseModal>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -29,7 +29,9 @@
|
|||||||
</BaseInputGroup>
|
</BaseInputGroup>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<BaseModalFooter>
|
<div
|
||||||
|
class="z-0 flex justify-end p-4 border-t border-gray-200 border-solid"
|
||||||
|
>
|
||||||
<BaseButton
|
<BaseButton
|
||||||
variant="primary-outline"
|
variant="primary-outline"
|
||||||
class="mr-3"
|
class="mr-3"
|
||||||
@ -54,7 +56,7 @@
|
|||||||
: $t('general.save')
|
: $t('general.save')
|
||||||
}}
|
}}
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
</BaseModalFooter>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</BaseModal>
|
</BaseModal>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -72,7 +72,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="border-t border-gray-200 dark:border-gray-600 py-3">
|
<div class="border-t border-gray-200 py-3">
|
||||||
<div
|
<div
|
||||||
class="
|
class="
|
||||||
grid grid-cols-1
|
grid grid-cols-1
|
||||||
@ -89,7 +89,7 @@
|
|||||||
:key="gIndex"
|
:key="gIndex"
|
||||||
class="flex flex-col space-y-1"
|
class="flex flex-col space-y-1"
|
||||||
>
|
>
|
||||||
<p class="text-sm text-gray-500 dark:text-gray-200 border-b dark:border-gray-600 pb-1 mb-2">
|
<p class="text-sm text-gray-500 border-b border-gray-200 pb-1 mb-2">
|
||||||
{{ gIndex }}
|
{{ gIndex }}
|
||||||
</p>
|
</p>
|
||||||
<div
|
<div
|
||||||
@ -116,7 +116,15 @@
|
|||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<BaseModalFooter>
|
<div
|
||||||
|
class="
|
||||||
|
z-0
|
||||||
|
flex
|
||||||
|
justify-end
|
||||||
|
p-4
|
||||||
|
border-t border-solid border--200 border-modal-bg
|
||||||
|
"
|
||||||
|
>
|
||||||
<BaseButton
|
<BaseButton
|
||||||
class="mr-3 text-sm"
|
class="mr-3 text-sm"
|
||||||
variant="primary-outline"
|
variant="primary-outline"
|
||||||
@ -136,7 +144,7 @@
|
|||||||
</template>
|
</template>
|
||||||
{{ !roleStore.isEdit ? $t('general.save') : $t('general.update') }}
|
{{ !roleStore.isEdit ? $t('general.save') : $t('general.update') }}
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
</BaseModalFooter>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</BaseModal>
|
</BaseModal>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -70,7 +70,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<BaseModalFooter>
|
<div class="z-0 flex justify-end p-4 border-t border-gray-200 border-solid">
|
||||||
<BaseButton class="mr-3" variant="primary-outline" @click="closeModal">
|
<BaseButton class="mr-3" variant="primary-outline" @click="closeModal">
|
||||||
{{ $t('general.cancel') }}
|
{{ $t('general.cancel') }}
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
@ -80,7 +80,7 @@
|
|||||||
</template>
|
</template>
|
||||||
{{ $t('general.choose') }}
|
{{ $t('general.choose') }}
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
</BaseModalFooter>
|
</div>
|
||||||
</BaseModal>
|
</BaseModal>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|||||||
@ -62,7 +62,9 @@
|
|||||||
</BaseInputGroup>
|
</BaseInputGroup>
|
||||||
</BaseInputGrid>
|
</BaseInputGrid>
|
||||||
</div>
|
</div>
|
||||||
<BaseModalFooter>
|
<div
|
||||||
|
class="z-0 flex justify-end p-4 border-t border-gray-200 border-solid"
|
||||||
|
>
|
||||||
<BaseButton
|
<BaseButton
|
||||||
class="mr-3"
|
class="mr-3"
|
||||||
variant="primary-outline"
|
variant="primary-outline"
|
||||||
@ -83,7 +85,7 @@
|
|||||||
<BaseIcon v-if="!isLoading" name="PhotographIcon" class="h-5 mr-2" />
|
<BaseIcon v-if="!isLoading" name="PhotographIcon" class="h-5 mr-2" />
|
||||||
{{ $t('general.preview') }}
|
{{ $t('general.preview') }}
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
</BaseModalFooter>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
<div v-else>
|
<div v-else>
|
||||||
<div class="my-6 mx-4 border border-gray-200 relative">
|
<div class="my-6 mx-4 border border-gray-200 relative">
|
||||||
@ -104,7 +106,9 @@
|
|||||||
></iframe>
|
></iframe>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<BaseModalFooter>
|
<div
|
||||||
|
class="z-0 flex justify-end p-4 border-t border-gray-200 border-solid"
|
||||||
|
>
|
||||||
<BaseButton
|
<BaseButton
|
||||||
class="mr-3"
|
class="mr-3"
|
||||||
variant="primary-outline"
|
variant="primary-outline"
|
||||||
@ -123,7 +127,7 @@
|
|||||||
<BaseIcon v-if="!isLoading" name="PaperAirplaneIcon" class="mr-2" />
|
<BaseIcon v-if="!isLoading" name="PaperAirplaneIcon" class="mr-2" />
|
||||||
{{ $t('general.send') }}
|
{{ $t('general.send') }}
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
</BaseModalFooter>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</BaseModal>
|
</BaseModal>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -65,7 +65,9 @@
|
|||||||
</BaseInputGroup>
|
</BaseInputGroup>
|
||||||
</BaseInputGrid>
|
</BaseInputGrid>
|
||||||
</div>
|
</div>
|
||||||
<BaseModalFooter>
|
<div
|
||||||
|
class="z-0 flex justify-end p-4 border-t border-gray-200 border-solid"
|
||||||
|
>
|
||||||
<BaseButton
|
<BaseButton
|
||||||
class="mr-3"
|
class="mr-3"
|
||||||
variant="primary-outline"
|
variant="primary-outline"
|
||||||
@ -91,7 +93,7 @@
|
|||||||
</template>
|
</template>
|
||||||
{{ $t('general.preview') }}
|
{{ $t('general.preview') }}
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
</BaseModalFooter>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
<div v-else>
|
<div v-else>
|
||||||
<div class="my-6 mx-4 border border-gray-200 relative">
|
<div class="my-6 mx-4 border border-gray-200 relative">
|
||||||
@ -112,7 +114,9 @@
|
|||||||
style="min-height: 500px"
|
style="min-height: 500px"
|
||||||
></iframe>
|
></iframe>
|
||||||
</div>
|
</div>
|
||||||
<BaseModalFooter>
|
<div
|
||||||
|
class="z-0 flex justify-end p-4 border-t border-gray-200 border-solid"
|
||||||
|
>
|
||||||
<BaseButton
|
<BaseButton
|
||||||
class="mr-3"
|
class="mr-3"
|
||||||
variant="primary-outline"
|
variant="primary-outline"
|
||||||
@ -136,7 +140,7 @@
|
|||||||
/>
|
/>
|
||||||
{{ $t('general.send') }}
|
{{ $t('general.send') }}
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
</BaseModalFooter>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</BaseModal>
|
</BaseModal>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -65,7 +65,9 @@
|
|||||||
</BaseInputGroup>
|
</BaseInputGroup>
|
||||||
</BaseInputGrid>
|
</BaseInputGrid>
|
||||||
</div>
|
</div>
|
||||||
<BaseModalFooter>
|
<div
|
||||||
|
class="z-0 flex justify-end p-4 border-t border-gray-200 border-solid"
|
||||||
|
>
|
||||||
<BaseButton
|
<BaseButton
|
||||||
class="mr-3"
|
class="mr-3"
|
||||||
variant="primary-outline"
|
variant="primary-outline"
|
||||||
@ -91,7 +93,7 @@
|
|||||||
</template>
|
</template>
|
||||||
{{ $t('general.preview') }}
|
{{ $t('general.preview') }}
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
</BaseModalFooter>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
<div v-else>
|
<div v-else>
|
||||||
<div class="my-6 mx-4 border border-gray-200 relative">
|
<div class="my-6 mx-4 border border-gray-200 relative">
|
||||||
@ -112,7 +114,9 @@
|
|||||||
style="min-height: 500px"
|
style="min-height: 500px"
|
||||||
></iframe>
|
></iframe>
|
||||||
</div>
|
</div>
|
||||||
<BaseModalFooter>
|
<div
|
||||||
|
class="z-0 flex justify-end p-4 border-t border-gray-200 border-solid"
|
||||||
|
>
|
||||||
<BaseButton
|
<BaseButton
|
||||||
class="mr-3"
|
class="mr-3"
|
||||||
variant="primary-outline"
|
variant="primary-outline"
|
||||||
@ -136,7 +140,7 @@
|
|||||||
/>
|
/>
|
||||||
{{ $t('general.send') }}
|
{{ $t('general.send') }}
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
</BaseModalFooter>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</BaseModal>
|
</BaseModal>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -90,7 +90,15 @@
|
|||||||
</BaseInputGroup>
|
</BaseInputGroup>
|
||||||
</BaseInputGrid>
|
</BaseInputGrid>
|
||||||
</div>
|
</div>
|
||||||
<BaseModalFooter>
|
<div
|
||||||
|
class="
|
||||||
|
z-0
|
||||||
|
flex
|
||||||
|
justify-end
|
||||||
|
p-4
|
||||||
|
border-t border-solid border--200 border-modal-bg
|
||||||
|
"
|
||||||
|
>
|
||||||
<BaseButton
|
<BaseButton
|
||||||
class="mr-3 text-sm"
|
class="mr-3 text-sm"
|
||||||
variant="primary-outline"
|
variant="primary-outline"
|
||||||
@ -114,7 +122,7 @@
|
|||||||
</template>
|
</template>
|
||||||
{{ taxTypeStore.isEdit ? $t('general.update') : $t('general.save') }}
|
{{ taxTypeStore.isEdit ? $t('general.update') : $t('general.save') }}
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
</BaseModalFooter>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</BaseModal>
|
</BaseModal>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -87,7 +87,9 @@
|
|||||||
</BaseInputGrid>
|
</BaseInputGrid>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<BaseModalFooter>
|
<div
|
||||||
|
class="z-0 flex justify-end p-4 border-t border-gray-200 border-solid"
|
||||||
|
>
|
||||||
<BaseButton
|
<BaseButton
|
||||||
class="mr-3 text-sm"
|
class="mr-3 text-sm"
|
||||||
type="button"
|
type="button"
|
||||||
@ -107,7 +109,7 @@
|
|||||||
</template>
|
</template>
|
||||||
{{ $t('general.save') }}
|
{{ $t('general.save') }}
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
</BaseModalFooter>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</BaseModal>
|
</BaseModal>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -172,7 +172,15 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<BaseModalFooter>
|
<div
|
||||||
|
class="
|
||||||
|
z-0
|
||||||
|
flex
|
||||||
|
justify-end
|
||||||
|
p-4
|
||||||
|
border-t border-solid border-gray-light border-modal-bg
|
||||||
|
"
|
||||||
|
>
|
||||||
<BaseButton
|
<BaseButton
|
||||||
class="mr-3"
|
class="mr-3"
|
||||||
type="button"
|
type="button"
|
||||||
@ -199,7 +207,7 @@
|
|||||||
!customFieldStore.isEdit ? $t('general.save') : $t('general.update')
|
!customFieldStore.isEdit ? $t('general.save') : $t('general.update')
|
||||||
}}
|
}}
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
</BaseModalFooter>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</BaseModal>
|
</BaseModal>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -153,7 +153,7 @@
|
|||||||
<BaseSwitch v-model="set_as_default" class="flex" />
|
<BaseSwitch v-model="set_as_default" class="flex" />
|
||||||
</div>
|
</div>
|
||||||
<div class="ml-4 right">
|
<div class="ml-4 right">
|
||||||
<p class="p-0 mb-1 text-base leading-snug text-black dark:text-white box-title">
|
<p class="p-0 mb-1 text-base leading-snug text-black box-title">
|
||||||
{{ $t('settings.disk.is_default') }}
|
{{ $t('settings.disk.is_default') }}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -132,7 +132,7 @@
|
|||||||
<BaseSwitch v-model="set_as_default" class="flex" />
|
<BaseSwitch v-model="set_as_default" class="flex" />
|
||||||
</div>
|
</div>
|
||||||
<div class="ml-4 right">
|
<div class="ml-4 right">
|
||||||
<p class="p-0 mb-1 text-base leading-snug text-black dark:text-white box-title">
|
<p class="p-0 mb-1 text-base leading-snug text-black box-title">
|
||||||
{{ $t('settings.disk.is_default') }}
|
{{ $t('settings.disk.is_default') }}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -63,7 +63,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="ml-4 right">
|
<div class="ml-4 right">
|
||||||
<p class="p-0 mb-1 text-base leading-snug text-black dark:text-white box-title">
|
<p class="p-0 mb-1 text-base leading-snug text-black box-title">
|
||||||
{{ $t('settings.disk.is_default') }}
|
{{ $t('settings.disk.is_default') }}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -134,7 +134,7 @@
|
|||||||
<BaseSwitch v-model="set_as_default" class="flex" />
|
<BaseSwitch v-model="set_as_default" class="flex" />
|
||||||
</div>
|
</div>
|
||||||
<div class="ml-4 right">
|
<div class="ml-4 right">
|
||||||
<p class="p-0 mb-1 text-base leading-snug text-black dark:text-white box-title">
|
<p class="p-0 mb-1 text-base leading-snug text-black box-title">
|
||||||
{{ $t('settings.disk.is_default') }}
|
{{ $t('settings.disk.is_default') }}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="grid h-screen grid-cols-12 overflow-y-hidden bg-gray-100 dark:bg-gray-900">
|
<div class="grid h-screen grid-cols-12 overflow-y-hidden bg-gray-100">
|
||||||
<NotificationRoot />
|
<NotificationRoot />
|
||||||
|
|
||||||
<div
|
<div
|
||||||
|
|||||||
@ -15,17 +15,8 @@
|
|||||||
bg-gradient-to-r
|
bg-gradient-to-r
|
||||||
from-primary-500
|
from-primary-500
|
||||||
to-primary-400
|
to-primary-400
|
||||||
dark:from-gray-700/70 dark:to-gray-800/70
|
|
||||||
bg-primary-500
|
|
||||||
dark:bg-transparent
|
|
||||||
dark:backdrop-blur-xl
|
|
||||||
dark:shadow-glass
|
|
||||||
dark:border
|
|
||||||
dark:border-white/10
|
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<BaseDarkHighlight />
|
|
||||||
|
|
||||||
<router-link
|
<router-link
|
||||||
to="/admin/dashboard"
|
to="/admin/dashboard"
|
||||||
class="
|
class="
|
||||||
@ -62,7 +53,6 @@
|
|||||||
cursor-pointer
|
cursor-pointer
|
||||||
md:hidden md:ml-0
|
md:hidden md:ml-0
|
||||||
hover:bg-gray-100
|
hover:bg-gray-100
|
||||||
dark:bg-gray-800 dark:border-gray-500 dark:border
|
|
||||||
"
|
"
|
||||||
@click.prevent="onToggle"
|
@click.prevent="onToggle"
|
||||||
>
|
>
|
||||||
@ -88,21 +78,19 @@
|
|||||||
bg-white
|
bg-white
|
||||||
rounded
|
rounded
|
||||||
md:h-9 md:w-9
|
md:h-9 md:w-9
|
||||||
dark:bg-gray-700 dark:border-gray-500 dark:border
|
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<BaseIcon name="PlusIcon" class="w-5 h-5 text-gray-600 dark:text-white" />
|
<BaseIcon name="PlusIcon" class="w-5 h-5 text-gray-600" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<router-link to="/admin/invoices/create">
|
<router-link to="/admin/invoices/create">
|
||||||
<BaseDropdownItem
|
<BaseDropdownItem
|
||||||
v-if="userStore.hasAbilities(abilities.CREATE_INVOICE)"
|
v-if="userStore.hasAbilities(abilities.CREATE_INVOICE)"
|
||||||
v-slot="slotProps"
|
|
||||||
>
|
>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="DocumentTextIcon"
|
name="DocumentTextIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
/>
|
/>
|
||||||
{{ $t('invoices.new_invoice') }}
|
{{ $t('invoices.new_invoice') }}
|
||||||
@ -111,11 +99,10 @@
|
|||||||
<router-link to="/admin/estimates/create">
|
<router-link to="/admin/estimates/create">
|
||||||
<BaseDropdownItem
|
<BaseDropdownItem
|
||||||
v-if="userStore.hasAbilities(abilities.CREATE_ESTIMATE)"
|
v-if="userStore.hasAbilities(abilities.CREATE_ESTIMATE)"
|
||||||
v-slot="slotProps"
|
|
||||||
>
|
>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="DocumentIcon"
|
name="DocumentIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
/>
|
/>
|
||||||
{{ $t('estimates.new_estimate') }}
|
{{ $t('estimates.new_estimate') }}
|
||||||
@ -125,11 +112,10 @@
|
|||||||
<router-link to="/admin/customers/create">
|
<router-link to="/admin/customers/create">
|
||||||
<BaseDropdownItem
|
<BaseDropdownItem
|
||||||
v-if="userStore.hasAbilities(abilities.CREATE_CUSTOMER)"
|
v-if="userStore.hasAbilities(abilities.CREATE_CUSTOMER)"
|
||||||
v-slot="slotProps"
|
|
||||||
>
|
>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="UserIcon"
|
name="UserIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
/>
|
/>
|
||||||
{{ $t('customers.new_customer') }}
|
{{ $t('customers.new_customer') }}
|
||||||
@ -157,25 +143,25 @@
|
|||||||
<template #activator>
|
<template #activator>
|
||||||
<img
|
<img
|
||||||
:src="previewAvatar"
|
:src="previewAvatar"
|
||||||
class="block w-8 h-8 rounded md:h-9 md:w-9 object-cover"
|
class="block w-8 h-8 rounded md:h-9 md:w-9"
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<router-link to="/admin/settings/account-settings">
|
<router-link to="/admin/settings/account-settings">
|
||||||
<BaseDropdownItem v-slot="slotProps">
|
<BaseDropdownItem>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="CogIcon"
|
name="CogIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
/>
|
/>
|
||||||
{{ $t('navigation.settings') }}
|
{{ $t('navigation.settings') }}
|
||||||
</BaseDropdownItem>
|
</BaseDropdownItem>
|
||||||
</router-link>
|
</router-link>
|
||||||
|
|
||||||
<BaseDropdownItem v-slot="slotProps" @click="logout">
|
<BaseDropdownItem @click="logout">
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
name="LogoutIcon"
|
name="LogoutIcon"
|
||||||
:class="slotProps.class"
|
class="w-5 h-5 mr-3 text-gray-400 group-hover:text-gray-500"
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
/>
|
/>
|
||||||
{{ $t('navigation.logout') }}
|
{{ $t('navigation.logout') }}
|
||||||
|
|||||||
@ -15,9 +15,7 @@
|
|||||||
leave-from="opacity-100"
|
leave-from="opacity-100"
|
||||||
leave-to="opacity-0"
|
leave-to="opacity-0"
|
||||||
>
|
>
|
||||||
<DialogOverlay
|
<DialogOverlay class="fixed inset-0 bg-gray-600 bg-opacity-75" />
|
||||||
class="fixed inset-0 bg-gray-600 bg-opacity-75 dark:bg-gray-900/90"
|
|
||||||
/>
|
|
||||||
</TransitionChild>
|
</TransitionChild>
|
||||||
|
|
||||||
<TransitionChild
|
<TransitionChild
|
||||||
@ -29,9 +27,7 @@
|
|||||||
leave-from="translate-x-0"
|
leave-from="translate-x-0"
|
||||||
leave-to="-translate-x-full"
|
leave-to="-translate-x-full"
|
||||||
>
|
>
|
||||||
<div
|
<div class="relative flex flex-col flex-1 w-full max-w-xs bg-white">
|
||||||
class="relative flex flex-col flex-1 w-full max-w-xs bg-white dark:bg-gray-800"
|
|
||||||
>
|
|
||||||
<TransitionChild
|
<TransitionChild
|
||||||
as="template"
|
as="template"
|
||||||
enter="ease-in-out duration-300"
|
enter="ease-in-out duration-300"
|
||||||
@ -54,7 +50,8 @@
|
|||||||
focus:outline-none
|
focus:outline-none
|
||||||
focus:ring-2
|
focus:ring-2
|
||||||
focus:ring-inset
|
focus:ring-inset
|
||||||
focus:ring-white"
|
focus:ring-white
|
||||||
|
"
|
||||||
@click="globalStore.setSidebarVisibility(false)"
|
@click="globalStore.setSidebarVisibility(false)"
|
||||||
>
|
>
|
||||||
<span class="sr-only">Close sidebar</span>
|
<span class="sr-only">Close sidebar</span>
|
||||||
@ -85,8 +82,8 @@
|
|||||||
:to="item.link"
|
:to="item.link"
|
||||||
:class="[
|
:class="[
|
||||||
hasActiveUrl(item.link)
|
hasActiveUrl(item.link)
|
||||||
? 'text-primary-500 border-primary-500 bg-gray-100 dark:shadow-glass dark:backdrop-blur-xl dark:hover:bg-gray-700 dark:bg-gray-700/50 dark:text-primary-400 dark:font-medium'
|
? 'text-primary-500 border-primary-500 bg-gray-100 '
|
||||||
: 'text-black dark:text-gray-300',
|
: 'text-black',
|
||||||
'cursor-pointer px-0 pl-4 py-3 border-transparent flex items-center border-l-4 border-solid text-sm not-italic font-medium',
|
'cursor-pointer px-0 pl-4 py-3 border-transparent flex items-center border-l-4 border-solid text-sm not-italic font-medium',
|
||||||
]"
|
]"
|
||||||
@click="globalStore.setSidebarVisibility(false)"
|
@click="globalStore.setSidebarVisibility(false)"
|
||||||
@ -103,10 +100,6 @@
|
|||||||
/>
|
/>
|
||||||
{{ $t(item.title) }}
|
{{ $t(item.title) }}
|
||||||
</router-link>
|
</router-link>
|
||||||
<LightDarkSwitch
|
|
||||||
:show-label="false"
|
|
||||||
class="absolute right-6 top-6 !w-auto"
|
|
||||||
/>
|
|
||||||
</nav>
|
</nav>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -123,13 +116,14 @@
|
|||||||
hidden
|
hidden
|
||||||
w-56
|
w-56
|
||||||
h-screen
|
h-screen
|
||||||
|
pb-32
|
||||||
|
overflow-y-auto
|
||||||
bg-white
|
bg-white
|
||||||
border-r border-gray-200 border-solid
|
border-r border-gray-200 border-solid
|
||||||
xl:w-64
|
xl:w-64
|
||||||
md:fixed md:flex md:flex-col md:inset-y-0
|
md:fixed md:flex md:flex-col md:inset-y-0
|
||||||
pt-16
|
pt-16
|
||||||
dark:border-gray-800
|
"
|
||||||
dark:bg-gray-800/80"
|
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
v-for="menu in globalStore.menuGroups"
|
v-for="menu in globalStore.menuGroups"
|
||||||
@ -142,8 +136,8 @@
|
|||||||
:to="item.link"
|
:to="item.link"
|
||||||
:class="[
|
:class="[
|
||||||
hasActiveUrl(item.link)
|
hasActiveUrl(item.link)
|
||||||
? 'text-primary-500 border-primary-500 bg-gray-100 dark:border-primary-400 dark:shadow-glass dark:backdrop-blur-xl dark:hover:bg-gray-700 dark:bg-gray-700/50 dark:text-primary-400 dark:font-medium'
|
? 'text-primary-500 border-primary-500 bg-gray-100 '
|
||||||
: 'text-black dark:hover:bg-transparent dark:hover:text-white dark:text-gray-300',
|
: 'text-black',
|
||||||
'cursor-pointer px-0 pl-6 hover:bg-gray-50 py-3 group flex items-center border-l-4 border-solid border-transparent text-sm not-italic font-medium',
|
'cursor-pointer px-0 pl-6 hover:bg-gray-50 py-3 group flex items-center border-l-4 border-solid border-transparent text-sm not-italic font-medium',
|
||||||
]"
|
]"
|
||||||
>
|
>
|
||||||
@ -151,8 +145,8 @@
|
|||||||
:name="item.icon"
|
:name="item.icon"
|
||||||
:class="[
|
:class="[
|
||||||
hasActiveUrl(item.link)
|
hasActiveUrl(item.link)
|
||||||
? 'text-primary-500 group-hover:text-primary-500 dark:text-primary-400 dark:group-hover:text-primary-500 '
|
? 'text-primary-500 group-hover:text-primary-500 '
|
||||||
: 'text-gray-400 group-hover:text-black dark:text-gray-400 dark:group-hover:text-white',
|
: 'text-gray-400 group-hover:text-black',
|
||||||
'mr-4 shrink-0 h-5 w-5 ',
|
'mr-4 shrink-0 h-5 w-5 ',
|
||||||
]"
|
]"
|
||||||
/>
|
/>
|
||||||
@ -160,9 +154,6 @@
|
|||||||
{{ $t(item.title) }}
|
{{ $t(item.title) }}
|
||||||
</router-link>
|
</router-link>
|
||||||
</div>
|
</div>
|
||||||
<LightDarkSwitch
|
|
||||||
class="absolute bottom-0 py-4 border-t border-gray-200 dark:border-gray-700"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -178,7 +169,6 @@ import {
|
|||||||
|
|
||||||
import { useRoute } from 'vue-router'
|
import { useRoute } from 'vue-router'
|
||||||
import { useGlobalStore } from '@/scripts/admin/stores/global'
|
import { useGlobalStore } from '@/scripts/admin/stores/global'
|
||||||
import LightDarkSwitch from '@/scripts/components/LightDarkSwitcher.vue'
|
|
||||||
|
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const globalStore = useGlobalStore()
|
const globalStore = useGlobalStore()
|
||||||
|
|||||||
@ -184,20 +184,6 @@ export const useCompanyStore = (useWindow = false) => {
|
|||||||
setDefaultCurrency(data) {
|
setDefaultCurrency(data) {
|
||||||
this.defaultCurrency = data.currency
|
this.defaultCurrency = data.currency
|
||||||
},
|
},
|
||||||
|
|
||||||
checkCompanyHasCurrencyTransactions() {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
axios
|
|
||||||
.get(`/api/v1/company/has-transactions`)
|
|
||||||
.then((response) => {
|
|
||||||
resolve(response)
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
handleError(err)
|
|
||||||
reject(err)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
})()
|
})()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -34,7 +34,6 @@ export const useGlobalStore = (useWindow = false) => {
|
|||||||
isAppLoaded: false,
|
isAppLoaded: false,
|
||||||
isSidebarOpen: false,
|
isSidebarOpen: false,
|
||||||
areCurrenciesLoading: false,
|
areCurrenciesLoading: false,
|
||||||
isDarkModeOn: false,
|
|
||||||
|
|
||||||
downloadReport: null,
|
downloadReport: null,
|
||||||
}),
|
}),
|
||||||
|
|||||||
@ -32,7 +32,7 @@
|
|||||||
<div class="mt-4 mb-4 text-sm">
|
<div class="mt-4 mb-4 text-sm">
|
||||||
<router-link
|
<router-link
|
||||||
to="/login"
|
to="/login"
|
||||||
class="text-sm text-primary-400 hover:text-gray-700 dark:hover:text-primary-500"
|
class="text-sm text-primary-400 hover:text-gray-700"
|
||||||
>
|
>
|
||||||
{{ $t('general.back_to_login') }}
|
{{ $t('general.back_to_login') }}
|
||||||
</router-link>
|
</router-link>
|
||||||
|
|||||||
@ -49,7 +49,7 @@
|
|||||||
<div class="mb-4">
|
<div class="mb-4">
|
||||||
<router-link
|
<router-link
|
||||||
to="forgot-password"
|
to="forgot-password"
|
||||||
class="text-sm text-primary-400 hover:text-gray-700 dark:hover:text-primary-500"
|
class="text-sm text-primary-400 hover:text-gray-700"
|
||||||
>
|
>
|
||||||
{{ $t('login.forgot_password') }}
|
{{ $t('login.forgot_password') }}
|
||||||
</router-link>
|
</router-link>
|
||||||
|
|||||||
@ -171,7 +171,7 @@
|
|||||||
|
|
||||||
<BaseInputGrid class="col-span-5 lg:col-span-4">
|
<BaseInputGrid class="col-span-5 lg:col-span-4">
|
||||||
<div class="md:col-span-2">
|
<div class="md:col-span-2">
|
||||||
<p class="text-sm text-gray-500 dark:text-gray-300">
|
<p class="text-sm text-gray-500">
|
||||||
{{ $t('customers.portal_access_text') }}
|
{{ $t('customers.portal_access_text') }}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="pt-6 mt-5 border-t border-solid lg:pt-8 md:pt-4 border-gray-200 dark:border-gray-600">
|
<div class="pt-6 mt-5 border-t border-solid lg:pt-8 md:pt-4 border-gray-200">
|
||||||
<!-- Basic Info -->
|
<!-- Basic Info -->
|
||||||
<BaseHeading>
|
<BaseHeading>
|
||||||
{{ $t('customers.basic_info') }}
|
{{ $t('customers.basic_info') }}
|
||||||
|
|||||||
@ -2,23 +2,8 @@
|
|||||||
<div>
|
<div>
|
||||||
<div
|
<div
|
||||||
v-if="dashboardStore.isDashboardDataLoaded"
|
v-if="dashboardStore.isDashboardDataLoaded"
|
||||||
class="
|
class="grid grid-cols-10 mt-8 bg-white rounded shadow"
|
||||||
grid
|
|
||||||
grid-cols-10
|
|
||||||
mt-8
|
|
||||||
bg-white
|
|
||||||
rounded shadow
|
|
||||||
dark:text-white
|
|
||||||
dark:backdrop-blur-xl
|
|
||||||
dark:shadow-glass
|
|
||||||
dark:border
|
|
||||||
dark:bg-opacity-70
|
|
||||||
dark:border-white/10
|
|
||||||
dark:bg-gray-800
|
|
||||||
relative
|
|
||||||
"
|
|
||||||
>
|
>
|
||||||
<BaseDarkHighlight />
|
|
||||||
<!-- Chart -->
|
<!-- Chart -->
|
||||||
<div
|
<div
|
||||||
class="
|
class="
|
||||||
@ -69,7 +54,6 @@
|
|||||||
lg:border-t-0 lg:text-right lg:col-span-3
|
lg:border-t-0 lg:text-right lg:col-span-3
|
||||||
xl:col-span-2
|
xl:col-span-2
|
||||||
lg:grid-cols-1
|
lg:grid-cols-1
|
||||||
dark:border-white/10
|
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<div class="p-6">
|
<div class="p-6">
|
||||||
@ -112,7 +96,15 @@
|
|||||||
</span>
|
</span>
|
||||||
<br />
|
<br />
|
||||||
<span
|
<span
|
||||||
class="block mt-1 text-xl font-semibold leading-8 lg:text-2xl text-red-400"
|
class="
|
||||||
|
block
|
||||||
|
mt-1
|
||||||
|
text-xl
|
||||||
|
font-semibold
|
||||||
|
leading-8
|
||||||
|
lg:text-2xl
|
||||||
|
text-red-400
|
||||||
|
"
|
||||||
>
|
>
|
||||||
<BaseFormatMoney
|
<BaseFormatMoney
|
||||||
:amount="dashboardStore.totalExpenses"
|
:amount="dashboardStore.totalExpenses"
|
||||||
@ -124,10 +116,8 @@
|
|||||||
class="
|
class="
|
||||||
col-span-3
|
col-span-3
|
||||||
p-6
|
p-6
|
||||||
border-t
|
border-t border-gray-200 border-solid
|
||||||
border-gray-200 border-solid
|
|
||||||
lg:col-span-1
|
lg:col-span-1
|
||||||
dark:border-white/10
|
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<span class="text-xs leading-5 lg:text-sm">
|
<span class="text-xs leading-5 lg:text-sm">
|
||||||
@ -142,7 +132,7 @@
|
|||||||
font-semibold
|
font-semibold
|
||||||
leading-8
|
leading-8
|
||||||
lg:text-2xl
|
lg:text-2xl
|
||||||
text-primary-500 dark:text-primary-400
|
text-primary-500
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<BaseFormatMoney
|
<BaseFormatMoney
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<BaseContentPlaceholders
|
<BaseContentPlaceholders
|
||||||
class="grid grid-cols-10 mt-8 bg-white rounded shadow dark:bg-gray-800"
|
class="grid grid-cols-10 mt-8 bg-white rounded shadow"
|
||||||
>
|
>
|
||||||
<!-- Chart -->
|
<!-- Chart -->
|
||||||
<div
|
<div
|
||||||
@ -29,7 +29,6 @@
|
|||||||
text-center
|
text-center
|
||||||
border-t border-l border-gray-200 border-solid
|
border-t border-l border-gray-200 border-solid
|
||||||
lg:border-t-0 lg:text-right lg:col-span-3
|
lg:border-t-0 lg:text-right lg:col-span-3
|
||||||
dark:border-gray-600
|
|
||||||
xl:col-span-2
|
xl:col-span-2
|
||||||
lg:grid-cols-1
|
lg:grid-cols-1
|
||||||
"
|
"
|
||||||
@ -78,7 +77,6 @@
|
|||||||
col-span-3
|
col-span-3
|
||||||
p-6
|
p-6
|
||||||
border-t border-gray-200 border-solid
|
border-t border-gray-200 border-solid
|
||||||
dark:border-gray-600
|
|
||||||
lg:justify-end lg:items-end lg:col-span-1
|
lg:justify-end lg:items-end lg:col-span-1
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
|
|||||||
@ -12,24 +12,18 @@
|
|||||||
hover:bg-gray-50
|
hover:bg-gray-50
|
||||||
xl:p-4
|
xl:p-4
|
||||||
lg:col-span-2
|
lg:col-span-2
|
||||||
dark:backdrop-blur-xl
|
|
||||||
dark:shadow-glass
|
|
||||||
dark:border
|
|
||||||
dark:border-white/10
|
|
||||||
dark:bg-gray-800/70
|
|
||||||
"
|
"
|
||||||
:class="{ 'lg:!col-span-3': large }"
|
:class="{ 'lg:!col-span-3': large }"
|
||||||
:to="route"
|
:to="route"
|
||||||
>
|
>
|
||||||
<div>
|
<div>
|
||||||
<span class="text-xl font-semibold leading-tight text-black xl:text-3xl dark:text-white">
|
<span class="text-xl font-semibold leading-tight text-black xl:text-3xl">
|
||||||
<slot />
|
<slot />
|
||||||
</span>
|
</span>
|
||||||
<span class="block mt-1 text-sm leading-tight text-gray-500 xl:text-lg dark:text-gray-300">
|
<span class="block mt-1 text-sm leading-tight text-gray-500 xl:text-lg">
|
||||||
{{ label }}
|
{{ label }}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<BaseDarkHighlight class="!bg-highlight/[.17] !top-5" />
|
|
||||||
<div class="flex items-center">
|
<div class="flex items-center">
|
||||||
<component :is="iconComponent" class="w-10 h-10 xl:w-12 xl:h-12" />
|
<component :is="iconComponent" class="w-10 h-10 xl:w-12 xl:h-12" />
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<BaseContentPlaceholders
|
<BaseContentPlaceholders
|
||||||
:rounded="true"
|
:rounded="true"
|
||||||
class="relative flex justify-between w-full p-3 bg-white rounded shadow lg:col-span-3 xl:p-4 dark:bg-gray-800"
|
class="relative flex justify-between w-full p-3 bg-white rounded shadow lg:col-span-3 xl:p-4"
|
||||||
>
|
>
|
||||||
<div>
|
<div>
|
||||||
<BaseContentPlaceholdersText
|
<BaseContentPlaceholdersText
|
||||||
|
|||||||
@ -12,7 +12,6 @@
|
|||||||
shadow
|
shadow
|
||||||
lg:col-span-2
|
lg:col-span-2
|
||||||
xl:p-4
|
xl:p-4
|
||||||
dark:bg-gray-800
|
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
@ -130,7 +130,6 @@
|
|||||||
mt-5
|
mt-5
|
||||||
list-none
|
list-none
|
||||||
border-b-2 border-gray-200 border-solid
|
border-b-2 border-gray-200 border-solid
|
||||||
dark:border-gray-600
|
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<!-- Tabs -->
|
<!-- Tabs -->
|
||||||
|
|||||||
@ -50,7 +50,6 @@
|
|||||||
xl:ml-64
|
xl:ml-64
|
||||||
w-88
|
w-88
|
||||||
xl:block
|
xl:block
|
||||||
dark:bg-gray-800
|
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
@ -63,7 +62,6 @@
|
|||||||
pb-2
|
pb-2
|
||||||
border border-gray-200 border-solid
|
border border-gray-200 border-solid
|
||||||
height-full
|
height-full
|
||||||
dark:border-gray-600
|
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<div class="mb-6">
|
<div class="mb-6">
|
||||||
@ -98,10 +96,9 @@
|
|||||||
px-4
|
px-4
|
||||||
py-1
|
py-1
|
||||||
pb-2
|
pb-2
|
||||||
mb-2
|
mb-1 mb-2
|
||||||
text-sm
|
text-sm
|
||||||
border-b border-gray-200 border-solid
|
border-b border-gray-200 border-solid
|
||||||
dark:border-gray-600
|
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
{{ $t('general.sort_by') }}
|
{{ $t('general.sort_by') }}
|
||||||
@ -164,7 +161,6 @@
|
|||||||
overflow-y-scroll
|
overflow-y-scroll
|
||||||
border-l border-gray-200 border-solid
|
border-l border-gray-200 border-solid
|
||||||
base-scroll
|
base-scroll
|
||||||
dark:border-gray-600
|
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<div v-for="(estimate, index) in estimateList" :key="index">
|
<div v-for="(estimate, index) in estimateList" :key="index">
|
||||||
@ -173,9 +169,9 @@
|
|||||||
:id="'estimate-' + estimate.id"
|
:id="'estimate-' + estimate.id"
|
||||||
:to="`/admin/estimates/${estimate.id}/view`"
|
:to="`/admin/estimates/${estimate.id}/view`"
|
||||||
:class="[
|
:class="[
|
||||||
'flex justify-between side-estimate p-4 cursor-pointer hover:bg-gray-100 items-center border-l-4 border-transparent dark:hover:bg-gray-700',
|
'flex justify-between side-estimate p-4 cursor-pointer hover:bg-gray-100 items-center border-l-4 border-transparent',
|
||||||
{
|
{
|
||||||
'bg-gray-100 border-l-4 border-primary-500 border-solid dark:border-primary-400 dark:bg-gray-700':
|
'bg-gray-100 border-l-4 border-primary-500 border-solid':
|
||||||
hasActiveUrl(estimate.id),
|
hasActiveUrl(estimate.id),
|
||||||
},
|
},
|
||||||
]"
|
]"
|
||||||
@ -195,7 +191,6 @@
|
|||||||
text-black
|
text-black
|
||||||
capitalize
|
capitalize
|
||||||
truncate
|
truncate
|
||||||
dark:text-white
|
|
||||||
"
|
"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
@ -208,7 +203,6 @@
|
|||||||
font-medium
|
font-medium
|
||||||
leading-5
|
leading-5
|
||||||
text-gray-600
|
text-gray-600
|
||||||
dark:text-gray-400
|
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
{{ estimate.estimate_number }}
|
{{ estimate.estimate_number }}
|
||||||
@ -234,7 +228,6 @@
|
|||||||
font-semibold
|
font-semibold
|
||||||
leading-8
|
leading-8
|
||||||
text-right text-gray-900
|
text-right text-gray-900
|
||||||
dark:text-white
|
|
||||||
"
|
"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
@ -246,7 +239,6 @@
|
|||||||
leading-5
|
leading-5
|
||||||
text-right text-gray-600
|
text-right text-gray-600
|
||||||
est-date
|
est-date
|
||||||
dark:text-gray-400
|
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
{{ estimate.formatted_estimate_date }}
|
{{ estimate.formatted_estimate_date }}
|
||||||
@ -259,7 +251,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<p
|
<p
|
||||||
v-if="!estimateList?.length && !isLoading"
|
v-if="!estimateList?.length && !isLoading"
|
||||||
class="flex justify-center px-4 mt-5 text-sm text-gray-600 dark:text-gray-300"
|
class="flex justify-center px-4 mt-5 text-sm text-gray-600"
|
||||||
>
|
>
|
||||||
{{ $t('estimates.no_matching_estimates') }}
|
{{ $t('estimates.no_matching_estimates') }}
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
@ -32,8 +32,6 @@
|
|||||||
:content-loading="isLoading"
|
:content-loading="isLoading"
|
||||||
:calendar-button="true"
|
:calendar-button="true"
|
||||||
calendar-button-icon="calendar"
|
calendar-button-icon="calendar"
|
||||||
:show-extra-options="true"
|
|
||||||
:source-date="estimateStore.newEstimate.estimate_date"
|
|
||||||
/>
|
/>
|
||||||
</BaseInputGroup>
|
</BaseInputGroup>
|
||||||
|
|
||||||
|
|||||||
@ -34,24 +34,6 @@
|
|||||||
/>
|
/>
|
||||||
</BaseInputGroup>
|
</BaseInputGroup>
|
||||||
|
|
||||||
<BaseInputGroup
|
|
||||||
:label="$tc('wizard.company_slug')"
|
|
||||||
:help-text="$t('wizard.company_slug_help_text')"
|
|
||||||
:error="
|
|
||||||
v$.companyForm.slug.$error &&
|
|
||||||
v$.companyForm.slug.$errors[0].$message
|
|
||||||
"
|
|
||||||
required
|
|
||||||
>
|
|
||||||
<BaseInput
|
|
||||||
v-model="companyForm.slug"
|
|
||||||
:invalid="v$.companyForm.slug.$error"
|
|
||||||
type="text"
|
|
||||||
name="slug"
|
|
||||||
@input="v$.companyForm.slug.$touch()"
|
|
||||||
/>
|
|
||||||
</BaseInputGroup>
|
|
||||||
|
|
||||||
<BaseInputGroup
|
<BaseInputGroup
|
||||||
:label="$t('wizard.country')"
|
:label="$t('wizard.country')"
|
||||||
:error="
|
:error="
|
||||||
@ -75,7 +57,9 @@
|
|||||||
track-by="name"
|
track-by="name"
|
||||||
/>
|
/>
|
||||||
</BaseInputGroup>
|
</BaseInputGroup>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="grid grid-cols-1 gap-4 mb-4 md:grid-cols-2 md:mb-6">
|
||||||
<BaseInputGroup :label="$t('wizard.state')">
|
<BaseInputGroup :label="$t('wizard.state')">
|
||||||
<BaseInput
|
<BaseInput
|
||||||
v-model="companyForm.address.state"
|
v-model="companyForm.address.state"
|
||||||
@ -160,9 +144,9 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, computed, onMounted, reactive, watch } from 'vue'
|
import { ref, computed, onMounted, reactive } from 'vue'
|
||||||
import { useI18n } from 'vue-i18n'
|
import { useI18n } from 'vue-i18n'
|
||||||
import { required, minLength, maxLength, helpers } from '@vuelidate/validators'
|
import { required, maxLength, helpers } from '@vuelidate/validators'
|
||||||
import { useVuelidate } from '@vuelidate/core'
|
import { useVuelidate } from '@vuelidate/core'
|
||||||
import { useGlobalStore } from '@/scripts/admin/stores/global'
|
import { useGlobalStore } from '@/scripts/admin/stores/global'
|
||||||
import { useCompanyStore } from '@/scripts/admin/stores/company'
|
import { useCompanyStore } from '@/scripts/admin/stores/company'
|
||||||
@ -178,7 +162,6 @@ let logoFileName = ref(null)
|
|||||||
|
|
||||||
const companyForm = reactive({
|
const companyForm = reactive({
|
||||||
name: null,
|
name: null,
|
||||||
slug: null,
|
|
||||||
address: {
|
address: {
|
||||||
address_street_1: '',
|
address_street_1: '',
|
||||||
address_street_2: '',
|
address_street_2: '',
|
||||||
@ -205,28 +188,10 @@ onMounted(async () => {
|
|||||||
})?.id
|
})?.id
|
||||||
})
|
})
|
||||||
|
|
||||||
const slugValidator = (value) => {
|
|
||||||
return value == slugify(value)
|
|
||||||
}
|
|
||||||
const rules = {
|
const rules = {
|
||||||
companyForm: {
|
companyForm: {
|
||||||
name: {
|
name: {
|
||||||
required: helpers.withMessage(t('validation.required'), required),
|
required: helpers.withMessage(t('validation.required'), required),
|
||||||
minLength: helpers.withMessage(
|
|
||||||
t('validation.name_min_length', { count: 3 }),
|
|
||||||
minLength(3)
|
|
||||||
),
|
|
||||||
},
|
|
||||||
slug: {
|
|
||||||
required: helpers.withMessage(t('validation.required'), required),
|
|
||||||
minLength: helpers.withMessage(
|
|
||||||
t('validation.name_min_length', { count: 3 }),
|
|
||||||
minLength(3)
|
|
||||||
),
|
|
||||||
slugValidator: helpers.withMessage(
|
|
||||||
t('validation.invalid_slug'),
|
|
||||||
slugValidator
|
|
||||||
),
|
|
||||||
},
|
},
|
||||||
address: {
|
address: {
|
||||||
country_id: {
|
country_id: {
|
||||||
@ -284,24 +249,4 @@ async function next() {
|
|||||||
emit('next', 7)
|
emit('next', 7)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// watcher for if change company name then auto fill company slug value
|
|
||||||
watch(
|
|
||||||
() => companyForm.name,
|
|
||||||
(currentValue) => {
|
|
||||||
companyForm.slug = slugify(currentValue)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
function slugify(string) {
|
|
||||||
return string
|
|
||||||
.toString()
|
|
||||||
.trim()
|
|
||||||
.toLowerCase()
|
|
||||||
.replace(/\s+/g, '-')
|
|
||||||
.replace(/[^\w\-]+/g, '')
|
|
||||||
.replace(/\-\-+/g, '-')
|
|
||||||
.replace(/^-+/, '')
|
|
||||||
.replace(/-+$/, '')
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@ -56,7 +56,7 @@
|
|||||||
<BaseMultiselect
|
<BaseMultiselect
|
||||||
v-model="filters.status"
|
v-model="filters.status"
|
||||||
:groups="true"
|
:groups="true"
|
||||||
:options="invoiceStatus"
|
:options="status"
|
||||||
searchable
|
searchable
|
||||||
:placeholder="$t('general.select_a_status')"
|
:placeholder="$t('general.select_a_status')"
|
||||||
@update:modelValue="setActiveTab"
|
@update:modelValue="setActiveTab"
|
||||||
@ -127,31 +127,14 @@
|
|||||||
mt-5
|
mt-5
|
||||||
list-none
|
list-none
|
||||||
border-b-2 border-gray-200 border-solid
|
border-b-2 border-gray-200 border-solid
|
||||||
dark:border-gray-600
|
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<!-- Tabs -->
|
<!-- Tabs -->
|
||||||
<BaseTabGroup
|
<BaseTabGroup class="-mb-5" @change="setStatusFilter">
|
||||||
class="-mb-5"
|
<BaseTab :title="$t('general.all')" filter="" />
|
||||||
:selected-index="selectedIndex"
|
<BaseTab :title="$t('general.draft')" filter="DRAFT" />
|
||||||
@change="changeTabStatus"
|
<BaseTab :title="$t('general.sent')" filter="SENT" />
|
||||||
>
|
<BaseTab :title="$t('general.due')" filter="DUE" />
|
||||||
<BaseTab
|
|
||||||
:title="invoiceTabStatus[0].title"
|
|
||||||
:tab-status="invoiceTabStatus[0].value"
|
|
||||||
/>
|
|
||||||
<BaseTab
|
|
||||||
:title="invoiceTabStatus[1].title"
|
|
||||||
:tab-status="invoiceTabStatus[1].value"
|
|
||||||
/>
|
|
||||||
<BaseTab
|
|
||||||
:title="invoiceTabStatus[2].title"
|
|
||||||
:tab-status="invoiceTabStatus[2].value"
|
|
||||||
/>
|
|
||||||
<BaseTab
|
|
||||||
:title="invoiceTabStatus[3].title"
|
|
||||||
:tab-status="invoiceTabStatus[3].value"
|
|
||||||
/>
|
|
||||||
</BaseTabGroup>
|
</BaseTabGroup>
|
||||||
|
|
||||||
<BaseDropdown
|
<BaseDropdown
|
||||||
@ -306,10 +289,10 @@ const utils = inject('$utils')
|
|||||||
const table = ref(null)
|
const table = ref(null)
|
||||||
const showFilters = ref(false)
|
const showFilters = ref(false)
|
||||||
|
|
||||||
const invoiceStatus = ref([
|
const status = ref([
|
||||||
{
|
{
|
||||||
label: 'Status',
|
label: 'Status',
|
||||||
options: ['DRAFT', 'SENT', 'VIEWED', 'COMPLETED'],
|
options: ['DRAFT', 'DUE', 'SENT', 'VIEWED', 'COMPLETED'],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Paid Status',
|
label: 'Paid Status',
|
||||||
@ -317,29 +300,10 @@ const invoiceStatus = ref([
|
|||||||
},
|
},
|
||||||
,
|
,
|
||||||
])
|
])
|
||||||
|
|
||||||
const invoiceTabStatus = {
|
|
||||||
0: {
|
|
||||||
title: t('general.all'),
|
|
||||||
value: '',
|
|
||||||
},
|
|
||||||
1: {
|
|
||||||
title: t('general.draft'),
|
|
||||||
value: 'DRAFT',
|
|
||||||
},
|
|
||||||
2: {
|
|
||||||
title: t('general.sent'),
|
|
||||||
value: 'SENT',
|
|
||||||
},
|
|
||||||
3: {
|
|
||||||
title: t('general.due'),
|
|
||||||
value: 'DUE',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
const isRequestOngoing = ref(true)
|
const isRequestOngoing = ref(true)
|
||||||
|
const activeTab = ref('general.draft')
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const userStore = useUserStore()
|
const userStore = useUserStore()
|
||||||
const selectedIndex = ref(0)
|
|
||||||
|
|
||||||
let filters = reactive({
|
let filters = reactive({
|
||||||
customer_id: '',
|
customer_id: '',
|
||||||
@ -347,7 +311,6 @@ let filters = reactive({
|
|||||||
from_date: '',
|
from_date: '',
|
||||||
to_date: '',
|
to_date: '',
|
||||||
invoice_number: '',
|
invoice_number: '',
|
||||||
tab_status: '',
|
|
||||||
})
|
})
|
||||||
|
|
||||||
const showEmptyScreen = computed(
|
const showEmptyScreen = computed(
|
||||||
@ -438,7 +401,6 @@ async function fetchData({ page, filter, sort }) {
|
|||||||
from_date: filters.from_date,
|
from_date: filters.from_date,
|
||||||
to_date: filters.to_date,
|
to_date: filters.to_date,
|
||||||
invoice_number: filters.invoice_number,
|
invoice_number: filters.invoice_number,
|
||||||
tab_status: filters.tab_status,
|
|
||||||
orderByField: sort.fieldName || 'created_at',
|
orderByField: sort.fieldName || 'created_at',
|
||||||
orderBy: sort.order || 'desc',
|
orderBy: sort.order || 'desc',
|
||||||
page,
|
page,
|
||||||
@ -461,9 +423,29 @@ async function fetchData({ page, filter, sort }) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function changeTabStatus(val, index) {
|
function setStatusFilter(val) {
|
||||||
filters.tab_status = val['tab-status']
|
if (activeTab.value == val.title) {
|
||||||
selectedIndex.value = index
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
activeTab.value = val.title
|
||||||
|
|
||||||
|
switch (val.title) {
|
||||||
|
case t('general.draft'):
|
||||||
|
filters.status = 'DRAFT'
|
||||||
|
break
|
||||||
|
case t('general.sent'):
|
||||||
|
filters.status = 'SENT'
|
||||||
|
break
|
||||||
|
|
||||||
|
case t('general.due'):
|
||||||
|
filters.status = 'DUE'
|
||||||
|
break
|
||||||
|
|
||||||
|
default:
|
||||||
|
filters.status = ''
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function setFilters() {
|
function setFilters() {
|
||||||
@ -481,6 +463,8 @@ function clearFilter() {
|
|||||||
filters.from_date = ''
|
filters.from_date = ''
|
||||||
filters.to_date = ''
|
filters.to_date = ''
|
||||||
filters.invoice_number = ''
|
filters.invoice_number = ''
|
||||||
|
|
||||||
|
activeTab.value = t('general.all')
|
||||||
}
|
}
|
||||||
|
|
||||||
async function removeMultipleInvoices() {
|
async function removeMultipleInvoices() {
|
||||||
@ -521,21 +505,39 @@ function toggleFilter() {
|
|||||||
function setActiveTab(val) {
|
function setActiveTab(val) {
|
||||||
switch (val) {
|
switch (val) {
|
||||||
case 'DRAFT':
|
case 'DRAFT':
|
||||||
selectedIndex.value = 1
|
activeTab.value = t('general.draft')
|
||||||
|
break
|
||||||
|
case 'SENT':
|
||||||
|
activeTab.value = t('general.sent')
|
||||||
|
break
|
||||||
|
|
||||||
|
case 'DUE':
|
||||||
|
activeTab.value = t('general.due')
|
||||||
break
|
break
|
||||||
|
|
||||||
case 'SENT':
|
|
||||||
case 'VIEWED':
|
|
||||||
case 'COMPLETED':
|
case 'COMPLETED':
|
||||||
|
activeTab.value = t('invoices.completed')
|
||||||
|
break
|
||||||
|
|
||||||
case 'PAID':
|
case 'PAID':
|
||||||
selectedIndex.value = 2
|
activeTab.value = t('invoices.paid')
|
||||||
break
|
break
|
||||||
|
|
||||||
case 'UNPAID':
|
case 'UNPAID':
|
||||||
|
activeTab.value = t('invoices.unpaid')
|
||||||
|
break
|
||||||
|
|
||||||
case 'PARTIALLY_PAID':
|
case 'PARTIALLY_PAID':
|
||||||
selectedIndex.value = 3
|
activeTab.value = t('invoices.partially_paid')
|
||||||
|
break
|
||||||
|
|
||||||
|
case 'VIEWED':
|
||||||
|
activeTab.value = t('invoices.viewed')
|
||||||
|
break
|
||||||
|
|
||||||
|
default:
|
||||||
|
activeTab.value = t('general.all')
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
filters.tab_status = invoiceTabStatus[selectedIndex.value].value
|
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@ -299,7 +299,6 @@ onSearched = debounce(onSearched, 500)
|
|||||||
xl:ml-64
|
xl:ml-64
|
||||||
w-88
|
w-88
|
||||||
xl:block
|
xl:block
|
||||||
dark:bg-gray-800
|
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
@ -312,7 +311,6 @@ onSearched = debounce(onSearched, 500)
|
|||||||
pb-2
|
pb-2
|
||||||
border border-gray-200 border-solid
|
border border-gray-200 border-solid
|
||||||
height-full
|
height-full
|
||||||
dark:border-gray-600
|
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<div class="mb-6">
|
<div class="mb-6">
|
||||||
@ -341,10 +339,9 @@ onSearched = debounce(onSearched, 500)
|
|||||||
px-2
|
px-2
|
||||||
py-1
|
py-1
|
||||||
pb-2
|
pb-2
|
||||||
mb-2
|
mb-1 mb-2
|
||||||
text-sm
|
text-sm
|
||||||
border-b border-gray-200 border-solid
|
border-b border-gray-200 border-solid
|
||||||
dark:border-gray-600
|
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
{{ $t('general.sort_by') }}
|
{{ $t('general.sort_by') }}
|
||||||
@ -407,7 +404,6 @@ onSearched = debounce(onSearched, 500)
|
|||||||
overflow-y-scroll
|
overflow-y-scroll
|
||||||
border-l border-gray-200 border-solid
|
border-l border-gray-200 border-solid
|
||||||
base-scroll
|
base-scroll
|
||||||
dark:border-gray-600
|
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<div v-for="(invoice, index) in invoiceList" :key="index">
|
<div v-for="(invoice, index) in invoiceList" :key="index">
|
||||||
@ -416,9 +412,9 @@ onSearched = debounce(onSearched, 500)
|
|||||||
:id="'invoice-' + invoice.id"
|
:id="'invoice-' + invoice.id"
|
||||||
:to="`/admin/invoices/${invoice.id}/view`"
|
:to="`/admin/invoices/${invoice.id}/view`"
|
||||||
:class="[
|
:class="[
|
||||||
'flex justify-between side-invoice p-4 cursor-pointer hover:bg-gray-100 items-center border-l-4 border-transparent dark:hover:bg-gray-700',
|
'flex justify-between side-invoice p-4 cursor-pointer hover:bg-gray-100 items-center border-l-4 border-transparent',
|
||||||
{
|
{
|
||||||
'bg-gray-100 border-l-4 border-primary-500 border-solid dark:bg-gray-700':
|
'bg-gray-100 border-l-4 border-primary-500 border-solid':
|
||||||
hasActiveUrl(invoice.id),
|
hasActiveUrl(invoice.id),
|
||||||
},
|
},
|
||||||
]"
|
]"
|
||||||
@ -438,7 +434,6 @@ onSearched = debounce(onSearched, 500)
|
|||||||
text-black
|
text-black
|
||||||
capitalize
|
capitalize
|
||||||
truncate
|
truncate
|
||||||
dark:text-white
|
|
||||||
"
|
"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
@ -451,17 +446,16 @@ onSearched = debounce(onSearched, 500)
|
|||||||
font-medium
|
font-medium
|
||||||
leading-5
|
leading-5
|
||||||
text-gray-600
|
text-gray-600
|
||||||
dark:text-gray-400
|
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
{{ invoice.invoice_number }}
|
{{ invoice.invoice_number }}
|
||||||
</div>
|
</div>
|
||||||
<BaseInvoiceStatusBadge
|
<BaseEstimateStatusBadge
|
||||||
:status="invoice.status"
|
:status="invoice.status"
|
||||||
class="px-1 text-xs"
|
class="px-1 text-xs"
|
||||||
>
|
>
|
||||||
{{ invoice.status }}
|
{{ invoice.status }}
|
||||||
</BaseInvoiceStatusBadge>
|
</BaseEstimateStatusBadge>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex-1 whitespace-nowrap right">
|
<div class="flex-1 whitespace-nowrap right">
|
||||||
@ -474,7 +468,6 @@ onSearched = debounce(onSearched, 500)
|
|||||||
leading-8
|
leading-8
|
||||||
text-right text-gray-900
|
text-right text-gray-900
|
||||||
block
|
block
|
||||||
dark:text-white
|
|
||||||
"
|
"
|
||||||
:amount="invoice.total"
|
:amount="invoice.total"
|
||||||
:currency="invoice.customer.currency"
|
:currency="invoice.customer.currency"
|
||||||
@ -487,7 +480,6 @@ onSearched = debounce(onSearched, 500)
|
|||||||
leading-5
|
leading-5
|
||||||
text-right text-gray-600
|
text-right text-gray-600
|
||||||
est-date
|
est-date
|
||||||
dark:text-gray-400
|
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
{{ invoice.formatted_invoice_date }}
|
{{ invoice.formatted_invoice_date }}
|
||||||
@ -500,7 +492,7 @@ onSearched = debounce(onSearched, 500)
|
|||||||
</div>
|
</div>
|
||||||
<p
|
<p
|
||||||
v-if="!invoiceList?.length && !isLoading"
|
v-if="!invoiceList?.length && !isLoading"
|
||||||
class="flex justify-center px-4 mt-5 text-sm text-gray-600 dark:text-gray-300"
|
class="flex justify-center px-4 mt-5 text-sm text-gray-600"
|
||||||
>
|
>
|
||||||
{{ $t('invoices.no_matching_invoices') }}
|
{{ $t('invoices.no_matching_invoices') }}
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
@ -32,8 +32,6 @@
|
|||||||
:content-loading="isLoading"
|
:content-loading="isLoading"
|
||||||
:calendar-button="true"
|
:calendar-button="true"
|
||||||
calendar-button-icon="calendar"
|
calendar-button-icon="calendar"
|
||||||
:show-extra-options="true"
|
|
||||||
:source-date="invoiceStore.newInvoice.invoice_date"
|
|
||||||
/>
|
/>
|
||||||
</BaseInputGroup>
|
</BaseInputGroup>
|
||||||
|
|
||||||
|
|||||||
@ -53,7 +53,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-else class="mt-24">
|
<div v-else class="mt-24">
|
||||||
<label class="flex items-center justify-center text-gray-500 dark:text-gray-300">
|
<label class="flex items-center justify-center text-gray-500">
|
||||||
{{ $t('modules.no_modules_installed') }}
|
{{ $t('modules.no_modules_installed') }}
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
@ -61,10 +61,10 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<BaseCard v-else class="mt-6">
|
<BaseCard v-else class="mt-6">
|
||||||
<h6 class="text-gray-900 text-lg font-medium dark:text-white">
|
<h6 class="text-gray-900 text-lg font-medium">
|
||||||
{{ $t('modules.connect_installation') }}
|
{{ $t('modules.connect_installation') }}
|
||||||
</h6>
|
</h6>
|
||||||
<p class="mt-1 text-sm text-gray-500 dark:text-gray-400">
|
<p class="mt-1 text-sm text-gray-500">
|
||||||
{{
|
{{
|
||||||
$t('modules.api_token_description', {
|
$t('modules.api_token_description', {
|
||||||
url: globalStore.config.base_url.replace(/^http:\/\//, ''),
|
url: globalStore.config.base_url.replace(/^http:\/\//, ''),
|
||||||
|
|||||||
@ -82,9 +82,9 @@
|
|||||||
required
|
required
|
||||||
>
|
>
|
||||||
<BaseCustomerSelectInput
|
<BaseCustomerSelectInput
|
||||||
v-if="!isLoadingContent"
|
|
||||||
v-model="paymentStore.currentPayment.customer_id"
|
v-model="paymentStore.currentPayment.customer_id"
|
||||||
:content-loading="isLoadingContent"
|
:content-loading="isLoadingContent"
|
||||||
|
v-if="!isLoadingContent"
|
||||||
:invalid="v$.currentPayment.customer_id.$error"
|
:invalid="v$.currentPayment.customer_id.$error"
|
||||||
:placeholder="$t('customers.select_a_customer')"
|
:placeholder="$t('customers.select_a_customer')"
|
||||||
show-action
|
show-action
|
||||||
@ -215,7 +215,7 @@
|
|||||||
<SelectNotePopup type="Payment" @select="onSelectNote" />
|
<SelectNotePopup type="Payment" @select="onSelectNote" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<label class="mb-4 text-sm font-medium text-gray-800 dark:text-gray-300">
|
<label class="mb-4 text-sm font-medium text-gray-800">
|
||||||
{{ $t('estimates.notes') }}
|
{{ $t('estimates.notes') }}
|
||||||
</label>
|
</label>
|
||||||
|
|
||||||
@ -423,7 +423,7 @@ function onCustomerChange(customer_id) {
|
|||||||
if (customer_id) {
|
if (customer_id) {
|
||||||
let data = {
|
let data = {
|
||||||
customer_id: customer_id,
|
customer_id: customer_id,
|
||||||
tab_status: 'DUE',
|
status: 'DUE',
|
||||||
limit: 'all',
|
limit: 'all',
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -446,11 +446,7 @@ function onCustomerChange(customer_id) {
|
|||||||
paymentStore.currentPayment.selectedCustomer = res2.data.data
|
paymentStore.currentPayment.selectedCustomer = res2.data.data
|
||||||
paymentStore.currentPayment.customer = res2.data.data
|
paymentStore.currentPayment.customer = res2.data.data
|
||||||
paymentStore.currentPayment.currency = res2.data.data.currency
|
paymentStore.currentPayment.currency = res2.data.data.currency
|
||||||
if (
|
if(isEdit.value && !customerStore.editCustomer && paymentStore.currentPayment.customer_id) {
|
||||||
isEdit.value &&
|
|
||||||
!customerStore.editCustomer &&
|
|
||||||
paymentStore.currentPayment.customer_id
|
|
||||||
) {
|
|
||||||
customerStore.editCustomer = res2.data.data
|
customerStore.editCustomer = res2.data.data
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -35,7 +35,6 @@
|
|||||||
xl:ml-64
|
xl:ml-64
|
||||||
w-88
|
w-88
|
||||||
xl:block
|
xl:block
|
||||||
dark:bg-gray-800
|
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
@ -47,7 +46,6 @@
|
|||||||
pt-8
|
pt-8
|
||||||
pb-6
|
pb-6
|
||||||
border border-gray-200 border-solid
|
border border-gray-200 border-solid
|
||||||
dark:border-gray-600
|
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<BaseInput
|
<BaseInput
|
||||||
@ -79,7 +77,6 @@
|
|||||||
mb-2
|
mb-2
|
||||||
text-sm
|
text-sm
|
||||||
border-b border-gray-200 border-solid
|
border-b border-gray-200 border-solid
|
||||||
dark:border-gray-600
|
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
{{ $t('general.sort_by') }}
|
{{ $t('general.sort_by') }}
|
||||||
@ -142,7 +139,7 @@
|
|||||||
|
|
||||||
<div
|
<div
|
||||||
ref="paymentListSection"
|
ref="paymentListSection"
|
||||||
class="h-full overflow-y-scroll border-l border-gray-200 border-solid dark:border-gray-600"
|
class="h-full overflow-y-scroll border-l border-gray-200 border-solid"
|
||||||
>
|
>
|
||||||
<div v-for="(payment, index) in paymentList" :key="index">
|
<div v-for="(payment, index) in paymentList" :key="index">
|
||||||
<router-link
|
<router-link
|
||||||
@ -150,9 +147,9 @@
|
|||||||
:id="'payment-' + payment.id"
|
:id="'payment-' + payment.id"
|
||||||
:to="`/admin/payments/${payment.id}/view`"
|
:to="`/admin/payments/${payment.id}/view`"
|
||||||
:class="[
|
:class="[
|
||||||
'flex justify-between p-4 items-center cursor-pointer hover:bg-gray-100 border-l-4 border-transparent dark:hover:bg-gray-700',
|
'flex justify-between p-4 items-center cursor-pointer hover:bg-gray-100 border-l-4 border-transparent',
|
||||||
{
|
{
|
||||||
'bg-gray-100 border-l-4 border-primary-500 border-solid dark:bg-gray-700':
|
'bg-gray-100 border-l-4 border-primary-500 border-solid':
|
||||||
hasActiveUrl(payment.id),
|
hasActiveUrl(payment.id),
|
||||||
},
|
},
|
||||||
]"
|
]"
|
||||||
@ -172,7 +169,6 @@
|
|||||||
text-black
|
text-black
|
||||||
capitalize
|
capitalize
|
||||||
truncate
|
truncate
|
||||||
dark:text-white
|
|
||||||
"
|
"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
@ -185,7 +181,6 @@
|
|||||||
leading-5
|
leading-5
|
||||||
text-gray-500
|
text-gray-500
|
||||||
capitalize
|
capitalize
|
||||||
dark:text-gray-400
|
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
{{ payment?.payment_number }}
|
{{ payment?.payment_number }}
|
||||||
@ -216,13 +211,12 @@
|
|||||||
font-semibold
|
font-semibold
|
||||||
leading-8
|
leading-8
|
||||||
text-right text-gray-900
|
text-right text-gray-900
|
||||||
dark:text-white
|
|
||||||
"
|
"
|
||||||
:amount="payment?.amount"
|
:amount="payment?.amount"
|
||||||
:currency="payment.customer?.currency"
|
:currency="payment.customer?.currency"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<div class="text-sm text-right text-gray-500 non-italic dark:text-gray-400">
|
<div class="text-sm text-right text-gray-500 non-italic">
|
||||||
{{ payment.formatted_payment_date }}
|
{{ payment.formatted_payment_date }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -233,7 +227,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<p
|
<p
|
||||||
v-if="!paymentList?.length && !isLoading"
|
v-if="!paymentList?.length && !isLoading"
|
||||||
class="flex justify-center px-4 mt-5 text-sm text-gray-600 dark:text-gray-300"
|
class="flex justify-center px-4 mt-5 text-sm text-gray-600"
|
||||||
>
|
>
|
||||||
{{ $t('payments.no_matching_payments') }}
|
{{ $t('payments.no_matching_payments') }}
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user