mirror of
				https://github.com/crater-invoice/crater.git
				synced 2025-11-04 06:23:17 -05:00 
			
		
		
		
	Compare commits
	
		
			141 Commits
		
	
	
		
			dark-switc
			...
			e5afc93efa
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| e5afc93efa | |||
| 9f9e45a76a | |||
| 0e7c218819 | |||
| b18ccc1b34 | |||
| 80a209284d | |||
| 7152a7b74a | |||
| 77bb074f84 | |||
| 3e145211a5 | |||
| 7c556b8427 | |||
| ff9356eb49 | |||
| 11caa7bf51 | |||
| 85a87e5f2f | |||
| 4a4353d779 | |||
| 07bf7d3d5c | |||
| ef11dc4440 | |||
| fcd992179e | |||
| d057b27560 | |||
| 6c66f0634b | |||
| b6eb1eef78 | |||
| da184cb13e | |||
| ff8519764e | |||
| 55163888b3 | |||
| 0ea6bce713 | |||
| c8ea2a7f3d | |||
| 078d928206 | |||
| 01f01b8607 | |||
| 1314821bb1 | |||
| 40d2d7435b | |||
| 36f334dc87 | |||
| dfd13bf9de | |||
| afb8cab71a | |||
| 6f0c9c6923 | |||
| a7b1fe87ea | |||
| a2970402b9 | |||
| 2934b9fc3f | |||
| ebf19636e1 | |||
| cbc13d4884 | |||
| b02803e7c5 | |||
| 194a8cb235 | |||
| 8fd045e378 | |||
| 7a11fbd02a | |||
| 5bc213299f | |||
| 2b5b4ab603 | |||
| 8a47cab96c | |||
| 606fed3e68 | |||
| d227ad4e6b | |||
| 835d61d73c | |||
| 6bb89db25e | |||
| 3f0fd04ad3 | |||
| 6c3e1b1135 | |||
| e331bc18ab | |||
| 67549fd299 | |||
| e6cea15a5b | |||
| 9471cfbca3 | |||
| e0da5e8eb8 | |||
| 1328e36306 | |||
| 5a5ed65202 | |||
| 598e5801bc | |||
| 427fb7675f | |||
| 4ce313b10a | |||
| 12d4107c13 | |||
| 41ba8fc849 | |||
| 2ba2d83478 | |||
| f421cd1677 | |||
| 16b4533892 | |||
| 3afdfe3fda | |||
| ebdfd83b04 | |||
| 26ba2d8d28 | |||
| 22377bc407 | |||
| 65b7a2c78e | |||
| d8ca49572b | |||
| f28d67629f | |||
| fa9c0824d2 | |||
| d8ad7d1c09 | |||
| f3eba0ca98 | |||
| 0046ce1675 | |||
| 1ea4048e98 | |||
| 3922da67db | |||
| d939c7340f | |||
| a1540dcbc1 | |||
| df89e1d248 | |||
| c4d79a8b63 | |||
| 5d875af7be | |||
| 9734ccf9fa | |||
| 8080fe86ca | |||
| 43b3f00dff | |||
| 9f3b39a685 | |||
| 309b2e0888 | |||
| ca60a4830d | |||
| ee96724b81 | |||
| c3250d6141 | |||
| d2a8477087 | |||
| 718657b0a4 | |||
| 1acac8f129 | |||
| 176b207335 | |||
| 77d7ae0fe4 | |||
| fc222fc6de | |||
| fa9d28e66b | |||
| a87ef11edc | |||
| 221f272da9 | |||
| b022cbad59 | |||
| d342bc9771 | |||
| c236012f4e | |||
| c50a2a5988 | |||
| f07f488148 | |||
| 46ba42478f | |||
| ddfea9d827 | |||
| 25aa4ac198 | |||
| 2081580640 | |||
| b20277d1b7 | |||
| 9fded639b9 | |||
| a19266a29c | |||
| d07d2243a9 | |||
| 19a23983ab | |||
| 3545ebb7a4 | |||
| e0ab4136a9 | |||
| 7ee0ceba0c | |||
| 2ca332f33c | |||
| fd3a1524ad | |||
| 889df7b9a6 | |||
| 73f36981e4 | |||
| e3460384d0 | |||
| a793d53b31 | |||
| 59854f016b | |||
| 411e2bf7b7 | |||
| fc46391dec | |||
| 15bfbfdaf3 | |||
| 9d7cc7548a | |||
| 7e460249bc | |||
| fd68cea4de | |||
| 0268b808d5 | |||
| 532422feca | |||
| f3cb1f6af6 | |||
| 5b0e1fc5a8 | |||
| 6f68f57791 | |||
| 6db63b3aae | |||
| c8e7378725 | |||
| cf1e90aa40 | |||
| 3d476f66f9 | |||
| 5f0925416e | |||
| a3a1f51d34 | 
							
								
								
									
										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
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@ -16,4 +16,3 @@ Homestead.yaml
 | 
				
			|||||||
.gitkeep
 | 
					.gitkeep
 | 
				
			||||||
/public/docs
 | 
					/public/docs
 | 
				
			||||||
/.scribe
 | 
					/.scribe
 | 
				
			||||||
!storage/fonts/.gitkeep
 | 
					 | 
				
			||||||
@ -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,15 +38,15 @@
 | 
				
			|||||||
    "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",
 | 
					    "fzaninotto/faker": "^1.9.1",
 | 
				
			||||||
    "mockery/mockery": "^1.3.1",
 | 
					    "mockery/mockery": "^1.3.1",
 | 
				
			||||||
    "nunomaduro/collision": "^5.0",
 | 
					    "nunomaduro/collision": "^5.0",
 | 
				
			||||||
    "pestphp/pest": "^1.0",
 | 
					    "pestphp/pest": "^1.0",
 | 
				
			||||||
    "pestphp/pest-plugin-faker": "^1.0",
 | 
					    "pestphp/pest-plugin-faker": "^1.0",
 | 
				
			||||||
    "pestphp/pest-plugin-laravel": "^1.0",
 | 
					    "pestphp/pest-plugin-laravel": "^1.0",
 | 
				
			||||||
    "pestphp/pest-plugin-parallel": "^0.2.1",
 | 
					    "pestphp/pest-plugin-parallel": "^0.2.1",
 | 
				
			||||||
    "phpunit/phpunit": "^9.3"
 | 
					    "phpunit/phpunit": "^9.0"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "autoload": {
 | 
					  "autoload": {
 | 
				
			||||||
    "psr-4": {
 | 
					    "psr-4": {
 | 
				
			||||||
@ -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": {
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										2361
									
								
								composer.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2361
									
								
								composer.lock
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -71,7 +71,6 @@ return [
 | 
				
			|||||||
        ["code" => "cs", "name" => "Czech"],
 | 
					        ["code" => "cs", "name" => "Czech"],
 | 
				
			||||||
        ["code" => "el", "name" => "Greek"],
 | 
					        ["code" => "el", "name" => "Greek"],
 | 
				
			||||||
        ["code" => "hr", "name" => "Crotian"],
 | 
					        ["code" => "hr", "name" => "Crotian"],
 | 
				
			||||||
        ["code" => "th", "name" => "ไทย"],
 | 
					 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /*
 | 
					    /*
 | 
				
			||||||
 | 
				
			|||||||
@ -170,7 +170,7 @@ class CountriesTableSeeder extends Seeder
 | 
				
			|||||||
        ['id' => 152,'code' => 'NR','name' => "Nauru",'phonecode' => 674],
 | 
					        ['id' => 152,'code' => 'NR','name' => "Nauru",'phonecode' => 674],
 | 
				
			||||||
        ['id' => 153,'code' => 'NP','name' => "Nepal",'phonecode' => 977],
 | 
					        ['id' => 153,'code' => 'NP','name' => "Nepal",'phonecode' => 977],
 | 
				
			||||||
        ['id' => 154,'code' => 'AN','name' => "Netherlands Antilles",'phonecode' => 599],
 | 
					        ['id' => 154,'code' => 'AN','name' => "Netherlands Antilles",'phonecode' => 599],
 | 
				
			||||||
        ['id' => 155,'code' => 'NL','name' => "Netherlands",'phonecode' => 31],
 | 
					        ['id' => 155,'code' => 'NL','name' => "Netherlands The",'phonecode' => 31],
 | 
				
			||||||
        ['id' => 156,'code' => 'NC','name' => "New Caledonia",'phonecode' => 687],
 | 
					        ['id' => 156,'code' => 'NC','name' => "New Caledonia",'phonecode' => 687],
 | 
				
			||||||
        ['id' => 157,'code' => 'NZ','name' => "New Zealand",'phonecode' => 64],
 | 
					        ['id' => 157,'code' => 'NZ','name' => "New Zealand",'phonecode' => 64],
 | 
				
			||||||
        ['id' => 158,'code' => 'NI','name' => "Nicaragua",'phonecode' => 505],
 | 
					        ['id' => 158,'code' => 'NI','name' => "Nicaragua",'phonecode' => 505],
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
FROM php:8.0-fpm-alpine
 | 
					FROM php:7.4-fpm-alpine
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RUN apk add --no-cache \
 | 
					RUN apk add --no-cache \
 | 
				
			||||||
    php8-bcmath
 | 
					    php7-bcmath
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RUN docker-php-ext-install pdo pdo_mysql bcmath
 | 
					RUN docker-php-ext-install pdo pdo_mysql bcmath
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -27,7 +27,7 @@
 | 
				
			|||||||
    "vite": "^2.6.1"
 | 
					    "vite": "^2.6.1"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "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>
 | 
				
			||||||
 | 
				
			|||||||
@ -36,22 +36,18 @@
 | 
				
			|||||||
              justify-center
 | 
					              justify-center
 | 
				
			||||||
              w-full
 | 
					              w-full
 | 
				
			||||||
              px-2
 | 
					              px-2
 | 
				
			||||||
 | 
					              cursor-pointer
 | 
				
			||||||
              py-2
 | 
					              py-2
 | 
				
			||||||
              bg-gray-200
 | 
					              bg-gray-200
 | 
				
			||||||
              border-none
 | 
					              border-none
 | 
				
			||||||
              outline-none
 | 
					              outline-none
 | 
				
			||||||
              cursor-pointer
 | 
					 | 
				
			||||||
              dark:bg-gray-600/70
 | 
					 | 
				
			||||||
              dark:backdrop-blur-xl
 | 
					 | 
				
			||||||
              dark:shadow-glass
 | 
					 | 
				
			||||||
              dark:hover:bg-gray-600/80
 | 
					 | 
				
			||||||
            "
 | 
					            "
 | 
				
			||||||
            @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>
 | 
				
			||||||
@ -68,7 +64,7 @@
 | 
				
			|||||||
      <BaseIcon
 | 
					      <BaseIcon
 | 
				
			||||||
        v-if="taxes.length && index !== taxes.length - 1"
 | 
					        v-if="taxes.length && index !== taxes.length - 1"
 | 
				
			||||||
        name="TrashIcon"
 | 
					        name="TrashIcon"
 | 
				
			||||||
        class="h-5 text-gray-700 dark:text-red-400 cursor-pointer"
 | 
					        class="h-5 text-gray-700 cursor-pointer"
 | 
				
			||||||
        @click="removeTax(index)"
 | 
					        @click="removeTax(index)"
 | 
				
			||||||
      />
 | 
					      />
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
@ -119,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,
 | 
				
			||||||
@ -161,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,7 @@
 | 
				
			|||||||
      />
 | 
					      />
 | 
				
			||||||
      <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">
 | 
				
			||||||
        class="
 | 
					 | 
				
			||||||
          bg-white
 | 
					 | 
				
			||||||
          border
 | 
					 | 
				
			||||||
          border-gray-200
 | 
					 | 
				
			||||||
          border-solid
 | 
					 | 
				
			||||||
          dark:shadow-glass dark:border dark:border-white/10 dark:bg-gray-800/70
 | 
					 | 
				
			||||||
        "
 | 
					 | 
				
			||||||
      >
 | 
					 | 
				
			||||||
      <tr>
 | 
					      <tr>
 | 
				
			||||||
        <th
 | 
					        <th
 | 
				
			||||||
          class="
 | 
					          class="
 | 
				
			||||||
@ -32,7 +22,6 @@
 | 
				
			|||||||
            leading-5
 | 
					            leading-5
 | 
				
			||||||
            text-left text-gray-700
 | 
					            text-left text-gray-700
 | 
				
			||||||
            border-t border-b border-gray-200 border-solid
 | 
					            border-t border-b border-gray-200 border-solid
 | 
				
			||||||
              dark:text-white dark:border-white/10
 | 
					 | 
				
			||||||
          "
 | 
					          "
 | 
				
			||||||
        >
 | 
					        >
 | 
				
			||||||
          <BaseContentPlaceholders v-if="isLoading">
 | 
					          <BaseContentPlaceholders v-if="isLoading">
 | 
				
			||||||
@ -52,7 +41,6 @@
 | 
				
			|||||||
            leading-5
 | 
					            leading-5
 | 
				
			||||||
            text-right text-gray-700
 | 
					            text-right text-gray-700
 | 
				
			||||||
            border-t border-b border-gray-200 border-solid
 | 
					            border-t border-b border-gray-200 border-solid
 | 
				
			||||||
              dark:text-white dark:border-white/10
 | 
					 | 
				
			||||||
          "
 | 
					          "
 | 
				
			||||||
        >
 | 
					        >
 | 
				
			||||||
          <BaseContentPlaceholders v-if="isLoading">
 | 
					          <BaseContentPlaceholders v-if="isLoading">
 | 
				
			||||||
@ -72,7 +60,6 @@
 | 
				
			|||||||
            leading-5
 | 
					            leading-5
 | 
				
			||||||
            text-left text-gray-700
 | 
					            text-left text-gray-700
 | 
				
			||||||
            border-t border-b border-gray-200 border-solid
 | 
					            border-t border-b border-gray-200 border-solid
 | 
				
			||||||
              dark:text-white dark:border-white/10
 | 
					 | 
				
			||||||
          "
 | 
					          "
 | 
				
			||||||
        >
 | 
					        >
 | 
				
			||||||
          <BaseContentPlaceholders v-if="isLoading">
 | 
					          <BaseContentPlaceholders v-if="isLoading">
 | 
				
			||||||
@ -93,7 +80,6 @@
 | 
				
			|||||||
            leading-5
 | 
					            leading-5
 | 
				
			||||||
            text-left text-gray-700
 | 
					            text-left text-gray-700
 | 
				
			||||||
            border-t border-b border-gray-200 border-solid
 | 
					            border-t border-b border-gray-200 border-solid
 | 
				
			||||||
              dark:text-white dark:border-white/10
 | 
					 | 
				
			||||||
          "
 | 
					          "
 | 
				
			||||||
        >
 | 
					        >
 | 
				
			||||||
          <BaseContentPlaceholders v-if="isLoading">
 | 
					          <BaseContentPlaceholders v-if="isLoading">
 | 
				
			||||||
@ -113,7 +99,6 @@
 | 
				
			|||||||
            leading-5
 | 
					            leading-5
 | 
				
			||||||
            text-right text-gray-700
 | 
					            text-right text-gray-700
 | 
				
			||||||
            border-t border-b border-gray-200 border-solid
 | 
					            border-t border-b border-gray-200 border-solid
 | 
				
			||||||
              dark:text-white dark:border-white/10
 | 
					 | 
				
			||||||
          "
 | 
					          "
 | 
				
			||||||
        >
 | 
					        >
 | 
				
			||||||
          <BaseContentPlaceholders v-if="isLoading">
 | 
					          <BaseContentPlaceholders v-if="isLoading">
 | 
				
			||||||
@ -160,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>
 | 
				
			||||||
 | 
				
			|||||||
@ -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>
 | 
				
			||||||
 | 
				
			|||||||
@ -40,7 +40,6 @@
 | 
				
			|||||||
            px-4
 | 
					            px-4
 | 
				
			||||||
            md:px-8
 | 
					            md:px-8
 | 
				
			||||||
            py-1.5
 | 
					            py-1.5
 | 
				
			||||||
            dark:text-gray-200
 | 
					 | 
				
			||||||
          "
 | 
					          "
 | 
				
			||||||
        >
 | 
					        >
 | 
				
			||||||
          {{ $tc('settings.roles.permission', 2) }}
 | 
					          {{ $tc('settings.roles.permission', 2) }}
 | 
				
			||||||
@ -73,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
 | 
				
			||||||
@ -90,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
 | 
				
			||||||
@ -117,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"
 | 
				
			||||||
@ -137,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,8 +1,8 @@
 | 
				
			|||||||
<template>
 | 
					<template>
 | 
				
			||||||
  <div class="h-screen overflow-y-auto text-base dark:bg-gray-800/80 dark:text-white">
 | 
					  <div class="h-screen overflow-y-auto text-base">
 | 
				
			||||||
    <NotificationRoot />
 | 
					    <NotificationRoot />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <div class="container px-4 mx-auto">
 | 
					    <div class="container mx-auto px-4">
 | 
				
			||||||
      <router-view />
 | 
					      <router-view />
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
  </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"
 | 
				
			||||||
    >
 | 
					    >
 | 
				
			||||||
@ -74,7 +64,7 @@
 | 
				
			|||||||
        v-if="hasCreateAbilities"
 | 
					        v-if="hasCreateAbilities"
 | 
				
			||||||
        class="relative hidden float-left m-0 md:block"
 | 
					        class="relative hidden float-left m-0 md:block"
 | 
				
			||||||
      >
 | 
					      >
 | 
				
			||||||
        <BaseDropdown width-class="w-48" >
 | 
					        <BaseDropdown width-class="w-48">
 | 
				
			||||||
          <template #activator>
 | 
					          <template #activator>
 | 
				
			||||||
            <div
 | 
					            <div
 | 
				
			||||||
              class="
 | 
					              class="
 | 
				
			||||||
@ -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>
 | 
				
			||||||
@ -68,8 +65,10 @@
 | 
				
			|||||||
          </TransitionChild>
 | 
					          </TransitionChild>
 | 
				
			||||||
          <div class="flex-1 h-0 pt-5 pb-4 overflow-y-auto">
 | 
					          <div class="flex-1 h-0 pt-5 pb-4 overflow-y-auto">
 | 
				
			||||||
            <div class="flex items-center shrink-0 px-4 mb-10">
 | 
					            <div class="flex items-center shrink-0 px-4 mb-10">
 | 
				
			||||||
              <img class="h-auto max-w-full w-36 hidden dark:block" :src="getDarkLogo"/>
 | 
					              <MainLogo
 | 
				
			||||||
              <img class="h-auto max-w-full w-36 block dark:hidden" :src="getLightLogo"/>
 | 
					                class="block h-auto max-w-full w-36 text-primary-400"
 | 
				
			||||||
 | 
					                alt="Crater Logo"
 | 
				
			||||||
 | 
					              />
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            <nav
 | 
					            <nav
 | 
				
			||||||
@ -83,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)"
 | 
				
			||||||
@ -93,7 +92,7 @@
 | 
				
			|||||||
                  :name="item.icon"
 | 
					                  :name="item.icon"
 | 
				
			||||||
                  :class="[
 | 
					                  :class="[
 | 
				
			||||||
                    hasActiveUrl(item.link)
 | 
					                    hasActiveUrl(item.link)
 | 
				
			||||||
                      ? 'text-primary-500 dark:text-primary-400'
 | 
					                      ? 'text-primary-500 '
 | 
				
			||||||
                      : 'text-gray-400',
 | 
					                      : 'text-gray-400',
 | 
				
			||||||
                    'mr-4 shrink-0 h-5 w-5',
 | 
					                    'mr-4 shrink-0 h-5 w-5',
 | 
				
			||||||
                  ]"
 | 
					                  ]"
 | 
				
			||||||
@ -101,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>
 | 
				
			||||||
@ -121,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"
 | 
				
			||||||
@ -140,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',
 | 
				
			||||||
        ]"
 | 
					        ]"
 | 
				
			||||||
      >
 | 
					      >
 | 
				
			||||||
@ -149,8 +145,8 @@
 | 
				
			|||||||
          :name="item.icon"
 | 
					          :name="item.icon"
 | 
				
			||||||
          :class="[
 | 
					          :class="[
 | 
				
			||||||
            hasActiveUrl(item.link)
 | 
					            hasActiveUrl(item.link)
 | 
				
			||||||
              ? 'text-primary-500 dark:text-primary-400'
 | 
					              ? '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 ',
 | 
				
			||||||
          ]"
 | 
					          ]"
 | 
				
			||||||
        />
 | 
					        />
 | 
				
			||||||
@ -158,14 +154,12 @@
 | 
				
			|||||||
        {{ $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>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script setup>
 | 
					<script setup>
 | 
				
			||||||
import { computed } from 'vue'
 | 
					import MainLogo from '@/scripts/components/icons/MainLogo.vue'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
  Dialog,
 | 
					  Dialog,
 | 
				
			||||||
  DialogOverlay,
 | 
					  DialogOverlay,
 | 
				
			||||||
@ -175,14 +169,10 @@ 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()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const getDarkLogo = computed(() => new URL('/img/logo-white.png', import.meta.url))
 | 
					 | 
				
			||||||
const getLightLogo = computed(() => new URL('/img/crater-logo.png', import.meta.url))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function hasActiveUrl(url) {
 | 
					function hasActiveUrl(url) {
 | 
				
			||||||
  return route.path.indexOf(url) > -1
 | 
					  return route.path.indexOf(url) > -1
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -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,7 @@ export const useGlobalStore = (useWindow = false) => {
 | 
				
			|||||||
      isAppLoaded: false,
 | 
					      isAppLoaded: false,
 | 
				
			||||||
      isSidebarOpen: false,
 | 
					      isSidebarOpen: false,
 | 
				
			||||||
      areCurrenciesLoading: false,
 | 
					      areCurrenciesLoading: false,
 | 
				
			||||||
      isDarkModeOn: localStorage.getItem('theme') === 'dark' || document.documentElement.classList.contains('dark'),
 | 
					
 | 
				
			||||||
      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>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -113,7 +113,7 @@
 | 
				
			|||||||
            </span>
 | 
					            </span>
 | 
				
			||||||
          </template>
 | 
					          </template>
 | 
				
			||||||
          <BaseDropdownItem @click="removeMultipleCustomers">
 | 
					          <BaseDropdownItem @click="removeMultipleCustomers">
 | 
				
			||||||
            <BaseIcon name="TrashIcon" class="mr-3 text-gray-600 dark:text-gray-400 dark:group-hover:text-white" />
 | 
					            <BaseIcon name="TrashIcon" class="mr-3 text-gray-600" />
 | 
				
			||||||
            {{ $t('general.delete') }}
 | 
					            {{ $t('general.delete') }}
 | 
				
			||||||
          </BaseDropdownItem>
 | 
					          </BaseDropdownItem>
 | 
				
			||||||
        </BaseDropdown>
 | 
					        </BaseDropdown>
 | 
				
			||||||
@ -154,7 +154,7 @@
 | 
				
			|||||||
              :text="row.data.name"
 | 
					              :text="row.data.name"
 | 
				
			||||||
              :length="30"
 | 
					              :length="30"
 | 
				
			||||||
              tag="span"
 | 
					              tag="span"
 | 
				
			||||||
              class="font-medium text-primary-500 flex flex-col dark:text-primary-400"
 | 
					              class="font-medium text-primary-500 flex flex-col"
 | 
				
			||||||
            />
 | 
					            />
 | 
				
			||||||
            <BaseText
 | 
					            <BaseText
 | 
				
			||||||
              :text="row.data.contact_name ? row.data.contact_name : ''"
 | 
					              :text="row.data.contact_name ? row.data.contact_name : ''"
 | 
				
			||||||
 | 
				
			|||||||
@ -34,8 +34,8 @@
 | 
				
			|||||||
            v-if="userStore.hasAbilities(abilities.CREATE_ESTIMATE)"
 | 
					            v-if="userStore.hasAbilities(abilities.CREATE_ESTIMATE)"
 | 
				
			||||||
            :to="`/admin/estimates/create?customer=${$route.params.id}`"
 | 
					            :to="`/admin/estimates/create?customer=${$route.params.id}`"
 | 
				
			||||||
          >
 | 
					          >
 | 
				
			||||||
            <BaseDropdownItem v-slot="slotProps">
 | 
					            <BaseDropdownItem class="">
 | 
				
			||||||
              <BaseIcon name="DocumentIcon" :class="slotProps.class" />
 | 
					              <BaseIcon name="DocumentIcon" class="mr-3 text-gray-600" />
 | 
				
			||||||
              {{ $t('estimates.new_estimate') }}
 | 
					              {{ $t('estimates.new_estimate') }}
 | 
				
			||||||
            </BaseDropdownItem>
 | 
					            </BaseDropdownItem>
 | 
				
			||||||
          </router-link>
 | 
					          </router-link>
 | 
				
			||||||
@ -44,8 +44,8 @@
 | 
				
			|||||||
            v-if="userStore.hasAbilities(abilities.CREATE_INVOICE)"
 | 
					            v-if="userStore.hasAbilities(abilities.CREATE_INVOICE)"
 | 
				
			||||||
            :to="`/admin/invoices/create?customer=${$route.params.id}`"
 | 
					            :to="`/admin/invoices/create?customer=${$route.params.id}`"
 | 
				
			||||||
          >
 | 
					          >
 | 
				
			||||||
            <BaseDropdownItem v-slot="slotProps">
 | 
					            <BaseDropdownItem>
 | 
				
			||||||
              <BaseIcon name="DocumentTextIcon" :class="slotProps.class" />
 | 
					              <BaseIcon name="DocumentTextIcon" class="mr-3 text-gray-600" />
 | 
				
			||||||
              {{ $t('invoices.new_invoice') }}
 | 
					              {{ $t('invoices.new_invoice') }}
 | 
				
			||||||
            </BaseDropdownItem>
 | 
					            </BaseDropdownItem>
 | 
				
			||||||
          </router-link>
 | 
					          </router-link>
 | 
				
			||||||
@ -54,8 +54,8 @@
 | 
				
			|||||||
            v-if="userStore.hasAbilities(abilities.CREATE_PAYMENT)"
 | 
					            v-if="userStore.hasAbilities(abilities.CREATE_PAYMENT)"
 | 
				
			||||||
            :to="`/admin/payments/create?customer=${$route.params.id}`"
 | 
					            :to="`/admin/payments/create?customer=${$route.params.id}`"
 | 
				
			||||||
          >
 | 
					          >
 | 
				
			||||||
            <BaseDropdownItem v-slot="slotProps">
 | 
					            <BaseDropdownItem>
 | 
				
			||||||
              <BaseIcon name="CreditCardIcon" :class="slotProps.class" />
 | 
					              <BaseIcon name="CreditCardIcon" class="mr-3 text-gray-600" />
 | 
				
			||||||
              {{ $t('payments.new_payment') }}
 | 
					              {{ $t('payments.new_payment') }}
 | 
				
			||||||
            </BaseDropdownItem>
 | 
					            </BaseDropdownItem>
 | 
				
			||||||
          </router-link>
 | 
					          </router-link>
 | 
				
			||||||
@ -64,8 +64,8 @@
 | 
				
			|||||||
            v-if="userStore.hasAbilities(abilities.CREATE_EXPENSE)"
 | 
					            v-if="userStore.hasAbilities(abilities.CREATE_EXPENSE)"
 | 
				
			||||||
            :to="`/admin/expenses/create?customer=${$route.params.id}`"
 | 
					            :to="`/admin/expenses/create?customer=${$route.params.id}`"
 | 
				
			||||||
          >
 | 
					          >
 | 
				
			||||||
            <BaseDropdownItem v-slot="slotProps">
 | 
					            <BaseDropdownItem>
 | 
				
			||||||
              <BaseIcon name="CalculatorIcon" :class="slotProps.class" />
 | 
					              <BaseIcon name="CalculatorIcon" class="mr-3 text-gray-600" />
 | 
				
			||||||
              {{ $t('expenses.new_expense') }}
 | 
					              {{ $t('expenses.new_expense') }}
 | 
				
			||||||
            </BaseDropdownItem>
 | 
					            </BaseDropdownItem>
 | 
				
			||||||
          </router-link>
 | 
					          </router-link>
 | 
				
			||||||
 | 
				
			|||||||
@ -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') }}
 | 
				
			||||||
 | 
				
			|||||||
@ -13,7 +13,6 @@
 | 
				
			|||||||
      xl:ml-64
 | 
					      xl:ml-64
 | 
				
			||||||
      w-88
 | 
					      w-88
 | 
				
			||||||
      xl:block
 | 
					      xl:block
 | 
				
			||||||
      dark:bg-gray-800
 | 
					 | 
				
			||||||
    "
 | 
					    "
 | 
				
			||||||
  >
 | 
					  >
 | 
				
			||||||
    <div
 | 
					    <div
 | 
				
			||||||
@ -26,7 +25,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
 | 
					 | 
				
			||||||
      "
 | 
					      "
 | 
				
			||||||
    >
 | 
					    >
 | 
				
			||||||
      <BaseInput
 | 
					      <BaseInput
 | 
				
			||||||
@ -61,7 +59,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') }}
 | 
				
			||||||
@ -117,7 +114,6 @@
 | 
				
			|||||||
        border-l border-gray-200 border-solid
 | 
					        border-l border-gray-200 border-solid
 | 
				
			||||||
        sidebar
 | 
					        sidebar
 | 
				
			||||||
        base-scroll
 | 
					        base-scroll
 | 
				
			||||||
        dark:border-gray-600
 | 
					 | 
				
			||||||
      "
 | 
					      "
 | 
				
			||||||
    >
 | 
					    >
 | 
				
			||||||
      <div v-for="(customer, index) in customerList" :key="index">
 | 
					      <div v-for="(customer, index) in customerList" :key="index">
 | 
				
			||||||
@ -126,9 +122,9 @@
 | 
				
			|||||||
          :id="'customer-' + customer.id"
 | 
					          :id="'customer-' + customer.id"
 | 
				
			||||||
          :to="`/admin/customers/${customer.id}/view`"
 | 
					          :to="`/admin/customers/${customer.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:border-primary-400 dark:bg-gray-700':
 | 
					              'bg-gray-100 border-l-4 border-primary-500 border-solid':
 | 
				
			||||||
                hasActiveUrl(customer.id),
 | 
					                hasActiveUrl(customer.id),
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
          ]"
 | 
					          ]"
 | 
				
			||||||
@ -147,7 +143,6 @@
 | 
				
			|||||||
                text-black
 | 
					                text-black
 | 
				
			||||||
                capitalize
 | 
					                capitalize
 | 
				
			||||||
                truncate
 | 
					                truncate
 | 
				
			||||||
                dark:text-white
 | 
					 | 
				
			||||||
              "
 | 
					              "
 | 
				
			||||||
            />
 | 
					            />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -162,7 +157,6 @@
 | 
				
			|||||||
                font-medium
 | 
					                font-medium
 | 
				
			||||||
                leading-5
 | 
					                leading-5
 | 
				
			||||||
                text-gray-600
 | 
					                text-gray-600
 | 
				
			||||||
                dark:text-gray-400
 | 
					 | 
				
			||||||
              "
 | 
					              "
 | 
				
			||||||
            />
 | 
					            />
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
@ -181,7 +175,7 @@
 | 
				
			|||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
      <p
 | 
					      <p
 | 
				
			||||||
        v-if="!customerList?.length && !isFetching"
 | 
					        v-if="!customerList?.length && !isFetching"
 | 
				
			||||||
        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('customers.no_matching_customers') }}
 | 
					        {{ $t('customers.no_matching_customers') }}
 | 
				
			||||||
      </p>
 | 
					      </p>
 | 
				
			||||||
 | 
				
			|||||||
@ -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>
 | 
				
			||||||
 | 
				
			|||||||
@ -28,7 +28,7 @@
 | 
				
			|||||||
          <template #cell-user="{ row }">
 | 
					          <template #cell-user="{ row }">
 | 
				
			||||||
            <router-link
 | 
					            <router-link
 | 
				
			||||||
              :to="{ path: `invoices/${row.data.id}/view` }"
 | 
					              :to="{ path: `invoices/${row.data.id}/view` }"
 | 
				
			||||||
              class="font-medium text-primary-500 dark:text-primary-400"
 | 
					              class="font-medium text-primary-500"
 | 
				
			||||||
            >
 | 
					            >
 | 
				
			||||||
              {{ row.data.customer.name }}
 | 
					              {{ row.data.customer.name }}
 | 
				
			||||||
            </router-link>
 | 
					            </router-link>
 | 
				
			||||||
@ -78,7 +78,7 @@
 | 
				
			|||||||
          <template #cell-user="{ row }">
 | 
					          <template #cell-user="{ row }">
 | 
				
			||||||
            <router-link
 | 
					            <router-link
 | 
				
			||||||
              :to="{ path: `estimates/${row.data.id}/view` }"
 | 
					              :to="{ path: `estimates/${row.data.id}/view` }"
 | 
				
			||||||
              class="font-medium text-primary-500 dark:text-primary-400"
 | 
					              class="font-medium text-primary-500"
 | 
				
			||||||
            >
 | 
					            >
 | 
				
			||||||
              {{ row.data.customer.name }}
 | 
					              {{ row.data.customer.name }}
 | 
				
			||||||
            </router-link>
 | 
					            </router-link>
 | 
				
			||||||
 | 
				
			|||||||
@ -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 -->
 | 
				
			||||||
@ -164,7 +163,7 @@
 | 
				
			|||||||
          </template>
 | 
					          </template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          <BaseDropdownItem @click="removeMultipleEstimates">
 | 
					          <BaseDropdownItem @click="removeMultipleEstimates">
 | 
				
			||||||
            <BaseIcon name="TrashIcon" class="mr-3 text-gray-600 dark:text-gray-400 dark:group-hover:text-white" />
 | 
					            <BaseIcon name="TrashIcon" class="mr-3 text-gray-600" />
 | 
				
			||||||
            {{ $t('general.delete') }}
 | 
					            {{ $t('general.delete') }}
 | 
				
			||||||
          </BaseDropdownItem>
 | 
					          </BaseDropdownItem>
 | 
				
			||||||
        </BaseDropdown>
 | 
					        </BaseDropdown>
 | 
				
			||||||
@ -205,7 +204,7 @@
 | 
				
			|||||||
        <template #cell-estimate_number="{ row }">
 | 
					        <template #cell-estimate_number="{ row }">
 | 
				
			||||||
          <router-link
 | 
					          <router-link
 | 
				
			||||||
            :to="{ path: `estimates/${row.data.id}/view` }"
 | 
					            :to="{ path: `estimates/${row.data.id}/view` }"
 | 
				
			||||||
            class="font-medium text-primary-500 dark:text-primary-400"
 | 
					            class="font-medium text-primary-500"
 | 
				
			||||||
          >
 | 
					          >
 | 
				
			||||||
            {{ row.data.estimate_number }}
 | 
					            {{ row.data.estimate_number }}
 | 
				
			||||||
          </router-link>
 | 
					          </router-link>
 | 
				
			||||||
 | 
				
			|||||||
@ -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>
 | 
				
			||||||
 | 
				
			|||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user