Compare commits
21 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2254a13ad0 | ||
|
|
1f5885de84 | ||
|
|
705f58e3d1 | ||
|
|
0330453ad6 | ||
|
|
66b98e2765 | ||
|
|
55648c9a30 | ||
|
|
cd6d3daf43 | ||
|
|
1db5060c42 | ||
|
|
4cabba395d | ||
|
|
59b478f262 | ||
|
|
e4f14a24b7 | ||
|
|
3bd0d055d9 | ||
|
|
746d17e182 | ||
|
|
e96e51598a | ||
|
|
9abec36f07 | ||
|
|
ecd8e3679f | ||
|
|
ba95723b61 | ||
|
|
12289bdce3 | ||
|
|
d1c5234a03 | ||
|
|
27cc876e82 | ||
|
|
82919d39f6 |
106
CLAUDE.md
106
CLAUDE.md
@@ -75,10 +75,14 @@ npm test # vitest run (single pass)
|
||||
npm run test:watch # vitest watch
|
||||
|
||||
# Database
|
||||
npx prisma migrate dev # Apply migrations (dev)
|
||||
npx prisma migrate deploy # Apply migrations (prod)
|
||||
npx prisma generate # Regenerate Prisma client after schema changes
|
||||
npx prisma studio # DB browser GUI
|
||||
npx prisma migrate dev # Create migration from schema changes + apply to dev
|
||||
npx prisma migrate dev --name <descriptive_name> # Named migration
|
||||
npx prisma migrate deploy # Apply pending migrations to production
|
||||
npx prisma generate # Regenerate Prisma client after schema changes
|
||||
npx prisma studio # DB browser GUI
|
||||
npx prisma db seed # (Re)seed the dev database
|
||||
npx prisma migrate diff --from-url <url> --to-schema-datamodel prisma/schema.prisma --script # Preview SQL before prod deploy
|
||||
npx prisma migrate resolve --applied <migration> # Mark migration as applied without running SQL
|
||||
```
|
||||
|
||||
**Do not start the dev server.** The user manages it separately.
|
||||
@@ -248,6 +252,24 @@ When adding new features, add tests in `src/__tests__/`. Name test files `<featu
|
||||
- Custom hooks: `useApiCall`, `useListData`, `useTableSort`, `useDebounce`, `useModalLock`.
|
||||
- Styling: CSS files in `src/admin/` — no CSS-in-JS, no Tailwind. Use CSS variables.
|
||||
|
||||
### Query Invalidation Convention
|
||||
|
||||
Mutations must invalidate the **full domain** of any entity they touch. Prefer broad invalidation:
|
||||
|
||||
- `["users"]` over `["users", "list"]`
|
||||
- `["trips"]` over `["trips", "vehicles"]`
|
||||
|
||||
Reason: React Query's `invalidateQueries` uses prefix matching, so `["trips"]` matches all
|
||||
`["trips", ...]` sub-queries. This means new queries are automatically invalidated without
|
||||
updating every mutation handler. Inactive queries are only marked stale, not refetched, so
|
||||
the performance cost is minimal. Optimize to targeted keys only when profiling shows a problem.
|
||||
|
||||
When entity A embeds/references entity B, A's mutation handlers invalidate B's domain:
|
||||
|
||||
- User CRUD invalidates `["trips"]` and `["attendance"]` (both embed user data)
|
||||
- Vehicle CRUD invalidates `["trips"]` (trips reference vehicles)
|
||||
- Invoice CRUD invalidates `["orders"]` (orders reference invoices)
|
||||
|
||||
---
|
||||
|
||||
## Database Conventions
|
||||
@@ -260,6 +282,69 @@ When adding new features, add tests in `src/__tests__/`. Name test files `<featu
|
||||
|
||||
---
|
||||
|
||||
## Database Migrations (Critical Workflow)
|
||||
|
||||
**Golden rule: NEVER use `prisma db push`.** It bypasses migration history and causes drift
|
||||
between the schema and migration tracking. Always use `prisma migrate dev` for every schema change.
|
||||
|
||||
### Making schema changes
|
||||
|
||||
```
|
||||
1. Edit prisma/schema.prisma
|
||||
2. npx prisma migrate dev --name descriptive_name
|
||||
→ This creates a migration in prisma/migrations/ AND applies it to dev DB
|
||||
3. npx prisma generate
|
||||
4. Commit BOTH schema.prisma AND the new migration folder
|
||||
git add prisma/schema.prisma prisma/migrations/
|
||||
```
|
||||
|
||||
### Verifying before production deploy
|
||||
|
||||
```bash
|
||||
# Preview what SQL will run on production (no changes applied)
|
||||
npx prisma migrate diff \
|
||||
--from-url "mysql://user:pass@prod:3306/app" \
|
||||
--to-schema-datamodel prisma/schema.prisma \
|
||||
--script
|
||||
|
||||
# Empty output = no diff. If it shows SQL, review it before deploying.
|
||||
```
|
||||
|
||||
### Deploying migrations to production
|
||||
|
||||
The release process runs `prisma migrate deploy` on production.
|
||||
This applies only pending migrations — safe, idempotent.
|
||||
|
||||
### If migrations get out of sync (drift)
|
||||
|
||||
```bash
|
||||
# Diff production DB against local schema to find drift
|
||||
npx prisma migrate diff \
|
||||
--from-url "mysql://prod" \
|
||||
--to-schema-datamodel prisma/schema.prisma \
|
||||
--script
|
||||
|
||||
# If drift is safe (CREATE only, no DROPs): apply with db push ONCE, then baseline
|
||||
# If drift includes DROPs: investigate before touching production
|
||||
```
|
||||
|
||||
### Baselinining a database that has no migrations
|
||||
|
||||
If production was synced with `db push` and has no `_prisma_migrations` table:
|
||||
|
||||
```bash
|
||||
# 1. Create initial migration locally
|
||||
npx prisma migrate dev --name init
|
||||
|
||||
# 2. Copy to production and mark as applied (no SQL runs)
|
||||
scp -r prisma/migrations user@prod:/var/www/app-ts/prisma/
|
||||
ssh user@prod
|
||||
cd /var/www/app-ts
|
||||
npx prisma migrate resolve --applied <migration_name>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Known Issues & Gotchas
|
||||
|
||||
1. **Date.prototype.toJSON override** — global monkey-patch in `src/config/env.ts`. Side-effects on third-party libraries that serialize dates. Do not remove without migrating all date serialization.
|
||||
@@ -276,7 +361,7 @@ When adding new features, add tests in `src/__tests__/`. Name test files `<featu
|
||||
|
||||
7. **NAS_PATH file access** — Project file uploads write to a network share path. In dev, this path may not be mounted. Features using `NAS_PATH` will fail gracefully (or not) if the path is unavailable.
|
||||
|
||||
8. **Prisma client regeneration** — After any schema change, run `npx prisma generate`. The generated client is not committed to git.
|
||||
8. **Prisma client regeneration** — After any schema change and migration, run `npx prisma generate`. The generated client is not committed to git.
|
||||
|
||||
9. **No CSRF tokens** — CSRF protection relies on `SameSite=Strict` cookies + CORS. Do not weaken CORS configuration.
|
||||
|
||||
@@ -293,10 +378,11 @@ When adding new features, add tests in `src/__tests__/`. Name test files `<featu
|
||||
5. Create tarball: `tar -czf app-ts-X.Y.Z.tar.gz dist dist-client prisma package.json package-lock.json scripts`
|
||||
6. Deploy via SSH to production server (`boha_admin@192.168.50.100`):
|
||||
- Path: `/var/www/app-ts`
|
||||
- Backup: `node_modules`, `.env`, `ecosystem.config.js`
|
||||
- Clean directory (keep backups only)
|
||||
- Extract tarball
|
||||
- Restore backups
|
||||
- Restart: `pm2 reload ecosystem.config.js`
|
||||
- Remove old files: `rm -rf dist dist-client prisma scripts package.json package-lock.json`
|
||||
- Copy tarball to server: `scp app-ts-X.Y.Z.tar.gz boha_admin@192.168.50.100:/tmp/`
|
||||
- Extract tarball: `tar -xzf /tmp/app-ts-X.Y.Z.tar.gz`
|
||||
- Install dependencies: `npm install --omit=dev`
|
||||
- Apply Prisma migrations: `npx prisma migrate deploy`
|
||||
- Restart: `pm2 restart app-ts --update-env`
|
||||
|
||||
Do not push directly to production or restart services without confirmation.
|
||||
|
||||
37
boneyard.config.json
Normal file
37
boneyard.config.json
Normal file
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"breakpoints": [375, 768, 1280],
|
||||
"out": "./src/admin/bones",
|
||||
"color": "#e0e0e0",
|
||||
"animate": "shimmer",
|
||||
"shimmerColor": "#f0f0f0",
|
||||
"speed": "1.2s",
|
||||
"shimmerAngle": 110,
|
||||
"wait": 3000,
|
||||
"routes": [
|
||||
"/",
|
||||
"/users",
|
||||
"/attendance",
|
||||
"/attendance/history",
|
||||
"/attendance/admin",
|
||||
"/attendance/balances",
|
||||
"/attendance/requests",
|
||||
"/attendance/approval",
|
||||
"/attendance/create",
|
||||
"/trips",
|
||||
"/trips/history",
|
||||
"/trips/admin",
|
||||
"/vehicles",
|
||||
"/offers",
|
||||
"/offers/new",
|
||||
"/offers/customers",
|
||||
"/offers/templates",
|
||||
"/orders",
|
||||
"/orders/1",
|
||||
"/projects",
|
||||
"/projects/80",
|
||||
"/invoices",
|
||||
"/invoices/new",
|
||||
"/settings",
|
||||
"/audit-log"
|
||||
]
|
||||
}
|
||||
412
package-lock.json
generated
412
package-lock.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "app-ts",
|
||||
"version": "1.5.3",
|
||||
"version": "1.6.7",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "app-ts",
|
||||
"version": "1.5.3",
|
||||
"version": "1.6.7",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"@dnd-kit/core": "^6.3.1",
|
||||
@@ -19,6 +19,7 @@
|
||||
"@fastify/rate-limit": "^10.3.0",
|
||||
"@fastify/static": "^9.0.0",
|
||||
"@prisma/client": "^6.19.2",
|
||||
"@tanstack/react-query": "^5.100.5",
|
||||
"@types/jsdom": "^28.0.1",
|
||||
"bcryptjs": "^3.0.3",
|
||||
"date-fns": "^4.1.0",
|
||||
@@ -350,21 +351,21 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@emnapi/core": {
|
||||
"version": "1.9.0",
|
||||
"resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.0.tgz",
|
||||
"integrity": "sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==",
|
||||
"version": "1.10.0",
|
||||
"resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz",
|
||||
"integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"@emnapi/wasi-threads": "1.2.0",
|
||||
"@emnapi/wasi-threads": "1.2.1",
|
||||
"tslib": "^2.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@emnapi/runtime": {
|
||||
"version": "1.9.0",
|
||||
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.0.tgz",
|
||||
"integrity": "sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==",
|
||||
"version": "1.10.0",
|
||||
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz",
|
||||
"integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
@@ -373,9 +374,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@emnapi/wasi-threads": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz",
|
||||
"integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==",
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz",
|
||||
"integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
@@ -1099,9 +1100,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@fastify/static": {
|
||||
"version": "9.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@fastify/static/-/static-9.0.0.tgz",
|
||||
"integrity": "sha512-r64H8Woe/vfilg5RTy7lwWlE8ZZcTrc3kebYFMEUBrMqlydhQyoiExQXdYAy2REVpST/G35+stAM8WYp1WGmMA==",
|
||||
"version": "9.1.3",
|
||||
"resolved": "https://registry.npmjs.org/@fastify/static/-/static-9.1.3.tgz",
|
||||
"integrity": "sha512-aXrYtsiryLhRxRNaxNqsn7FUISeb7rB9q4eHUPIot5aeQBLNahnz1m6thzm7JWC1poSGXS9XrX8DvuMivp2hkQ==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
@@ -1192,20 +1193,22 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@napi-rs/wasm-runtime": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz",
|
||||
"integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==",
|
||||
"version": "1.1.4",
|
||||
"resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz",
|
||||
"integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"@emnapi/core": "^1.7.1",
|
||||
"@emnapi/runtime": "^1.7.1",
|
||||
"@tybys/wasm-util": "^0.10.1"
|
||||
},
|
||||
"funding": {
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/Brooooooklyn"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@emnapi/core": "^1.7.1",
|
||||
"@emnapi/runtime": "^1.7.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@noble/hashes": {
|
||||
@@ -1220,20 +1223,10 @@
|
||||
"url": "https://paulmillr.com/funding/"
|
||||
}
|
||||
},
|
||||
"node_modules/@oxc-project/runtime": {
|
||||
"version": "0.115.0",
|
||||
"resolved": "https://registry.npmjs.org/@oxc-project/runtime/-/runtime-0.115.0.tgz",
|
||||
"integrity": "sha512-Rg8Wlt5dCbXhQnsXPrkOjL1DTSvXLgb2R/KYfnf1/K+R0k6UMLEmbQXPM+kwrWqSmWA2t0B1EtHy2/3zikQpvQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": "^20.19.0 || >=22.12.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@oxc-project/types": {
|
||||
"version": "0.115.0",
|
||||
"resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.115.0.tgz",
|
||||
"integrity": "sha512-4n91DKnebUS4yjUHl2g3/b2T+IUdCfmoZGhmwsovZCDaJSs+QkVAM+0AqqTxHSsHfeiMuueT75cZaZcT/m0pSw==",
|
||||
"version": "0.130.0",
|
||||
"resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.130.0.tgz",
|
||||
"integrity": "sha512-ibD2usx9JRu7f5pu2tMKMI4cpA4NgXJQoYRP4pQ7Pxmn1l6k/53qWtQWZayhYy3X4QZkt90Ot+mJEaeXouio6Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"funding": {
|
||||
@@ -1292,34 +1285,34 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@prisma/config": {
|
||||
"version": "6.19.2",
|
||||
"resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.19.2.tgz",
|
||||
"integrity": "sha512-kadBGDl+aUswv/zZMk9Mx0C8UZs1kjao8H9/JpI4Wh4SHZaM7zkTwiKn/iFLfRg+XtOAo/Z/c6pAYhijKl0nzQ==",
|
||||
"version": "6.19.3",
|
||||
"resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.19.3.tgz",
|
||||
"integrity": "sha512-CBPT44BjlQxEt8kiMEauji2WHTDoVBOKl7UlewXmUgBPnr/oPRZC3psci5chJnYmH0ivEIog2OU9PGWoki3DLQ==",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"c12": "3.1.0",
|
||||
"deepmerge-ts": "7.1.5",
|
||||
"effect": "3.18.4",
|
||||
"effect": "3.21.0",
|
||||
"empathic": "2.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@prisma/debug": {
|
||||
"version": "6.19.2",
|
||||
"resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.19.2.tgz",
|
||||
"integrity": "sha512-lFnEZsLdFLmEVCVNdskLDCL8Uup41GDfU0LUfquw+ercJC8ODTuL0WNKgOKmYxCJVvFwf0OuZBzW99DuWmoH2A==",
|
||||
"version": "6.19.3",
|
||||
"resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.19.3.tgz",
|
||||
"integrity": "sha512-ljkJ+SgpXNktLG0Q/n4JGYCkKf0f8oYLyjImS2I8e2q2WCfdRRtWER062ZV/ixaNP2M2VKlWXVJiGzZaUgbKZw==",
|
||||
"license": "Apache-2.0"
|
||||
},
|
||||
"node_modules/@prisma/engines": {
|
||||
"version": "6.19.2",
|
||||
"resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.19.2.tgz",
|
||||
"integrity": "sha512-TTkJ8r+uk/uqczX40wb+ODG0E0icVsMgwCTyTHXehaEfb0uo80M9g1aW1tEJrxmFHeOZFXdI2sTA1j1AgcHi4A==",
|
||||
"version": "6.19.3",
|
||||
"resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.19.3.tgz",
|
||||
"integrity": "sha512-RSYxtlYFl5pJ8ZePgMv0lZ9IzVCOdTPOegrs2qcbAEFrBI1G33h6wyC9kjQvo0DnYEhEVY0X4LsuFHXLKQk88g==",
|
||||
"hasInstallScript": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@prisma/debug": "6.19.2",
|
||||
"@prisma/debug": "6.19.3",
|
||||
"@prisma/engines-version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7",
|
||||
"@prisma/fetch-engine": "6.19.2",
|
||||
"@prisma/get-platform": "6.19.2"
|
||||
"@prisma/fetch-engine": "6.19.3",
|
||||
"@prisma/get-platform": "6.19.3"
|
||||
}
|
||||
},
|
||||
"node_modules/@prisma/engines-version": {
|
||||
@@ -1329,23 +1322,23 @@
|
||||
"license": "Apache-2.0"
|
||||
},
|
||||
"node_modules/@prisma/fetch-engine": {
|
||||
"version": "6.19.2",
|
||||
"resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.19.2.tgz",
|
||||
"integrity": "sha512-h4Ff4Pho+SR1S8XerMCC12X//oY2bG3Iug/fUnudfcXEUnIeRiBdXHFdGlGOgQ3HqKgosTEhkZMvGM9tWtYC+Q==",
|
||||
"version": "6.19.3",
|
||||
"resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.19.3.tgz",
|
||||
"integrity": "sha512-tKtl/qco9Nt7LU5iKhpultD8O4vMCZcU2CHjNTnRrL1QvSUr5W/GcyFPjNL87GtRrwBc7ubXXD9xy4EvLvt8JA==",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@prisma/debug": "6.19.2",
|
||||
"@prisma/debug": "6.19.3",
|
||||
"@prisma/engines-version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7",
|
||||
"@prisma/get-platform": "6.19.2"
|
||||
"@prisma/get-platform": "6.19.3"
|
||||
}
|
||||
},
|
||||
"node_modules/@prisma/get-platform": {
|
||||
"version": "6.19.2",
|
||||
"resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.19.2.tgz",
|
||||
"integrity": "sha512-PGLr06JUSTqIvztJtAzIxOwtWKtJm5WwOG6xpsgD37Rc84FpfUBGLKz65YpJBGtkRQGXTYEFie7pYALocC3MtA==",
|
||||
"version": "6.19.3",
|
||||
"resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.19.3.tgz",
|
||||
"integrity": "sha512-xFj1VcJ1N3MKooOQAGO0W5tsd0W2QzIvW7DD7c/8H14Zmp4jseeWAITm+w2LLoLrlhoHdPPh0NMZ8mfL6puoHA==",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@prisma/debug": "6.19.2"
|
||||
"@prisma/debug": "6.19.3"
|
||||
}
|
||||
},
|
||||
"node_modules/@puppeteer/browsers": {
|
||||
@@ -1379,9 +1372,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@rolldown/binding-android-arm64": {
|
||||
"version": "1.0.0-rc.9",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.9.tgz",
|
||||
"integrity": "sha512-lcJL0bN5hpgJfSIz/8PIf02irmyL43P+j1pTCfbD1DbLkmGRuFIA4DD3B3ZOvGqG0XiVvRznbKtN0COQVaKUTg==",
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.1.tgz",
|
||||
"integrity": "sha512-fJI3I0r3C3Oj/zdBCpaCmBRZYf07xpaq4yCfDDoSFm+beWNzbIl26puW8RraUdugoJw/95zerNOn6jasAhzSmg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -1396,9 +1389,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@rolldown/binding-darwin-arm64": {
|
||||
"version": "1.0.0-rc.9",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.9.tgz",
|
||||
"integrity": "sha512-J7Zk3kLYFsLtuH6U+F4pS2sYVzac0qkjcO5QxHS7OS7yZu2LRs+IXo+uvJ/mvpyUljDJ3LROZPoQfgBIpCMhdQ==",
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.1.tgz",
|
||||
"integrity": "sha512-cKnAhWEsV7TPcA/5EAteDp6KcJZBQ2G+BqE7zayMMi7kMvwRsbv7WT9aOnn0WNl4SKEIf43vjS31iUPu80nzXg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -1413,9 +1406,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@rolldown/binding-darwin-x64": {
|
||||
"version": "1.0.0-rc.9",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.9.tgz",
|
||||
"integrity": "sha512-iwtmmghy8nhfRGeNAIltcNXzD0QMNaaA5U/NyZc1Ia4bxrzFByNMDoppoC+hl7cDiUq5/1CnFthpT9n+UtfFyg==",
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.1.tgz",
|
||||
"integrity": "sha512-YKrVwQjIRBPo+5G/u03wGjbdy4q7pyzCe93DK9VJ7zkVmeg8LJ7GbgsiHWdR4xSoe4CAXRD7Bcjgbtr64bkXNg==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -1430,9 +1423,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@rolldown/binding-freebsd-x64": {
|
||||
"version": "1.0.0-rc.9",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.9.tgz",
|
||||
"integrity": "sha512-DLFYI78SCiZr5VvdEplsVC2Vx53lnA4/Ga5C65iyldMVaErr86aiqCoNBLl92PXPfDtUYjUh+xFFor40ueNs4Q==",
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.1.tgz",
|
||||
"integrity": "sha512-z/oBsREo46SsFqBwYtFe0kpJeBijAT48O/WXLI4suiCLBkr03RTtTJMCzSdDd2znlh8VJizL09XVkQgk8IZonw==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -1447,9 +1440,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@rolldown/binding-linux-arm-gnueabihf": {
|
||||
"version": "1.0.0-rc.9",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.9.tgz",
|
||||
"integrity": "sha512-CsjTmTwd0Hri6iTw/DRMK7kOZ7FwAkrO4h8YWKoX/kcj833e4coqo2wzIFywtch/8Eb5enQ/lwLM7w6JX1W5RQ==",
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.1.tgz",
|
||||
"integrity": "sha512-ik8q7GM11zxvYxFc2PeDcT6TBvhCQMaUxfph/M5l9sKuTs/Sjg3L+Byw0F7w0ZVLBZmx30P+gG0ECzzN+MFcmQ==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
@@ -1464,9 +1457,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@rolldown/binding-linux-arm64-gnu": {
|
||||
"version": "1.0.0-rc.9",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.9.tgz",
|
||||
"integrity": "sha512-2x9O2JbSPxpxMDhP9Z74mahAStibTlrBMW0520+epJH5sac7/LwZW5Bmg/E6CXuEF53JJFW509uP+lSedaUNxg==",
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.1.tgz",
|
||||
"integrity": "sha512-QoSx2EkyrrdZ6kcyE8stqZ62t0Yra8Fs5ia9lOxJrh6TMQJK7gQKmscdTHf7pOXKREKrVwOtJcQG3qVSfc866A==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -1481,9 +1474,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@rolldown/binding-linux-arm64-musl": {
|
||||
"version": "1.0.0-rc.9",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.9.tgz",
|
||||
"integrity": "sha512-JA1QRW31ogheAIRhIg9tjMfsYbglXXYGNPLdPEYrwFxdbkQCAzvpSCSHCDWNl4hTtrol8WeboCSEpjdZK8qrCg==",
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.1.tgz",
|
||||
"integrity": "sha512-uwNwFpwKeNiZawfAWBgg0VIztPTV3ihhh1vV334h9ivnNLorxnQMU6Fz8wG1Zb4Qh9LC1/MkcyT3YlDXG3Rsgg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -1498,9 +1491,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@rolldown/binding-linux-ppc64-gnu": {
|
||||
"version": "1.0.0-rc.9",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.9.tgz",
|
||||
"integrity": "sha512-aOKU9dJheda8Kj8Y3w9gnt9QFOO+qKPAl8SWd7JPHP+Cu0EuDAE5wokQubLzIDQWg2myXq2XhTpOVS07qqvT+w==",
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.1.tgz",
|
||||
"integrity": "sha512-zY1bul7OWr7DFBiJ++wofXvnr8B45ce3QsQUhKrIhXsygAh7bTkwyeM1bi1a2g5C/yC/N8TZyGDEoMfm/l9mpg==",
|
||||
"cpu": [
|
||||
"ppc64"
|
||||
],
|
||||
@@ -1515,9 +1508,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@rolldown/binding-linux-s390x-gnu": {
|
||||
"version": "1.0.0-rc.9",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.9.tgz",
|
||||
"integrity": "sha512-OalO94fqj7IWRn3VdXWty75jC5dk4C197AWEuMhIpvVv2lw9fiPhud0+bW2ctCxb3YoBZor71QHbY+9/WToadA==",
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.1.tgz",
|
||||
"integrity": "sha512-0frlsT/f4Ft6I7SMESTKnF3cZsdicQn1dCMkF/jT9wDLE+gGoiQfv1nmT9e+s7s/fekvvy6tZM2jHvI2tkbJDQ==",
|
||||
"cpu": [
|
||||
"s390x"
|
||||
],
|
||||
@@ -1532,9 +1525,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@rolldown/binding-linux-x64-gnu": {
|
||||
"version": "1.0.0-rc.9",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.9.tgz",
|
||||
"integrity": "sha512-cVEl1vZtBsBZna3YMjGXNvnYYrOJ7RzuWvZU0ffvJUexWkukMaDuGhUXn0rjnV0ptzGVkvc+vW9Yqy6h8YX4pg==",
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.1.tgz",
|
||||
"integrity": "sha512-XABVmGp9Tg0WspTVvwduTc4fpqy6JnAUrSQe6OuyqD/03nI7r0O9OWUkMIwFrjKAIqolvqoA4ZrJppgwE0Gxmw==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -1549,9 +1542,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@rolldown/binding-linux-x64-musl": {
|
||||
"version": "1.0.0-rc.9",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.9.tgz",
|
||||
"integrity": "sha512-UzYnKCIIc4heAKgI4PZ3dfBGUZefGCJ1TPDuLHoCzgrMYPb5Rv6TLFuYtyM4rWyHM7hymNdsg5ik2C+UD9VDbA==",
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.1.tgz",
|
||||
"integrity": "sha512-bV4fzswuzVcKD90o/VM6QqKxnxlDq0g2BISDLNVmxrnhpv1DDbyPhCIjYfvzYLV+MvkKKnQt2Q6AO86SEBULUQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -1566,9 +1559,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@rolldown/binding-openharmony-arm64": {
|
||||
"version": "1.0.0-rc.9",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.9.tgz",
|
||||
"integrity": "sha512-+6zoiF+RRyf5cdlFQP7nm58mq7+/2PFaY2DNQeD4B87N36JzfF/l9mdBkkmTvSYcYPE8tMh/o3cRlsx1ldLfog==",
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.1.tgz",
|
||||
"integrity": "sha512-/Mh0Zhq3OP7fVs0kcQHZP6lZEthMGTaSf8UBQYSFEZDWGXXlEC+nJ6EqenaK2t4LBXMe3A+K/G2BVXXdtOr4PQ==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -1583,9 +1576,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@rolldown/binding-wasm32-wasi": {
|
||||
"version": "1.0.0-rc.9",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.9.tgz",
|
||||
"integrity": "sha512-rgFN6sA/dyebil3YTlL2evvi/M+ivhfnyxec7AccTpRPccno/rPoNlqybEZQBkcbZu8Hy+eqNJCqfBR8P7Pg8g==",
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.1.tgz",
|
||||
"integrity": "sha512-+1xc9X45l8ufsBAm6Gjvx2qDRIY9lTVt0cgWNcJ+1gdhXvkbxePA60yRTwSTuXL09CMhyJmjpV7E3NoyxbqFQQ==",
|
||||
"cpu": [
|
||||
"wasm32"
|
||||
],
|
||||
@@ -1593,16 +1586,18 @@
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"@napi-rs/wasm-runtime": "^1.1.1"
|
||||
"@emnapi/core": "1.10.0",
|
||||
"@emnapi/runtime": "1.10.0",
|
||||
"@napi-rs/wasm-runtime": "^1.1.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
"node": "^20.19.0 || >=22.12.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@rolldown/binding-win32-arm64-msvc": {
|
||||
"version": "1.0.0-rc.9",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.9.tgz",
|
||||
"integrity": "sha512-lHVNUG/8nlF1IQk1C0Ci574qKYyty2goMiPlRqkC5R+3LkXDkL5Dhx8ytbxq35m+pkHVIvIxviD+TWLdfeuadA==",
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.1.tgz",
|
||||
"integrity": "sha512-1D+UqZdfnuR+Jy1GgMJwi85bD40H21uNmOPRWQhw4oRSuolZ/B5rixZ45DK2KXOTCvmVCecauWgEhbw8bI7tOw==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -1617,9 +1612,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@rolldown/binding-win32-x64-msvc": {
|
||||
"version": "1.0.0-rc.9",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.9.tgz",
|
||||
"integrity": "sha512-G0oA4+w1iY5AGi5HcDTxWsoxF509hrFIPB2rduV5aDqS9FtDg1CAfa7V34qImbjfhIcA8C+RekocJZA96EarwQ==",
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.1.tgz",
|
||||
"integrity": "sha512-INAycaWuhlOK3wk4mRHGsdgwYWmd9cChdPdE9bwWmy6rn9VqVNYNFGhOdXrofXUxwHIncSiPNb8tNm8knDVIeQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -1646,6 +1641,32 @@
|
||||
"integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@tanstack/query-core": {
|
||||
"version": "5.100.5",
|
||||
"resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.100.5.tgz",
|
||||
"integrity": "sha512-t20KrhKkf0HXzqQkPbJ5erhFesup68BAbwFgYmTrS7bxMF7O5MdmL8jUkik4thsG7Hg00fblz30h6yF1d5TxGg==",
|
||||
"license": "MIT",
|
||||
"funding": {
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/tannerlinsley"
|
||||
}
|
||||
},
|
||||
"node_modules/@tanstack/react-query": {
|
||||
"version": "5.100.5",
|
||||
"resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.100.5.tgz",
|
||||
"integrity": "sha512-aNwj1mi2v2bQ9IxkyR1grLOUkv3BYWoykHy9KDyLNbjC3tsahbOHJibK+Wjtr1wRhG59/AvJhiJG5OlthaCgJA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@tanstack/query-core": "5.100.5"
|
||||
},
|
||||
"funding": {
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/tannerlinsley"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": "^18 || ^19"
|
||||
}
|
||||
},
|
||||
"node_modules/@tokenizer/token": {
|
||||
"version": "0.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz",
|
||||
@@ -1659,9 +1680,9 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@tybys/wasm-util": {
|
||||
"version": "0.10.1",
|
||||
"resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
|
||||
"integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==",
|
||||
"version": "0.10.2",
|
||||
"resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz",
|
||||
"integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
@@ -2306,9 +2327,9 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/basic-ftp": {
|
||||
"version": "5.2.0",
|
||||
"resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.2.0.tgz",
|
||||
"integrity": "sha512-VoMINM2rqJwJgfdHq6RiUudKt2BV+FY5ZFezP/ypmwayk68+NzzAQy4XXLlqsGD4MCzq3DrmNFD/uUmBJuGoXw==",
|
||||
"version": "5.3.1",
|
||||
"resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.3.1.tgz",
|
||||
"integrity": "sha512-bopVNp6ugyA150DDuZfPFdt1KZ5a94ZDiwX4hMgZDzF+GttD80lEy8kj98kbyhLXnPvhtIo93mdnLIjpCAeeOw==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=10.0.0"
|
||||
@@ -2832,9 +2853,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/defu": {
|
||||
"version": "6.1.4",
|
||||
"resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz",
|
||||
"integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==",
|
||||
"version": "6.1.7",
|
||||
"resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz",
|
||||
"integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/degenerator": {
|
||||
@@ -2919,9 +2940,9 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/dompurify": {
|
||||
"version": "3.3.3",
|
||||
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.3.tgz",
|
||||
"integrity": "sha512-Oj6pzI2+RqBfFG+qOaOLbFXLQ90ARpcGG6UePL82bJLtdsa6CYJD7nmiU8MW9nQNOtCHV3lZ/Bzq1X0QYbBZCA==",
|
||||
"version": "3.4.5",
|
||||
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.5.tgz",
|
||||
"integrity": "sha512-OrwIBKsdNSVEeubdJ1HBv/wNENRM9ytAVCv7YXt//A3vPdVMNuACRqK9mXCGCBW2ln7BT/A4X0jXHo2Gu89miA==",
|
||||
"license": "(MPL-2.0 OR Apache-2.0)",
|
||||
"optionalDependencies": {
|
||||
"@types/trusted-types": "^2.0.7"
|
||||
@@ -2964,9 +2985,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/effect": {
|
||||
"version": "3.18.4",
|
||||
"resolved": "https://registry.npmjs.org/effect/-/effect-3.18.4.tgz",
|
||||
"integrity": "sha512-b1LXQJLe9D11wfnOKAk3PKxuqYshQ0Heez+y5pnkd3jLj1yx9QhM72zZ9uUrOQyNvrs2GZZd/3maL0ZV18YuDA==",
|
||||
"version": "3.21.0",
|
||||
"resolved": "https://registry.npmjs.org/effect/-/effect-3.21.0.tgz",
|
||||
"integrity": "sha512-PPN80qRokCd1f015IANNhrwOnLO7GrrMQfk4/lnZRE/8j7UPWrNNjPV0uBrZutI/nHzernbW+J0hdqQysHiSnQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@standard-schema/spec": "^1.0.0",
|
||||
@@ -3358,9 +3379,9 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/fast-uri": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz",
|
||||
"integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==",
|
||||
"version": "3.1.2",
|
||||
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz",
|
||||
"integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
@@ -3374,9 +3395,9 @@
|
||||
"license": "BSD-3-Clause"
|
||||
},
|
||||
"node_modules/fastify": {
|
||||
"version": "5.8.4",
|
||||
"resolved": "https://registry.npmjs.org/fastify/-/fastify-5.8.4.tgz",
|
||||
"integrity": "sha512-sa42J1xylbBAYUWALSBoyXKPDUvM3OoNOibIefA+Oha57FryXKKCZarA1iDntOCWp3O35voZLuDg2mdODXtPzQ==",
|
||||
"version": "5.8.5",
|
||||
"resolved": "https://registry.npmjs.org/fastify/-/fastify-5.8.5.tgz",
|
||||
"integrity": "sha512-Yqptv59pQzPgQUSIm87hMqHJmdkb1+GPxdE6vW6FRyVE9G86mt7rOghitiU4JHRaTyDUk9pfeKmDeu70lAwM4Q==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
@@ -3885,9 +3906,9 @@
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/ip-address": {
|
||||
"version": "10.1.0",
|
||||
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz",
|
||||
"integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==",
|
||||
"version": "10.2.0",
|
||||
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz",
|
||||
"integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 12"
|
||||
@@ -4411,9 +4432,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/lodash-es": {
|
||||
"version": "4.17.23",
|
||||
"resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz",
|
||||
"integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==",
|
||||
"version": "4.18.1",
|
||||
"resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz",
|
||||
"integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/lodash.clonedeep": {
|
||||
@@ -4615,9 +4636,9 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/nanoid": {
|
||||
"version": "3.3.11",
|
||||
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
|
||||
"integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
|
||||
"version": "3.3.12",
|
||||
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz",
|
||||
"integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==",
|
||||
"dev": true,
|
||||
"funding": [
|
||||
{
|
||||
@@ -4658,23 +4679,23 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/nodemailer": {
|
||||
"version": "8.0.4",
|
||||
"resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-8.0.4.tgz",
|
||||
"integrity": "sha512-k+jf6N8PfQJ0Fe8ZhJlgqU5qJU44Lpvp2yvidH3vp1lPnVQMgi4yEEMPXg5eJS1gFIJTVq1NHBk7Ia9ARdSBdQ==",
|
||||
"version": "8.0.7",
|
||||
"resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-8.0.7.tgz",
|
||||
"integrity": "sha512-pkjE4mkBzQjdJT4/UmlKl3pX0rC9fZmjh7c6C9o7lv66Ac6w9WCnzPzhbPNxwZAzlF4mdq4CSWB5+FbK6FWCow==",
|
||||
"license": "MIT-0",
|
||||
"engines": {
|
||||
"node": ">=6.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/nypm": {
|
||||
"version": "0.6.5",
|
||||
"resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.5.tgz",
|
||||
"integrity": "sha512-K6AJy1GMVyfyMXRVB88700BJqNUkByijGJM8kEHpLdcAt+vSQAVfkWWHYzuRXHSY6xA2sNc5RjTj0p9rE2izVQ==",
|
||||
"version": "0.6.6",
|
||||
"resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.6.tgz",
|
||||
"integrity": "sha512-vRyr0r4cbBapw07Xw8xrj9Teq3o7MUD35rSaTcanDbW+aK2XHDgJFiU6ZTj2GBw7Q12ysdsyFss+Vdz4hQ0Y6Q==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"citty": "^0.2.0",
|
||||
"citty": "^0.2.2",
|
||||
"pathe": "^2.0.3",
|
||||
"tinyexec": "^1.0.2"
|
||||
"tinyexec": "^1.1.1"
|
||||
},
|
||||
"bin": {
|
||||
"nypm": "dist/cli.mjs"
|
||||
@@ -4684,9 +4705,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/nypm/node_modules/citty": {
|
||||
"version": "0.2.1",
|
||||
"resolved": "https://registry.npmjs.org/citty/-/citty-0.2.1.tgz",
|
||||
"integrity": "sha512-kEV95lFBhQgtogAPlQfJJ0WGVSokvLr/UEoFPiKKOXF7pl98HfUVUD0ejsuTCld/9xH9vogSywZ5KqHzXrZpqg==",
|
||||
"version": "0.2.2",
|
||||
"resolved": "https://registry.npmjs.org/citty/-/citty-0.2.2.tgz",
|
||||
"integrity": "sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/object-inspect": {
|
||||
@@ -4978,13 +4999,13 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/pkg-types": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz",
|
||||
"integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==",
|
||||
"version": "2.3.1",
|
||||
"resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz",
|
||||
"integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"confbox": "^0.2.2",
|
||||
"exsolve": "^1.0.7",
|
||||
"confbox": "^0.2.4",
|
||||
"exsolve": "^1.0.8",
|
||||
"pathe": "^2.0.3"
|
||||
}
|
||||
},
|
||||
@@ -4998,9 +5019,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/postcss": {
|
||||
"version": "8.5.8",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz",
|
||||
"integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==",
|
||||
"version": "8.5.14",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz",
|
||||
"integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==",
|
||||
"dev": true,
|
||||
"funding": [
|
||||
{
|
||||
@@ -5027,14 +5048,14 @@
|
||||
}
|
||||
},
|
||||
"node_modules/prisma": {
|
||||
"version": "6.19.2",
|
||||
"resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.2.tgz",
|
||||
"integrity": "sha512-XTKeKxtQElcq3U9/jHyxSPgiRgeYDKxWTPOf6NkXA0dNj5j40MfEsZkMbyNpwDWCUv7YBFUl7I2VK/6ALbmhEg==",
|
||||
"version": "6.19.3",
|
||||
"resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.3.tgz",
|
||||
"integrity": "sha512-++ZJ0ijLrDJF6hNB4t4uxg2br3fC4H9Yc9tcbjr2fcNFP3rh/SBNrAgjhsqBU4Ght8JPrVofG/ZkXfnSfnYsFg==",
|
||||
"hasInstallScript": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@prisma/config": "6.19.2",
|
||||
"@prisma/engines": "6.19.2"
|
||||
"@prisma/config": "6.19.3",
|
||||
"@prisma/engines": "6.19.3"
|
||||
},
|
||||
"bin": {
|
||||
"prisma": "build/index.js"
|
||||
@@ -5553,14 +5574,14 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/rolldown": {
|
||||
"version": "1.0.0-rc.9",
|
||||
"resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.9.tgz",
|
||||
"integrity": "sha512-9EbgWge7ZH+yqb4d2EnELAntgPTWbfL8ajiTW+SyhJEC4qhBbkCKbqFV4Ge4zmu5ziQuVbWxb/XwLZ+RIO7E8Q==",
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.1.tgz",
|
||||
"integrity": "sha512-X0KQHljNnEkWNqqiz9zJrGunh1B0HgOxLXvnFpCOcadzcy5qohZ3tqMEUg00vncoRovXuK3ZqCT9KnnKzoInFQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@oxc-project/types": "=0.115.0",
|
||||
"@rolldown/pluginutils": "1.0.0-rc.9"
|
||||
"@oxc-project/types": "=0.130.0",
|
||||
"@rolldown/pluginutils": "^1.0.0"
|
||||
},
|
||||
"bin": {
|
||||
"rolldown": "bin/cli.mjs"
|
||||
@@ -5569,27 +5590,27 @@
|
||||
"node": "^20.19.0 || >=22.12.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@rolldown/binding-android-arm64": "1.0.0-rc.9",
|
||||
"@rolldown/binding-darwin-arm64": "1.0.0-rc.9",
|
||||
"@rolldown/binding-darwin-x64": "1.0.0-rc.9",
|
||||
"@rolldown/binding-freebsd-x64": "1.0.0-rc.9",
|
||||
"@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.9",
|
||||
"@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.9",
|
||||
"@rolldown/binding-linux-arm64-musl": "1.0.0-rc.9",
|
||||
"@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.9",
|
||||
"@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.9",
|
||||
"@rolldown/binding-linux-x64-gnu": "1.0.0-rc.9",
|
||||
"@rolldown/binding-linux-x64-musl": "1.0.0-rc.9",
|
||||
"@rolldown/binding-openharmony-arm64": "1.0.0-rc.9",
|
||||
"@rolldown/binding-wasm32-wasi": "1.0.0-rc.9",
|
||||
"@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.9",
|
||||
"@rolldown/binding-win32-x64-msvc": "1.0.0-rc.9"
|
||||
"@rolldown/binding-android-arm64": "1.0.1",
|
||||
"@rolldown/binding-darwin-arm64": "1.0.1",
|
||||
"@rolldown/binding-darwin-x64": "1.0.1",
|
||||
"@rolldown/binding-freebsd-x64": "1.0.1",
|
||||
"@rolldown/binding-linux-arm-gnueabihf": "1.0.1",
|
||||
"@rolldown/binding-linux-arm64-gnu": "1.0.1",
|
||||
"@rolldown/binding-linux-arm64-musl": "1.0.1",
|
||||
"@rolldown/binding-linux-ppc64-gnu": "1.0.1",
|
||||
"@rolldown/binding-linux-s390x-gnu": "1.0.1",
|
||||
"@rolldown/binding-linux-x64-gnu": "1.0.1",
|
||||
"@rolldown/binding-linux-x64-musl": "1.0.1",
|
||||
"@rolldown/binding-openharmony-arm64": "1.0.1",
|
||||
"@rolldown/binding-wasm32-wasi": "1.0.1",
|
||||
"@rolldown/binding-win32-arm64-msvc": "1.0.1",
|
||||
"@rolldown/binding-win32-x64-msvc": "1.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/rolldown/node_modules/@rolldown/pluginutils": {
|
||||
"version": "1.0.0-rc.9",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.9.tgz",
|
||||
"integrity": "sha512-w6oiRWgEBl04QkFZgmW+jnU1EC9b57Oihi2ot3HNWIQRqgHp5PnYDia5iZ5FF7rpa4EQdiqMDXjlqKGXBhsoXw==",
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz",
|
||||
"integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
@@ -6147,23 +6168,23 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/tinyexec": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.4.tgz",
|
||||
"integrity": "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==",
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.2.tgz",
|
||||
"integrity": "sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/tinyglobby": {
|
||||
"version": "0.2.15",
|
||||
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
|
||||
"integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
|
||||
"version": "0.2.16",
|
||||
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz",
|
||||
"integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"fdir": "^6.5.0",
|
||||
"picomatch": "^4.0.3"
|
||||
"picomatch": "^4.0.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12.0.0"
|
||||
@@ -6331,18 +6352,17 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/vite": {
|
||||
"version": "8.0.0",
|
||||
"resolved": "https://registry.npmjs.org/vite/-/vite-8.0.0.tgz",
|
||||
"integrity": "sha512-fPGaRNj9Zytaf8LEiBhY7Z6ijnFKdzU/+mL8EFBaKr7Vw1/FWcTBAMW0wLPJAGMPX38ZPVCVgLceWiEqeoqL2Q==",
|
||||
"version": "8.0.13",
|
||||
"resolved": "https://registry.npmjs.org/vite/-/vite-8.0.13.tgz",
|
||||
"integrity": "sha512-MFtjBYgzmSxmgA4RAfjIyXWpGe1oALnjgUTzzV7QLx/TKxCzjtMH6Fd9/eVK+5Fg1qNoz5VAwsmMs/NofrmJvw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@oxc-project/runtime": "0.115.0",
|
||||
"lightningcss": "^1.32.0",
|
||||
"picomatch": "^4.0.3",
|
||||
"postcss": "^8.5.8",
|
||||
"rolldown": "1.0.0-rc.9",
|
||||
"tinyglobby": "^0.2.15"
|
||||
"picomatch": "^4.0.4",
|
||||
"postcss": "^8.5.14",
|
||||
"rolldown": "1.0.1",
|
||||
"tinyglobby": "^0.2.16"
|
||||
},
|
||||
"bin": {
|
||||
"vite": "bin/vite.js"
|
||||
@@ -6358,8 +6378,8 @@
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@types/node": "^20.19.0 || >=22.12.0",
|
||||
"@vitejs/devtools": "^0.0.0-alpha.31",
|
||||
"esbuild": "^0.27.0",
|
||||
"@vitejs/devtools": "^0.1.18",
|
||||
"esbuild": "^0.27.0 || ^0.28.0",
|
||||
"jiti": ">=1.21.0",
|
||||
"less": "^4.0.0",
|
||||
"sass": "^1.70.0",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "app-ts",
|
||||
"version": "1.5.4",
|
||||
"version": "1.7.0",
|
||||
"description": "",
|
||||
"main": "dist/server.js",
|
||||
"scripts": {
|
||||
@@ -17,7 +17,11 @@
|
||||
"db:push": "prisma db push",
|
||||
"db:studio": "prisma studio",
|
||||
"test": "vitest run",
|
||||
"test:watch": "vitest"
|
||||
"test:watch": "vitest",
|
||||
"seed": "tsx prisma/seed.ts"
|
||||
},
|
||||
"prisma": {
|
||||
"seed": "tsx prisma/seed.ts"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
@@ -34,6 +38,7 @@
|
||||
"@fastify/rate-limit": "^10.3.0",
|
||||
"@fastify/static": "^9.0.0",
|
||||
"@prisma/client": "^6.19.2",
|
||||
"@tanstack/react-query": "^5.100.5",
|
||||
"@types/jsdom": "^28.0.1",
|
||||
"bcryptjs": "^3.0.3",
|
||||
"date-fns": "^4.1.0",
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
-- Add billing_text column to invoices table
|
||||
ALTER TABLE `invoices` ADD COLUMN `billing_text` VARCHAR(500) NULL AFTER `issued_by`;
|
||||
@@ -1,3 +0,0 @@
|
||||
-- Add lock fields to quotations table for pessimistic locking
|
||||
ALTER TABLE `quotations` ADD COLUMN `locked_by` INT NULL AFTER `scope_description`;
|
||||
ALTER TABLE `quotations` ADD COLUMN `locked_at` DATETIME NULL AFTER `locked_by`;
|
||||
@@ -1,9 +0,0 @@
|
||||
CREATE TABLE `invoice_alert_log` (
|
||||
`id` INT NOT NULL AUTO_INCREMENT,
|
||||
`invoice_type` VARCHAR(20) NOT NULL,
|
||||
`invoice_id` INT NOT NULL,
|
||||
`alert_type` VARCHAR(20) NOT NULL,
|
||||
`sent_at` DATETIME(0) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `invoice_type_invoice_id_alert_type` (`invoice_type`, `invoice_id`, `alert_type`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
@@ -1 +0,0 @@
|
||||
ALTER TABLE `invoices` ADD COLUMN `language` VARCHAR(5) DEFAULT 'cs' AFTER `billing_text`;
|
||||
@@ -1,2 +0,0 @@
|
||||
-- Add file_path column for NAS storage of received invoice files
|
||||
ALTER TABLE `received_invoices` ADD COLUMN `file_path` VARCHAR(500) NULL AFTER `file_data`;
|
||||
@@ -1,4 +0,0 @@
|
||||
-- Remove file_data (BLOB) and file_path columns — files are now stored on NAS
|
||||
-- Path is derived from year, month, and file_name
|
||||
ALTER TABLE `received_invoices` DROP COLUMN `file_data`;
|
||||
ALTER TABLE `received_invoices` DROP COLUMN `file_path`;
|
||||
@@ -1 +0,0 @@
|
||||
ALTER TABLE `company_settings` ADD COLUMN `logo_data_dark` MEDIUMBLOB NULL AFTER `logo_data`;
|
||||
@@ -1,4 +0,0 @@
|
||||
ALTER TABLE `company_settings`
|
||||
ADD COLUMN `offer_number_pattern` VARCHAR(100) NULL,
|
||||
ADD COLUMN `order_number_pattern` VARCHAR(100) NULL,
|
||||
ADD COLUMN `invoice_number_pattern` VARCHAR(100) NULL;
|
||||
@@ -1,3 +0,0 @@
|
||||
ALTER TABLE `company_settings`
|
||||
ADD COLUMN `smtp_from` VARCHAR(255) NULL,
|
||||
ADD COLUMN `smtp_from_name` VARCHAR(255) NULL;
|
||||
@@ -1,13 +0,0 @@
|
||||
-- System settings columns on company_settings
|
||||
ALTER TABLE `company_settings`
|
||||
ADD COLUMN `break_threshold_hours` DECIMAL(4,2) DEFAULT 6,
|
||||
ADD COLUMN `break_duration_short` INT DEFAULT 15,
|
||||
ADD COLUMN `break_duration_long` INT DEFAULT 30,
|
||||
ADD COLUMN `clock_rounding_minutes` INT DEFAULT 15,
|
||||
ADD COLUMN `invoice_alert_email` VARCHAR(255) NULL,
|
||||
ADD COLUMN `leave_notify_email` VARCHAR(255) NULL,
|
||||
ADD COLUMN `max_login_attempts` INT DEFAULT 5,
|
||||
ADD COLUMN `lockout_minutes` INT DEFAULT 15,
|
||||
ADD COLUMN `max_requests_per_minute` INT DEFAULT 300,
|
||||
ADD COLUMN `available_vat_rates` LONGTEXT NULL,
|
||||
ADD COLUMN `available_currencies` LONGTEXT NULL;
|
||||
@@ -1,18 +0,0 @@
|
||||
-- Create new unified permission
|
||||
INSERT INTO permissions (name, display_name, description, module)
|
||||
VALUES ('settings.manage', 'Správa nastavení', 'Správa všech nastavení systému', 'settings')
|
||||
ON DUPLICATE KEY UPDATE display_name = VALUES(display_name);
|
||||
|
||||
-- Grant to all roles that had any of the old 3
|
||||
INSERT IGNORE INTO role_permissions (role_id, permission_id)
|
||||
SELECT DISTINCT rp.role_id, (SELECT id FROM permissions WHERE name = 'settings.manage')
|
||||
FROM role_permissions rp
|
||||
JOIN permissions p ON p.id = rp.permission_id
|
||||
WHERE p.name IN ('offers.settings', 'settings.roles', 'settings.security');
|
||||
|
||||
-- Clean up old role_permissions
|
||||
DELETE FROM role_permissions
|
||||
WHERE permission_id IN (SELECT id FROM permissions WHERE name IN ('offers.settings', 'settings.roles', 'settings.security'));
|
||||
|
||||
-- Remove old permissions
|
||||
DELETE FROM permissions WHERE name IN ('offers.settings', 'settings.roles', 'settings.security');
|
||||
@@ -1,2 +0,0 @@
|
||||
-- Add unique constraint on number_sequences(type, year) for atomic numbering
|
||||
ALTER TABLE number_sequences ADD UNIQUE INDEX idx_number_sequences_type_year (`type`, `year`);
|
||||
@@ -98,6 +98,7 @@ CREATE TABLE `company_settings` (
|
||||
`vat_id` VARCHAR(50) NULL,
|
||||
`custom_fields` LONGTEXT NULL,
|
||||
`logo_data` LONGBLOB NULL,
|
||||
`logo_data_dark` MEDIUMBLOB NULL,
|
||||
`quotation_prefix` VARCHAR(20) NULL,
|
||||
`default_currency` VARCHAR(10) NULL DEFAULT 'CZK',
|
||||
`default_vat_rate` DECIMAL(5, 2) NULL DEFAULT 21.00,
|
||||
@@ -108,7 +109,24 @@ CREATE TABLE `company_settings` (
|
||||
`order_type_code` VARCHAR(10) NULL,
|
||||
`invoice_type_code` VARCHAR(10) NULL,
|
||||
`require_2fa` BOOLEAN NOT NULL DEFAULT false,
|
||||
`break_threshold_hours` DECIMAL(4, 2) NULL DEFAULT 6.00,
|
||||
`break_duration_short` INTEGER NULL DEFAULT 15,
|
||||
`break_duration_long` INTEGER NULL DEFAULT 30,
|
||||
`clock_rounding_minutes` INTEGER NULL DEFAULT 15,
|
||||
`invoice_alert_email` VARCHAR(255) NULL,
|
||||
`leave_notify_email` VARCHAR(255) NULL,
|
||||
`max_login_attempts` INTEGER NULL DEFAULT 5,
|
||||
`lockout_minutes` INTEGER NULL DEFAULT 15,
|
||||
`max_requests_per_minute` INTEGER NULL DEFAULT 300,
|
||||
`available_vat_rates` LONGTEXT NULL,
|
||||
`available_currencies` LONGTEXT NULL,
|
||||
`smtp_from` VARCHAR(255) NULL,
|
||||
`smtp_from_name` VARCHAR(255) NULL,
|
||||
`offer_number_pattern` VARCHAR(100) NULL,
|
||||
`order_number_pattern` VARCHAR(100) NULL,
|
||||
`invoice_number_pattern` VARCHAR(100) NULL,
|
||||
|
||||
UNIQUE INDEX `company_settings_uuid_key`(`uuid`),
|
||||
PRIMARY KEY (`id`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
@@ -167,14 +185,18 @@ CREATE TABLE `invoices` (
|
||||
`tax_date` DATE NULL,
|
||||
`paid_date` DATE NULL,
|
||||
`issued_by` VARCHAR(255) NULL,
|
||||
`billing_text` VARCHAR(500) NULL,
|
||||
`language` VARCHAR(5) NULL DEFAULT 'cs',
|
||||
`notes` TEXT NULL,
|
||||
`internal_notes` TEXT NULL,
|
||||
`created_at` DATETIME(0) NULL DEFAULT CURRENT_TIMESTAMP(0),
|
||||
`modified_at` DATETIME(0) NULL,
|
||||
|
||||
UNIQUE INDEX `idx_invoices_number_unique`(`invoice_number`),
|
||||
INDEX `customer_id`(`customer_id`),
|
||||
INDEX `idx_invoices_due_date`(`due_date`),
|
||||
INDEX `idx_invoices_status_issue`(`status`, `issue_date`),
|
||||
INDEX `idx_invoices_status_due`(`status`, `due_date`),
|
||||
INDEX `order_id`(`order_id`),
|
||||
PRIMARY KEY (`id`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
@@ -239,6 +261,7 @@ CREATE TABLE `number_sequences` (
|
||||
`year` INTEGER NULL,
|
||||
`last_number` INTEGER NULL DEFAULT 0,
|
||||
|
||||
UNIQUE INDEX `idx_number_sequences_type_year`(`type`, `year`),
|
||||
PRIMARY KEY (`id`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
@@ -294,6 +317,7 @@ CREATE TABLE `orders` (
|
||||
`created_at` DATETIME(0) NULL DEFAULT CURRENT_TIMESTAMP(0),
|
||||
`modified_at` DATETIME(0) NULL,
|
||||
|
||||
UNIQUE INDEX `idx_orders_number_unique`(`order_number`),
|
||||
INDEX `customer_id`(`customer_id`),
|
||||
INDEX `quotation_id`(`quotation_id`),
|
||||
PRIMARY KEY (`id`)
|
||||
@@ -341,6 +365,7 @@ CREATE TABLE `projects` (
|
||||
`created_at` DATETIME(0) NULL DEFAULT CURRENT_TIMESTAMP(0),
|
||||
`modified_at` DATETIME(0) NULL,
|
||||
|
||||
UNIQUE INDEX `projects_project_number_key`(`project_number`),
|
||||
INDEX `customer_id`(`customer_id`),
|
||||
INDEX `fk_projects_responsible_user`(`responsible_user_id`),
|
||||
INDEX `order_id`(`order_id`),
|
||||
@@ -386,10 +411,13 @@ CREATE TABLE `quotations` (
|
||||
`status` VARCHAR(20) NOT NULL DEFAULT 'active',
|
||||
`scope_title` VARCHAR(500) NULL,
|
||||
`scope_description` TEXT NULL,
|
||||
`locked_by` INTEGER NULL,
|
||||
`locked_at` DATETIME(0) NULL,
|
||||
`uuid` VARCHAR(36) NULL,
|
||||
`modified_at` DATETIME(0) NULL,
|
||||
`sync_version` INTEGER NULL DEFAULT 0,
|
||||
|
||||
UNIQUE INDEX `quotations_quotation_number_key`(`quotation_number`),
|
||||
INDEX `customer_id`(`customer_id`),
|
||||
INDEX `idx_quotations_number`(`quotation_number`),
|
||||
PRIMARY KEY (`id`)
|
||||
@@ -411,7 +439,6 @@ CREATE TABLE `received_invoices` (
|
||||
`due_date` DATE NULL,
|
||||
`paid_date` DATE NULL,
|
||||
`status` ENUM('unpaid', 'paid') NOT NULL DEFAULT 'unpaid',
|
||||
`file_data` MEDIUMBLOB NULL,
|
||||
`file_name` VARCHAR(255) NULL,
|
||||
`file_mime` VARCHAR(100) NULL,
|
||||
`file_size` INTEGER UNSIGNED NULL,
|
||||
@@ -572,6 +599,7 @@ CREATE TABLE `users` (
|
||||
`totp_secret` VARCHAR(255) NULL,
|
||||
`totp_enabled` BOOLEAN NOT NULL DEFAULT false,
|
||||
`totp_backup_codes` TEXT NULL,
|
||||
`totp_last_used_counter` INTEGER NULL,
|
||||
|
||||
UNIQUE INDEX `username`(`username`),
|
||||
UNIQUE INDEX `email`(`email`),
|
||||
@@ -597,12 +625,28 @@ CREATE TABLE `vehicles` (
|
||||
PRIMARY KEY (`id`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE `invoice_alert_log` (
|
||||
`id` INTEGER NOT NULL AUTO_INCREMENT,
|
||||
`invoice_type` VARCHAR(20) NOT NULL,
|
||||
`invoice_id` INTEGER NOT NULL,
|
||||
`alert_type` VARCHAR(20) NOT NULL,
|
||||
`sent_at` DATETIME(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0),
|
||||
`created_at` DATETIME(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0),
|
||||
|
||||
UNIQUE INDEX `invoice_type_invoice_id_alert_type`(`invoice_type`, `invoice_id`, `alert_type`),
|
||||
PRIMARY KEY (`id`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE `attendance` ADD CONSTRAINT `attendance_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE `attendance_project_logs` ADD CONSTRAINT `attendance_project_logs_attendance_id_fkey` FOREIGN KEY (`attendance_id`) REFERENCES `attendance`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE `attendance_project_logs` ADD CONSTRAINT `attendance_project_logs_project_id_fkey` FOREIGN KEY (`project_id`) REFERENCES `projects`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE `invoice_items` ADD CONSTRAINT `invoice_items_ibfk_1` FOREIGN KEY (`invoice_id`) REFERENCES `invoices`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION;
|
||||
|
||||
@@ -674,4 +718,3 @@ ALTER TABLE `trips` ADD CONSTRAINT `trips_vehicle_fk` FOREIGN KEY (`vehicle_id`)
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE `users` ADD CONSTRAINT `users_ibfk_1` FOREIGN KEY (`role_id`) REFERENCES `roles`(`id`) ON DELETE SET NULL ON UPDATE NO ACTION;
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
-- Insert the settings.system permission (also available via seed)
|
||||
INSERT INTO `permissions` (`name`, `display_name`, `module`, `description`)
|
||||
VALUES ('settings.system', 'Systémová nastavení', 'settings', 'Spravovat systémová nastavení, 2FA, e-maily, limity')
|
||||
ON DUPLICATE KEY UPDATE `name` = `name`;
|
||||
@@ -0,0 +1,3 @@
|
||||
-- AlterTable
|
||||
ALTER TABLE `quotations` DROP COLUMN `exchange_rate`;
|
||||
ALTER TABLE `quotations` DROP COLUMN `exchange_rate_date`;
|
||||
@@ -0,0 +1,2 @@
|
||||
-- AlterTable
|
||||
ALTER TABLE `invoice_items` ADD COLUMN `item_description` TEXT NULL;
|
||||
@@ -0,0 +1,14 @@
|
||||
-- AlterTable: quotation_items
|
||||
ALTER TABLE `quotation_items` DROP COLUMN `uuid`;
|
||||
ALTER TABLE `quotation_items` DROP COLUMN `is_deleted`;
|
||||
ALTER TABLE `quotation_items` DROP COLUMN `sync_version`;
|
||||
|
||||
-- AlterTable: quotations
|
||||
ALTER TABLE `quotations` DROP COLUMN `uuid`;
|
||||
ALTER TABLE `quotations` DROP COLUMN `sync_version`;
|
||||
|
||||
-- AlterTable: scope_sections
|
||||
ALTER TABLE `scope_sections` DROP COLUMN `content_editor_height`;
|
||||
ALTER TABLE `scope_sections` DROP COLUMN `uuid`;
|
||||
ALTER TABLE `scope_sections` DROP COLUMN `is_deleted`;
|
||||
ALTER TABLE `scope_sections` DROP COLUMN `sync_version`;
|
||||
@@ -1,3 +1,3 @@
|
||||
# Please do not edit this file manually
|
||||
# It should be added in your version-control system (i.e. Git)
|
||||
# It should be added in your version-control system (e.g., Git)
|
||||
provider = "mysql"
|
||||
|
||||
@@ -32,7 +32,7 @@ model attendance {
|
||||
users users @relation(fields: [user_id], references: [id], onDelete: Cascade, onUpdate: NoAction, map: "attendance_ibfk_1")
|
||||
attendance_project_logs attendance_project_logs[]
|
||||
|
||||
@@unique([user_id, shift_date], map: "idx_attendance_user_date")
|
||||
@@index([user_id, shift_date], map: "idx_attendance_user_date")
|
||||
@@index([user_id, departure_time], map: "idx_attendance_user_departure")
|
||||
@@index([project_id], map: "idx_project_id")
|
||||
}
|
||||
@@ -101,7 +101,7 @@ model company_settings {
|
||||
vat_id String? @db.VarChar(50)
|
||||
custom_fields String? @db.LongText
|
||||
logo_data Bytes?
|
||||
logo_data_dark Bytes?
|
||||
logo_data_dark Bytes? @db.MediumBlob
|
||||
quotation_prefix String? @db.VarChar(20)
|
||||
default_currency String? @default("CZK") @db.VarChar(10)
|
||||
default_vat_rate Decimal? @default(21.00) @db.Decimal(5, 2)
|
||||
@@ -112,7 +112,7 @@ model company_settings {
|
||||
order_type_code String? @db.VarChar(10)
|
||||
invoice_type_code String? @db.VarChar(10)
|
||||
require_2fa Boolean @default(false)
|
||||
break_threshold_hours Decimal? @default(6) @db.Decimal(4, 2)
|
||||
break_threshold_hours Decimal? @default(6.00) @db.Decimal(4, 2)
|
||||
break_duration_short Int? @default(15)
|
||||
break_duration_long Int? @default(30)
|
||||
clock_rounding_minutes Int? @default(15)
|
||||
@@ -153,8 +153,9 @@ model customers {
|
||||
model invoice_items {
|
||||
id Int @id @default(autoincrement())
|
||||
invoice_id Int
|
||||
description String? @db.VarChar(500)
|
||||
quantity Decimal? @default(1.000) @db.Decimal(12, 3)
|
||||
description String? @db.VarChar(500)
|
||||
item_description String? @db.Text
|
||||
quantity Decimal? @default(1.000) @db.Decimal(12, 3)
|
||||
unit String? @db.VarChar(20)
|
||||
unit_price Decimal? @default(0.00) @db.Decimal(12, 2)
|
||||
vat_rate Decimal? @default(21.00) @db.Decimal(5, 2)
|
||||
@@ -377,10 +378,7 @@ model quotation_items {
|
||||
unit String? @db.VarChar(20)
|
||||
unit_price Decimal? @default(0.00) @db.Decimal(12, 2)
|
||||
is_included_in_total Boolean? @default(true)
|
||||
uuid String? @db.VarChar(36)
|
||||
modified_at DateTime? @db.DateTime(0)
|
||||
is_deleted Boolean? @default(false)
|
||||
sync_version Int? @default(0)
|
||||
quotations quotations @relation(fields: [quotation_id], references: [id], onDelete: Cascade, onUpdate: NoAction, map: "quotation_items_ibfk_1")
|
||||
|
||||
@@index([quotation_id], map: "quotation_id")
|
||||
@@ -389,7 +387,7 @@ model quotation_items {
|
||||
model quotations {
|
||||
id Int @id @default(autoincrement())
|
||||
quotation_number String? @unique @db.VarChar(50)
|
||||
project_code String? @db.VarChar(50)
|
||||
project_code String? @db.VarChar(100)
|
||||
customer_id Int?
|
||||
created_at DateTime? @default(now()) @db.DateTime(0)
|
||||
valid_until DateTime? @db.Date
|
||||
@@ -397,17 +395,13 @@ model quotations {
|
||||
language String? @default("cs") @db.VarChar(5)
|
||||
vat_rate Decimal? @default(21.00) @db.Decimal(5, 2)
|
||||
apply_vat Boolean? @default(true)
|
||||
exchange_rate Decimal? @default(1.0000) @db.Decimal(10, 4)
|
||||
exchange_rate_date DateTime? @db.Date
|
||||
order_id Int?
|
||||
status String @default("active") @db.VarChar(20)
|
||||
scope_title String? @db.VarChar(500)
|
||||
scope_description String? @db.Text
|
||||
locked_by Int?
|
||||
locked_at DateTime? @db.DateTime(0)
|
||||
uuid String? @db.VarChar(36)
|
||||
modified_at DateTime? @db.DateTime(0)
|
||||
sync_version Int? @default(0)
|
||||
orders orders[]
|
||||
projects projects[]
|
||||
quotation_items quotation_items[]
|
||||
@@ -437,7 +431,7 @@ model received_invoices {
|
||||
file_mime String? @db.VarChar(100)
|
||||
file_size Int? @db.UnsignedInt
|
||||
notes String? @db.Text
|
||||
uploaded_by Int?
|
||||
uploaded_by Int? @db.UnsignedInt
|
||||
created_at DateTime @default(now()) @db.DateTime(0)
|
||||
modified_at DateTime @default(now()) @db.DateTime(0)
|
||||
|
||||
@@ -449,7 +443,7 @@ model received_invoices {
|
||||
/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments
|
||||
model refresh_tokens {
|
||||
id Int @id @default(autoincrement()) @db.UnsignedInt
|
||||
user_id Int
|
||||
user_id Int @db.UnsignedInt
|
||||
token_hash String @unique(map: "token_hash") @db.VarChar(64)
|
||||
expires_at DateTime @db.DateTime(0)
|
||||
replaced_at DateTime? @db.DateTime(0)
|
||||
@@ -492,11 +486,7 @@ model scope_sections {
|
||||
title String? @db.VarChar(500)
|
||||
title_cz String? @db.VarChar(500)
|
||||
content String? @db.Text
|
||||
content_editor_height Int?
|
||||
uuid String? @db.VarChar(36)
|
||||
modified_at DateTime? @db.DateTime(0)
|
||||
is_deleted Boolean? @default(false)
|
||||
sync_version Int? @default(0)
|
||||
quotations quotations @relation(fields: [quotation_id], references: [id], onDelete: Cascade, onUpdate: NoAction, map: "scope_sections_ibfk_1")
|
||||
|
||||
@@index([quotation_id], map: "quotation_id")
|
||||
@@ -632,7 +622,7 @@ model invoice_alert_log {
|
||||
sent_at DateTime @default(now()) @db.DateTime(0)
|
||||
created_at DateTime @default(now()) @db.DateTime(0)
|
||||
|
||||
@@unique([invoice_type, invoice_id, alert_type])
|
||||
@@unique([invoice_type, invoice_id, alert_type], map: "invoice_type_invoice_id_alert_type")
|
||||
}
|
||||
|
||||
enum received_invoices_status {
|
||||
|
||||
436
prisma/seed.ts
Normal file
436
prisma/seed.ts
Normal file
@@ -0,0 +1,436 @@
|
||||
import { PrismaClient } from "@prisma/client";
|
||||
import bcrypt from "bcryptjs";
|
||||
|
||||
const prisma = new PrismaClient();
|
||||
|
||||
const PERMISSIONS: {
|
||||
name: string;
|
||||
display_name: string;
|
||||
module: string;
|
||||
description: string;
|
||||
}[] = [
|
||||
// Docházka
|
||||
{
|
||||
name: "attendance.record",
|
||||
display_name: "Záznam docházky",
|
||||
module: "attendance",
|
||||
description: "Zapisovat příchody/odchody",
|
||||
},
|
||||
{
|
||||
name: "attendance.history",
|
||||
display_name: "Historie docházky",
|
||||
module: "attendance",
|
||||
description: "Prohlížet vlastní historii docházky",
|
||||
},
|
||||
{
|
||||
name: "attendance.approve",
|
||||
display_name: "Schvalování docházky",
|
||||
module: "attendance",
|
||||
description: "Schvalovat žádosti o dovolenou/nemoc",
|
||||
},
|
||||
{
|
||||
name: "attendance.manage",
|
||||
display_name: "Správa docházky",
|
||||
module: "attendance",
|
||||
description: "Spravovat všechny záznamy, vytvářet/editovat/mazat",
|
||||
},
|
||||
{
|
||||
name: "attendance.balances",
|
||||
display_name: "Správa bilancí",
|
||||
module: "attendance",
|
||||
description: "Spravovat zůstatky dovolené a sick days",
|
||||
},
|
||||
|
||||
// Kniha jízd
|
||||
{
|
||||
name: "trips.record",
|
||||
display_name: "Záznam jízd",
|
||||
module: "trips",
|
||||
description: "Zapisovat jízdy",
|
||||
},
|
||||
{
|
||||
name: "trips.history",
|
||||
display_name: "Historie jízd",
|
||||
module: "trips",
|
||||
description: "Prohlížet vlastní historii jízd",
|
||||
},
|
||||
{
|
||||
name: "trips.manage",
|
||||
display_name: "Správa jízd",
|
||||
module: "trips",
|
||||
description: "Spravovat všechny jízdy",
|
||||
},
|
||||
|
||||
// Vozidla
|
||||
{
|
||||
name: "vehicles.manage",
|
||||
display_name: "Správa vozidel",
|
||||
module: "vehicles",
|
||||
description: "Spravovat vozový park",
|
||||
},
|
||||
|
||||
// Nabídky
|
||||
{
|
||||
name: "offers.view",
|
||||
display_name: "Zobrazit nabídky",
|
||||
module: "offers",
|
||||
description: "Prohlížet seznam nabídek",
|
||||
},
|
||||
{
|
||||
name: "offers.create",
|
||||
display_name: "Vytvořit nabídku",
|
||||
module: "offers",
|
||||
description: "Vytvářet nové nabídky",
|
||||
},
|
||||
{
|
||||
name: "offers.edit",
|
||||
display_name: "Upravit nabídku",
|
||||
module: "offers",
|
||||
description: "Upravovat existující nabídky",
|
||||
},
|
||||
{
|
||||
name: "offers.delete",
|
||||
display_name: "Smazat nabídku",
|
||||
module: "offers",
|
||||
description: "Mazat nabídky",
|
||||
},
|
||||
{
|
||||
name: "offers.export",
|
||||
display_name: "Exportovat nabídku",
|
||||
module: "offers",
|
||||
description: "Exportovat nabídky do PDF",
|
||||
},
|
||||
|
||||
// Objednávky
|
||||
{
|
||||
name: "orders.view",
|
||||
display_name: "Zobrazit objednávky",
|
||||
module: "orders",
|
||||
description: "Prohlížet seznam objednávek",
|
||||
},
|
||||
{
|
||||
name: "orders.create",
|
||||
display_name: "Vytvořit objednávku",
|
||||
module: "orders",
|
||||
description: "Vytvářet nové objednávky",
|
||||
},
|
||||
{
|
||||
name: "orders.edit",
|
||||
display_name: "Upravit objednávku",
|
||||
module: "orders",
|
||||
description: "Upravovat existující objednávky",
|
||||
},
|
||||
{
|
||||
name: "orders.delete",
|
||||
display_name: "Smazat objednávku",
|
||||
module: "orders",
|
||||
description: "Mazat objednávky",
|
||||
},
|
||||
{
|
||||
name: "orders.export",
|
||||
display_name: "Exportovat objednávku",
|
||||
module: "orders",
|
||||
description: "Exportovat objednávky do PDF",
|
||||
},
|
||||
|
||||
// Faktury
|
||||
{
|
||||
name: "invoices.view",
|
||||
display_name: "Zobrazit faktury",
|
||||
module: "invoices",
|
||||
description: "Prohlížet seznam faktur",
|
||||
},
|
||||
{
|
||||
name: "invoices.create",
|
||||
display_name: "Vytvořit fakturu",
|
||||
module: "invoices",
|
||||
description: "Vytvářet nové faktury",
|
||||
},
|
||||
{
|
||||
name: "invoices.edit",
|
||||
display_name: "Upravit fakturu",
|
||||
module: "invoices",
|
||||
description: "Upravovat existující faktury",
|
||||
},
|
||||
{
|
||||
name: "invoices.delete",
|
||||
display_name: "Smazat fakturu",
|
||||
module: "invoices",
|
||||
description: "Mazat faktury",
|
||||
},
|
||||
{
|
||||
name: "invoices.export",
|
||||
display_name: "Exportovat fakturu",
|
||||
module: "invoices",
|
||||
description: "Exportovat faktury do PDF",
|
||||
},
|
||||
|
||||
// Projekty
|
||||
{
|
||||
name: "projects.view",
|
||||
display_name: "Zobrazit projekty",
|
||||
module: "projects",
|
||||
description: "Prohlížet seznam projektů",
|
||||
},
|
||||
{
|
||||
name: "projects.edit",
|
||||
display_name: "Upravit projekt",
|
||||
module: "projects",
|
||||
description: "Upravovat existující projekty",
|
||||
},
|
||||
{
|
||||
name: "projects.delete",
|
||||
display_name: "Smazat projekt",
|
||||
module: "projects",
|
||||
description: "Mazat projekty",
|
||||
},
|
||||
{
|
||||
name: "projects.files",
|
||||
display_name: "Soubory projektu",
|
||||
module: "projects",
|
||||
description: "Spravovat soubory a složky projektu",
|
||||
},
|
||||
|
||||
// Zákazníci
|
||||
{
|
||||
name: "customers.view",
|
||||
display_name: "Zobrazit zákazníky",
|
||||
module: "customers",
|
||||
description: "Prohlížet seznam zákazníků",
|
||||
},
|
||||
{
|
||||
name: "customers.create",
|
||||
display_name: "Vytvořit zákazníka",
|
||||
module: "customers",
|
||||
description: "Vytvářet nové zákazníky",
|
||||
},
|
||||
{
|
||||
name: "customers.edit",
|
||||
display_name: "Upravit zákazníka",
|
||||
module: "customers",
|
||||
description: "Upravovat existující zákazníky",
|
||||
},
|
||||
{
|
||||
name: "customers.delete",
|
||||
display_name: "Smazat zákazníka",
|
||||
module: "customers",
|
||||
description: "Mazat zákazníky",
|
||||
},
|
||||
|
||||
// Uživatelé
|
||||
{
|
||||
name: "users.view",
|
||||
display_name: "Zobrazit uživatele",
|
||||
module: "users",
|
||||
description: "Prohlížet seznam uživatelů",
|
||||
},
|
||||
{
|
||||
name: "users.create",
|
||||
display_name: "Vytvořit uživatele",
|
||||
module: "users",
|
||||
description: "Vytvářet nové uživatele",
|
||||
},
|
||||
{
|
||||
name: "users.edit",
|
||||
display_name: "Upravit uživatele",
|
||||
module: "users",
|
||||
description: "Upravovat existující uživatele",
|
||||
},
|
||||
{
|
||||
name: "users.delete",
|
||||
display_name: "Smazat uživatele",
|
||||
module: "users",
|
||||
description: "Mazat uživatele",
|
||||
},
|
||||
|
||||
// Nastavení
|
||||
{
|
||||
name: "settings.company",
|
||||
display_name: "Nastavení společnosti",
|
||||
module: "settings",
|
||||
description: "Upravovat údaje o společnosti, logo",
|
||||
},
|
||||
{
|
||||
name: "settings.system",
|
||||
display_name: "Systémová nastavení",
|
||||
module: "settings",
|
||||
description: "Spravovat systémová nastavení, 2FA, e-maily, limity",
|
||||
},
|
||||
{
|
||||
name: "settings.banking",
|
||||
display_name: "Bankovní účty",
|
||||
module: "settings",
|
||||
description: "Spravovat bankovní účty společnosti",
|
||||
},
|
||||
{
|
||||
name: "settings.roles",
|
||||
display_name: "Role a oprávnění",
|
||||
module: "settings",
|
||||
description: "Spravovat role a přiřazovat oprávnění",
|
||||
},
|
||||
{
|
||||
name: "settings.templates",
|
||||
display_name: "Šablony",
|
||||
module: "settings",
|
||||
description: "Spravovat šablony nabídek a položek",
|
||||
},
|
||||
{
|
||||
name: "settings.audit",
|
||||
display_name: "Audit log",
|
||||
module: "settings",
|
||||
description: "Prohlížet auditní logy",
|
||||
},
|
||||
];
|
||||
|
||||
async function main() {
|
||||
console.log("Seeding permissions...");
|
||||
|
||||
// 1. Clear existing permissions and re-insert current set
|
||||
await prisma.role_permissions.deleteMany({});
|
||||
await prisma.permissions.deleteMany({});
|
||||
console.log(" Cleared old permissions");
|
||||
|
||||
for (const perm of PERMISSIONS) {
|
||||
await prisma.permissions.create({ data: perm });
|
||||
}
|
||||
console.log(` Inserted ${PERMISSIONS.length} permissions`);
|
||||
|
||||
// 2. Ensure admin role exists
|
||||
let adminRole = await prisma.roles.findFirst({ where: { name: "admin" } });
|
||||
if (!adminRole) {
|
||||
adminRole = await prisma.roles.create({
|
||||
data: {
|
||||
name: "admin",
|
||||
display_name: "Administrátor",
|
||||
description: "Hlavní administrátor s plným přístupem",
|
||||
},
|
||||
});
|
||||
console.log(" Created admin role");
|
||||
} else {
|
||||
console.log(" Admin role already exists (id=" + adminRole.id + ")");
|
||||
}
|
||||
|
||||
// 3. Assign all permissions to admin role
|
||||
const allPerms = await prisma.permissions.findMany();
|
||||
const existingAssignments = await prisma.role_permissions.findMany({
|
||||
where: { role_id: adminRole.id },
|
||||
});
|
||||
|
||||
// Delete stale assignments (permissions no longer in the list)
|
||||
const validIds = new Set(allPerms.map((p) => p.id));
|
||||
const staleIds = existingAssignments.filter(
|
||||
(a) => !validIds.has(a.permission_id),
|
||||
);
|
||||
if (staleIds.length > 0) {
|
||||
for (const s of staleIds) {
|
||||
await prisma.role_permissions.delete({
|
||||
where: {
|
||||
role_id_permission_id: {
|
||||
role_id: adminRole.id,
|
||||
permission_id: s.permission_id,
|
||||
},
|
||||
},
|
||||
});
|
||||
}
|
||||
console.log(` Removed ${staleIds.length} stale role_permissions`);
|
||||
}
|
||||
|
||||
// Add missing assignments
|
||||
const existingIds = new Set(existingAssignments.map((a) => a.permission_id));
|
||||
let added = 0;
|
||||
for (const perm of allPerms) {
|
||||
if (!existingIds.has(perm.id)) {
|
||||
await prisma.role_permissions.create({
|
||||
data: { role_id: adminRole.id, permission_id: perm.id },
|
||||
});
|
||||
added++;
|
||||
}
|
||||
}
|
||||
if (added > 0) console.log(` Added ${added} role_permission assignments`);
|
||||
console.log(` Admin role now has all ${allPerms.length} permissions`);
|
||||
|
||||
// 4. Ensure admin user exists
|
||||
let adminUser = await prisma.users.findFirst({
|
||||
where: { username: "admin" },
|
||||
});
|
||||
if (!adminUser) {
|
||||
const hash = bcrypt.hashSync("admin", 10);
|
||||
adminUser = await prisma.users.create({
|
||||
data: {
|
||||
username: "admin",
|
||||
email: "admin@boha.local",
|
||||
password_hash: hash,
|
||||
first_name: "Admin",
|
||||
last_name: "BOHA",
|
||||
role_id: adminRole.id,
|
||||
is_active: true,
|
||||
},
|
||||
});
|
||||
console.log(" Created admin user (admin / admin)");
|
||||
} else if (adminUser.role_id !== adminRole.id) {
|
||||
await prisma.users.update({
|
||||
where: { id: adminUser.id },
|
||||
data: { role_id: adminRole.id },
|
||||
});
|
||||
console.log(" Updated admin user role_id to admin role");
|
||||
} else {
|
||||
console.log(" Admin user already exists with correct role");
|
||||
}
|
||||
|
||||
// 5. Create default company_settings if not exists
|
||||
const existingSettings = await prisma.company_settings.findFirst();
|
||||
if (!existingSettings) {
|
||||
await prisma.company_settings.create({
|
||||
data: {
|
||||
company_name: "BOHA s.r.o.",
|
||||
default_currency: "CZK",
|
||||
default_vat_rate: 21.0,
|
||||
available_vat_rates: JSON.stringify([0, 10, 15, 21]),
|
||||
available_currencies: JSON.stringify(["CZK", "EUR"]),
|
||||
offer_number_pattern: "NAB-{YYYY}-{NNN}",
|
||||
order_number_pattern: "OBJ-{YYYY}-{NNN}",
|
||||
invoice_number_pattern: "FV-{YYYY}-{NNN}",
|
||||
break_threshold_hours: 6.0,
|
||||
break_duration_short: 15,
|
||||
break_duration_long: 30,
|
||||
clock_rounding_minutes: 15,
|
||||
require_2fa: false,
|
||||
max_login_attempts: 5,
|
||||
lockout_minutes: 15,
|
||||
max_requests_per_minute: 300,
|
||||
},
|
||||
});
|
||||
console.log(" Created default company_settings");
|
||||
} else {
|
||||
console.log(" company_settings already exists");
|
||||
}
|
||||
|
||||
// 6. Initialize number_sequences for current year
|
||||
const year = new Date().getFullYear();
|
||||
const types = ["quotation", "order", "invoice"];
|
||||
for (const type of types) {
|
||||
const existing = await prisma.number_sequences.findFirst({
|
||||
where: { type, year },
|
||||
});
|
||||
if (!existing) {
|
||||
await prisma.number_sequences.create({
|
||||
data: { type, year, last_number: 0 },
|
||||
});
|
||||
console.log(` Created number_sequence: ${type}/${year}`);
|
||||
}
|
||||
}
|
||||
console.log(" number_sequences ready");
|
||||
|
||||
console.log(
|
||||
"\nSeed complete — " +
|
||||
PERMISSIONS.length +
|
||||
" permissions, 1 admin role, company_settings + number_sequences ready.",
|
||||
);
|
||||
}
|
||||
|
||||
main()
|
||||
.catch((e) => {
|
||||
console.error("Seed failed:", e);
|
||||
process.exit(1);
|
||||
})
|
||||
.finally(() => prisma.$disconnect());
|
||||
@@ -1,7 +1,9 @@
|
||||
import { lazy, Suspense } from "react";
|
||||
import { Routes, Route } from "react-router-dom";
|
||||
import { QueryClientProvider } from "@tanstack/react-query";
|
||||
import { AuthProvider } from "./context/AuthContext";
|
||||
import { AlertProvider } from "./context/AlertContext";
|
||||
import { queryClient } from "./lib/queryClient";
|
||||
import ErrorBoundary from "./components/ErrorBoundary";
|
||||
import AdminLayout from "./components/AdminLayout";
|
||||
import AlertContainer from "./components/AlertContainer";
|
||||
@@ -14,8 +16,8 @@ import "./buttons.css";
|
||||
import "./layout.css";
|
||||
import "./components.css";
|
||||
import "./tables.css";
|
||||
import "./skeleton.css";
|
||||
import "./datepicker.css";
|
||||
import "./bones/registry";
|
||||
import "./filemanager.css";
|
||||
import "./pagination.css";
|
||||
import "./responsive.css";
|
||||
@@ -46,7 +48,6 @@ const OffersTemplates = lazy(() => import("./pages/OffersTemplates"));
|
||||
const Orders = lazy(() => import("./pages/Orders"));
|
||||
const OrderDetail = lazy(() => import("./pages/OrderDetail"));
|
||||
const Projects = lazy(() => import("./pages/Projects"));
|
||||
const ProjectCreate = lazy(() => import("./pages/ProjectCreate"));
|
||||
const ProjectDetail = lazy(() => import("./pages/ProjectDetail"));
|
||||
const Invoices = lazy(() => import("./pages/Invoices"));
|
||||
const InvoiceDetail = lazy(() => import("./pages/InvoiceDetail"));
|
||||
@@ -58,64 +59,80 @@ export default function AdminApp() {
|
||||
return (
|
||||
<AuthProvider>
|
||||
<AlertProvider>
|
||||
<AlertContainer />
|
||||
<ErrorBoundary>
|
||||
<Suspense
|
||||
fallback={
|
||||
<div className="admin-loading">
|
||||
<div className="admin-spinner" />
|
||||
</div>
|
||||
}
|
||||
>
|
||||
<Routes>
|
||||
<Route path="login" element={<Login />} />
|
||||
<Route element={<AdminLayout />}>
|
||||
<Route index element={<Dashboard />} />
|
||||
<Route path="users" element={<Users />} />
|
||||
<Route path="attendance" element={<Attendance />} />
|
||||
<Route
|
||||
path="attendance/history"
|
||||
element={<AttendanceHistory />}
|
||||
/>
|
||||
<Route path="attendance/admin" element={<AttendanceAdmin />} />
|
||||
<Route
|
||||
path="attendance/balances"
|
||||
element={<AttendanceBalances />}
|
||||
/>
|
||||
<Route path="attendance/requests" element={<LeaveRequests />} />
|
||||
<Route path="attendance/approval" element={<LeaveApproval />} />
|
||||
<Route
|
||||
path="attendance/create"
|
||||
element={<AttendanceCreate />}
|
||||
/>
|
||||
<Route
|
||||
path="attendance/location/:id"
|
||||
element={<AttendanceLocation />}
|
||||
/>
|
||||
<Route path="trips" element={<Trips />} />
|
||||
<Route path="trips/history" element={<TripsHistory />} />
|
||||
<Route path="trips/admin" element={<TripsAdmin />} />
|
||||
<Route path="vehicles" element={<Vehicles />} />
|
||||
<Route path="offers" element={<Offers />} />
|
||||
<Route path="offers/new" element={<OfferDetail />} />
|
||||
<Route path="offers/:id" element={<OfferDetail />} />
|
||||
<Route path="offers/customers" element={<OffersCustomers />} />
|
||||
<Route path="offers/templates" element={<OffersTemplates />} />
|
||||
<Route path="orders" element={<Orders />} />
|
||||
<Route path="orders/:id" element={<OrderDetail />} />
|
||||
<Route path="projects" element={<Projects />} />
|
||||
<Route path="projects/new" element={<ProjectCreate />} />
|
||||
<Route path="projects/:id" element={<ProjectDetail />} />
|
||||
<Route path="invoices" element={<Invoices />} />
|
||||
<Route path="invoices/new" element={<InvoiceDetail />} />
|
||||
<Route path="invoices/:id" element={<InvoiceDetail />} />
|
||||
<Route path="settings" element={<Settings />} />
|
||||
<Route path="audit-log" element={<AuditLog />} />
|
||||
</Route>
|
||||
<Route path="*" element={<NotFound />} />
|
||||
</Routes>
|
||||
</Suspense>
|
||||
</ErrorBoundary>
|
||||
<QueryClientProvider client={queryClient}>
|
||||
<AlertContainer />
|
||||
<ErrorBoundary>
|
||||
<Suspense
|
||||
fallback={
|
||||
<div className="admin-loading">
|
||||
<div className="admin-spinner" />
|
||||
</div>
|
||||
}
|
||||
>
|
||||
<Routes>
|
||||
<Route path="login" element={<Login />} />
|
||||
<Route element={<AdminLayout />}>
|
||||
<Route index element={<Dashboard />} />
|
||||
<Route path="users" element={<Users />} />
|
||||
<Route path="attendance" element={<Attendance />} />
|
||||
<Route
|
||||
path="attendance/history"
|
||||
element={<AttendanceHistory />}
|
||||
/>
|
||||
<Route
|
||||
path="attendance/admin"
|
||||
element={<AttendanceAdmin />}
|
||||
/>
|
||||
<Route
|
||||
path="attendance/balances"
|
||||
element={<AttendanceBalances />}
|
||||
/>
|
||||
<Route
|
||||
path="attendance/requests"
|
||||
element={<LeaveRequests />}
|
||||
/>
|
||||
<Route
|
||||
path="attendance/approval"
|
||||
element={<LeaveApproval />}
|
||||
/>
|
||||
<Route
|
||||
path="attendance/create"
|
||||
element={<AttendanceCreate />}
|
||||
/>
|
||||
<Route
|
||||
path="attendance/location/:id"
|
||||
element={<AttendanceLocation />}
|
||||
/>
|
||||
<Route path="trips" element={<Trips />} />
|
||||
<Route path="trips/history" element={<TripsHistory />} />
|
||||
<Route path="trips/admin" element={<TripsAdmin />} />
|
||||
<Route path="vehicles" element={<Vehicles />} />
|
||||
<Route path="offers" element={<Offers />} />
|
||||
<Route path="offers/new" element={<OfferDetail />} />
|
||||
<Route path="offers/:id" element={<OfferDetail />} />
|
||||
<Route
|
||||
path="offers/customers"
|
||||
element={<OffersCustomers />}
|
||||
/>
|
||||
<Route
|
||||
path="offers/templates"
|
||||
element={<OffersTemplates />}
|
||||
/>
|
||||
<Route path="orders" element={<Orders />} />
|
||||
<Route path="orders/:id" element={<OrderDetail />} />
|
||||
<Route path="projects" element={<Projects />} />
|
||||
<Route path="projects/:id" element={<ProjectDetail />} />
|
||||
<Route path="invoices" element={<Invoices />} />
|
||||
<Route path="invoices/new" element={<InvoiceDetail />} />
|
||||
<Route path="invoices/:id" element={<InvoiceDetail />} />
|
||||
<Route path="settings" element={<Settings />} />
|
||||
<Route path="audit-log" element={<AuditLog />} />
|
||||
</Route>
|
||||
<Route path="*" element={<NotFound />} />
|
||||
</Routes>
|
||||
</Suspense>
|
||||
</ErrorBoundary>
|
||||
</QueryClientProvider>
|
||||
</AlertProvider>
|
||||
</AuthProvider>
|
||||
);
|
||||
|
||||
@@ -330,15 +330,6 @@ img {
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes shimmer {
|
||||
0% {
|
||||
background-position: -200% 0;
|
||||
}
|
||||
100% {
|
||||
background-position: 200% 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* ── Additional Utilities ─────────────────────────────────────────── */
|
||||
|
||||
/* Font sizes */
|
||||
|
||||
1142
src/admin/bones/attendance-balances.bones.json
Normal file
1142
src/admin/bones/attendance-balances.bones.json
Normal file
File diff suppressed because it is too large
Load Diff
263
src/admin/bones/attendance-create.bones.json
Normal file
263
src/admin/bones/attendance-create.bones.json
Normal file
@@ -0,0 +1,263 @@
|
||||
{
|
||||
"breakpoints": {
|
||||
"375": {
|
||||
"name": "attendance-create",
|
||||
"viewportWidth": 351,
|
||||
"width": 351,
|
||||
"height": 403,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
100,
|
||||
22,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
42,
|
||||
100,
|
||||
361,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
55,
|
||||
92.5926,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
83,
|
||||
92.5926,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
127,
|
||||
92.5926,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
156,
|
||||
92.5926,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
200,
|
||||
92.5926,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
229,
|
||||
92.5926,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
273,
|
||||
92.5926,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
302,
|
||||
92.5926,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
346,
|
||||
19.2352,
|
||||
44,
|
||||
8
|
||||
]
|
||||
]
|
||||
},
|
||||
"768": {
|
||||
"name": "attendance-create",
|
||||
"viewportWidth": 736,
|
||||
"width": 736,
|
||||
"height": 420,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
23.3738,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
46,
|
||||
81.5217,
|
||||
373,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
65,
|
||||
76.3587,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
94,
|
||||
76.3587,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
138,
|
||||
76.3587,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
167,
|
||||
76.3587,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
211,
|
||||
76.3587,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
240,
|
||||
76.3587,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
284,
|
||||
76.3587,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
313,
|
||||
76.3587,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
357,
|
||||
9.1733,
|
||||
44,
|
||||
8
|
||||
]
|
||||
]
|
||||
},
|
||||
"1280": {
|
||||
"name": "attendance-create",
|
||||
"viewportWidth": 996,
|
||||
"width": 996,
|
||||
"height": 369,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
17.2722,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
46,
|
||||
60.241,
|
||||
323,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
65,
|
||||
56.4257,
|
||||
19,
|
||||
8
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
93,
|
||||
56.4257,
|
||||
36,
|
||||
8
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
129,
|
||||
56.4257,
|
||||
19,
|
||||
8
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
156,
|
||||
56.4257,
|
||||
36,
|
||||
8
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
192,
|
||||
56.4257,
|
||||
19,
|
||||
8
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
219,
|
||||
56.4257,
|
||||
36,
|
||||
8
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
255,
|
||||
56.4257,
|
||||
19,
|
||||
8
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
282,
|
||||
56.4257,
|
||||
36,
|
||||
8
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
318,
|
||||
6.3771,
|
||||
32,
|
||||
8
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
"_hash": "7c4e446bf97f164a0fba87e2dd7df7d1"
|
||||
}
|
||||
1094
src/admin/bones/attendance-history-fund.bones.json
Normal file
1094
src/admin/bones/attendance-history-fund.bones.json
Normal file
File diff suppressed because it is too large
Load Diff
1094
src/admin/bones/attendance-history-table.bones.json
Normal file
1094
src/admin/bones/attendance-history-table.bones.json
Normal file
File diff suppressed because it is too large
Load Diff
1149
src/admin/bones/audit-log-rows.bones.json
Normal file
1149
src/admin/bones/audit-log-rows.bones.json
Normal file
File diff suppressed because it is too large
Load Diff
506
src/admin/bones/dash-sessions.bones.json
Normal file
506
src/admin/bones/dash-sessions.bones.json
Normal file
@@ -0,0 +1,506 @@
|
||||
{
|
||||
"breakpoints": {
|
||||
"375": {
|
||||
"name": "dash-sessions",
|
||||
"viewportWidth": 341,
|
||||
"width": 341,
|
||||
"height": 304,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
100,
|
||||
304,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
3.8123,
|
||||
17,
|
||||
34.9386,
|
||||
17,
|
||||
8
|
||||
],
|
||||
[
|
||||
59.3383,
|
||||
13,
|
||||
36.8493,
|
||||
37,
|
||||
8
|
||||
],
|
||||
[
|
||||
0.2933,
|
||||
63,
|
||||
99.4135,
|
||||
83,
|
||||
8,
|
||||
true
|
||||
],
|
||||
[
|
||||
4.9853,
|
||||
86,
|
||||
10.5572,
|
||||
36,
|
||||
8,
|
||||
true
|
||||
],
|
||||
[
|
||||
7.6246,
|
||||
95,
|
||||
5.2786,
|
||||
18,
|
||||
"50%"
|
||||
],
|
||||
[
|
||||
63.0407,
|
||||
79,
|
||||
19.5152,
|
||||
27,
|
||||
9999
|
||||
],
|
||||
[
|
||||
19.0616,
|
||||
110,
|
||||
21.6734,
|
||||
19,
|
||||
8
|
||||
],
|
||||
[
|
||||
43.081,
|
||||
110,
|
||||
1.0585,
|
||||
19,
|
||||
8
|
||||
],
|
||||
[
|
||||
46.4855,
|
||||
110,
|
||||
26.8649,
|
||||
19,
|
||||
8
|
||||
],
|
||||
[
|
||||
4.9853,
|
||||
167,
|
||||
10.5572,
|
||||
36,
|
||||
8,
|
||||
true
|
||||
],
|
||||
[
|
||||
7.6246,
|
||||
176,
|
||||
5.2786,
|
||||
18,
|
||||
"50%"
|
||||
],
|
||||
[
|
||||
19.0616,
|
||||
162,
|
||||
75.9531,
|
||||
22,
|
||||
8
|
||||
],
|
||||
[
|
||||
19.0616,
|
||||
189,
|
||||
21.6734,
|
||||
19,
|
||||
8
|
||||
],
|
||||
[
|
||||
43.081,
|
||||
189,
|
||||
1.0585,
|
||||
19,
|
||||
8
|
||||
],
|
||||
[
|
||||
46.4855,
|
||||
189,
|
||||
26.8649,
|
||||
19,
|
||||
8
|
||||
],
|
||||
[
|
||||
4.9853,
|
||||
246,
|
||||
10.5572,
|
||||
36,
|
||||
8,
|
||||
true
|
||||
],
|
||||
[
|
||||
7.6246,
|
||||
255,
|
||||
5.2786,
|
||||
18,
|
||||
"50%"
|
||||
],
|
||||
[
|
||||
19.0616,
|
||||
241,
|
||||
75.9531,
|
||||
22,
|
||||
8
|
||||
],
|
||||
[
|
||||
19.0616,
|
||||
267,
|
||||
21.6734,
|
||||
19,
|
||||
8
|
||||
],
|
||||
[
|
||||
43.081,
|
||||
267,
|
||||
1.0585,
|
||||
19,
|
||||
8
|
||||
],
|
||||
[
|
||||
46.4855,
|
||||
267,
|
||||
26.8649,
|
||||
19,
|
||||
8
|
||||
]
|
||||
]
|
||||
},
|
||||
"768": {
|
||||
"name": "dash-sessions",
|
||||
"viewportWidth": 726,
|
||||
"width": 726,
|
||||
"height": 319,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
100,
|
||||
319,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
2.6171,
|
||||
19,
|
||||
16.4106,
|
||||
17,
|
||||
8
|
||||
],
|
||||
[
|
||||
80.0749,
|
||||
15,
|
||||
17.308,
|
||||
37,
|
||||
8
|
||||
],
|
||||
[
|
||||
0.1377,
|
||||
67,
|
||||
99.7245,
|
||||
85,
|
||||
8,
|
||||
true
|
||||
],
|
||||
[
|
||||
3.4435,
|
||||
89,
|
||||
5.5096,
|
||||
40,
|
||||
8,
|
||||
true
|
||||
],
|
||||
[
|
||||
4.9587,
|
||||
100,
|
||||
2.4793,
|
||||
18,
|
||||
"50%"
|
||||
],
|
||||
[
|
||||
34.5278,
|
||||
83,
|
||||
9.1662,
|
||||
27,
|
||||
9999
|
||||
],
|
||||
[
|
||||
11.157,
|
||||
114,
|
||||
11.0279,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
23.2868,
|
||||
114,
|
||||
0.5381,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
24.9268,
|
||||
114,
|
||||
13.6686,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
3.4435,
|
||||
173,
|
||||
5.5096,
|
||||
40,
|
||||
8,
|
||||
true
|
||||
],
|
||||
[
|
||||
4.9587,
|
||||
184,
|
||||
2.4793,
|
||||
18,
|
||||
"50%"
|
||||
],
|
||||
[
|
||||
11.157,
|
||||
168,
|
||||
85.3994,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
11.157,
|
||||
198,
|
||||
11.0279,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
23.2868,
|
||||
198,
|
||||
0.5381,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
24.9268,
|
||||
198,
|
||||
13.6686,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
3.4435,
|
||||
257,
|
||||
5.5096,
|
||||
40,
|
||||
8,
|
||||
true
|
||||
],
|
||||
[
|
||||
4.9587,
|
||||
268,
|
||||
2.4793,
|
||||
18,
|
||||
"50%"
|
||||
],
|
||||
[
|
||||
11.157,
|
||||
251,
|
||||
85.3994,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
11.157,
|
||||
281,
|
||||
11.0279,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
23.2868,
|
||||
281,
|
||||
0.5381,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
24.9268,
|
||||
281,
|
||||
13.6686,
|
||||
21,
|
||||
8
|
||||
]
|
||||
]
|
||||
},
|
||||
"1280": {
|
||||
"name": "dash-sessions",
|
||||
"viewportWidth": 484,
|
||||
"width": 484,
|
||||
"height": 309,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
100,
|
||||
309,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
3.9256,
|
||||
15,
|
||||
24.6158,
|
||||
17,
|
||||
8
|
||||
],
|
||||
[
|
||||
72.1785,
|
||||
15,
|
||||
23.8959,
|
||||
29,
|
||||
8
|
||||
],
|
||||
[
|
||||
0.2066,
|
||||
59,
|
||||
99.5868,
|
||||
83,
|
||||
8,
|
||||
true
|
||||
],
|
||||
[
|
||||
5.1653,
|
||||
80,
|
||||
8.2645,
|
||||
40,
|
||||
8,
|
||||
true
|
||||
],
|
||||
[
|
||||
7.438,
|
||||
91,
|
||||
3.719,
|
||||
18,
|
||||
"50%"
|
||||
],
|
||||
[
|
||||
51.7917,
|
||||
76,
|
||||
12.9358,
|
||||
24,
|
||||
9999
|
||||
],
|
||||
[
|
||||
16.7355,
|
||||
105,
|
||||
16.5418,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
34.9303,
|
||||
105,
|
||||
0.8071,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
37.3902,
|
||||
105,
|
||||
20.503,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
5.1653,
|
||||
164,
|
||||
8.2645,
|
||||
40,
|
||||
8,
|
||||
true
|
||||
],
|
||||
[
|
||||
7.438,
|
||||
175,
|
||||
3.719,
|
||||
18,
|
||||
"50%"
|
||||
],
|
||||
[
|
||||
16.7355,
|
||||
158,
|
||||
78.0992,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
16.7355,
|
||||
188,
|
||||
16.5418,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
34.9303,
|
||||
188,
|
||||
0.8071,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
37.3902,
|
||||
188,
|
||||
20.503,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
5.1653,
|
||||
247,
|
||||
8.2645,
|
||||
40,
|
||||
8,
|
||||
true
|
||||
],
|
||||
[
|
||||
7.438,
|
||||
258,
|
||||
3.719,
|
||||
18,
|
||||
"50%"
|
||||
],
|
||||
[
|
||||
16.7355,
|
||||
242,
|
||||
78.0992,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
16.7355,
|
||||
271,
|
||||
16.5418,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
34.9303,
|
||||
271,
|
||||
0.8071,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
37.3902,
|
||||
271,
|
||||
20.503,
|
||||
21,
|
||||
8
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
"_hash": "e057ca7b36a30c5971a4225ec3ad4680"
|
||||
}
|
||||
707
src/admin/bones/invoice-detail.bones.json
Normal file
707
src/admin/bones/invoice-detail.bones.json
Normal file
@@ -0,0 +1,707 @@
|
||||
{
|
||||
"breakpoints": {
|
||||
"375": {
|
||||
"name": "invoice-detail",
|
||||
"viewportWidth": 351,
|
||||
"width": 351,
|
||||
"height": 466,
|
||||
"bones": [
|
||||
[
|
||||
3.4188,
|
||||
12,
|
||||
5.698,
|
||||
20,
|
||||
"50%"
|
||||
],
|
||||
[
|
||||
14.8148,
|
||||
9,
|
||||
30.0881,
|
||||
22,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
52,
|
||||
30.6713,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
34.0901,
|
||||
52,
|
||||
31.2455,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
68.7545,
|
||||
52,
|
||||
31.2455,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
112,
|
||||
100,
|
||||
152,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
125,
|
||||
44.0171,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
154,
|
||||
44.0171,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
52.2792,
|
||||
125,
|
||||
44.0171,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
52.2792,
|
||||
154,
|
||||
44.0171,
|
||||
27,
|
||||
9999
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
197,
|
||||
44.0171,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
226,
|
||||
44.0171,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
52.2792,
|
||||
197,
|
||||
44.0171,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
52.2792,
|
||||
226,
|
||||
44.0171,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
280,
|
||||
100,
|
||||
186,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
293,
|
||||
92.5926,
|
||||
17,
|
||||
8
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
322,
|
||||
33.3066,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
37.0103,
|
||||
322,
|
||||
35.1718,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
72.1822,
|
||||
322,
|
||||
36.9836,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
109.1658,
|
||||
322,
|
||||
36.9881,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
353,
|
||||
33.3066,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
37.0103,
|
||||
353,
|
||||
35.1718,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
72.1822,
|
||||
353,
|
||||
36.9836,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
109.1658,
|
||||
353,
|
||||
36.9881,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
387,
|
||||
33.3066,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
37.0103,
|
||||
387,
|
||||
35.1718,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
72.1822,
|
||||
387,
|
||||
36.9836,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
109.1658,
|
||||
387,
|
||||
36.9881,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
420,
|
||||
33.3066,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
37.0103,
|
||||
420,
|
||||
35.1718,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
72.1822,
|
||||
420,
|
||||
36.9836,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
109.1658,
|
||||
420,
|
||||
36.9881,
|
||||
33,
|
||||
0
|
||||
]
|
||||
]
|
||||
},
|
||||
"768": {
|
||||
"name": "invoice-detail",
|
||||
"viewportWidth": 736,
|
||||
"width": 736,
|
||||
"height": 444,
|
||||
"bones": [
|
||||
[
|
||||
1.6304,
|
||||
12,
|
||||
2.7174,
|
||||
20,
|
||||
"50%"
|
||||
],
|
||||
[
|
||||
7.0652,
|
||||
7,
|
||||
17.5378,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
62.9692,
|
||||
0,
|
||||
9.1733,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
73.7729,
|
||||
0,
|
||||
13.6379,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
89.0413,
|
||||
0,
|
||||
10.9587,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
60,
|
||||
100,
|
||||
164,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
79,
|
||||
46.3315,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
108,
|
||||
46.3315,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
51.087,
|
||||
79,
|
||||
46.3315,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
51.087,
|
||||
108,
|
||||
46.3315,
|
||||
27,
|
||||
9999
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
151,
|
||||
46.3315,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
180,
|
||||
46.3315,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
51.087,
|
||||
151,
|
||||
46.3315,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
51.087,
|
||||
180,
|
||||
46.3315,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
240,
|
||||
100,
|
||||
204,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
259,
|
||||
94.837,
|
||||
17,
|
||||
8
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
288,
|
||||
22.3803,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
24.9618,
|
||||
288,
|
||||
23.5882,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
48.55,
|
||||
288,
|
||||
24.431,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
72.9811,
|
||||
288,
|
||||
24.4374,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
321,
|
||||
22.3803,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
24.9618,
|
||||
321,
|
||||
23.5882,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
48.55,
|
||||
321,
|
||||
24.431,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
72.9811,
|
||||
321,
|
||||
24.4374,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
356,
|
||||
22.3803,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
24.9618,
|
||||
356,
|
||||
23.5882,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
48.55,
|
||||
356,
|
||||
24.431,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
72.9811,
|
||||
356,
|
||||
24.4374,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
391,
|
||||
22.3803,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
24.9618,
|
||||
391,
|
||||
23.5882,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
48.55,
|
||||
391,
|
||||
24.431,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
72.9811,
|
||||
391,
|
||||
24.4374,
|
||||
35,
|
||||
0
|
||||
]
|
||||
]
|
||||
},
|
||||
"1280": {
|
||||
"name": "invoice-detail",
|
||||
"viewportWidth": 996,
|
||||
"width": 996,
|
||||
"height": 457,
|
||||
"bones": [
|
||||
[
|
||||
0.6024,
|
||||
7,
|
||||
2.008,
|
||||
20,
|
||||
"50%"
|
||||
],
|
||||
[
|
||||
4.0161,
|
||||
2,
|
||||
12.9597,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
73.8407,
|
||||
0,
|
||||
6.3771,
|
||||
34,
|
||||
8
|
||||
],
|
||||
[
|
||||
81.4226,
|
||||
0,
|
||||
9.6762,
|
||||
34,
|
||||
8
|
||||
],
|
||||
[
|
||||
92.3036,
|
||||
0,
|
||||
7.6964,
|
||||
34,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
50,
|
||||
100,
|
||||
160,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
69,
|
||||
47.2892,
|
||||
19,
|
||||
8
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
96,
|
||||
47.2892,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
50.8032,
|
||||
69,
|
||||
47.2892,
|
||||
19,
|
||||
8
|
||||
],
|
||||
[
|
||||
50.8032,
|
||||
96,
|
||||
47.2892,
|
||||
24,
|
||||
9999
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
138,
|
||||
47.2892,
|
||||
19,
|
||||
8
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
165,
|
||||
47.2892,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
50.8032,
|
||||
138,
|
||||
47.2892,
|
||||
19,
|
||||
8
|
||||
],
|
||||
[
|
||||
50.8032,
|
||||
165,
|
||||
47.2892,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
226,
|
||||
100,
|
||||
232,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
245,
|
||||
96.1847,
|
||||
17,
|
||||
8
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
273,
|
||||
22.9606,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
24.8682,
|
||||
273,
|
||||
24.065,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
48.9332,
|
||||
273,
|
||||
24.578,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
73.5112,
|
||||
273,
|
||||
24.5811,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
311,
|
||||
22.9606,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
24.8682,
|
||||
311,
|
||||
24.065,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
48.9332,
|
||||
311,
|
||||
24.578,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
73.5112,
|
||||
311,
|
||||
24.5811,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
354,
|
||||
22.9606,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
24.8682,
|
||||
354,
|
||||
24.065,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
48.9332,
|
||||
354,
|
||||
24.578,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
73.5112,
|
||||
354,
|
||||
24.5811,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
396,
|
||||
22.9606,
|
||||
42,
|
||||
0
|
||||
],
|
||||
[
|
||||
24.8682,
|
||||
396,
|
||||
24.065,
|
||||
42,
|
||||
0
|
||||
],
|
||||
[
|
||||
48.9332,
|
||||
396,
|
||||
24.578,
|
||||
42,
|
||||
0
|
||||
],
|
||||
[
|
||||
73.5112,
|
||||
396,
|
||||
24.5811,
|
||||
42,
|
||||
0
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
"_hash": "934452d45a0bef9320dc379fb3f43bb5"
|
||||
}
|
||||
599
src/admin/bones/leave-approval.bones.json
Normal file
599
src/admin/bones/leave-approval.bones.json
Normal file
@@ -0,0 +1,599 @@
|
||||
{
|
||||
"breakpoints": {
|
||||
"375": {
|
||||
"name": "leave-approval",
|
||||
"viewportWidth": 351,
|
||||
"width": 351,
|
||||
"height": 294,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
100,
|
||||
22,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
26,
|
||||
100,
|
||||
19,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
61,
|
||||
100,
|
||||
233,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
74,
|
||||
19.2753,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
22.979,
|
||||
74,
|
||||
18.7812,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
41.7601,
|
||||
74,
|
||||
23.0502,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
64.8104,
|
||||
74,
|
||||
23.0502,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
87.8606,
|
||||
74,
|
||||
9.4373,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
97.2979,
|
||||
74,
|
||||
54.4471,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
105,
|
||||
19.2753,
|
||||
54,
|
||||
0
|
||||
],
|
||||
[
|
||||
22.979,
|
||||
105,
|
||||
18.7812,
|
||||
54,
|
||||
0
|
||||
],
|
||||
[
|
||||
41.7601,
|
||||
105,
|
||||
23.0502,
|
||||
54,
|
||||
0
|
||||
],
|
||||
[
|
||||
64.8104,
|
||||
105,
|
||||
23.0502,
|
||||
54,
|
||||
0
|
||||
],
|
||||
[
|
||||
87.8606,
|
||||
105,
|
||||
9.4373,
|
||||
54,
|
||||
0
|
||||
],
|
||||
[
|
||||
97.2979,
|
||||
105,
|
||||
54.4471,
|
||||
54,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
159,
|
||||
19.2753,
|
||||
54,
|
||||
0
|
||||
],
|
||||
[
|
||||
22.979,
|
||||
159,
|
||||
18.7812,
|
||||
54,
|
||||
0
|
||||
],
|
||||
[
|
||||
41.7601,
|
||||
159,
|
||||
23.0502,
|
||||
54,
|
||||
0
|
||||
],
|
||||
[
|
||||
64.8104,
|
||||
159,
|
||||
23.0502,
|
||||
54,
|
||||
0
|
||||
],
|
||||
[
|
||||
87.8606,
|
||||
159,
|
||||
9.4373,
|
||||
54,
|
||||
0
|
||||
],
|
||||
[
|
||||
97.2979,
|
||||
159,
|
||||
54.4471,
|
||||
54,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
213,
|
||||
19.2753,
|
||||
54,
|
||||
0
|
||||
],
|
||||
[
|
||||
22.979,
|
||||
213,
|
||||
18.7812,
|
||||
54,
|
||||
0
|
||||
],
|
||||
[
|
||||
41.7601,
|
||||
213,
|
||||
23.0502,
|
||||
54,
|
||||
0
|
||||
],
|
||||
[
|
||||
64.8104,
|
||||
213,
|
||||
23.0502,
|
||||
54,
|
||||
0
|
||||
],
|
||||
[
|
||||
87.8606,
|
||||
213,
|
||||
9.4373,
|
||||
54,
|
||||
0
|
||||
],
|
||||
[
|
||||
97.2979,
|
||||
213,
|
||||
54.4471,
|
||||
54,
|
||||
0
|
||||
]
|
||||
]
|
||||
},
|
||||
"768": {
|
||||
"name": "leave-approval",
|
||||
"viewportWidth": 736,
|
||||
"width": 736,
|
||||
"height": 299,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
29.4264,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
30,
|
||||
29.4264,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
67,
|
||||
100,
|
||||
232,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
86,
|
||||
12.6911,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
15.2726,
|
||||
86,
|
||||
12.3769,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
27.6495,
|
||||
86,
|
||||
15.0921,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
42.7416,
|
||||
86,
|
||||
15.0921,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
57.8337,
|
||||
86,
|
||||
6.4856,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
64.3194,
|
||||
86,
|
||||
33.0991,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
119,
|
||||
12.6911,
|
||||
54,
|
||||
0
|
||||
],
|
||||
[
|
||||
15.2726,
|
||||
119,
|
||||
12.3769,
|
||||
54,
|
||||
0
|
||||
],
|
||||
[
|
||||
27.6495,
|
||||
119,
|
||||
15.0921,
|
||||
54,
|
||||
0
|
||||
],
|
||||
[
|
||||
42.7416,
|
||||
119,
|
||||
15.0921,
|
||||
54,
|
||||
0
|
||||
],
|
||||
[
|
||||
57.8337,
|
||||
119,
|
||||
6.4856,
|
||||
54,
|
||||
0
|
||||
],
|
||||
[
|
||||
64.3194,
|
||||
119,
|
||||
33.0991,
|
||||
54,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
173,
|
||||
12.6911,
|
||||
54,
|
||||
0
|
||||
],
|
||||
[
|
||||
15.2726,
|
||||
173,
|
||||
12.3769,
|
||||
54,
|
||||
0
|
||||
],
|
||||
[
|
||||
27.6495,
|
||||
173,
|
||||
15.0921,
|
||||
54,
|
||||
0
|
||||
],
|
||||
[
|
||||
42.7416,
|
||||
173,
|
||||
15.0921,
|
||||
54,
|
||||
0
|
||||
],
|
||||
[
|
||||
57.8337,
|
||||
173,
|
||||
6.4856,
|
||||
54,
|
||||
0
|
||||
],
|
||||
[
|
||||
64.3194,
|
||||
173,
|
||||
33.0991,
|
||||
54,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
227,
|
||||
12.6911,
|
||||
54,
|
||||
0
|
||||
],
|
||||
[
|
||||
15.2726,
|
||||
227,
|
||||
12.3769,
|
||||
54,
|
||||
0
|
||||
],
|
||||
[
|
||||
27.6495,
|
||||
227,
|
||||
15.0921,
|
||||
54,
|
||||
0
|
||||
],
|
||||
[
|
||||
42.7416,
|
||||
227,
|
||||
15.0921,
|
||||
54,
|
||||
0
|
||||
],
|
||||
[
|
||||
57.8337,
|
||||
227,
|
||||
6.4856,
|
||||
54,
|
||||
0
|
||||
],
|
||||
[
|
||||
64.3194,
|
||||
227,
|
||||
33.0991,
|
||||
54,
|
||||
0
|
||||
]
|
||||
]
|
||||
},
|
||||
"1280": {
|
||||
"name": "leave-approval",
|
||||
"viewportWidth": 996,
|
||||
"width": 996,
|
||||
"height": 299,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
21.7448,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
30,
|
||||
21.7448,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
67,
|
||||
100,
|
||||
232,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
86,
|
||||
13.8664,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
15.774,
|
||||
86,
|
||||
13.5589,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
29.333,
|
||||
86,
|
||||
16.196,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
45.529,
|
||||
86,
|
||||
16.196,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
61.725,
|
||||
86,
|
||||
7.8878,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
69.6128,
|
||||
86,
|
||||
28.4795,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
124,
|
||||
13.8664,
|
||||
52,
|
||||
0
|
||||
],
|
||||
[
|
||||
15.774,
|
||||
124,
|
||||
13.5589,
|
||||
52,
|
||||
0
|
||||
],
|
||||
[
|
||||
29.333,
|
||||
124,
|
||||
16.196,
|
||||
52,
|
||||
0
|
||||
],
|
||||
[
|
||||
45.529,
|
||||
124,
|
||||
16.196,
|
||||
52,
|
||||
0
|
||||
],
|
||||
[
|
||||
61.725,
|
||||
124,
|
||||
7.8878,
|
||||
52,
|
||||
0
|
||||
],
|
||||
[
|
||||
69.6128,
|
||||
124,
|
||||
28.4795,
|
||||
52,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
176,
|
||||
13.8664,
|
||||
52,
|
||||
0
|
||||
],
|
||||
[
|
||||
15.774,
|
||||
176,
|
||||
13.5589,
|
||||
52,
|
||||
0
|
||||
],
|
||||
[
|
||||
29.333,
|
||||
176,
|
||||
16.196,
|
||||
52,
|
||||
0
|
||||
],
|
||||
[
|
||||
45.529,
|
||||
176,
|
||||
16.196,
|
||||
52,
|
||||
0
|
||||
],
|
||||
[
|
||||
61.725,
|
||||
176,
|
||||
7.8878,
|
||||
52,
|
||||
0
|
||||
],
|
||||
[
|
||||
69.6128,
|
||||
176,
|
||||
28.4795,
|
||||
52,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
228,
|
||||
13.8664,
|
||||
52,
|
||||
0
|
||||
],
|
||||
[
|
||||
15.774,
|
||||
228,
|
||||
13.5589,
|
||||
52,
|
||||
0
|
||||
],
|
||||
[
|
||||
29.333,
|
||||
228,
|
||||
16.196,
|
||||
52,
|
||||
0
|
||||
],
|
||||
[
|
||||
45.529,
|
||||
228,
|
||||
16.196,
|
||||
52,
|
||||
0
|
||||
],
|
||||
[
|
||||
61.725,
|
||||
228,
|
||||
7.8878,
|
||||
52,
|
||||
0
|
||||
],
|
||||
[
|
||||
69.6128,
|
||||
228,
|
||||
28.4795,
|
||||
52,
|
||||
0
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
"_hash": "4b74917f659334073252a738cfa9c4ac"
|
||||
}
|
||||
704
src/admin/bones/leave-requests.bones.json
Normal file
704
src/admin/bones/leave-requests.bones.json
Normal file
@@ -0,0 +1,704 @@
|
||||
{
|
||||
"breakpoints": {
|
||||
"375": {
|
||||
"name": "leave-requests",
|
||||
"viewportWidth": 351,
|
||||
"width": 351,
|
||||
"height": 367,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
100,
|
||||
22,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
26,
|
||||
100,
|
||||
19,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
53,
|
||||
100,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
113,
|
||||
100,
|
||||
254,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
126,
|
||||
21.1806,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
24.8843,
|
||||
126,
|
||||
20.6375,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
45.5217,
|
||||
126,
|
||||
25.3294,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
70.8511,
|
||||
126,
|
||||
25.3294,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
96.1806,
|
||||
126,
|
||||
10.3677,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
106.5483,
|
||||
126,
|
||||
20.7977,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
127.346,
|
||||
126,
|
||||
18.8079,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
157,
|
||||
21.1806,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
24.8843,
|
||||
157,
|
||||
20.6375,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
45.5217,
|
||||
157,
|
||||
25.3294,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
70.8511,
|
||||
157,
|
||||
25.3294,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
96.1806,
|
||||
157,
|
||||
10.3677,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
106.5483,
|
||||
157,
|
||||
20.7977,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
127.346,
|
||||
157,
|
||||
18.8079,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
218,
|
||||
21.1806,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
24.8843,
|
||||
218,
|
||||
20.6375,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
45.5217,
|
||||
218,
|
||||
25.3294,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
70.8511,
|
||||
218,
|
||||
25.3294,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
96.1806,
|
||||
218,
|
||||
10.3677,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
106.5483,
|
||||
218,
|
||||
20.7977,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
127.346,
|
||||
218,
|
||||
18.8079,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
279,
|
||||
21.1806,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
24.8843,
|
||||
279,
|
||||
20.6375,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
45.5217,
|
||||
279,
|
||||
25.3294,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
70.8511,
|
||||
279,
|
||||
25.3294,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
96.1806,
|
||||
279,
|
||||
10.3677,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
106.5483,
|
||||
279,
|
||||
20.7977,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
127.346,
|
||||
279,
|
||||
18.8079,
|
||||
61,
|
||||
0
|
||||
]
|
||||
]
|
||||
},
|
||||
"768": {
|
||||
"name": "leave-requests",
|
||||
"viewportWidth": 736,
|
||||
"width": 736,
|
||||
"height": 320,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
27.1888,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
30,
|
||||
27.1888,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
83.6914,
|
||||
4,
|
||||
16.3086,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
67,
|
||||
100,
|
||||
253,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
86,
|
||||
14.313,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
16.8945,
|
||||
86,
|
||||
13.9585,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
30.853,
|
||||
86,
|
||||
17.0219,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.8749,
|
||||
86,
|
||||
17.0219,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
64.8968,
|
||||
86,
|
||||
7.3157,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
72.2126,
|
||||
86,
|
||||
13.2006,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
85.4131,
|
||||
86,
|
||||
12.0053,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
119,
|
||||
14.313,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
16.8945,
|
||||
119,
|
||||
13.9585,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
30.853,
|
||||
119,
|
||||
17.0219,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.8749,
|
||||
119,
|
||||
17.0219,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
64.8968,
|
||||
119,
|
||||
7.3157,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
72.2126,
|
||||
119,
|
||||
13.2006,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
85.4131,
|
||||
119,
|
||||
12.0053,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
180,
|
||||
14.313,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
16.8945,
|
||||
180,
|
||||
13.9585,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
30.853,
|
||||
180,
|
||||
17.0219,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.8749,
|
||||
180,
|
||||
17.0219,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
64.8968,
|
||||
180,
|
||||
7.3157,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
72.2126,
|
||||
180,
|
||||
13.2006,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
85.4131,
|
||||
180,
|
||||
12.0053,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
241,
|
||||
14.313,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
16.8945,
|
||||
241,
|
||||
13.9585,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
30.853,
|
||||
241,
|
||||
17.0219,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.8749,
|
||||
241,
|
||||
17.0219,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
64.8968,
|
||||
241,
|
||||
7.3157,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
72.2126,
|
||||
241,
|
||||
13.2006,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
85.4131,
|
||||
241,
|
||||
12.0053,
|
||||
61,
|
||||
0
|
||||
]
|
||||
]
|
||||
},
|
||||
"1280": {
|
||||
"name": "leave-requests",
|
||||
"viewportWidth": 996,
|
||||
"width": 996,
|
||||
"height": 308,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
20.0913,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
30,
|
||||
20.0913,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
88.3503,
|
||||
10,
|
||||
11.6497,
|
||||
32,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
67,
|
||||
100,
|
||||
241,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
86,
|
||||
14.9787,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
16.8863,
|
||||
86,
|
||||
14.6461,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
31.5324,
|
||||
86,
|
||||
17.495,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
49.0274,
|
||||
86,
|
||||
17.495,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
66.5223,
|
||||
86,
|
||||
8.52,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
75.0424,
|
||||
86,
|
||||
12.74,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
87.7824,
|
||||
86,
|
||||
10.31,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
124,
|
||||
14.9787,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
16.8863,
|
||||
124,
|
||||
14.6461,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
31.5324,
|
||||
124,
|
||||
17.495,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
49.0274,
|
||||
124,
|
||||
17.495,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
66.5223,
|
||||
124,
|
||||
8.52,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
75.0424,
|
||||
124,
|
||||
12.74,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
87.7824,
|
||||
124,
|
||||
10.31,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
179,
|
||||
14.9787,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
16.8863,
|
||||
179,
|
||||
14.6461,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
31.5324,
|
||||
179,
|
||||
17.495,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
49.0274,
|
||||
179,
|
||||
17.495,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
66.5223,
|
||||
179,
|
||||
8.52,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
75.0424,
|
||||
179,
|
||||
12.74,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
87.7824,
|
||||
179,
|
||||
10.31,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
234,
|
||||
14.9787,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
16.8863,
|
||||
234,
|
||||
14.6461,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
31.5324,
|
||||
234,
|
||||
17.495,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
49.0274,
|
||||
234,
|
||||
17.495,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
66.5223,
|
||||
234,
|
||||
8.52,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
75.0424,
|
||||
234,
|
||||
12.74,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
87.7824,
|
||||
234,
|
||||
10.31,
|
||||
55,
|
||||
0
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
"_hash": "125231cbf4c6abc4e73bb48732dc9353"
|
||||
}
|
||||
620
src/admin/bones/offer-detail.bones.json
Normal file
620
src/admin/bones/offer-detail.bones.json
Normal file
@@ -0,0 +1,620 @@
|
||||
{
|
||||
"breakpoints": {
|
||||
"375": {
|
||||
"name": "offer-detail",
|
||||
"viewportWidth": 351,
|
||||
"width": 351,
|
||||
"height": 483,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
12.5356,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
52,
|
||||
100,
|
||||
22,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
86,
|
||||
100,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
146,
|
||||
100,
|
||||
338,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
159,
|
||||
44.0171,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
187,
|
||||
44.0171,
|
||||
46,
|
||||
8
|
||||
],
|
||||
[
|
||||
52.2792,
|
||||
159,
|
||||
44.0171,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
52.2792,
|
||||
187,
|
||||
44.0171,
|
||||
46,
|
||||
8
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
249,
|
||||
44.0171,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
278,
|
||||
44.0171,
|
||||
46,
|
||||
8
|
||||
],
|
||||
[
|
||||
52.2792,
|
||||
249,
|
||||
44.0171,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
52.2792,
|
||||
278,
|
||||
44.0171,
|
||||
46,
|
||||
8
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
339,
|
||||
34.4062,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
38.1099,
|
||||
339,
|
||||
34.8157,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
72.9256,
|
||||
339,
|
||||
36.6097,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
109.5353,
|
||||
339,
|
||||
36.6186,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
370,
|
||||
34.4062,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
38.1099,
|
||||
370,
|
||||
34.8157,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
72.9256,
|
||||
370,
|
||||
36.6097,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
109.5353,
|
||||
370,
|
||||
36.6186,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
404,
|
||||
34.4062,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
38.1099,
|
||||
404,
|
||||
34.8157,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
72.9256,
|
||||
404,
|
||||
36.6097,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
109.5353,
|
||||
404,
|
||||
36.6186,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
437,
|
||||
34.4062,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
38.1099,
|
||||
437,
|
||||
34.8157,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
72.9256,
|
||||
437,
|
||||
36.6097,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
109.5353,
|
||||
437,
|
||||
36.6186,
|
||||
33,
|
||||
0
|
||||
]
|
||||
]
|
||||
},
|
||||
"768": {
|
||||
"name": "offer-detail",
|
||||
"viewportWidth": 736,
|
||||
"width": 736,
|
||||
"height": 416,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
5.9783,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
38.4829,
|
||||
7,
|
||||
19.8412,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
90.8267,
|
||||
0,
|
||||
9.1733,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
60,
|
||||
100,
|
||||
356,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
79,
|
||||
46.3315,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
108,
|
||||
46.3315,
|
||||
46,
|
||||
8
|
||||
],
|
||||
[
|
||||
51.087,
|
||||
79,
|
||||
46.3315,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
51.087,
|
||||
108,
|
||||
46.3315,
|
||||
46,
|
||||
8
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
169,
|
||||
46.3315,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
198,
|
||||
46.3315,
|
||||
46,
|
||||
8
|
||||
],
|
||||
[
|
||||
51.087,
|
||||
169,
|
||||
46.3315,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
51.087,
|
||||
198,
|
||||
46.3315,
|
||||
46,
|
||||
8
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
260,
|
||||
22.8558,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
25.4373,
|
||||
260,
|
||||
23.4333,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
48.8706,
|
||||
260,
|
||||
24.2718,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
73.1424,
|
||||
260,
|
||||
24.2761,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
292,
|
||||
22.8558,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
25.4373,
|
||||
292,
|
||||
23.4333,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
48.8706,
|
||||
292,
|
||||
24.2718,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
73.1424,
|
||||
292,
|
||||
24.2761,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
327,
|
||||
22.8558,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
25.4373,
|
||||
327,
|
||||
23.4333,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
48.8706,
|
||||
327,
|
||||
24.2718,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
73.1424,
|
||||
327,
|
||||
24.2761,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
362,
|
||||
22.8558,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
25.4373,
|
||||
362,
|
||||
23.4333,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
48.8706,
|
||||
362,
|
||||
24.2718,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
73.1424,
|
||||
362,
|
||||
24.2761,
|
||||
35,
|
||||
0
|
||||
]
|
||||
]
|
||||
},
|
||||
"1280": {
|
||||
"name": "offer-detail",
|
||||
"viewportWidth": 996,
|
||||
"width": 996,
|
||||
"height": 419,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
3.2129,
|
||||
32,
|
||||
8
|
||||
],
|
||||
[
|
||||
41.0878,
|
||||
1,
|
||||
14.6618,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
93.6229,
|
||||
0,
|
||||
6.3771,
|
||||
32,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
48,
|
||||
100,
|
||||
371,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
67,
|
||||
47.2892,
|
||||
19,
|
||||
8
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
94,
|
||||
47.2892,
|
||||
41,
|
||||
8
|
||||
],
|
||||
[
|
||||
50.8032,
|
||||
67,
|
||||
47.2892,
|
||||
19,
|
||||
8
|
||||
],
|
||||
[
|
||||
50.8032,
|
||||
94,
|
||||
47.2892,
|
||||
41,
|
||||
8
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
151,
|
||||
47.2892,
|
||||
19,
|
||||
8
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
178,
|
||||
47.2892,
|
||||
41,
|
||||
8
|
||||
],
|
||||
[
|
||||
50.8032,
|
||||
151,
|
||||
47.2892,
|
||||
19,
|
||||
8
|
||||
],
|
||||
[
|
||||
50.8032,
|
||||
178,
|
||||
47.2892,
|
||||
41,
|
||||
8
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
235,
|
||||
23.2194,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
25.1271,
|
||||
235,
|
||||
23.9787,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
49.1058,
|
||||
235,
|
||||
24.4917,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
73.5975,
|
||||
235,
|
||||
24.4949,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
273,
|
||||
23.2194,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
25.1271,
|
||||
273,
|
||||
23.9787,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
49.1058,
|
||||
273,
|
||||
24.4917,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
73.5975,
|
||||
273,
|
||||
24.4949,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
316,
|
||||
23.2194,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
25.1271,
|
||||
316,
|
||||
23.9787,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
49.1058,
|
||||
316,
|
||||
24.4917,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
73.5975,
|
||||
316,
|
||||
24.4949,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
358,
|
||||
23.2194,
|
||||
42,
|
||||
0
|
||||
],
|
||||
[
|
||||
25.1271,
|
||||
358,
|
||||
23.9787,
|
||||
42,
|
||||
0
|
||||
],
|
||||
[
|
||||
49.1058,
|
||||
358,
|
||||
24.4917,
|
||||
42,
|
||||
0
|
||||
],
|
||||
[
|
||||
73.5975,
|
||||
358,
|
||||
24.4949,
|
||||
42,
|
||||
0
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
"_hash": "67676fde7dd5c432922d819fc9bf48db"
|
||||
}
|
||||
641
src/admin/bones/offers-customers.bones.json
Normal file
641
src/admin/bones/offers-customers.bones.json
Normal file
@@ -0,0 +1,641 @@
|
||||
{
|
||||
"breakpoints": {
|
||||
"375": {
|
||||
"name": "offers-customers",
|
||||
"viewportWidth": 351,
|
||||
"width": 351,
|
||||
"height": 549,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
100,
|
||||
22,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
26,
|
||||
100,
|
||||
19,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
53,
|
||||
100,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
113,
|
||||
100,
|
||||
436,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
126,
|
||||
92.5926,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
186,
|
||||
34.562,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
38.2657,
|
||||
186,
|
||||
23.7936,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
62.0593,
|
||||
186,
|
||||
32.4653,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
94.5246,
|
||||
186,
|
||||
51.6293,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
217,
|
||||
34.562,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
38.2657,
|
||||
217,
|
||||
23.7936,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
62.0593,
|
||||
217,
|
||||
32.4653,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
94.5246,
|
||||
217,
|
||||
51.6293,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
278,
|
||||
34.562,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
38.2657,
|
||||
278,
|
||||
23.7936,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
62.0593,
|
||||
278,
|
||||
32.4653,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
94.5246,
|
||||
278,
|
||||
51.6293,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
339,
|
||||
34.562,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
38.2657,
|
||||
339,
|
||||
23.7936,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
62.0593,
|
||||
339,
|
||||
32.4653,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
94.5246,
|
||||
339,
|
||||
51.6293,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
400,
|
||||
34.562,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
38.2657,
|
||||
400,
|
||||
23.7936,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
62.0593,
|
||||
400,
|
||||
32.4653,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
94.5246,
|
||||
400,
|
||||
51.6293,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
461,
|
||||
34.562,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
38.2657,
|
||||
461,
|
||||
23.7936,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
62.0593,
|
||||
461,
|
||||
32.4653,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
94.5246,
|
||||
461,
|
||||
51.6293,
|
||||
61,
|
||||
0
|
||||
]
|
||||
]
|
||||
},
|
||||
"768": {
|
||||
"name": "offers-customers",
|
||||
"viewportWidth": 736,
|
||||
"width": 736,
|
||||
"height": 502,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
12.9458,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
30,
|
||||
12.9458,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
80.6322,
|
||||
4,
|
||||
19.3678,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
67,
|
||||
100,
|
||||
435,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
86,
|
||||
94.837,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
146,
|
||||
23.2868,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
25.8683,
|
||||
146,
|
||||
16.453,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
42.3212,
|
||||
146,
|
||||
21.9175,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
64.2387,
|
||||
146,
|
||||
33.1798,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
179,
|
||||
23.2868,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
25.8683,
|
||||
179,
|
||||
16.453,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
42.3212,
|
||||
179,
|
||||
21.9175,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
64.2387,
|
||||
179,
|
||||
33.1798,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
240,
|
||||
23.2868,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
25.8683,
|
||||
240,
|
||||
16.453,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
42.3212,
|
||||
240,
|
||||
21.9175,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
64.2387,
|
||||
240,
|
||||
33.1798,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
301,
|
||||
23.2868,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
25.8683,
|
||||
301,
|
||||
16.453,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
42.3212,
|
||||
301,
|
||||
21.9175,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
64.2387,
|
||||
301,
|
||||
33.1798,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
362,
|
||||
23.2868,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
25.8683,
|
||||
362,
|
||||
16.453,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
42.3212,
|
||||
362,
|
||||
21.9175,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
64.2387,
|
||||
362,
|
||||
33.1798,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
423,
|
||||
23.2868,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
25.8683,
|
||||
423,
|
||||
16.453,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
42.3212,
|
||||
423,
|
||||
21.9175,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
64.2387,
|
||||
423,
|
||||
33.1798,
|
||||
61,
|
||||
0
|
||||
]
|
||||
]
|
||||
},
|
||||
"1280": {
|
||||
"name": "offers-customers",
|
||||
"viewportWidth": 996,
|
||||
"width": 996,
|
||||
"height": 470,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
9.5664,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
30,
|
||||
9.5664,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
86.0897,
|
||||
10,
|
||||
13.9103,
|
||||
32,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
67,
|
||||
100,
|
||||
403,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
86,
|
||||
96.1847,
|
||||
36,
|
||||
8
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
138,
|
||||
25.673,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
27.5806,
|
||||
138,
|
||||
19.0904,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
46.6711,
|
||||
138,
|
||||
24.3254,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
70.9965,
|
||||
138,
|
||||
27.0959,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
176,
|
||||
25.673,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
27.5806,
|
||||
176,
|
||||
19.0904,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
46.6711,
|
||||
176,
|
||||
24.3254,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
70.9965,
|
||||
176,
|
||||
27.0959,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
231,
|
||||
25.673,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
27.5806,
|
||||
231,
|
||||
19.0904,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
46.6711,
|
||||
231,
|
||||
24.3254,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
70.9965,
|
||||
231,
|
||||
27.0959,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
286,
|
||||
25.673,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
27.5806,
|
||||
286,
|
||||
19.0904,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
46.6711,
|
||||
286,
|
||||
24.3254,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
70.9965,
|
||||
286,
|
||||
27.0959,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
341,
|
||||
25.673,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
27.5806,
|
||||
341,
|
||||
19.0904,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
46.6711,
|
||||
341,
|
||||
24.3254,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
70.9965,
|
||||
341,
|
||||
27.0959,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
396,
|
||||
25.673,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
27.5806,
|
||||
396,
|
||||
19.0904,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
46.6711,
|
||||
396,
|
||||
24.3254,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
70.9965,
|
||||
396,
|
||||
27.0959,
|
||||
55,
|
||||
0
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
"_hash": "63b2dec2b6ceb84d931a000ab8b669dd"
|
||||
}
|
||||
452
src/admin/bones/offers-templates.bones.json
Normal file
452
src/admin/bones/offers-templates.bones.json
Normal file
@@ -0,0 +1,452 @@
|
||||
{
|
||||
"breakpoints": {
|
||||
"375": {
|
||||
"name": "offers-templates",
|
||||
"viewportWidth": 351,
|
||||
"width": 351,
|
||||
"height": 436,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
100,
|
||||
436,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
13,
|
||||
92.5926,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
73,
|
||||
39.659,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
43.3627,
|
||||
73,
|
||||
39.6857,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
83.0484,
|
||||
73,
|
||||
63.1054,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
104,
|
||||
39.659,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
43.3627,
|
||||
104,
|
||||
39.6857,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
83.0484,
|
||||
104,
|
||||
63.1054,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
165,
|
||||
39.659,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
43.3627,
|
||||
165,
|
||||
39.6857,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
83.0484,
|
||||
165,
|
||||
63.1054,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
226,
|
||||
39.659,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
43.3627,
|
||||
226,
|
||||
39.6857,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
83.0484,
|
||||
226,
|
||||
63.1054,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
287,
|
||||
39.659,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
43.3627,
|
||||
287,
|
||||
39.6857,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
83.0484,
|
||||
287,
|
||||
63.1054,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
348,
|
||||
39.659,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
43.3627,
|
||||
348,
|
||||
39.6857,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
83.0484,
|
||||
348,
|
||||
63.1054,
|
||||
61,
|
||||
0
|
||||
]
|
||||
]
|
||||
},
|
||||
"768": {
|
||||
"name": "offers-templates",
|
||||
"viewportWidth": 736,
|
||||
"width": 736,
|
||||
"height": 435,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
100,
|
||||
435,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
19,
|
||||
94.837,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
79,
|
||||
26.9744,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
29.5559,
|
||||
79,
|
||||
26.9977,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
56.5536,
|
||||
79,
|
||||
40.8649,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
112,
|
||||
26.9744,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
29.5559,
|
||||
112,
|
||||
26.9977,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
56.5536,
|
||||
112,
|
||||
40.8649,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
173,
|
||||
26.9744,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
29.5559,
|
||||
173,
|
||||
26.9977,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
56.5536,
|
||||
173,
|
||||
40.8649,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
234,
|
||||
26.9744,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
29.5559,
|
||||
234,
|
||||
26.9977,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
56.5536,
|
||||
234,
|
||||
40.8649,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
295,
|
||||
26.9744,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
29.5559,
|
||||
295,
|
||||
26.9977,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
56.5536,
|
||||
295,
|
||||
40.8649,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
356,
|
||||
26.9744,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
29.5559,
|
||||
356,
|
||||
26.9977,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
56.5536,
|
||||
356,
|
||||
40.8649,
|
||||
61,
|
||||
0
|
||||
]
|
||||
]
|
||||
},
|
||||
"1280": {
|
||||
"name": "offers-templates",
|
||||
"viewportWidth": 996,
|
||||
"width": 996,
|
||||
"height": 403,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
100,
|
||||
403,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
19,
|
||||
96.1847,
|
||||
36,
|
||||
8
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
71,
|
||||
30.8719,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
32.7796,
|
||||
71,
|
||||
30.897,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
63.6766,
|
||||
71,
|
||||
34.4158,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
109,
|
||||
30.8719,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
32.7796,
|
||||
109,
|
||||
30.897,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
63.6766,
|
||||
109,
|
||||
34.4158,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
164,
|
||||
30.8719,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
32.7796,
|
||||
164,
|
||||
30.897,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
63.6766,
|
||||
164,
|
||||
34.4158,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
219,
|
||||
30.8719,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
32.7796,
|
||||
219,
|
||||
30.897,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
63.6766,
|
||||
219,
|
||||
34.4158,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
274,
|
||||
30.8719,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
32.7796,
|
||||
274,
|
||||
30.897,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
63.6766,
|
||||
274,
|
||||
34.4158,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
329,
|
||||
30.8719,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
32.7796,
|
||||
329,
|
||||
30.897,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
63.6766,
|
||||
329,
|
||||
34.4158,
|
||||
55,
|
||||
0
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
"_hash": "5e5881859bd932a42345c69a6a30ca65"
|
||||
}
|
||||
872
src/admin/bones/offers.bones.json
Normal file
872
src/admin/bones/offers.bones.json
Normal file
@@ -0,0 +1,872 @@
|
||||
{
|
||||
"breakpoints": {
|
||||
"375": {
|
||||
"name": "offers",
|
||||
"viewportWidth": 351,
|
||||
"width": 351,
|
||||
"height": 497,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
100,
|
||||
22,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
26,
|
||||
100,
|
||||
19,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
61,
|
||||
100,
|
||||
436,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
74,
|
||||
92.5926,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
134,
|
||||
26.7495,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
30.4532,
|
||||
134,
|
||||
20.6019,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
51.055,
|
||||
134,
|
||||
21.4165,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
72.4715,
|
||||
134,
|
||||
23.0502,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
95.5217,
|
||||
134,
|
||||
23.0502,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
118.5719,
|
||||
134,
|
||||
30.7692,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
165,
|
||||
26.7495,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
30.4532,
|
||||
165,
|
||||
20.6019,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
51.055,
|
||||
165,
|
||||
21.4165,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
72.4715,
|
||||
165,
|
||||
23.0502,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
95.5217,
|
||||
165,
|
||||
23.0502,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
118.5719,
|
||||
165,
|
||||
30.7692,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
226,
|
||||
26.7495,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
30.4532,
|
||||
226,
|
||||
20.6019,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
51.055,
|
||||
226,
|
||||
21.4165,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
72.4715,
|
||||
226,
|
||||
23.0502,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
95.5217,
|
||||
226,
|
||||
23.0502,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
118.5719,
|
||||
226,
|
||||
30.7692,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
287,
|
||||
26.7495,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
30.4532,
|
||||
287,
|
||||
20.6019,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
51.055,
|
||||
287,
|
||||
21.4165,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
72.4715,
|
||||
287,
|
||||
23.0502,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
95.5217,
|
||||
287,
|
||||
23.0502,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
118.5719,
|
||||
287,
|
||||
30.7692,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
348,
|
||||
26.7495,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
30.4532,
|
||||
348,
|
||||
20.6019,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
51.055,
|
||||
348,
|
||||
21.4165,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
72.4715,
|
||||
348,
|
||||
23.0502,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
95.5217,
|
||||
348,
|
||||
23.0502,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
118.5719,
|
||||
348,
|
||||
30.7692,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
409,
|
||||
26.7495,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
30.4532,
|
||||
409,
|
||||
20.6019,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
51.055,
|
||||
409,
|
||||
21.4165,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
72.4715,
|
||||
409,
|
||||
23.0502,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
95.5217,
|
||||
409,
|
||||
23.0502,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
118.5719,
|
||||
409,
|
||||
30.7692,
|
||||
61,
|
||||
0
|
||||
]
|
||||
]
|
||||
},
|
||||
"768": {
|
||||
"name": "offers",
|
||||
"viewportWidth": 736,
|
||||
"width": 736,
|
||||
"height": 502,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
11.3451,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
30,
|
||||
11.3451,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
67,
|
||||
100,
|
||||
435,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
86,
|
||||
94.837,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
146,
|
||||
17.6779,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
20.2594,
|
||||
146,
|
||||
13.7101,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
33.9695,
|
||||
146,
|
||||
13.3301,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.2996,
|
||||
146,
|
||||
15.2917,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
62.5913,
|
||||
146,
|
||||
15.2917,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
77.883,
|
||||
146,
|
||||
19.5355,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
179,
|
||||
17.6779,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
20.2594,
|
||||
179,
|
||||
13.7101,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
33.9695,
|
||||
179,
|
||||
13.3301,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.2996,
|
||||
179,
|
||||
15.2917,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
62.5913,
|
||||
179,
|
||||
15.2917,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
77.883,
|
||||
179,
|
||||
19.5355,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
240,
|
||||
17.6779,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
20.2594,
|
||||
240,
|
||||
13.7101,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
33.9695,
|
||||
240,
|
||||
13.3301,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.2996,
|
||||
240,
|
||||
15.2917,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
62.5913,
|
||||
240,
|
||||
15.2917,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
77.883,
|
||||
240,
|
||||
19.5355,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
301,
|
||||
17.6779,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
20.2594,
|
||||
301,
|
||||
13.7101,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
33.9695,
|
||||
301,
|
||||
13.3301,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.2996,
|
||||
301,
|
||||
15.2917,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
62.5913,
|
||||
301,
|
||||
15.2917,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
77.883,
|
||||
301,
|
||||
19.5355,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
362,
|
||||
17.6779,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
20.2594,
|
||||
362,
|
||||
13.7101,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
33.9695,
|
||||
362,
|
||||
13.3301,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.2996,
|
||||
362,
|
||||
15.2917,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
62.5913,
|
||||
362,
|
||||
15.2917,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
77.883,
|
||||
362,
|
||||
19.5355,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
423,
|
||||
17.6779,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
20.2594,
|
||||
423,
|
||||
13.7101,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
33.9695,
|
||||
423,
|
||||
13.3301,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.2996,
|
||||
423,
|
||||
15.2917,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
62.5913,
|
||||
423,
|
||||
15.2917,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
77.883,
|
||||
423,
|
||||
19.5355,
|
||||
61,
|
||||
0
|
||||
]
|
||||
]
|
||||
},
|
||||
"1280": {
|
||||
"name": "offers",
|
||||
"viewportWidth": 996,
|
||||
"width": 996,
|
||||
"height": 470,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
8.3835,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
30,
|
||||
8.3835,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
67,
|
||||
100,
|
||||
403,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
86,
|
||||
96.1847,
|
||||
36,
|
||||
8
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
138,
|
||||
18.8912,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
20.7988,
|
||||
138,
|
||||
15.0085,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
35.8073,
|
||||
138,
|
||||
13.333,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
49.1403,
|
||||
138,
|
||||
16.5553,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
65.6956,
|
||||
138,
|
||||
16.5553,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
82.2509,
|
||||
138,
|
||||
15.8415,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
176,
|
||||
18.8912,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
20.7988,
|
||||
176,
|
||||
15.0085,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
35.8073,
|
||||
176,
|
||||
13.333,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
49.1403,
|
||||
176,
|
||||
16.5553,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
65.6956,
|
||||
176,
|
||||
16.5553,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
82.2509,
|
||||
176,
|
||||
15.8415,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
231,
|
||||
18.8912,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
20.7988,
|
||||
231,
|
||||
15.0085,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
35.8073,
|
||||
231,
|
||||
13.333,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
49.1403,
|
||||
231,
|
||||
16.5553,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
65.6956,
|
||||
231,
|
||||
16.5553,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
82.2509,
|
||||
231,
|
||||
15.8415,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
286,
|
||||
18.8912,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
20.7988,
|
||||
286,
|
||||
15.0085,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
35.8073,
|
||||
286,
|
||||
13.333,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
49.1403,
|
||||
286,
|
||||
16.5553,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
65.6956,
|
||||
286,
|
||||
16.5553,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
82.2509,
|
||||
286,
|
||||
15.8415,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
341,
|
||||
18.8912,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
20.7988,
|
||||
341,
|
||||
15.0085,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
35.8073,
|
||||
341,
|
||||
13.333,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
49.1403,
|
||||
341,
|
||||
16.5553,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
65.6956,
|
||||
341,
|
||||
16.5553,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
82.2509,
|
||||
341,
|
||||
15.8415,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
396,
|
||||
18.8912,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
20.7988,
|
||||
396,
|
||||
15.0085,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
35.8073,
|
||||
396,
|
||||
13.333,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
49.1403,
|
||||
396,
|
||||
16.5553,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
65.6956,
|
||||
396,
|
||||
16.5553,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
82.2509,
|
||||
396,
|
||||
15.8415,
|
||||
55,
|
||||
0
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
"_hash": "62d793eb0343d832087d687b76639e09"
|
||||
}
|
||||
998
src/admin/bones/orders.bones.json
Normal file
998
src/admin/bones/orders.bones.json
Normal file
@@ -0,0 +1,998 @@
|
||||
{
|
||||
"breakpoints": {
|
||||
"375": {
|
||||
"name": "orders",
|
||||
"viewportWidth": 351,
|
||||
"width": 351,
|
||||
"height": 497,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
100,
|
||||
22,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
26,
|
||||
100,
|
||||
19,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
61,
|
||||
100,
|
||||
436,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
74,
|
||||
92.5926,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
134,
|
||||
26.7495,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
30.4532,
|
||||
134,
|
||||
29.1043,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
59.5575,
|
||||
134,
|
||||
20.6019,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
80.1594,
|
||||
134,
|
||||
26.6515,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
106.8109,
|
||||
134,
|
||||
23.0502,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
129.8611,
|
||||
134,
|
||||
21.2028,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
151.0639,
|
||||
134,
|
||||
17.094,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
165,
|
||||
26.7495,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
30.4532,
|
||||
165,
|
||||
29.1043,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
59.5575,
|
||||
165,
|
||||
20.6019,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
80.1594,
|
||||
165,
|
||||
26.6515,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
106.8109,
|
||||
165,
|
||||
23.0502,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
129.8611,
|
||||
165,
|
||||
21.2028,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
151.0639,
|
||||
165,
|
||||
17.094,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
226,
|
||||
26.7495,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
30.4532,
|
||||
226,
|
||||
29.1043,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
59.5575,
|
||||
226,
|
||||
20.6019,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
80.1594,
|
||||
226,
|
||||
26.6515,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
106.8109,
|
||||
226,
|
||||
23.0502,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
129.8611,
|
||||
226,
|
||||
21.2028,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
151.0639,
|
||||
226,
|
||||
17.094,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
287,
|
||||
26.7495,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
30.4532,
|
||||
287,
|
||||
29.1043,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
59.5575,
|
||||
287,
|
||||
20.6019,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
80.1594,
|
||||
287,
|
||||
26.6515,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
106.8109,
|
||||
287,
|
||||
23.0502,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
129.8611,
|
||||
287,
|
||||
21.2028,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
151.0639,
|
||||
287,
|
||||
17.094,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
348,
|
||||
26.7495,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
30.4532,
|
||||
348,
|
||||
29.1043,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
59.5575,
|
||||
348,
|
||||
20.6019,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
80.1594,
|
||||
348,
|
||||
26.6515,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
106.8109,
|
||||
348,
|
||||
23.0502,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
129.8611,
|
||||
348,
|
||||
21.2028,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
151.0639,
|
||||
348,
|
||||
17.094,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
409,
|
||||
26.7495,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
30.4532,
|
||||
409,
|
||||
29.1043,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
59.5575,
|
||||
409,
|
||||
20.6019,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
80.1594,
|
||||
409,
|
||||
26.6515,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
106.8109,
|
||||
409,
|
||||
23.0502,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
129.8611,
|
||||
409,
|
||||
21.2028,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
151.0639,
|
||||
409,
|
||||
17.094,
|
||||
61,
|
||||
0
|
||||
]
|
||||
]
|
||||
},
|
||||
"768": {
|
||||
"name": "orders",
|
||||
"viewportWidth": 736,
|
||||
"width": 736,
|
||||
"height": 502,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
16.6461,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
30,
|
||||
16.6461,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
67,
|
||||
100,
|
||||
435,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
86,
|
||||
94.837,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
146,
|
||||
15.642,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
18.2235,
|
||||
146,
|
||||
16.9837,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
35.2072,
|
||||
146,
|
||||
12.1306,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.3378,
|
||||
146,
|
||||
14.5338,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
61.8716,
|
||||
146,
|
||||
13.5296,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
75.4012,
|
||||
146,
|
||||
12.4745,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
87.8758,
|
||||
146,
|
||||
9.5427,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
179,
|
||||
15.642,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
18.2235,
|
||||
179,
|
||||
16.9837,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
35.2072,
|
||||
179,
|
||||
12.1306,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.3378,
|
||||
179,
|
||||
14.5338,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
61.8716,
|
||||
179,
|
||||
13.5296,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
75.4012,
|
||||
179,
|
||||
12.4745,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
87.8758,
|
||||
179,
|
||||
9.5427,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
240,
|
||||
15.642,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
18.2235,
|
||||
240,
|
||||
16.9837,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
35.2072,
|
||||
240,
|
||||
12.1306,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.3378,
|
||||
240,
|
||||
14.5338,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
61.8716,
|
||||
240,
|
||||
13.5296,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
75.4012,
|
||||
240,
|
||||
12.4745,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
87.8758,
|
||||
240,
|
||||
9.5427,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
301,
|
||||
15.642,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
18.2235,
|
||||
301,
|
||||
16.9837,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
35.2072,
|
||||
301,
|
||||
12.1306,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.3378,
|
||||
301,
|
||||
14.5338,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
61.8716,
|
||||
301,
|
||||
13.5296,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
75.4012,
|
||||
301,
|
||||
12.4745,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
87.8758,
|
||||
301,
|
||||
9.5427,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
362,
|
||||
15.642,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
18.2235,
|
||||
362,
|
||||
16.9837,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
35.2072,
|
||||
362,
|
||||
12.1306,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.3378,
|
||||
362,
|
||||
14.5338,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
61.8716,
|
||||
362,
|
||||
13.5296,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
75.4012,
|
||||
362,
|
||||
12.4745,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
87.8758,
|
||||
362,
|
||||
9.5427,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
423,
|
||||
15.642,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
18.2235,
|
||||
423,
|
||||
16.9837,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
35.2072,
|
||||
423,
|
||||
12.1306,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.3378,
|
||||
423,
|
||||
14.5338,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
61.8716,
|
||||
423,
|
||||
13.5296,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
75.4012,
|
||||
423,
|
||||
12.4745,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
87.8758,
|
||||
423,
|
||||
9.5427,
|
||||
61,
|
||||
0
|
||||
]
|
||||
]
|
||||
},
|
||||
"1280": {
|
||||
"name": "orders",
|
||||
"viewportWidth": 996,
|
||||
"width": 996,
|
||||
"height": 470,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
12.3008,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
30,
|
||||
12.3008,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
67,
|
||||
100,
|
||||
403,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
86,
|
||||
96.1847,
|
||||
36,
|
||||
8
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
138,
|
||||
16.2243,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
18.1319,
|
||||
138,
|
||||
17.5044,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
35.6363,
|
||||
138,
|
||||
12.8891,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
48.5254,
|
||||
138,
|
||||
13.7535,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
62.2788,
|
||||
138,
|
||||
14.2178,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
76.4966,
|
||||
138,
|
||||
13.2138,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
89.7104,
|
||||
138,
|
||||
8.382,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
176,
|
||||
16.2243,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
18.1319,
|
||||
176,
|
||||
17.5044,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
35.6363,
|
||||
176,
|
||||
12.8891,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
48.5254,
|
||||
176,
|
||||
13.7535,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
62.2788,
|
||||
176,
|
||||
14.2178,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
76.4966,
|
||||
176,
|
||||
13.2138,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
89.7104,
|
||||
176,
|
||||
8.382,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
231,
|
||||
16.2243,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
18.1319,
|
||||
231,
|
||||
17.5044,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
35.6363,
|
||||
231,
|
||||
12.8891,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
48.5254,
|
||||
231,
|
||||
13.7535,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
62.2788,
|
||||
231,
|
||||
14.2178,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
76.4966,
|
||||
231,
|
||||
13.2138,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
89.7104,
|
||||
231,
|
||||
8.382,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
286,
|
||||
16.2243,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
18.1319,
|
||||
286,
|
||||
17.5044,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
35.6363,
|
||||
286,
|
||||
12.8891,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
48.5254,
|
||||
286,
|
||||
13.7535,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
62.2788,
|
||||
286,
|
||||
14.2178,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
76.4966,
|
||||
286,
|
||||
13.2138,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
89.7104,
|
||||
286,
|
||||
8.382,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
341,
|
||||
16.2243,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
18.1319,
|
||||
341,
|
||||
17.5044,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
35.6363,
|
||||
341,
|
||||
12.8891,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
48.5254,
|
||||
341,
|
||||
13.7535,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
62.2788,
|
||||
341,
|
||||
14.2178,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
76.4966,
|
||||
341,
|
||||
13.2138,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
89.7104,
|
||||
341,
|
||||
8.382,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
396,
|
||||
16.2243,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
18.1319,
|
||||
396,
|
||||
17.5044,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
35.6363,
|
||||
396,
|
||||
12.8891,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
48.5254,
|
||||
396,
|
||||
13.7535,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
62.2788,
|
||||
396,
|
||||
14.2178,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
76.4966,
|
||||
396,
|
||||
13.2138,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
89.7104,
|
||||
396,
|
||||
8.382,
|
||||
55,
|
||||
0
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
"_hash": "677a0002aa805c9f7790bc68c6374bb5"
|
||||
}
|
||||
371
src/admin/bones/project-detail.bones.json
Normal file
371
src/admin/bones/project-detail.bones.json
Normal file
@@ -0,0 +1,371 @@
|
||||
{
|
||||
"breakpoints": {
|
||||
"375": {
|
||||
"name": "project-detail",
|
||||
"viewportWidth": 351,
|
||||
"width": 351,
|
||||
"height": 481,
|
||||
"bones": [
|
||||
[
|
||||
3.4188,
|
||||
12,
|
||||
5.698,
|
||||
20,
|
||||
"50%"
|
||||
],
|
||||
[
|
||||
14.8148,
|
||||
9,
|
||||
50.2315,
|
||||
22,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
52,
|
||||
48.0057,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
51.4245,
|
||||
52,
|
||||
48.5755,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
112,
|
||||
100,
|
||||
188,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
125,
|
||||
48.1481,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
154,
|
||||
48.1481,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
56.4103,
|
||||
125,
|
||||
48.1481,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
56.4103,
|
||||
154,
|
||||
48.1481,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
214,
|
||||
48.1481,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
243,
|
||||
48.1481,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
56.4103,
|
||||
214,
|
||||
48.1481,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
56.4103,
|
||||
243,
|
||||
48.1481,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
316,
|
||||
100,
|
||||
165,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
329,
|
||||
92.5926,
|
||||
17,
|
||||
8
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
357,
|
||||
92.5926,
|
||||
104,
|
||||
8
|
||||
]
|
||||
]
|
||||
},
|
||||
"768": {
|
||||
"name": "project-detail",
|
||||
"viewportWidth": 736,
|
||||
"width": 736,
|
||||
"height": 453,
|
||||
"bones": [
|
||||
[
|
||||
1.6304,
|
||||
12,
|
||||
2.7174,
|
||||
20,
|
||||
"50%"
|
||||
],
|
||||
[
|
||||
7.0652,
|
||||
7,
|
||||
29.2799,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
78.2375,
|
||||
0,
|
||||
9.1733,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
89.0413,
|
||||
0,
|
||||
10.9587,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
60,
|
||||
100,
|
||||
200,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
79,
|
||||
46.3315,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
108,
|
||||
46.3315,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
51.087,
|
||||
79,
|
||||
46.3315,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
51.087,
|
||||
108,
|
||||
46.3315,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
168,
|
||||
46.3315,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
197,
|
||||
46.3315,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
51.087,
|
||||
168,
|
||||
46.3315,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
51.087,
|
||||
197,
|
||||
46.3315,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
276,
|
||||
100,
|
||||
177,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
295,
|
||||
94.837,
|
||||
17,
|
||||
8
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
323,
|
||||
94.837,
|
||||
104,
|
||||
8
|
||||
]
|
||||
]
|
||||
},
|
||||
"1280": {
|
||||
"name": "project-detail",
|
||||
"viewportWidth": 996,
|
||||
"width": 996,
|
||||
"height": 404,
|
||||
"bones": [
|
||||
[
|
||||
0.6024,
|
||||
7,
|
||||
2.008,
|
||||
20,
|
||||
"50%"
|
||||
],
|
||||
[
|
||||
4.0161,
|
||||
2,
|
||||
21.6365,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
84.7217,
|
||||
0,
|
||||
6.3771,
|
||||
34,
|
||||
8
|
||||
],
|
||||
[
|
||||
92.3036,
|
||||
0,
|
||||
7.6964,
|
||||
34,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
50,
|
||||
100,
|
||||
180,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
69,
|
||||
47.2892,
|
||||
19,
|
||||
8
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
96,
|
||||
47.2892,
|
||||
36,
|
||||
8
|
||||
],
|
||||
[
|
||||
50.8032,
|
||||
69,
|
||||
47.2892,
|
||||
19,
|
||||
8
|
||||
],
|
||||
[
|
||||
50.8032,
|
||||
96,
|
||||
47.2892,
|
||||
36,
|
||||
8
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
148,
|
||||
47.2892,
|
||||
19,
|
||||
8
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
175,
|
||||
47.2892,
|
||||
36,
|
||||
8
|
||||
],
|
||||
[
|
||||
50.8032,
|
||||
148,
|
||||
47.2892,
|
||||
19,
|
||||
8
|
||||
],
|
||||
[
|
||||
50.8032,
|
||||
175,
|
||||
47.2892,
|
||||
36,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
246,
|
||||
100,
|
||||
157,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
265,
|
||||
96.1847,
|
||||
17,
|
||||
8
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
294,
|
||||
96.1847,
|
||||
84,
|
||||
8
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
"_hash": "ab5e1f108d42c55b0e6382fcaffff793"
|
||||
}
|
||||
746
src/admin/bones/projects.bones.json
Normal file
746
src/admin/bones/projects.bones.json
Normal file
@@ -0,0 +1,746 @@
|
||||
{
|
||||
"breakpoints": {
|
||||
"375": {
|
||||
"name": "projects",
|
||||
"viewportWidth": 351,
|
||||
"width": 351,
|
||||
"height": 497,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
100,
|
||||
22,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
26,
|
||||
100,
|
||||
19,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
61,
|
||||
100,
|
||||
436,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
74,
|
||||
92.5926,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
134,
|
||||
34.6065,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
38.3102,
|
||||
134,
|
||||
31.3568,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
69.667,
|
||||
134,
|
||||
26.6515,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
96.3186,
|
||||
134,
|
||||
27.7066,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
124.0251,
|
||||
134,
|
||||
22.1287,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
165,
|
||||
34.6065,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
38.3102,
|
||||
165,
|
||||
31.3568,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
69.667,
|
||||
165,
|
||||
26.6515,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
96.3186,
|
||||
165,
|
||||
27.7066,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
124.0251,
|
||||
165,
|
||||
22.1287,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
226,
|
||||
34.6065,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
38.3102,
|
||||
226,
|
||||
31.3568,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
69.667,
|
||||
226,
|
||||
26.6515,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
96.3186,
|
||||
226,
|
||||
27.7066,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
124.0251,
|
||||
226,
|
||||
22.1287,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
287,
|
||||
34.6065,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
38.3102,
|
||||
287,
|
||||
31.3568,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
69.667,
|
||||
287,
|
||||
26.6515,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
96.3186,
|
||||
287,
|
||||
27.7066,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
124.0251,
|
||||
287,
|
||||
22.1287,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
348,
|
||||
34.6065,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
38.3102,
|
||||
348,
|
||||
31.3568,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
69.667,
|
||||
348,
|
||||
26.6515,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
96.3186,
|
||||
348,
|
||||
27.7066,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
124.0251,
|
||||
348,
|
||||
22.1287,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
409,
|
||||
34.6065,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
38.3102,
|
||||
409,
|
||||
31.3568,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
69.667,
|
||||
409,
|
||||
26.6515,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
96.3186,
|
||||
409,
|
||||
27.7066,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
124.0251,
|
||||
409,
|
||||
22.1287,
|
||||
61,
|
||||
0
|
||||
]
|
||||
]
|
||||
},
|
||||
"768": {
|
||||
"name": "projects",
|
||||
"viewportWidth": 736,
|
||||
"width": 736,
|
||||
"height": 502,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
10.9099,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
30,
|
||||
10.9099,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
67,
|
||||
100,
|
||||
435,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
86,
|
||||
94.837,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
146,
|
||||
23.429,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
26.0105,
|
||||
146,
|
||||
21.2806,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.2911,
|
||||
146,
|
||||
18.1704,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
65.4615,
|
||||
146,
|
||||
17.6694,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
83.1309,
|
||||
146,
|
||||
14.2875,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
179,
|
||||
23.429,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
26.0105,
|
||||
179,
|
||||
21.2806,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.2911,
|
||||
179,
|
||||
18.1704,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
65.4615,
|
||||
179,
|
||||
17.6694,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
83.1309,
|
||||
179,
|
||||
14.2875,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
240,
|
||||
23.429,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
26.0105,
|
||||
240,
|
||||
21.2806,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.2911,
|
||||
240,
|
||||
18.1704,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
65.4615,
|
||||
240,
|
||||
17.6694,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
83.1309,
|
||||
240,
|
||||
14.2875,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
301,
|
||||
23.429,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
26.0105,
|
||||
301,
|
||||
21.2806,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.2911,
|
||||
301,
|
||||
18.1704,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
65.4615,
|
||||
301,
|
||||
17.6694,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
83.1309,
|
||||
301,
|
||||
14.2875,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
362,
|
||||
23.429,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
26.0105,
|
||||
362,
|
||||
21.2806,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.2911,
|
||||
362,
|
||||
18.1704,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
65.4615,
|
||||
362,
|
||||
17.6694,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
83.1309,
|
||||
362,
|
||||
14.2875,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
423,
|
||||
23.429,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
26.0105,
|
||||
423,
|
||||
21.2806,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.2911,
|
||||
423,
|
||||
18.1704,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
65.4615,
|
||||
423,
|
||||
17.6694,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
83.1309,
|
||||
423,
|
||||
14.2875,
|
||||
61,
|
||||
0
|
||||
]
|
||||
]
|
||||
},
|
||||
"1280": {
|
||||
"name": "projects",
|
||||
"viewportWidth": 996,
|
||||
"width": 996,
|
||||
"height": 470,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
8.0619,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
30,
|
||||
8.0619,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
67,
|
||||
100,
|
||||
403,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
86,
|
||||
96.1847,
|
||||
36,
|
||||
8
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
138,
|
||||
24.4588,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
26.3664,
|
||||
138,
|
||||
22.4068,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
48.7732,
|
||||
138,
|
||||
19.4308,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
68.2041,
|
||||
138,
|
||||
17.2612,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
85.4653,
|
||||
138,
|
||||
12.6271,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
176,
|
||||
24.4588,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
26.3664,
|
||||
176,
|
||||
22.4068,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
48.7732,
|
||||
176,
|
||||
19.4308,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
68.2041,
|
||||
176,
|
||||
17.2612,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
85.4653,
|
||||
176,
|
||||
12.6271,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
231,
|
||||
24.4588,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
26.3664,
|
||||
231,
|
||||
22.4068,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
48.7732,
|
||||
231,
|
||||
19.4308,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
68.2041,
|
||||
231,
|
||||
17.2612,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
85.4653,
|
||||
231,
|
||||
12.6271,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
286,
|
||||
24.4588,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
26.3664,
|
||||
286,
|
||||
22.4068,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
48.7732,
|
||||
286,
|
||||
19.4308,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
68.2041,
|
||||
286,
|
||||
17.2612,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
85.4653,
|
||||
286,
|
||||
12.6271,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
341,
|
||||
24.4588,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
26.3664,
|
||||
341,
|
||||
22.4068,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
48.7732,
|
||||
341,
|
||||
19.4308,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
68.2041,
|
||||
341,
|
||||
17.2612,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
85.4653,
|
||||
341,
|
||||
12.6271,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
396,
|
||||
24.4588,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
26.3664,
|
||||
396,
|
||||
22.4068,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
48.7732,
|
||||
396,
|
||||
19.4308,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
68.2041,
|
||||
396,
|
||||
17.2612,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
85.4653,
|
||||
396,
|
||||
12.6271,
|
||||
55,
|
||||
0
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
"_hash": "17f8285c3ca514ddef6d48c1183ed642"
|
||||
}
|
||||
50
src/admin/bones/registry.ts
Normal file
50
src/admin/bones/registry.ts
Normal file
@@ -0,0 +1,50 @@
|
||||
"use client"
|
||||
// Auto-generated by `npx boneyard-js build` — do not edit
|
||||
import { registerBones } from 'boneyard-js'
|
||||
import { configureBoneyard } from 'boneyard-js/react'
|
||||
|
||||
import _dash_sessions from './dash-sessions.bones.json'
|
||||
import _attendance_history_fund from './attendance-history-fund.bones.json'
|
||||
import _attendance_history_table from './attendance-history-table.bones.json'
|
||||
import _leave_requests from './leave-requests.bones.json'
|
||||
import _leave_approval from './leave-approval.bones.json'
|
||||
import _attendance_balances from './attendance-balances.bones.json'
|
||||
import _trips_history from './trips-history.bones.json'
|
||||
import _trips_admin from './trips-admin.bones.json'
|
||||
import _vehicles from './vehicles.bones.json'
|
||||
import _offers from './offers.bones.json'
|
||||
import _orders from './orders.bones.json'
|
||||
import _projects from './projects.bones.json'
|
||||
import _offers_customers from './offers-customers.bones.json'
|
||||
import _users from './users.bones.json'
|
||||
import _audit_log_rows from './audit-log-rows.bones.json'
|
||||
import _offer_detail from './offer-detail.bones.json'
|
||||
import _invoice_detail from './invoice-detail.bones.json'
|
||||
import _project_detail from './project-detail.bones.json'
|
||||
import _attendance_create from './attendance-create.bones.json'
|
||||
import _offers_templates from './offers-templates.bones.json'
|
||||
|
||||
configureBoneyard({"color":"#e0e0e0","animate":"shimmer","shimmerColor":"#f0f0f0","speed":"1.2s","shimmerAngle":110})
|
||||
|
||||
registerBones({
|
||||
"dash-sessions": _dash_sessions,
|
||||
"attendance-history-fund": _attendance_history_fund,
|
||||
"attendance-history-table": _attendance_history_table,
|
||||
"leave-requests": _leave_requests,
|
||||
"leave-approval": _leave_approval,
|
||||
"attendance-balances": _attendance_balances,
|
||||
"trips-history": _trips_history,
|
||||
"trips-admin": _trips_admin,
|
||||
"vehicles": _vehicles,
|
||||
"offers": _offers,
|
||||
"orders": _orders,
|
||||
"projects": _projects,
|
||||
"offers-customers": _offers_customers,
|
||||
"users": _users,
|
||||
"audit-log-rows": _audit_log_rows,
|
||||
"offer-detail": _offer_detail,
|
||||
"invoice-detail": _invoice_detail,
|
||||
"project-detail": _project_detail,
|
||||
"attendance-create": _attendance_create,
|
||||
"offers-templates": _offers_templates,
|
||||
})
|
||||
725
src/admin/bones/trips-admin.bones.json
Normal file
725
src/admin/bones/trips-admin.bones.json
Normal file
@@ -0,0 +1,725 @@
|
||||
{
|
||||
"breakpoints": {
|
||||
"375": {
|
||||
"name": "trips-admin",
|
||||
"viewportWidth": 317,
|
||||
"width": 317,
|
||||
"height": 437,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
100,
|
||||
22,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
26,
|
||||
100,
|
||||
19,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
61,
|
||||
100,
|
||||
376,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
4.1009,
|
||||
74,
|
||||
37.8795,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
41.9805,
|
||||
74,
|
||||
43.4592,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
85.4397,
|
||||
74,
|
||||
31.6739,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
117.1136,
|
||||
74,
|
||||
16.6108,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
133.7244,
|
||||
74,
|
||||
28.1053,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
4.1009,
|
||||
105,
|
||||
37.8795,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
41.9805,
|
||||
105,
|
||||
43.4592,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
85.4397,
|
||||
105,
|
||||
31.6739,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
117.1136,
|
||||
105,
|
||||
16.6108,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
133.7244,
|
||||
105,
|
||||
28.1053,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
4.1009,
|
||||
166,
|
||||
37.8795,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
41.9805,
|
||||
166,
|
||||
43.4592,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
85.4397,
|
||||
166,
|
||||
31.6739,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
117.1136,
|
||||
166,
|
||||
16.6108,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
133.7244,
|
||||
166,
|
||||
28.1053,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
4.1009,
|
||||
227,
|
||||
37.8795,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
41.9805,
|
||||
227,
|
||||
43.4592,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
85.4397,
|
||||
227,
|
||||
31.6739,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
117.1136,
|
||||
227,
|
||||
16.6108,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
133.7244,
|
||||
227,
|
||||
28.1053,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
4.1009,
|
||||
288,
|
||||
37.8795,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
41.9805,
|
||||
288,
|
||||
43.4592,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
85.4397,
|
||||
288,
|
||||
31.6739,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
117.1136,
|
||||
288,
|
||||
16.6108,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
133.7244,
|
||||
288,
|
||||
28.1053,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
4.1009,
|
||||
349,
|
||||
37.8795,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
41.9805,
|
||||
349,
|
||||
43.4592,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
85.4397,
|
||||
349,
|
||||
31.6739,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
117.1136,
|
||||
349,
|
||||
16.6108,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
133.7244,
|
||||
349,
|
||||
28.1053,
|
||||
61,
|
||||
0
|
||||
]
|
||||
]
|
||||
},
|
||||
"768": {
|
||||
"name": "trips-admin",
|
||||
"viewportWidth": 690,
|
||||
"width": 690,
|
||||
"height": 442,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
16.3202,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
30,
|
||||
16.3202,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
67,
|
||||
100,
|
||||
375,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
2.7536,
|
||||
86,
|
||||
22.8057,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
25.5593,
|
||||
86,
|
||||
26.0711,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
51.6304,
|
||||
86,
|
||||
19.1757,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
70.8062,
|
||||
86,
|
||||
10.3601,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
81.1662,
|
||||
86,
|
||||
16.0802,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.7536,
|
||||
119,
|
||||
22.8057,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
25.5593,
|
||||
119,
|
||||
26.0711,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
51.6304,
|
||||
119,
|
||||
19.1757,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
70.8062,
|
||||
119,
|
||||
10.3601,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
81.1662,
|
||||
119,
|
||||
16.0802,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.7536,
|
||||
180,
|
||||
22.8057,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
25.5593,
|
||||
180,
|
||||
26.0711,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
51.6304,
|
||||
180,
|
||||
19.1757,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
70.8062,
|
||||
180,
|
||||
10.3601,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
81.1662,
|
||||
180,
|
||||
16.0802,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.7536,
|
||||
241,
|
||||
22.8057,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
25.5593,
|
||||
241,
|
||||
26.0711,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
51.6304,
|
||||
241,
|
||||
19.1757,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
70.8062,
|
||||
241,
|
||||
10.3601,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
81.1662,
|
||||
241,
|
||||
16.0802,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.7536,
|
||||
302,
|
||||
22.8057,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
25.5593,
|
||||
302,
|
||||
26.0711,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
51.6304,
|
||||
302,
|
||||
19.1757,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
70.8062,
|
||||
302,
|
||||
10.3601,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
81.1662,
|
||||
302,
|
||||
16.0802,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.7536,
|
||||
363,
|
||||
22.8057,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
25.5593,
|
||||
363,
|
||||
26.0711,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
51.6304,
|
||||
363,
|
||||
19.1757,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
70.8062,
|
||||
363,
|
||||
10.3601,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
81.1662,
|
||||
363,
|
||||
16.0802,
|
||||
61,
|
||||
0
|
||||
]
|
||||
]
|
||||
},
|
||||
"1280": {
|
||||
"name": "trips-admin",
|
||||
"viewportWidth": 950,
|
||||
"width": 950,
|
||||
"height": 418,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
11.8536,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
30,
|
||||
11.8536,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
67,
|
||||
100,
|
||||
351,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
2,
|
||||
86,
|
||||
23.523,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
25.523,
|
||||
86,
|
||||
26.574,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
52.097,
|
||||
86,
|
||||
20.1382,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
72.2352,
|
||||
86,
|
||||
11.9046,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
84.1398,
|
||||
86,
|
||||
13.8602,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
2,
|
||||
124,
|
||||
23.523,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
25.523,
|
||||
124,
|
||||
26.574,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
52.097,
|
||||
124,
|
||||
20.1382,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
72.2352,
|
||||
124,
|
||||
11.9046,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
84.1398,
|
||||
124,
|
||||
13.8602,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
2,
|
||||
179,
|
||||
23.523,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
25.523,
|
||||
179,
|
||||
26.574,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
52.097,
|
||||
179,
|
||||
20.1382,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
72.2352,
|
||||
179,
|
||||
11.9046,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
84.1398,
|
||||
179,
|
||||
13.8602,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
2,
|
||||
234,
|
||||
23.523,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
25.523,
|
||||
234,
|
||||
26.574,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
52.097,
|
||||
234,
|
||||
20.1382,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
72.2352,
|
||||
234,
|
||||
11.9046,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
84.1398,
|
||||
234,
|
||||
13.8602,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
2,
|
||||
289,
|
||||
23.523,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
25.523,
|
||||
289,
|
||||
26.574,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
52.097,
|
||||
289,
|
||||
20.1382,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
72.2352,
|
||||
289,
|
||||
11.9046,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
84.1398,
|
||||
289,
|
||||
13.8602,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
2,
|
||||
344,
|
||||
23.523,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
25.523,
|
||||
344,
|
||||
26.574,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
52.097,
|
||||
344,
|
||||
20.1382,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
72.2352,
|
||||
344,
|
||||
11.9046,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
84.1398,
|
||||
344,
|
||||
13.8602,
|
||||
55,
|
||||
0
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
"_hash": "39a325f430c84bb51960a684759a8f0c"
|
||||
}
|
||||
725
src/admin/bones/trips-history.bones.json
Normal file
725
src/admin/bones/trips-history.bones.json
Normal file
@@ -0,0 +1,725 @@
|
||||
{
|
||||
"breakpoints": {
|
||||
"375": {
|
||||
"name": "trips-history",
|
||||
"viewportWidth": 317,
|
||||
"width": 317,
|
||||
"height": 300,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
100,
|
||||
22,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
26,
|
||||
100,
|
||||
19,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
61,
|
||||
100,
|
||||
239,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
4.1009,
|
||||
74,
|
||||
35.2326,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
39.3336,
|
||||
74,
|
||||
40.4278,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
79.7614,
|
||||
74,
|
||||
29.4657,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
109.2271,
|
||||
74,
|
||||
37.1402,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
146.3673,
|
||||
74,
|
||||
15.4623,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
4.1009,
|
||||
105,
|
||||
35.2326,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
39.3336,
|
||||
105,
|
||||
40.4278,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
79.7614,
|
||||
105,
|
||||
29.4657,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
109.2271,
|
||||
105,
|
||||
37.1402,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
146.3673,
|
||||
105,
|
||||
15.4623,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
4.1009,
|
||||
138,
|
||||
35.2326,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
39.3336,
|
||||
138,
|
||||
40.4278,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
79.7614,
|
||||
138,
|
||||
29.4657,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
109.2271,
|
||||
138,
|
||||
37.1402,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
146.3673,
|
||||
138,
|
||||
15.4623,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
4.1009,
|
||||
172,
|
||||
35.2326,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
39.3336,
|
||||
172,
|
||||
40.4278,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
79.7614,
|
||||
172,
|
||||
29.4657,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
109.2271,
|
||||
172,
|
||||
37.1402,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
146.3673,
|
||||
172,
|
||||
15.4623,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
4.1009,
|
||||
205,
|
||||
35.2326,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
39.3336,
|
||||
205,
|
||||
40.4278,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
79.7614,
|
||||
205,
|
||||
29.4657,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
109.2271,
|
||||
205,
|
||||
37.1402,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
146.3673,
|
||||
205,
|
||||
15.4623,
|
||||
34,
|
||||
0
|
||||
],
|
||||
[
|
||||
4.1009,
|
||||
239,
|
||||
35.2326,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
39.3336,
|
||||
239,
|
||||
40.4278,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
79.7614,
|
||||
239,
|
||||
29.4657,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
109.2271,
|
||||
239,
|
||||
37.1402,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
146.3673,
|
||||
239,
|
||||
15.4623,
|
||||
33,
|
||||
0
|
||||
]
|
||||
]
|
||||
},
|
||||
"768": {
|
||||
"name": "trips-history",
|
||||
"viewportWidth": 690,
|
||||
"width": 690,
|
||||
"height": 312,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
16.6033,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
30,
|
||||
16.6033,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
67,
|
||||
100,
|
||||
245,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
2.7536,
|
||||
86,
|
||||
21.0417,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
23.7953,
|
||||
86,
|
||||
24.0534,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.8487,
|
||||
86,
|
||||
17.6925,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
65.5412,
|
||||
86,
|
||||
22.1445,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
87.6857,
|
||||
86,
|
||||
9.5607,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.7536,
|
||||
119,
|
||||
21.0417,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
23.7953,
|
||||
119,
|
||||
24.0534,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.8487,
|
||||
119,
|
||||
17.6925,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
65.5412,
|
||||
119,
|
||||
22.1445,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
87.6857,
|
||||
119,
|
||||
9.5607,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.7536,
|
||||
154,
|
||||
21.0417,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
23.7953,
|
||||
154,
|
||||
24.0534,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.8487,
|
||||
154,
|
||||
17.6925,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
65.5412,
|
||||
154,
|
||||
22.1445,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
87.6857,
|
||||
154,
|
||||
9.5607,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.7536,
|
||||
189,
|
||||
21.0417,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
23.7953,
|
||||
189,
|
||||
24.0534,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.8487,
|
||||
189,
|
||||
17.6925,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
65.5412,
|
||||
189,
|
||||
22.1445,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
87.6857,
|
||||
189,
|
||||
9.5607,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.7536,
|
||||
224,
|
||||
21.0417,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
23.7953,
|
||||
224,
|
||||
24.0534,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.8487,
|
||||
224,
|
||||
17.6925,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
65.5412,
|
||||
224,
|
||||
22.1445,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
87.6857,
|
||||
224,
|
||||
9.5607,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.7536,
|
||||
259,
|
||||
21.0417,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
23.7953,
|
||||
259,
|
||||
24.0534,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.8487,
|
||||
259,
|
||||
17.6925,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
65.5412,
|
||||
259,
|
||||
22.1445,
|
||||
35,
|
||||
0
|
||||
],
|
||||
[
|
||||
87.6857,
|
||||
259,
|
||||
9.5607,
|
||||
35,
|
||||
0
|
||||
]
|
||||
]
|
||||
},
|
||||
"1280": {
|
||||
"name": "trips-history",
|
||||
"viewportWidth": 958,
|
||||
"width": 958,
|
||||
"height": 355,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
11.9585,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
30,
|
||||
11.9585,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
67,
|
||||
100,
|
||||
288,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
1.9833,
|
||||
86,
|
||||
21.1541,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
23.1374,
|
||||
86,
|
||||
23.8974,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.0348,
|
||||
86,
|
||||
18.1106,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
65.1455,
|
||||
86,
|
||||
22.1604,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
87.3059,
|
||||
86,
|
||||
10.7108,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9833,
|
||||
124,
|
||||
21.1541,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
23.1374,
|
||||
124,
|
||||
23.8974,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.0348,
|
||||
124,
|
||||
18.1106,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
65.1455,
|
||||
124,
|
||||
22.1604,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
87.3059,
|
||||
124,
|
||||
10.7108,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9833,
|
||||
167,
|
||||
21.1541,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
23.1374,
|
||||
167,
|
||||
23.8974,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.0348,
|
||||
167,
|
||||
18.1106,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
65.1455,
|
||||
167,
|
||||
22.1604,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
87.3059,
|
||||
167,
|
||||
10.7108,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9833,
|
||||
209,
|
||||
21.1541,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
23.1374,
|
||||
209,
|
||||
23.8974,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.0348,
|
||||
209,
|
||||
18.1106,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
65.1455,
|
||||
209,
|
||||
22.1604,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
87.3059,
|
||||
209,
|
||||
10.7108,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9833,
|
||||
252,
|
||||
21.1541,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
23.1374,
|
||||
252,
|
||||
23.8974,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.0348,
|
||||
252,
|
||||
18.1106,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
65.1455,
|
||||
252,
|
||||
22.1604,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
87.3059,
|
||||
252,
|
||||
10.7108,
|
||||
43,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9833,
|
||||
294,
|
||||
21.1541,
|
||||
42,
|
||||
0
|
||||
],
|
||||
[
|
||||
23.1374,
|
||||
294,
|
||||
23.8974,
|
||||
42,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.0348,
|
||||
294,
|
||||
18.1106,
|
||||
42,
|
||||
0
|
||||
],
|
||||
[
|
||||
65.1455,
|
||||
294,
|
||||
22.1604,
|
||||
42,
|
||||
0
|
||||
],
|
||||
[
|
||||
87.3059,
|
||||
294,
|
||||
10.7108,
|
||||
42,
|
||||
0
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
"_hash": "6b54a0afbb4863895e318916b1fdca67"
|
||||
}
|
||||
767
src/admin/bones/users.bones.json
Normal file
767
src/admin/bones/users.bones.json
Normal file
@@ -0,0 +1,767 @@
|
||||
{
|
||||
"breakpoints": {
|
||||
"375": {
|
||||
"name": "users",
|
||||
"viewportWidth": 351,
|
||||
"width": 351,
|
||||
"height": 549,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
100,
|
||||
22,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
26,
|
||||
100,
|
||||
19,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
53,
|
||||
100,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
113,
|
||||
100,
|
||||
436,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
126,
|
||||
92.5926,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
186,
|
||||
37.362,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
41.0657,
|
||||
186,
|
||||
26.429,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
67.4947,
|
||||
186,
|
||||
36.1779,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
103.6725,
|
||||
186,
|
||||
23.62,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
127.2926,
|
||||
186,
|
||||
18.8613,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
217,
|
||||
37.362,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
41.0657,
|
||||
217,
|
||||
26.429,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
67.4947,
|
||||
217,
|
||||
36.1779,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
103.6725,
|
||||
217,
|
||||
23.62,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
127.2926,
|
||||
217,
|
||||
18.8613,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
278,
|
||||
37.362,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
41.0657,
|
||||
278,
|
||||
26.429,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
67.4947,
|
||||
278,
|
||||
36.1779,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
103.6725,
|
||||
278,
|
||||
23.62,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
127.2926,
|
||||
278,
|
||||
18.8613,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
339,
|
||||
37.362,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
41.0657,
|
||||
339,
|
||||
26.429,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
67.4947,
|
||||
339,
|
||||
36.1779,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
103.6725,
|
||||
339,
|
||||
23.62,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
127.2926,
|
||||
339,
|
||||
18.8613,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
400,
|
||||
37.362,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
41.0657,
|
||||
400,
|
||||
26.429,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
67.4947,
|
||||
400,
|
||||
36.1779,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
103.6725,
|
||||
400,
|
||||
23.62,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
127.2926,
|
||||
400,
|
||||
18.8613,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
461,
|
||||
37.362,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
41.0657,
|
||||
461,
|
||||
26.429,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
67.4947,
|
||||
461,
|
||||
36.1779,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
103.6725,
|
||||
461,
|
||||
23.62,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
127.2926,
|
||||
461,
|
||||
18.8613,
|
||||
61,
|
||||
0
|
||||
]
|
||||
]
|
||||
},
|
||||
"768": {
|
||||
"name": "users",
|
||||
"viewportWidth": 736,
|
||||
"width": 736,
|
||||
"height": 502,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
12.6741,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
30,
|
||||
12.6741,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
81.2479,
|
||||
4,
|
||||
18.7521,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
67,
|
||||
100,
|
||||
435,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
86,
|
||||
94.837,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
146,
|
||||
24.3079,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
26.8894,
|
||||
146,
|
||||
18.6481,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
45.5375,
|
||||
146,
|
||||
23.5628,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
69.1003,
|
||||
146,
|
||||
15.6568,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
84.7571,
|
||||
146,
|
||||
12.6613,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
179,
|
||||
24.3079,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
26.8894,
|
||||
179,
|
||||
18.6481,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
45.5375,
|
||||
179,
|
||||
23.5628,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
69.1003,
|
||||
179,
|
||||
15.6568,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
84.7571,
|
||||
179,
|
||||
12.6613,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
240,
|
||||
24.3079,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
26.8894,
|
||||
240,
|
||||
18.6481,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
45.5375,
|
||||
240,
|
||||
23.5628,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
69.1003,
|
||||
240,
|
||||
15.6568,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
84.7571,
|
||||
240,
|
||||
12.6613,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
301,
|
||||
24.3079,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
26.8894,
|
||||
301,
|
||||
18.6481,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
45.5375,
|
||||
301,
|
||||
23.5628,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
69.1003,
|
||||
301,
|
||||
15.6568,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
84.7571,
|
||||
301,
|
||||
12.6613,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
362,
|
||||
24.3079,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
26.8894,
|
||||
362,
|
||||
18.6481,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
45.5375,
|
||||
362,
|
||||
23.5628,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
69.1003,
|
||||
362,
|
||||
15.6568,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
84.7571,
|
||||
362,
|
||||
12.6613,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
423,
|
||||
24.3079,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
26.8894,
|
||||
423,
|
||||
18.6481,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
45.5375,
|
||||
423,
|
||||
23.5628,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
69.1003,
|
||||
423,
|
||||
15.6568,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
84.7571,
|
||||
423,
|
||||
12.6613,
|
||||
61,
|
||||
0
|
||||
]
|
||||
]
|
||||
},
|
||||
"1280": {
|
||||
"name": "users",
|
||||
"viewportWidth": 996,
|
||||
"width": 996,
|
||||
"height": 505,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
9.3656,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
30,
|
||||
9.3656,
|
||||
21,
|
||||
8
|
||||
],
|
||||
[
|
||||
86.5446,
|
||||
10,
|
||||
13.4554,
|
||||
32,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
67,
|
||||
100,
|
||||
438,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
86,
|
||||
96.1847,
|
||||
36,
|
||||
8
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
138,
|
||||
25.3655,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
27.2732,
|
||||
138,
|
||||
20.4302,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.7033,
|
||||
138,
|
||||
22.8571,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
70.5604,
|
||||
138,
|
||||
15.9011,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
86.4615,
|
||||
138,
|
||||
11.6309,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
176,
|
||||
25.3655,
|
||||
62,
|
||||
0
|
||||
],
|
||||
[
|
||||
27.2732,
|
||||
176,
|
||||
20.4302,
|
||||
62,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.7033,
|
||||
176,
|
||||
22.8571,
|
||||
62,
|
||||
0
|
||||
],
|
||||
[
|
||||
70.5604,
|
||||
176,
|
||||
15.9011,
|
||||
62,
|
||||
0
|
||||
],
|
||||
[
|
||||
86.4615,
|
||||
176,
|
||||
11.6309,
|
||||
62,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
238,
|
||||
25.3655,
|
||||
62,
|
||||
0
|
||||
],
|
||||
[
|
||||
27.2732,
|
||||
238,
|
||||
20.4302,
|
||||
62,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.7033,
|
||||
238,
|
||||
22.8571,
|
||||
62,
|
||||
0
|
||||
],
|
||||
[
|
||||
70.5604,
|
||||
238,
|
||||
15.9011,
|
||||
62,
|
||||
0
|
||||
],
|
||||
[
|
||||
86.4615,
|
||||
238,
|
||||
11.6309,
|
||||
62,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
300,
|
||||
25.3655,
|
||||
62,
|
||||
0
|
||||
],
|
||||
[
|
||||
27.2732,
|
||||
300,
|
||||
20.4302,
|
||||
62,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.7033,
|
||||
300,
|
||||
22.8571,
|
||||
62,
|
||||
0
|
||||
],
|
||||
[
|
||||
70.5604,
|
||||
300,
|
||||
15.9011,
|
||||
62,
|
||||
0
|
||||
],
|
||||
[
|
||||
86.4615,
|
||||
300,
|
||||
11.6309,
|
||||
62,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
362,
|
||||
25.3655,
|
||||
62,
|
||||
0
|
||||
],
|
||||
[
|
||||
27.2732,
|
||||
362,
|
||||
20.4302,
|
||||
62,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.7033,
|
||||
362,
|
||||
22.8571,
|
||||
62,
|
||||
0
|
||||
],
|
||||
[
|
||||
70.5604,
|
||||
362,
|
||||
15.9011,
|
||||
62,
|
||||
0
|
||||
],
|
||||
[
|
||||
86.4615,
|
||||
362,
|
||||
11.6309,
|
||||
62,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
424,
|
||||
25.3655,
|
||||
62,
|
||||
0
|
||||
],
|
||||
[
|
||||
27.2732,
|
||||
424,
|
||||
20.4302,
|
||||
62,
|
||||
0
|
||||
],
|
||||
[
|
||||
47.7033,
|
||||
424,
|
||||
22.8571,
|
||||
62,
|
||||
0
|
||||
],
|
||||
[
|
||||
70.5604,
|
||||
424,
|
||||
15.9011,
|
||||
62,
|
||||
0
|
||||
],
|
||||
[
|
||||
86.4615,
|
||||
424,
|
||||
11.6309,
|
||||
62,
|
||||
0
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
"_hash": "53e8df6c8f8bf975b3b88bfca3bbd804"
|
||||
}
|
||||
746
src/admin/bones/vehicles.bones.json
Normal file
746
src/admin/bones/vehicles.bones.json
Normal file
@@ -0,0 +1,746 @@
|
||||
{
|
||||
"breakpoints": {
|
||||
"375": {
|
||||
"name": "vehicles",
|
||||
"viewportWidth": 351,
|
||||
"width": 351,
|
||||
"height": 530,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
100,
|
||||
22,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
34,
|
||||
100,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
94,
|
||||
100,
|
||||
436,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
107,
|
||||
92.5926,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
167,
|
||||
23.9583,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
27.662,
|
||||
167,
|
||||
24.4168,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
52.0789,
|
||||
167,
|
||||
29.042,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
81.1209,
|
||||
167,
|
||||
18.8435,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
99.9644,
|
||||
167,
|
||||
46.1895,
|
||||
31,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
197,
|
||||
23.9583,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
27.662,
|
||||
197,
|
||||
24.4168,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
52.0789,
|
||||
197,
|
||||
29.042,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
81.1209,
|
||||
197,
|
||||
18.8435,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
99.9644,
|
||||
197,
|
||||
46.1895,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
258,
|
||||
23.9583,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
27.662,
|
||||
258,
|
||||
24.4168,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
52.0789,
|
||||
258,
|
||||
29.042,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
81.1209,
|
||||
258,
|
||||
18.8435,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
99.9644,
|
||||
258,
|
||||
46.1895,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
319,
|
||||
23.9583,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
27.662,
|
||||
319,
|
||||
24.4168,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
52.0789,
|
||||
319,
|
||||
29.042,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
81.1209,
|
||||
319,
|
||||
18.8435,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
99.9644,
|
||||
319,
|
||||
46.1895,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
380,
|
||||
23.9583,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
27.662,
|
||||
380,
|
||||
24.4168,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
52.0789,
|
||||
380,
|
||||
29.042,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
81.1209,
|
||||
380,
|
||||
18.8435,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
99.9644,
|
||||
380,
|
||||
46.1895,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
3.7037,
|
||||
441,
|
||||
23.9583,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
27.662,
|
||||
441,
|
||||
24.4168,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
52.0789,
|
||||
441,
|
||||
29.042,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
81.1209,
|
||||
441,
|
||||
18.8435,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
99.9644,
|
||||
441,
|
||||
46.1895,
|
||||
61,
|
||||
0
|
||||
]
|
||||
]
|
||||
},
|
||||
"768": {
|
||||
"name": "vehicles",
|
||||
"viewportWidth": 736,
|
||||
"width": 736,
|
||||
"height": 495,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
7,
|
||||
10.1478,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
82.6427,
|
||||
0,
|
||||
17.3573,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
60,
|
||||
100,
|
||||
435,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
79,
|
||||
94.837,
|
||||
44,
|
||||
8
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
139,
|
||||
16.4126,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
18.9941,
|
||||
139,
|
||||
16.5039,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
35.498,
|
||||
139,
|
||||
19.5058,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
55.0038,
|
||||
139,
|
||||
12.8843,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
67.8881,
|
||||
139,
|
||||
29.5304,
|
||||
33,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
172,
|
||||
16.4126,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
18.9941,
|
||||
172,
|
||||
16.5039,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
35.498,
|
||||
172,
|
||||
19.5058,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
55.0038,
|
||||
172,
|
||||
12.8843,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
67.8881,
|
||||
172,
|
||||
29.5304,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
233,
|
||||
16.4126,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
18.9941,
|
||||
233,
|
||||
16.5039,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
35.498,
|
||||
233,
|
||||
19.5058,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
55.0038,
|
||||
233,
|
||||
12.8843,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
67.8881,
|
||||
233,
|
||||
29.5304,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
294,
|
||||
16.4126,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
18.9941,
|
||||
294,
|
||||
16.5039,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
35.498,
|
||||
294,
|
||||
19.5058,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
55.0038,
|
||||
294,
|
||||
12.8843,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
67.8881,
|
||||
294,
|
||||
29.5304,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
355,
|
||||
16.4126,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
18.9941,
|
||||
355,
|
||||
16.5039,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
35.498,
|
||||
355,
|
||||
19.5058,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
55.0038,
|
||||
355,
|
||||
12.8843,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
67.8881,
|
||||
355,
|
||||
29.5304,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
2.5815,
|
||||
416,
|
||||
16.4126,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
18.9941,
|
||||
416,
|
||||
16.5039,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
35.498,
|
||||
416,
|
||||
19.5058,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
55.0038,
|
||||
416,
|
||||
12.8843,
|
||||
61,
|
||||
0
|
||||
],
|
||||
[
|
||||
67.8881,
|
||||
416,
|
||||
29.5304,
|
||||
61,
|
||||
0
|
||||
]
|
||||
]
|
||||
},
|
||||
"1280": {
|
||||
"name": "vehicles",
|
||||
"viewportWidth": 996,
|
||||
"width": 996,
|
||||
"height": 451,
|
||||
"bones": [
|
||||
[
|
||||
0,
|
||||
1,
|
||||
7.4987,
|
||||
26,
|
||||
8
|
||||
],
|
||||
[
|
||||
87.5753,
|
||||
0,
|
||||
12.4247,
|
||||
32,
|
||||
8
|
||||
],
|
||||
[
|
||||
0,
|
||||
48,
|
||||
100,
|
||||
403,
|
||||
10,
|
||||
true
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
67,
|
||||
96.1847,
|
||||
36,
|
||||
8
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
119,
|
||||
18.3531,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
20.2607,
|
||||
119,
|
||||
18.2762,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
38.537,
|
||||
119,
|
||||
21.1785,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
59.7154,
|
||||
119,
|
||||
14.7841,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
74.4996,
|
||||
119,
|
||||
23.5928,
|
||||
38,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
157,
|
||||
18.3531,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
20.2607,
|
||||
157,
|
||||
18.2762,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
38.537,
|
||||
157,
|
||||
21.1785,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
59.7154,
|
||||
157,
|
||||
14.7841,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
74.4996,
|
||||
157,
|
||||
23.5928,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
212,
|
||||
18.3531,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
20.2607,
|
||||
212,
|
||||
18.2762,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
38.537,
|
||||
212,
|
||||
21.1785,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
59.7154,
|
||||
212,
|
||||
14.7841,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
74.4996,
|
||||
212,
|
||||
23.5928,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
267,
|
||||
18.3531,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
20.2607,
|
||||
267,
|
||||
18.2762,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
38.537,
|
||||
267,
|
||||
21.1785,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
59.7154,
|
||||
267,
|
||||
14.7841,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
74.4996,
|
||||
267,
|
||||
23.5928,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
322,
|
||||
18.3531,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
20.2607,
|
||||
322,
|
||||
18.2762,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
38.537,
|
||||
322,
|
||||
21.1785,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
59.7154,
|
||||
322,
|
||||
14.7841,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
74.4996,
|
||||
322,
|
||||
23.5928,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
1.9076,
|
||||
377,
|
||||
18.3531,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
20.2607,
|
||||
377,
|
||||
18.2762,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
38.537,
|
||||
377,
|
||||
21.1785,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
59.7154,
|
||||
377,
|
||||
14.7841,
|
||||
55,
|
||||
0
|
||||
],
|
||||
[
|
||||
74.4996,
|
||||
377,
|
||||
23.5928,
|
||||
55,
|
||||
0
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
"_hash": "567bad6080dc9ba9767c6e40a88559b9"
|
||||
}
|
||||
@@ -1,7 +1,11 @@
|
||||
import { useState, useEffect, useRef, useCallback } from "react";
|
||||
import { useState, useRef } from "react";
|
||||
import { useQuery, useQueryClient } from "@tanstack/react-query";
|
||||
import { projectFilesOptions } from "../lib/queries/projects";
|
||||
import { useAlert } from "../context/AlertContext";
|
||||
import ConfirmModal from "./ConfirmModal";
|
||||
import apiFetch from "../utils/api";
|
||||
import { Skeleton } from "boneyard-js/react";
|
||||
import ProjectFileManagerFixture from "../fixtures/ProjectFileManagerFixture";
|
||||
|
||||
const API_BASE = "/api/admin";
|
||||
|
||||
@@ -196,14 +200,11 @@ export default function ProjectFileManager({
|
||||
hasNasFolder,
|
||||
}: ProjectFileManagerProps) {
|
||||
const alert = useAlert();
|
||||
const queryClient = useQueryClient();
|
||||
const fileInputRef = useRef<HTMLInputElement>(null);
|
||||
const isCancelling = useRef(false);
|
||||
|
||||
const [items, setItems] = useState<FileItem[]>([]);
|
||||
const [loading, setLoading] = useState(true);
|
||||
const [currentPath, setCurrentPath] = useState("");
|
||||
const [breadcrumb, setBreadcrumb] = useState<string[]>([""]);
|
||||
const [fullPath, setFullPath] = useState("");
|
||||
|
||||
const [dragOver, setDragOver] = useState(false);
|
||||
const [uploading, setUploading] = useState(false);
|
||||
@@ -217,59 +218,25 @@ export default function ProjectFileManager({
|
||||
|
||||
const [deleteTarget, setDeleteTarget] = useState<FileItem | null>(null);
|
||||
const [deleting, setDeleting] = useState(false);
|
||||
const [errorMessage, setErrorMessage] = useState<string | null>(null);
|
||||
|
||||
const canManage = hasPermission("projects.files");
|
||||
|
||||
const fetchFiles = useCallback(
|
||||
async (path = "", options: { ignore?: boolean } = {}) => {
|
||||
setLoading(true);
|
||||
setErrorMessage(null);
|
||||
try {
|
||||
const params = new URLSearchParams({ project_id: String(projectId) });
|
||||
if (path) {
|
||||
params.set("path", path);
|
||||
}
|
||||
const res = await apiFetch(`${API_BASE}/project-files?${params}`);
|
||||
if (options.ignore) return;
|
||||
if (res.status === 401) return;
|
||||
const data = await res.json();
|
||||
if (data.success) {
|
||||
setItems(data.data.items || []);
|
||||
setBreadcrumb(data.data.breadcrumb || [""]);
|
||||
setCurrentPath(data.data.path || "");
|
||||
setFullPath(data.data.full_path || "");
|
||||
} else if (res.status === 404) {
|
||||
setItems([]);
|
||||
setBreadcrumb([""]);
|
||||
} else {
|
||||
setErrorMessage(data.error || "Nepodařilo se načíst soubory");
|
||||
}
|
||||
} catch {
|
||||
if (!options.ignore) {
|
||||
setErrorMessage("Chyba připojení");
|
||||
}
|
||||
} finally {
|
||||
if (!options.ignore) {
|
||||
setLoading(false);
|
||||
}
|
||||
}
|
||||
},
|
||||
[projectId],
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
const opts = { ignore: false };
|
||||
fetchFiles("", opts);
|
||||
return () => {
|
||||
opts.ignore = true;
|
||||
};
|
||||
}, [fetchFiles]);
|
||||
const {
|
||||
data: filesData,
|
||||
isPending: filesLoading,
|
||||
error: filesError,
|
||||
} = useQuery(projectFilesOptions(projectId, currentPath));
|
||||
const items = filesData?.items ?? [];
|
||||
const breadcrumb = filesData?.breadcrumb ?? [""];
|
||||
const fullPath = filesData?.full_path ?? "";
|
||||
const errorMessage = filesError
|
||||
? filesError.message || "Nepodařilo se načíst soubory"
|
||||
: null;
|
||||
|
||||
const navigateTo = (path: string) => {
|
||||
setNewFolderMode(false);
|
||||
setRenamingItem(null);
|
||||
fetchFiles(path);
|
||||
setCurrentPath(path);
|
||||
};
|
||||
|
||||
const handleBreadcrumbClick = (index: number) => {
|
||||
@@ -332,7 +299,9 @@ export default function ProjectFileManager({
|
||||
? "Soubor byl nahrán"
|
||||
: `Nahráno ${successCount} souborů`;
|
||||
alert.success(msg);
|
||||
fetchFiles(currentPath);
|
||||
queryClient.invalidateQueries({
|
||||
queryKey: ["projects", String(projectId), "files"],
|
||||
});
|
||||
}
|
||||
if (errorMsg) {
|
||||
alert.error(errorMsg);
|
||||
@@ -383,7 +352,9 @@ export default function ProjectFileManager({
|
||||
alert.success("Složka byla vytvořena");
|
||||
setNewFolderMode(false);
|
||||
setNewFolderName("");
|
||||
fetchFiles(currentPath);
|
||||
queryClient.invalidateQueries({
|
||||
queryKey: ["projects", String(projectId), "files"],
|
||||
});
|
||||
} else {
|
||||
alert.error(data.error || "Nepodařilo se vytvořit složku");
|
||||
}
|
||||
@@ -444,7 +415,9 @@ export default function ProjectFileManager({
|
||||
? "Složka byla smazána"
|
||||
: "Soubor byl smazán",
|
||||
);
|
||||
fetchFiles(currentPath);
|
||||
queryClient.invalidateQueries({
|
||||
queryKey: ["projects", String(projectId), "files"],
|
||||
});
|
||||
} else {
|
||||
alert.error(data.error || "Nepodařilo se smazat");
|
||||
}
|
||||
@@ -479,7 +452,9 @@ export default function ProjectFileManager({
|
||||
const data = await res.json();
|
||||
if (data.success) {
|
||||
alert.success("Přejmenováno");
|
||||
fetchFiles(currentPath);
|
||||
queryClient.invalidateQueries({
|
||||
queryKey: ["projects", String(projectId), "files"],
|
||||
});
|
||||
} else {
|
||||
alert.error(data.error || "Nepodařilo se přejmenovat");
|
||||
}
|
||||
@@ -495,32 +470,15 @@ export default function ProjectFileManager({
|
||||
setRenameValue(item.name);
|
||||
};
|
||||
|
||||
if (loading && items.length === 0 && !errorMessage) {
|
||||
if (filesLoading && items.length === 0 && !errorMessage) {
|
||||
return (
|
||||
<div className="admin-card">
|
||||
<div className="admin-card-body">
|
||||
<h3 className="admin-card-title">Soubory</h3>
|
||||
<div className="admin-skeleton" style={{ padding: 0, gap: "0.5rem" }}>
|
||||
{[0, 1, 2, 3].map((i) => (
|
||||
<div key={i} className="admin-skeleton-row">
|
||||
<div
|
||||
className="admin-skeleton-line"
|
||||
style={{
|
||||
width: "18px",
|
||||
height: "18px",
|
||||
borderRadius: "4px",
|
||||
flexShrink: 0,
|
||||
}}
|
||||
/>
|
||||
<div
|
||||
className="admin-skeleton-line"
|
||||
style={{ width: `${60 + i * 10}%` }}
|
||||
/>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<Skeleton
|
||||
name="project-file-manager"
|
||||
loading={filesLoading && items.length === 0}
|
||||
fixture={<ProjectFileManagerFixture />}
|
||||
>
|
||||
<div />
|
||||
</Skeleton>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -710,7 +668,7 @@ export default function ProjectFileManager({
|
||||
</div>
|
||||
)}
|
||||
|
||||
{items.length === 0 && !loading ? (
|
||||
{items.length === 0 && !filesLoading ? (
|
||||
<div className="fm-empty">
|
||||
<svg
|
||||
width="32"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { useMemo, useRef, useCallback, useEffect } from "react";
|
||||
import { useMemo, useRef, useCallback, useLayoutEffect } from "react";
|
||||
import ReactQuill from "react-quill-new";
|
||||
import "react-quill-new/dist/quill.snow.css";
|
||||
|
||||
@@ -96,11 +96,11 @@ export default function RichEditor({
|
||||
[onChange],
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
useLayoutEffect(() => {
|
||||
if (!quillRef.current) return;
|
||||
const editor = quillRef.current.getEditor();
|
||||
editor.format("font", "tahoma");
|
||||
editor.format("size", "14px");
|
||||
editor.root.style.fontFamily = "Tahoma, sans-serif";
|
||||
editor.root.style.fontSize = "14px";
|
||||
}, []);
|
||||
|
||||
return (
|
||||
|
||||
@@ -116,7 +116,7 @@ const menuSections: MenuSection[] = [
|
||||
{
|
||||
path: "/attendance/admin",
|
||||
label: "Správa",
|
||||
permission: "attendance.admin",
|
||||
permission: "attendance.manage",
|
||||
matchPrefix: "/attendance/admin",
|
||||
matchAlso: ["/attendance/create", "/attendance/location"],
|
||||
icon: (
|
||||
@@ -198,7 +198,7 @@ const menuSections: MenuSection[] = [
|
||||
{
|
||||
path: "/trips/admin",
|
||||
label: "Správa",
|
||||
permission: "trips.admin",
|
||||
permission: "trips.manage",
|
||||
icon: (
|
||||
<svg
|
||||
viewBox="0 0 24 24"
|
||||
@@ -221,7 +221,7 @@ const menuSections: MenuSection[] = [
|
||||
{
|
||||
path: "/vehicles",
|
||||
label: "Vozidla",
|
||||
permission: "trips.vehicles",
|
||||
permission: "vehicles.manage",
|
||||
icon: (
|
||||
<svg
|
||||
viewBox="0 0 24 24"
|
||||
@@ -315,7 +315,7 @@ const menuSections: MenuSection[] = [
|
||||
{
|
||||
path: "/offers/customers",
|
||||
label: "Zákazníci",
|
||||
permission: "offers.view",
|
||||
permission: "customers.view",
|
||||
icon: (
|
||||
<svg
|
||||
viewBox="0 0 24 24"
|
||||
@@ -356,7 +356,13 @@ const menuSections: MenuSection[] = [
|
||||
{
|
||||
path: "/settings",
|
||||
label: "Nastavení",
|
||||
permission: "settings.manage",
|
||||
permission: [
|
||||
"settings.company",
|
||||
"settings.banking",
|
||||
"settings.roles",
|
||||
"settings.system",
|
||||
"settings.templates",
|
||||
],
|
||||
icon: (
|
||||
<svg
|
||||
viewBox="0 0 24 24"
|
||||
|
||||
@@ -89,6 +89,21 @@ export default function DashProfile({
|
||||
const handleSubmit = async (e?: React.FormEvent) => {
|
||||
e?.preventDefault();
|
||||
const dataToSave = { ...formData };
|
||||
|
||||
if (dataToSave.new_password && !dataToSave.current_password) {
|
||||
alert.error("Pro změnu hesla zadejte aktuální heslo");
|
||||
return;
|
||||
}
|
||||
if (dataToSave.current_password && !dataToSave.new_password) {
|
||||
alert.error("Pro změnu hesla zadejte nové heslo");
|
||||
return;
|
||||
}
|
||||
|
||||
// Strip empty password fields so Zod doesn't reject ""
|
||||
if (!dataToSave.current_password)
|
||||
delete (dataToSave as any).current_password;
|
||||
if (!dataToSave.new_password) delete (dataToSave as any).new_password;
|
||||
|
||||
try {
|
||||
const response = await apiFetch(`${API_BASE}/profile`, {
|
||||
method: "PUT",
|
||||
@@ -329,9 +344,24 @@ export default function DashProfile({
|
||||
className="admin-form-input"
|
||||
/>
|
||||
</div>
|
||||
<div className="admin-form-group">
|
||||
<label className="admin-form-label">Aktuální heslo</label>
|
||||
<input
|
||||
type="password"
|
||||
value={formData.current_password}
|
||||
onChange={(e) =>
|
||||
setFormData({
|
||||
...formData,
|
||||
current_password: e.target.value,
|
||||
})
|
||||
}
|
||||
className="admin-form-input"
|
||||
placeholder="Pro změnu hesla, zadejte aktuální heslo"
|
||||
/>
|
||||
</div>
|
||||
<div className="admin-form-group">
|
||||
<label className="admin-form-label">
|
||||
Nové heslo (ponechte prázdné pro zachování stávajícího)
|
||||
Nové heslo
|
||||
</label>
|
||||
<input
|
||||
type="password"
|
||||
@@ -343,27 +373,9 @@ export default function DashProfile({
|
||||
})
|
||||
}
|
||||
className="admin-form-input"
|
||||
placeholder="Pro změnu hesla, zadejte nové heslo"
|
||||
/>
|
||||
</div>
|
||||
{formData.new_password && (
|
||||
<div className="admin-form-group">
|
||||
<label className="admin-form-label required">
|
||||
Aktuální heslo
|
||||
</label>
|
||||
<input
|
||||
type="password"
|
||||
value={formData.current_password}
|
||||
onChange={(e) =>
|
||||
setFormData({
|
||||
...formData,
|
||||
current_password: e.target.value,
|
||||
})
|
||||
}
|
||||
className="admin-form-input"
|
||||
placeholder="Zadejte aktuální heslo pro potvrzení"
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-modal-footer">
|
||||
|
||||
@@ -1,27 +1,17 @@
|
||||
import { useState, useEffect, useCallback } from "react";
|
||||
import { useState } from "react";
|
||||
import { useQuery, useQueryClient } from "@tanstack/react-query";
|
||||
import { motion } from "framer-motion";
|
||||
import { useAlert } from "../../context/AlertContext";
|
||||
import ConfirmModal from "../ConfirmModal";
|
||||
import useModalLock from "../../hooks/useModalLock";
|
||||
import apiFetch from "../../utils/api";
|
||||
import { formatSessionDate } from "../../utils/dashboardHelpers";
|
||||
import { sessionsOptions, type Session } from "../../lib/queries/dashboard";
|
||||
import { Skeleton } from "boneyard-js/react";
|
||||
import DashSessionsFixture from "../../fixtures/DashSessionsFixture";
|
||||
|
||||
const API_BASE = "/api/admin";
|
||||
|
||||
interface DeviceInfo {
|
||||
icon?: string;
|
||||
browser?: string;
|
||||
os?: string;
|
||||
}
|
||||
|
||||
interface Session {
|
||||
id: number | string;
|
||||
is_current: boolean;
|
||||
device_info?: DeviceInfo;
|
||||
ip_address: string;
|
||||
created_at: string;
|
||||
}
|
||||
|
||||
interface DeleteModalState {
|
||||
isOpen: boolean;
|
||||
session: Session | null;
|
||||
@@ -77,9 +67,10 @@ function getDeviceIcon(iconType?: string) {
|
||||
|
||||
export default function DashSessions() {
|
||||
const alert = useAlert();
|
||||
const queryClient = useQueryClient();
|
||||
|
||||
const [sessions, setSessions] = useState<Session[]>([]);
|
||||
const [sessionsLoading, setSessionsLoading] = useState(true);
|
||||
const { data: sessions = [], isPending: sessionsLoading } =
|
||||
useQuery(sessionsOptions());
|
||||
const [deleteModal, setDeleteModal] = useState<DeleteModalState>({
|
||||
isOpen: false,
|
||||
session: null,
|
||||
@@ -89,26 +80,6 @@ export default function DashSessions() {
|
||||
|
||||
useModalLock(deleteAllModal);
|
||||
|
||||
const fetchSessions = useCallback(async () => {
|
||||
try {
|
||||
const response = await apiFetch(`${API_BASE}/sessions`);
|
||||
const data = await response.json();
|
||||
if (data.success) {
|
||||
setSessions(
|
||||
Array.isArray(data.data) ? data.data : data.data?.sessions || [],
|
||||
);
|
||||
}
|
||||
} catch {
|
||||
// session fetch failed silently
|
||||
} finally {
|
||||
setSessionsLoading(false);
|
||||
}
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
fetchSessions();
|
||||
}, [fetchSessions]);
|
||||
|
||||
const handleDeleteSession = async () => {
|
||||
if (!deleteModal.session) {
|
||||
return;
|
||||
@@ -122,7 +93,7 @@ export default function DashSessions() {
|
||||
const data = await response.json();
|
||||
if (data.success) {
|
||||
setDeleteModal({ isOpen: false, session: null });
|
||||
setSessions((prev) => prev.filter((s) => s.id !== sessionId));
|
||||
queryClient.invalidateQueries({ queryKey: ["sessions"] });
|
||||
alert.success("Relace byla ukončena");
|
||||
} else {
|
||||
alert.error(data.error || "Nepodařilo se ukončit relaci");
|
||||
@@ -143,7 +114,7 @@ export default function DashSessions() {
|
||||
const data = await response.json();
|
||||
if (data.success) {
|
||||
setDeleteAllModal(false);
|
||||
setSessions((prev) => prev.filter((s) => s.is_current));
|
||||
queryClient.invalidateQueries({ queryKey: ["sessions"] });
|
||||
alert.success(data.message || "Ostatní relace byly ukončeny");
|
||||
} else {
|
||||
alert.error(data.error || "Nepodařilo se ukončit relace");
|
||||
@@ -183,98 +154,84 @@ export default function DashSessions() {
|
||||
)}
|
||||
</div>
|
||||
<div className="admin-card-body" style={{ padding: 0 }}>
|
||||
{sessionsLoading && (
|
||||
<div
|
||||
className="admin-skeleton"
|
||||
style={{ padding: "1rem", gap: "1rem" }}
|
||||
>
|
||||
{[0, 1, 2].map((i) => (
|
||||
<div key={i} className="admin-skeleton-row">
|
||||
<div className="admin-skeleton-line circle" />
|
||||
<div className="flex-1">
|
||||
<div
|
||||
className="admin-skeleton-line w-1/2"
|
||||
style={{ marginBottom: "0.5rem" }}
|
||||
/>
|
||||
<div
|
||||
className="admin-skeleton-line w-1/3"
|
||||
style={{ height: "10px" }}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
{!sessionsLoading && sessions.length === 0 && (
|
||||
<div
|
||||
className="text-secondary"
|
||||
style={{
|
||||
padding: "1.5rem",
|
||||
textAlign: "center",
|
||||
fontSize: "0.875rem",
|
||||
}}
|
||||
>
|
||||
Žádné aktivní relace
|
||||
</div>
|
||||
)}
|
||||
{!sessionsLoading && sessions.length > 0 && (
|
||||
<div className="dash-sessions-list">
|
||||
{sessions.map((session) => (
|
||||
<Skeleton
|
||||
name="dash-sessions"
|
||||
loading={sessionsLoading}
|
||||
fixture={<DashSessionsFixture />}
|
||||
>
|
||||
<>
|
||||
{sessions.length === 0 && (
|
||||
<div
|
||||
key={session.id}
|
||||
className={`dash-session-item ${session.is_current ? "dash-session-item-current" : ""}`}
|
||||
className="text-secondary"
|
||||
style={{
|
||||
padding: "1.5rem",
|
||||
textAlign: "center",
|
||||
fontSize: "0.875rem",
|
||||
}}
|
||||
>
|
||||
<div className="dash-session-icon">
|
||||
{getDeviceIcon(session.device_info?.icon)}
|
||||
</div>
|
||||
<div className="dash-session-info">
|
||||
<div className="dash-session-device">
|
||||
{session.device_info?.browser} na{" "}
|
||||
{session.device_info?.os}
|
||||
{session.is_current && (
|
||||
<span
|
||||
className="admin-badge admin-badge-success"
|
||||
style={{ marginLeft: "0.5rem" }}
|
||||
>
|
||||
Aktuální
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
<div className="dash-session-meta">
|
||||
<span>{session.ip_address}</span>
|
||||
<span className="dash-session-meta-separator">|</span>
|
||||
<span>{formatSessionDate(session.created_at)}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div className="dash-session-actions">
|
||||
{!session.is_current && (
|
||||
<button
|
||||
onClick={() =>
|
||||
setDeleteModal({ isOpen: true, session })
|
||||
}
|
||||
className="admin-btn-icon danger"
|
||||
title="Ukončit relaci"
|
||||
aria-label="Ukončit relaci"
|
||||
>
|
||||
<svg
|
||||
width="16"
|
||||
height="16"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
strokeWidth="2"
|
||||
>
|
||||
<path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4" />
|
||||
<polyline points="16 17 21 12 16 7" />
|
||||
<line x1="21" y1="12" x2="9" y2="12" />
|
||||
</svg>
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
Žádné aktivní relace
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
)}
|
||||
{sessions.length > 0 && (
|
||||
<div className="dash-sessions-list">
|
||||
{sessions.map((session) => (
|
||||
<div
|
||||
key={session.id}
|
||||
className={`dash-session-item ${session.is_current ? "dash-session-item-current" : ""}`}
|
||||
>
|
||||
<div className="dash-session-icon">
|
||||
{getDeviceIcon(session.device_info?.icon)}
|
||||
</div>
|
||||
<div className="dash-session-info">
|
||||
<div className="dash-session-device">
|
||||
{session.device_info?.browser} na{" "}
|
||||
{session.device_info?.os}
|
||||
{session.is_current && (
|
||||
<span
|
||||
className="admin-badge admin-badge-success"
|
||||
style={{ marginLeft: "0.5rem" }}
|
||||
>
|
||||
Aktuální
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
<div className="dash-session-meta">
|
||||
<span>{session.ip_address}</span>
|
||||
<span className="dash-session-meta-separator">|</span>
|
||||
<span>{formatSessionDate(session.created_at)}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div className="dash-session-actions">
|
||||
{!session.is_current && (
|
||||
<button
|
||||
onClick={() =>
|
||||
setDeleteModal({ isOpen: true, session })
|
||||
}
|
||||
className="admin-btn-icon danger"
|
||||
title="Ukončit relaci"
|
||||
aria-label="Ukončit relaci"
|
||||
>
|
||||
<svg
|
||||
width="16"
|
||||
height="16"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
strokeWidth="2"
|
||||
>
|
||||
<path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4" />
|
||||
<polyline points="16 17 21 12 16 7" />
|
||||
<line x1="21" y1="12" x2="9" y2="12" />
|
||||
</svg>
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
</>
|
||||
</Skeleton>
|
||||
</div>
|
||||
</motion.div>
|
||||
|
||||
|
||||
@@ -90,6 +90,7 @@ export function AuthProvider({ children }: { children: ReactNode }) {
|
||||
const cachedUserRef = useRef<User | null>(null);
|
||||
const sessionFetchedRef = useRef(false);
|
||||
const silentRefreshInFlightRef = useRef<Promise<boolean> | null>(null);
|
||||
const hadValidSessionRef = useRef(false);
|
||||
const [user, setUser] = useState<User | null>(cachedUserRef.current);
|
||||
const [loading, setLoading] = useState(!sessionFetchedRef.current);
|
||||
const [error, setError] = useState<string | null>(null);
|
||||
@@ -138,13 +139,14 @@ export function AuthProvider({ children }: { children: ReactNode }) {
|
||||
if (data.success && data.data?.access_token) {
|
||||
setAccessTokenFn(data.data.access_token, data.data.expires_in);
|
||||
setUser(mapUser(data.data.user));
|
||||
hadValidSessionRef.current = true;
|
||||
return true;
|
||||
}
|
||||
accessTokenRef.current = null;
|
||||
tokenExpiresAtRef.current = null;
|
||||
setUser(null);
|
||||
cachedUserRef.current = null;
|
||||
setSessionExpired();
|
||||
if (hadValidSessionRef.current) setSessionExpired();
|
||||
return false;
|
||||
} catch {
|
||||
// Network error — don't kick the user out, just return false
|
||||
@@ -178,6 +180,7 @@ export function AuthProvider({ children }: { children: ReactNode }) {
|
||||
if (data.data.access_token) setAccessTokenFn(data.data.access_token);
|
||||
setUser(mapUser(data.data.user));
|
||||
cachedUserRef.current = mapUser(data.data.user);
|
||||
hadValidSessionRef.current = true;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -233,6 +236,7 @@ export function AuthProvider({ children }: { children: ReactNode }) {
|
||||
setUser(mapUser(data.data.user));
|
||||
cachedUserRef.current = mapUser(data.data.user);
|
||||
sessionFetchedRef.current = true;
|
||||
hadValidSessionRef.current = true;
|
||||
return { success: true };
|
||||
}
|
||||
setError(data.error);
|
||||
@@ -273,6 +277,7 @@ export function AuthProvider({ children }: { children: ReactNode }) {
|
||||
setUser(mapUser(data.data.user));
|
||||
cachedUserRef.current = mapUser(data.data.user);
|
||||
sessionFetchedRef.current = true;
|
||||
hadValidSessionRef.current = true;
|
||||
return { success: true };
|
||||
}
|
||||
setError(data.error);
|
||||
@@ -302,6 +307,7 @@ export function AuthProvider({ children }: { children: ReactNode }) {
|
||||
setUser(null);
|
||||
cachedUserRef.current = null;
|
||||
sessionFetchedRef.current = false;
|
||||
hadValidSessionRef.current = false;
|
||||
if (refreshTimeoutRef.current) {
|
||||
clearTimeout(refreshTimeoutRef.current);
|
||||
refreshTimeoutRef.current = null;
|
||||
|
||||
69
src/admin/fixtures/AttendanceAdminFixture.tsx
Normal file
69
src/admin/fixtures/AttendanceAdminFixture.tsx
Normal file
@@ -0,0 +1,69 @@
|
||||
export default function AttendanceAdminFixture() {
|
||||
return (
|
||||
<div>
|
||||
<div className="admin-page-header">
|
||||
<div>
|
||||
<h1 className="admin-page-title">Správa docházky</h1>
|
||||
</div>
|
||||
<div className="admin-page-actions">
|
||||
<button className="admin-btn admin-btn-secondary">
|
||||
Vyplnit měsíc
|
||||
</button>
|
||||
<button className="admin-btn admin-btn-primary">Přidat záznam</button>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-card mb-6">
|
||||
<div className="admin-card-body">
|
||||
<div className="admin-form-row">
|
||||
<label className="admin-form-label">Měsíc</label>
|
||||
<select className="admin-form-select" />
|
||||
<label className="admin-form-label">Zaměstnanec</label>
|
||||
<select className="admin-form-select" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-grid admin-grid-3">
|
||||
{Array.from({ length: 3 }, (_, i) => (
|
||||
<div key={i} className="admin-card">
|
||||
<div className="admin-card-body">
|
||||
<div className="flex-row gap-2 mb-2">
|
||||
<span style={{ fontWeight: 600 }}>Jan Novák</span>
|
||||
<span className="attendance-working-badge finished">
|
||||
✗
|
||||
</span>
|
||||
</div>
|
||||
<div className="admin-stat-value">8:00</div>
|
||||
<div className="admin-stat-label">odpracováno</div>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
<div className="admin-card">
|
||||
<div className="admin-card-body">
|
||||
<div className="admin-table-responsive">
|
||||
<table className="admin-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Datum</th>
|
||||
<th>Příchod</th>
|
||||
<th>Odchod</th>
|
||||
<th>Hodiny</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{Array.from({ length: 4 }, (_, i) => (
|
||||
<tr key={i}>
|
||||
<td>1. 4. 2025</td>
|
||||
<td className="admin-mono">08:00</td>
|
||||
<td className="admin-mono">16:00</td>
|
||||
<td className="admin-mono">8:00</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
104
src/admin/fixtures/AttendanceBalancesFixture.tsx
Normal file
104
src/admin/fixtures/AttendanceBalancesFixture.tsx
Normal file
@@ -0,0 +1,104 @@
|
||||
export default function AttendanceBalancesFixture() {
|
||||
return (
|
||||
<div>
|
||||
<div className="admin-page-header">
|
||||
<div>
|
||||
<h1 className="admin-page-title">Správa bilancí</h1>
|
||||
</div>
|
||||
<div className="admin-page-actions">
|
||||
<select className="admin-form-select" style={{ minWidth: 100 }}>
|
||||
<option>2025</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-card">
|
||||
<div className="admin-card-body">
|
||||
<div className="admin-table-responsive">
|
||||
<table className="admin-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Zaměstnanec</th>
|
||||
<th>Nárok (h)</th>
|
||||
<th>Čerpáno (h)</th>
|
||||
<th>Zbývá (h)</th>
|
||||
<th>Nemoc (h)</th>
|
||||
<th>Akce</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{Array.from({ length: 4 }, (_, i) => (
|
||||
<tr key={i}>
|
||||
<td className="fw-500">Jan Novák</td>
|
||||
<td className="admin-mono">160</td>
|
||||
<td className="admin-mono">40.0</td>
|
||||
<td className="admin-mono">120.0</td>
|
||||
<td className="admin-mono">8.0</td>
|
||||
<td>
|
||||
<div className="admin-table-actions">
|
||||
<button className="admin-btn-icon" title="Upravit">
|
||||
✎
|
||||
</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="mt-6">
|
||||
<h2 className="admin-page-title mb-4" style={{ fontSize: "1.25rem" }}>
|
||||
Měsíční přehled fondu 2025
|
||||
</h2>
|
||||
<div className="admin-grid admin-grid-3">
|
||||
{Array.from({ length: 3 }, (_, i) => (
|
||||
<div key={i} className="admin-card">
|
||||
<div className="admin-card-body">
|
||||
<h3 style={{ fontWeight: 600, fontSize: "1rem", margin: 0 }}>
|
||||
Duben
|
||||
</h3>
|
||||
<div
|
||||
style={{
|
||||
display: "flex",
|
||||
flexDirection: "column",
|
||||
gap: "0.375rem",
|
||||
marginTop: "0.5rem",
|
||||
}}
|
||||
>
|
||||
<div
|
||||
style={{
|
||||
display: "flex",
|
||||
justifyContent: "space-between",
|
||||
fontSize: 12,
|
||||
}}
|
||||
>
|
||||
<span>Jan Novák</span>
|
||||
<span className="text-secondary">8h</span>
|
||||
</div>
|
||||
<div
|
||||
style={{
|
||||
height: 3,
|
||||
background: "var(--bg-tertiary)",
|
||||
borderRadius: 2,
|
||||
overflow: "hidden",
|
||||
}}
|
||||
>
|
||||
<div
|
||||
style={{
|
||||
height: "100%",
|
||||
width: "75%",
|
||||
background: "var(--gradient)",
|
||||
borderRadius: 2,
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
43
src/admin/fixtures/AttendanceCreateFixture.tsx
Normal file
43
src/admin/fixtures/AttendanceCreateFixture.tsx
Normal file
@@ -0,0 +1,43 @@
|
||||
export default function AttendanceCreateFixture() {
|
||||
return (
|
||||
<div>
|
||||
<div className="admin-page-header">
|
||||
<h1 className="admin-page-title">Zapsat docházku</h1>
|
||||
</div>
|
||||
<div className="admin-card" style={{ maxWidth: 600 }}>
|
||||
<div className="admin-card-body">
|
||||
<FormField label="Uživatel">
|
||||
<select className="admin-form-select">
|
||||
<option>Jan Novák</option>
|
||||
</select>
|
||||
</FormField>
|
||||
<FormField label="Datum">
|
||||
<input type="date" className="admin-form-input" />
|
||||
</FormField>
|
||||
<FormField label="Příchod">
|
||||
<input type="time" className="admin-form-input" />
|
||||
</FormField>
|
||||
<FormField label="Odchod">
|
||||
<input type="time" className="admin-form-input" />
|
||||
</FormField>
|
||||
<button className="admin-btn admin-btn-primary">Uložit</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function FormField({
|
||||
label,
|
||||
children,
|
||||
}: {
|
||||
label: string;
|
||||
children: React.ReactNode;
|
||||
}) {
|
||||
return (
|
||||
<div className="admin-form-group">
|
||||
<label className="admin-form-label">{label}</label>
|
||||
{children}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
79
src/admin/fixtures/AttendanceFixture.tsx
Normal file
79
src/admin/fixtures/AttendanceFixture.tsx
Normal file
@@ -0,0 +1,79 @@
|
||||
export default function AttendanceFixture() {
|
||||
return (
|
||||
<div>
|
||||
<div className="admin-page-header">
|
||||
<div>
|
||||
<h1 className="admin-page-title">Docházka</h1>
|
||||
<p className="admin-page-subtitle">pondělí 28. dubna 2025</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="attendance-layout">
|
||||
<div className="attendance-main">
|
||||
<div className="attendance-clock-card">
|
||||
<div className="attendance-clock-header">
|
||||
<div className="attendance-clock-status">
|
||||
<span className="attendance-status-dot" />
|
||||
<span>Nepracuji</span>
|
||||
</div>
|
||||
<div className="attendance-clock-time">08:30</div>
|
||||
</div>
|
||||
<div className="attendance-clock-actions">
|
||||
<button className="admin-btn admin-btn-primary w-full">
|
||||
Příchod
|
||||
</button>
|
||||
<button className="admin-btn admin-btn-secondary w-full">
|
||||
Žádost o nepřítomnost
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="attendance-sidebar">
|
||||
<div className="attendance-balance-card">
|
||||
<h3 className="attendance-balance-title">Dovolená 2025</h3>
|
||||
<div className="attendance-balance-value">
|
||||
<span className="attendance-balance-number">12</span>
|
||||
<span className="attendance-balance-unit">dnů</span>
|
||||
</div>
|
||||
<div className="attendance-balance-detail">
|
||||
<span>Celkem: 160h</span>
|
||||
<span>Čerpáno: 64h</span>
|
||||
</div>
|
||||
<div className="attendance-balance-bar">
|
||||
<div
|
||||
className="attendance-balance-progress"
|
||||
style={{ width: "60%" }}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-stat-card">
|
||||
<div className="admin-stat-icon danger">
|
||||
<svg
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
strokeWidth="2"
|
||||
>
|
||||
<path d="M22 12h-4l-3 9L9 3l-3 9H2" />
|
||||
</svg>
|
||||
</div>
|
||||
<div className="admin-stat-content">
|
||||
<span className="admin-stat-label">Nemoc 2025</span>
|
||||
<span className="admin-stat-value">16h čerpáno</span>
|
||||
</div>
|
||||
</div>
|
||||
<div className="attendance-quick-links">
|
||||
<h4 className="attendance-quick-title">Rychlé odkazy</h4>
|
||||
<a className="attendance-quick-link">
|
||||
<span>Moje žádosti</span>
|
||||
</a>
|
||||
<a className="attendance-quick-link">
|
||||
<span>Historie docházky</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
102
src/admin/fixtures/AttendanceHistoryFixture.tsx
Normal file
102
src/admin/fixtures/AttendanceHistoryFixture.tsx
Normal file
@@ -0,0 +1,102 @@
|
||||
export default function AttendanceHistoryFixture() {
|
||||
return (
|
||||
<div>
|
||||
<div className="admin-page-header">
|
||||
<div>
|
||||
<h1 className="admin-page-title">Historie docházky</h1>
|
||||
<p className="admin-page-subtitle">duben 2025</p>
|
||||
</div>
|
||||
<div className="admin-page-actions">
|
||||
<button className="admin-btn admin-btn-secondary">Tisk</button>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-card mb-6">
|
||||
<div className="admin-card-body">
|
||||
<div className="admin-form-row">
|
||||
<label className="admin-form-label">Měsíc</label>
|
||||
<input className="admin-form-input" readOnly value="04/2025" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-card mb-6">
|
||||
<div className="admin-card-body">
|
||||
<div style={{ display: "flex", alignItems: "center", gap: "1rem" }}>
|
||||
<div className="admin-stat-icon info">
|
||||
<svg
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
strokeWidth="2"
|
||||
>
|
||||
<rect x="3" y="4" width="18" height="18" rx="2" ry="2" />
|
||||
<line x1="16" y1="2" x2="16" y2="6" />
|
||||
<line x1="8" y1="2" x2="8" y2="6" />
|
||||
<line x1="3" y1="10" x2="21" y2="10" />
|
||||
</svg>
|
||||
</div>
|
||||
<div style={{ flex: 1, minWidth: 200 }}>
|
||||
<div
|
||||
style={{
|
||||
display: "flex",
|
||||
justifyContent: "space-between",
|
||||
alignItems: "baseline",
|
||||
marginBottom: "0.375rem",
|
||||
}}
|
||||
>
|
||||
<span style={{ fontWeight: 600 }}>Fond: 120h / 160h</span>
|
||||
<span
|
||||
className="text-secondary"
|
||||
style={{ fontSize: "0.8125rem" }}
|
||||
>
|
||||
20 prac. dnů
|
||||
</span>
|
||||
</div>
|
||||
<div className="attendance-balance-bar">
|
||||
<div
|
||||
className="attendance-balance-progress"
|
||||
style={{ width: "75%" }}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-card">
|
||||
<div className="admin-card-body">
|
||||
<div className="admin-table-responsive">
|
||||
<table className="admin-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Datum</th>
|
||||
<th>Typ</th>
|
||||
<th>Příchod</th>
|
||||
<th>Pauza</th>
|
||||
<th>Odchod</th>
|
||||
<th>Hodiny</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{Array.from({ length: 5 }, (_, i) => (
|
||||
<tr key={i}>
|
||||
<td className="admin-mono">1. 4. 2025</td>
|
||||
<td>
|
||||
<span className="admin-badge admin-badge-info">
|
||||
Práce
|
||||
</span>
|
||||
</td>
|
||||
<td className="admin-mono">08:00</td>
|
||||
<td className="admin-mono">12:00 – 12:30</td>
|
||||
<td className="admin-mono">16:30</td>
|
||||
<td className="admin-mono">8:00</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
49
src/admin/fixtures/AttendanceLocationFixture.tsx
Normal file
49
src/admin/fixtures/AttendanceLocationFixture.tsx
Normal file
@@ -0,0 +1,49 @@
|
||||
export default function AttendanceLocationFixture() {
|
||||
return (
|
||||
<div>
|
||||
<div className="admin-page-header">
|
||||
<div style={{ display: "flex", alignItems: "center", gap: "0.75rem" }}>
|
||||
<svg
|
||||
width="32"
|
||||
height="32"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
strokeWidth="2"
|
||||
>
|
||||
<path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z" />
|
||||
<circle cx="12" cy="10" r="3" />
|
||||
</svg>
|
||||
<h1 className="admin-page-title">Lokace</h1>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-card" style={{ height: 300, marginBottom: "1rem" }}>
|
||||
<div
|
||||
style={{
|
||||
background: "var(--bg-secondary)",
|
||||
height: "100%",
|
||||
borderRadius: 8,
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
<div
|
||||
style={{ display: "grid", gridTemplateColumns: "1fr 1fr", gap: "1rem" }}
|
||||
>
|
||||
<div className="admin-card">
|
||||
<div className="admin-card-body">
|
||||
<h3 style={{ marginBottom: "0.5rem" }}>Poloha</h3>
|
||||
<p>50.0755° N, 14.4378° E</p>
|
||||
<p>Praha, Česká republika</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-card">
|
||||
<div className="admin-card-body">
|
||||
<h3 style={{ marginBottom: "0.5rem" }}>Čas záznamu</h3>
|
||||
<p>1. 1. 2024 08:00</p>
|
||||
<p>Přesnost: 10 m</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
52
src/admin/fixtures/AuditLogFixture.tsx
Normal file
52
src/admin/fixtures/AuditLogFixture.tsx
Normal file
@@ -0,0 +1,52 @@
|
||||
export default function AuditLogFixture() {
|
||||
return (
|
||||
<div>
|
||||
<div className="admin-page-header">
|
||||
<div>
|
||||
<h1 className="admin-page-title">Audit log</h1>
|
||||
<p className="admin-page-subtitle">Záznam změn v systému</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-card">
|
||||
<div className="admin-card-body">
|
||||
<div
|
||||
className="admin-search-bar mb-4"
|
||||
style={{ display: "flex", gap: "0.5rem" }}
|
||||
>
|
||||
<input className="admin-form-input" placeholder="" />
|
||||
<select className="admin-form-select" />
|
||||
<select className="admin-form-select" />
|
||||
</div>
|
||||
<div className="admin-table-responsive">
|
||||
<table className="admin-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Čas</th>
|
||||
<th>Uživatel</th>
|
||||
<th>Akce</th>
|
||||
<th>Entita</th>
|
||||
<th>Detail</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{Array.from({ length: 5 }, (_, i) => (
|
||||
<tr key={i}>
|
||||
<td className="admin-mono">1. 1. 2024 10:00</td>
|
||||
<td>admin</td>
|
||||
<td>
|
||||
<span className="admin-badge admin-badge-create">
|
||||
Vytvoření
|
||||
</span>
|
||||
</td>
|
||||
<td>Faktura</td>
|
||||
<td style={{ maxWidth: 300 }}>Nová faktura FV-2024-001</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
69
src/admin/fixtures/CompanySettingsFixture.tsx
Normal file
69
src/admin/fixtures/CompanySettingsFixture.tsx
Normal file
@@ -0,0 +1,69 @@
|
||||
export default function CompanySettingsFixture() {
|
||||
return (
|
||||
<div>
|
||||
<div className="admin-page-header">
|
||||
<div>
|
||||
<h1 className="admin-page-title">Nastavení firmy</h1>
|
||||
<p className="admin-page-subtitle">Firemní údaje a bankovní účty</p>
|
||||
</div>
|
||||
<button className="admin-btn admin-btn-primary">
|
||||
Uložit nastavení
|
||||
</button>
|
||||
</div>
|
||||
<div className="admin-settings-grid">
|
||||
<div className="admin-card">
|
||||
<div className="admin-card-header">
|
||||
<h3 className="admin-card-title">Firemní údaje</h3>
|
||||
</div>
|
||||
<div className="admin-card-body">
|
||||
<div className="admin-form">
|
||||
<label className="admin-form-label">Název firmy</label>
|
||||
<input
|
||||
className="admin-form-input"
|
||||
readOnly
|
||||
value="BOHA s.r.o."
|
||||
/>
|
||||
<div className="admin-form-row">
|
||||
<label className="admin-form-label">Ulice</label>
|
||||
<input
|
||||
className="admin-form-input"
|
||||
readOnly
|
||||
value="Hlavní 123"
|
||||
/>
|
||||
<label className="admin-form-label">Město</label>
|
||||
<input className="admin-form-input" readOnly value="Praha" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-card">
|
||||
<div className="admin-card-header">
|
||||
<h3 className="admin-card-title">Bankovní účty</h3>
|
||||
</div>
|
||||
<div className="admin-card-body">
|
||||
<div className="admin-table-responsive">
|
||||
<table className="admin-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Název</th>
|
||||
<th>Banka</th>
|
||||
<th>Číslo účtu</th>
|
||||
<th>Měna</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Hlavní účet</td>
|
||||
<td>ČSOB</td>
|
||||
<td className="admin-mono">123456/0300</td>
|
||||
<td>CZK</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
63
src/admin/fixtures/DashSessionsFixture.tsx
Normal file
63
src/admin/fixtures/DashSessionsFixture.tsx
Normal file
@@ -0,0 +1,63 @@
|
||||
export default function DashSessionsFixture() {
|
||||
return (
|
||||
<div className="admin-card">
|
||||
<div
|
||||
className="admin-card-header"
|
||||
style={{
|
||||
display: "flex",
|
||||
alignItems: "center",
|
||||
justifyContent: "space-between",
|
||||
gap: "0.75rem",
|
||||
}}
|
||||
>
|
||||
<h2 className="admin-card-title">Přihlášená zařízení</h2>
|
||||
<button className="admin-btn admin-btn-secondary admin-btn-sm">
|
||||
Odhlásit ostatní
|
||||
</button>
|
||||
</div>
|
||||
<div className="admin-card-body" style={{ padding: 0 }}>
|
||||
<div className="dash-sessions-list">
|
||||
{Array.from({ length: 3 }, (_, i) => (
|
||||
<div
|
||||
key={i}
|
||||
className={`dash-session-item${i === 0 ? " dash-session-item-current" : ""}`}
|
||||
>
|
||||
<div className="dash-session-icon">
|
||||
<svg
|
||||
width="18"
|
||||
height="18"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
strokeWidth="2"
|
||||
>
|
||||
<rect x="2" y="3" width="20" height="14" rx="2" ry="2" />
|
||||
<line x1="8" y1="21" x2="16" y2="21" />
|
||||
<line x1="12" y1="17" x2="12" y2="21" />
|
||||
</svg>
|
||||
</div>
|
||||
<div className="dash-session-info">
|
||||
<div className="dash-session-device">
|
||||
Chrome na Windows
|
||||
{i === 0 && (
|
||||
<span
|
||||
className="admin-badge admin-badge-success"
|
||||
style={{ marginLeft: "0.5rem" }}
|
||||
>
|
||||
Aktuální
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
<div className="dash-session-meta">
|
||||
<span>192.168.1.100</span>
|
||||
<span className="dash-session-meta-separator">|</span>
|
||||
<span>před 2 hodinami</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
94
src/admin/fixtures/DashboardFixture.tsx
Normal file
94
src/admin/fixtures/DashboardFixture.tsx
Normal file
@@ -0,0 +1,94 @@
|
||||
export default function DashboardFixture() {
|
||||
return (
|
||||
<div>
|
||||
<div className="admin-page-header">
|
||||
<div>
|
||||
<h1 className="admin-page-title">Dashboard</h1>
|
||||
<p className="admin-page-subtitle">Přehled</p>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
className="dash-kpi-grid"
|
||||
style={{
|
||||
display: "grid",
|
||||
gridTemplateColumns: "repeat(4, 1fr)",
|
||||
gap: "1rem",
|
||||
marginBottom: "1rem",
|
||||
}}
|
||||
>
|
||||
{["Nabídky", "Objednávky", "Faktury", "Projekty"].map((label, i) => (
|
||||
<div
|
||||
key={i}
|
||||
className="dash-kpi-card"
|
||||
style={{
|
||||
padding: "1.25rem",
|
||||
borderRadius: 10,
|
||||
background: "var(--bg-secondary)",
|
||||
}}
|
||||
>
|
||||
<div style={{ fontSize: "0.875rem", marginBottom: "0.25rem" }}>
|
||||
{label}
|
||||
</div>
|
||||
<div style={{ fontSize: "1.5rem", fontWeight: 600 }}>12</div>
|
||||
<div style={{ fontSize: "0.75rem" }}>tento měsíc</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
<div
|
||||
className="dash-quick-actions"
|
||||
style={{ display: "flex", gap: "0.5rem", marginBottom: "1rem" }}
|
||||
>
|
||||
{["Nová nabídka", "Nová faktura", "Zapsat docházku"].map((label, i) => (
|
||||
<button
|
||||
key={i}
|
||||
className="admin-btn admin-btn-secondary"
|
||||
style={{ flex: 1 }}
|
||||
>
|
||||
{label}
|
||||
</button>
|
||||
))}
|
||||
</div>
|
||||
<div
|
||||
style={{
|
||||
display: "grid",
|
||||
gridTemplateColumns: "2fr 1fr",
|
||||
gap: "1rem",
|
||||
marginBottom: "1rem",
|
||||
}}
|
||||
>
|
||||
<div className="admin-card" style={{ minHeight: 320 }}>
|
||||
<div className="admin-card-body">
|
||||
<h3 className="admin-card-title">Docházka dnes</h3>
|
||||
<div style={{ height: 200 }} />
|
||||
</div>
|
||||
</div>
|
||||
<div style={{ display: "flex", flexDirection: "column", gap: "1rem" }}>
|
||||
<div className="admin-card" style={{ minHeight: 150 }}>
|
||||
<div className="admin-card-body">
|
||||
<h3 className="admin-card-title">Aktivita</h3>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-card" style={{ minHeight: 150 }}>
|
||||
<div className="admin-card-body">
|
||||
<h3 className="admin-card-title">Profil</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
style={{ display: "grid", gridTemplateColumns: "1fr 1fr", gap: "1rem" }}
|
||||
>
|
||||
<div className="admin-card" style={{ minHeight: 200 }}>
|
||||
<div className="admin-card-body">
|
||||
<h3 className="admin-card-title">Relace</h3>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-card" style={{ minHeight: 200 }}>
|
||||
<div className="admin-card-body">
|
||||
<h3 className="admin-card-title">Poslední aktivity</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
86
src/admin/fixtures/InvoiceDetailFixture.tsx
Normal file
86
src/admin/fixtures/InvoiceDetailFixture.tsx
Normal file
@@ -0,0 +1,86 @@
|
||||
export default function InvoiceDetailFixture() {
|
||||
return (
|
||||
<div>
|
||||
<div className="admin-page-header">
|
||||
<div style={{ display: "flex", alignItems: "center", gap: "0.5rem" }}>
|
||||
<a href="/invoices" className="admin-btn-icon">
|
||||
<svg
|
||||
width="20"
|
||||
height="20"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
strokeWidth="2"
|
||||
>
|
||||
<path d="M19 12H5M12 19l-7-7 7-7" />
|
||||
</svg>
|
||||
</a>
|
||||
<div>
|
||||
<h1 className="admin-page-title">FV-2024-001</h1>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-page-actions">
|
||||
<button className="admin-btn admin-btn-primary">Uložit</button>
|
||||
<button className="admin-btn admin-btn-secondary">Zaplaceno</button>
|
||||
<button className="admin-btn admin-btn-secondary">Smazat</button>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-card" style={{ marginBottom: "1rem" }}>
|
||||
<div className="admin-card-body">
|
||||
<div
|
||||
className="admin-form-row"
|
||||
style={{
|
||||
display: "grid",
|
||||
gridTemplateColumns: "1fr 1fr",
|
||||
gap: "1rem",
|
||||
}}
|
||||
>
|
||||
<div className="admin-form-group">
|
||||
<label className="admin-form-label">Zákazník</label>
|
||||
<div>Firma s.r.o.</div>
|
||||
</div>
|
||||
<div className="admin-form-group">
|
||||
<label className="admin-form-label">Stav</label>
|
||||
<span className="admin-badge admin-badge-invoice-issued">
|
||||
Vystavena
|
||||
</span>
|
||||
</div>
|
||||
<div className="admin-form-group">
|
||||
<label className="admin-form-label">Datum vystavení</label>
|
||||
<div>1. 1. 2024</div>
|
||||
</div>
|
||||
<div className="admin-form-group">
|
||||
<label className="admin-form-label">Datum splatnosti</label>
|
||||
<div>15. 1. 2024</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-card">
|
||||
<div className="admin-card-body">
|
||||
<h3 className="admin-card-title">Položky</h3>
|
||||
<table className="admin-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Položka</th>
|
||||
<th>Množství</th>
|
||||
<th>Cena</th>
|
||||
<th>Celkem</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{Array.from({ length: 3 }, (_, i) => (
|
||||
<tr key={i}>
|
||||
<td>Služba {i + 1}</td>
|
||||
<td>1</td>
|
||||
<td>10 000 Kč</td>
|
||||
<td>10 000 Kč</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
83
src/admin/fixtures/InvoicesFixture.tsx
Normal file
83
src/admin/fixtures/InvoicesFixture.tsx
Normal file
@@ -0,0 +1,83 @@
|
||||
export default function InvoicesFixture() {
|
||||
return (
|
||||
<div>
|
||||
<div className="admin-page-header">
|
||||
<div>
|
||||
<h1 className="admin-page-title">Faktury</h1>
|
||||
<p className="admin-page-subtitle">15 faktur</p>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
className="dash-kpi-grid"
|
||||
style={{
|
||||
display: "grid",
|
||||
gridTemplateColumns: "repeat(4, 1fr)",
|
||||
gap: "1rem",
|
||||
marginBottom: "1rem",
|
||||
}}
|
||||
>
|
||||
{["Vystaveno", "Zaplaceno", "Po splatnosti", "Celkem"].map(
|
||||
(label, i) => (
|
||||
<div
|
||||
key={i}
|
||||
className="dash-kpi-card"
|
||||
style={{
|
||||
padding: "1.25rem",
|
||||
borderRadius: 10,
|
||||
background: "var(--bg-secondary)",
|
||||
}}
|
||||
>
|
||||
<div style={{ fontSize: "0.875rem", marginBottom: "0.25rem" }}>
|
||||
{label}
|
||||
</div>
|
||||
<div style={{ fontSize: "1.5rem", fontWeight: 600 }}>
|
||||
{i * 5 + 3}
|
||||
</div>
|
||||
</div>
|
||||
),
|
||||
)}
|
||||
</div>
|
||||
<div className="admin-card">
|
||||
<div className="admin-card-body">
|
||||
<div className="admin-search-bar mb-4">
|
||||
<input className="admin-form-input" placeholder="" />
|
||||
</div>
|
||||
<div className="admin-table-responsive">
|
||||
<table className="admin-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Číslo</th>
|
||||
<th>Zákazník</th>
|
||||
<th>Stav</th>
|
||||
<th>Datum</th>
|
||||
<th className="text-right">Částka</th>
|
||||
<th>Akce</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{Array.from({ length: 5 }, (_, i) => (
|
||||
<tr key={i}>
|
||||
<td className="admin-mono">FV-2024-00{i + 1}</td>
|
||||
<td>Firma s.r.o.</td>
|
||||
<td>
|
||||
<span className="admin-badge admin-badge-invoice-issued">
|
||||
Vystaveno
|
||||
</span>
|
||||
</td>
|
||||
<td className="admin-mono">1. 1. 2024</td>
|
||||
<td className="admin-mono text-right">50 000 Kč</td>
|
||||
<td>
|
||||
<div className="admin-table-actions">
|
||||
<button className="admin-btn-icon">👁</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
51
src/admin/fixtures/LeaveApprovalFixture.tsx
Normal file
51
src/admin/fixtures/LeaveApprovalFixture.tsx
Normal file
@@ -0,0 +1,51 @@
|
||||
export default function LeaveApprovalFixture() {
|
||||
return (
|
||||
<div>
|
||||
<div className="admin-page-header">
|
||||
<div>
|
||||
<h1 className="admin-page-title">Schvalování dovolené</h1>
|
||||
<p className="admin-page-subtitle">2 čekající</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-card">
|
||||
<div className="admin-card-body">
|
||||
<div className="admin-table-responsive">
|
||||
<table className="admin-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Uživatel</th>
|
||||
<th>Typ</th>
|
||||
<th>Od</th>
|
||||
<th>Do</th>
|
||||
<th>Dní</th>
|
||||
<th>Akce</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{Array.from({ length: 3 }, (_, i) => (
|
||||
<tr key={i}>
|
||||
<td>Jan Novák</td>
|
||||
<td>Dovolená</td>
|
||||
<td className="admin-mono">1. 7. 2024</td>
|
||||
<td className="admin-mono">5. 7. 2024</td>
|
||||
<td>5</td>
|
||||
<td>
|
||||
<div className="admin-table-actions">
|
||||
<button className="admin-btn admin-btn-sm admin-btn-primary">
|
||||
Schválit
|
||||
</button>
|
||||
<button className="admin-btn admin-btn-sm admin-btn-secondary">
|
||||
Zamítnout
|
||||
</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
53
src/admin/fixtures/LeaveRequestsFixture.tsx
Normal file
53
src/admin/fixtures/LeaveRequestsFixture.tsx
Normal file
@@ -0,0 +1,53 @@
|
||||
export default function LeaveRequestsFixture() {
|
||||
return (
|
||||
<div>
|
||||
<div className="admin-page-header">
|
||||
<div>
|
||||
<h1 className="admin-page-title">Žádosti o dovolenou</h1>
|
||||
<p className="admin-page-subtitle">3 žádosti</p>
|
||||
</div>
|
||||
<button className="admin-btn admin-btn-primary">+ Nová žádost</button>
|
||||
</div>
|
||||
<div className="admin-card">
|
||||
<div className="admin-card-body">
|
||||
<div className="admin-table-responsive">
|
||||
<table className="admin-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Uživatel</th>
|
||||
<th>Typ</th>
|
||||
<th>Od</th>
|
||||
<th>Do</th>
|
||||
<th>Dní</th>
|
||||
<th>Stav</th>
|
||||
<th>Akce</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{Array.from({ length: 3 }, (_, i) => (
|
||||
<tr key={i}>
|
||||
<td>Jan Novák</td>
|
||||
<td>Dovolená</td>
|
||||
<td className="admin-mono">1. 7. 2024</td>
|
||||
<td className="admin-mono">5. 7. 2024</td>
|
||||
<td>5</td>
|
||||
<td>
|
||||
<span className="admin-badge admin-badge-pending">
|
||||
Čeká
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
<div className="admin-table-actions">
|
||||
<button className="admin-btn-icon">Zrušit</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
60
src/admin/fixtures/OfferDetailFixture.tsx
Normal file
60
src/admin/fixtures/OfferDetailFixture.tsx
Normal file
@@ -0,0 +1,60 @@
|
||||
export default function OfferDetailFixture() {
|
||||
return (
|
||||
<div>
|
||||
<div className="admin-page-header">
|
||||
<button className="admin-btn-icon">←</button>
|
||||
<h1 className="admin-page-title">NAB-2024-001</h1>
|
||||
<button className="admin-btn admin-btn-primary">Uložit</button>
|
||||
</div>
|
||||
<div className="admin-card">
|
||||
<div className="admin-card-body">
|
||||
<div
|
||||
className="admin-form-row"
|
||||
style={{
|
||||
display: "grid",
|
||||
gridTemplateColumns: "1fr 1fr",
|
||||
gap: "1rem",
|
||||
}}
|
||||
>
|
||||
<div className="admin-form-group">
|
||||
<label className="admin-form-label">Číslo nabídky</label>
|
||||
<div className="admin-form-input">NAB-2024-001</div>
|
||||
</div>
|
||||
<div className="admin-form-group">
|
||||
<label className="admin-form-label">Zákazník</label>
|
||||
<div className="admin-form-input">Firma s.r.o.</div>
|
||||
</div>
|
||||
<div className="admin-form-group">
|
||||
<label className="admin-form-label">Datum</label>
|
||||
<div className="admin-form-input">1. 1. 2024</div>
|
||||
</div>
|
||||
<div className="admin-form-group">
|
||||
<label className="admin-form-label">Platnost do</label>
|
||||
<div className="admin-form-input">31. 1. 2024</div>
|
||||
</div>
|
||||
</div>
|
||||
<table className="admin-table" style={{ marginTop: "1rem" }}>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Položka</th>
|
||||
<th>Množství</th>
|
||||
<th>Cena</th>
|
||||
<th>Celkem</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{Array.from({ length: 3 }, (_, i) => (
|
||||
<tr key={i}>
|
||||
<td>Položka {i + 1}</td>
|
||||
<td>1</td>
|
||||
<td>10 000 Kč</td>
|
||||
<td>10 000 Kč</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
49
src/admin/fixtures/OffersCustomersFixture.tsx
Normal file
49
src/admin/fixtures/OffersCustomersFixture.tsx
Normal file
@@ -0,0 +1,49 @@
|
||||
export default function OffersCustomersFixture() {
|
||||
return (
|
||||
<div>
|
||||
<div className="admin-page-header">
|
||||
<div>
|
||||
<h1 className="admin-page-title">Zákazníci</h1>
|
||||
<p className="admin-page-subtitle">8 zákazníků</p>
|
||||
</div>
|
||||
<button className="admin-btn admin-btn-primary">
|
||||
+ Přidat zákazníka
|
||||
</button>
|
||||
</div>
|
||||
<div className="admin-card">
|
||||
<div className="admin-card-body">
|
||||
<div className="admin-search-bar mb-4">
|
||||
<input className="admin-form-input" placeholder="" />
|
||||
</div>
|
||||
<div className="admin-table-responsive">
|
||||
<table className="admin-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Název</th>
|
||||
<th>Město</th>
|
||||
<th>IČO</th>
|
||||
<th>Akce</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{Array.from({ length: 5 }, (_, i) => (
|
||||
<tr key={i}>
|
||||
<td>Firma s.r.o.</td>
|
||||
<td>Praha</td>
|
||||
<td className="admin-mono">12345678</td>
|
||||
<td>
|
||||
<div className="admin-table-actions">
|
||||
<button className="admin-btn-icon">✎</button>
|
||||
<button className="admin-btn-icon danger">🗑</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
54
src/admin/fixtures/OffersFixture.tsx
Normal file
54
src/admin/fixtures/OffersFixture.tsx
Normal file
@@ -0,0 +1,54 @@
|
||||
export default function OffersFixture() {
|
||||
return (
|
||||
<div>
|
||||
<div className="admin-page-header">
|
||||
<div>
|
||||
<h1 className="admin-page-title">Nabídky</h1>
|
||||
<p className="admin-page-subtitle">12 nabídek</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-card">
|
||||
<div className="admin-card-body">
|
||||
<div className="admin-search-bar mb-4">
|
||||
<input className="admin-form-input" placeholder="" />
|
||||
</div>
|
||||
<div className="admin-table-responsive">
|
||||
<table className="admin-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Číslo</th>
|
||||
<th>Zákazník</th>
|
||||
<th>Stav</th>
|
||||
<th>Datum</th>
|
||||
<th className="text-right">Celkem</th>
|
||||
<th>Akce</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{Array.from({ length: 5 }, (_, i) => (
|
||||
<tr key={i}>
|
||||
<td className="admin-mono">NAB-2024-00{i + 1}</td>
|
||||
<td>Firma s.r.o.</td>
|
||||
<td>
|
||||
<span className="admin-badge admin-badge-offer-active">
|
||||
Aktivní
|
||||
</span>
|
||||
</td>
|
||||
<td className="admin-mono">1. 1. 2024</td>
|
||||
<td className="admin-mono text-right fw-500">100 000 Kč</td>
|
||||
<td>
|
||||
<div className="admin-table-actions">
|
||||
<button className="admin-btn-icon">👁</button>
|
||||
<button className="admin-btn-icon">✎</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
36
src/admin/fixtures/OffersTemplatesFixture.tsx
Normal file
36
src/admin/fixtures/OffersTemplatesFixture.tsx
Normal file
@@ -0,0 +1,36 @@
|
||||
export default function OffersTemplatesFixture() {
|
||||
return (
|
||||
<div className="admin-card">
|
||||
<div className="admin-card-body">
|
||||
<div className="admin-search-bar mb-4">
|
||||
<input className="admin-form-input" placeholder="" />
|
||||
</div>
|
||||
<div className="admin-table-responsive">
|
||||
<table className="admin-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Název</th>
|
||||
<th>Cena</th>
|
||||
<th>Akce</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{Array.from({ length: 5 }, (_, i) => (
|
||||
<tr key={i}>
|
||||
<td>Šablona {i + 1}</td>
|
||||
<td className="admin-mono text-right">1 000 Kč</td>
|
||||
<td>
|
||||
<div className="admin-table-actions">
|
||||
<button className="admin-btn-icon">✎</button>
|
||||
<button className="admin-btn-icon danger">🗑</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
89
src/admin/fixtures/OrderDetailFixture.tsx
Normal file
89
src/admin/fixtures/OrderDetailFixture.tsx
Normal file
@@ -0,0 +1,89 @@
|
||||
export default function OrderDetailFixture() {
|
||||
return (
|
||||
<div>
|
||||
<div className="admin-page-header">
|
||||
<div className="admin-page-header-left">
|
||||
<Link
|
||||
to="/orders"
|
||||
className="admin-btn-icon"
|
||||
style={{ marginRight: "0.5rem" }}
|
||||
>
|
||||
<svg
|
||||
width="20"
|
||||
height="20"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
strokeWidth="2"
|
||||
>
|
||||
<path d="M19 12H5M12 19l-7-7 7-7" />
|
||||
</svg>
|
||||
</Link>
|
||||
<div>
|
||||
<h1 className="admin-page-title">OBJ-2024-001</h1>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-page-actions">
|
||||
<button className="admin-btn admin-btn-primary">Uložit</button>
|
||||
<button className="admin-btn admin-btn-secondary">Stornovat</button>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-card" style={{ marginBottom: "1rem" }}>
|
||||
<div className="admin-card-body">
|
||||
<div
|
||||
className="admin-form-row"
|
||||
style={{
|
||||
display: "grid",
|
||||
gridTemplateColumns: "1fr 1fr",
|
||||
gap: "1rem",
|
||||
}}
|
||||
>
|
||||
<div className="admin-form-group">
|
||||
<label className="admin-form-label">Zákazník</label>
|
||||
<div>Firma s.r.o.</div>
|
||||
</div>
|
||||
<div className="admin-form-group">
|
||||
<label className="admin-form-label">Stav</label>
|
||||
<span className="admin-badge admin-badge-order-realizace">
|
||||
V realizaci
|
||||
</span>
|
||||
</div>
|
||||
<div className="admin-form-group">
|
||||
<label className="admin-form-label">Datum vytvoření</label>
|
||||
<div>1. 1. 2024</div>
|
||||
</div>
|
||||
<div className="admin-form-group">
|
||||
<label className="admin-form-label">Celkem</label>
|
||||
<div className="fw-500">50 000 Kč</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-card">
|
||||
<div className="admin-card-body">
|
||||
<h3 className="admin-card-title">Položky</h3>
|
||||
<table className="admin-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Položka</th>
|
||||
<th>Množství</th>
|
||||
<th>Cena</th>
|
||||
<th>Celkem</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{Array.from({ length: 3 }, (_, i) => (
|
||||
<tr key={i}>
|
||||
<td>Položka {i + 1}</td>
|
||||
<td>1</td>
|
||||
<td>10 000 Kč</td>
|
||||
<td>10 000 Kč</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
55
src/admin/fixtures/OrdersFixture.tsx
Normal file
55
src/admin/fixtures/OrdersFixture.tsx
Normal file
@@ -0,0 +1,55 @@
|
||||
export default function OrdersFixture() {
|
||||
return (
|
||||
<div>
|
||||
<div className="admin-page-header">
|
||||
<div>
|
||||
<h1 className="admin-page-title">Objednávky</h1>
|
||||
<p className="admin-page-subtitle">8 objednávek</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-card">
|
||||
<div className="admin-card-body">
|
||||
<div className="admin-search-bar mb-4">
|
||||
<input className="admin-form-input" placeholder="" />
|
||||
</div>
|
||||
<div className="admin-table-responsive">
|
||||
<table className="admin-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Číslo</th>
|
||||
<th>Nabídka</th>
|
||||
<th>Zákazník</th>
|
||||
<th>Stav</th>
|
||||
<th>Datum</th>
|
||||
<th className="text-right">Celkem</th>
|
||||
<th>Akce</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{Array.from({ length: 5 }, (_, i) => (
|
||||
<tr key={i}>
|
||||
<td className="admin-mono">OBJ-2024-00{i + 1}</td>
|
||||
<td>NAB-2024-00{i + 1}</td>
|
||||
<td>Firma s.r.o.</td>
|
||||
<td>
|
||||
<span className="admin-badge admin-badge-order-realizace">
|
||||
V realizaci
|
||||
</span>
|
||||
</td>
|
||||
<td className="admin-mono">1. 1. 2024</td>
|
||||
<td className="admin-mono text-right fw-500">50 000 Kč</td>
|
||||
<td>
|
||||
<div className="admin-table-actions">
|
||||
<button className="admin-btn-icon">👁</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
70
src/admin/fixtures/ProjectDetailFixture.tsx
Normal file
70
src/admin/fixtures/ProjectDetailFixture.tsx
Normal file
@@ -0,0 +1,70 @@
|
||||
export default function ProjectDetailFixture() {
|
||||
return (
|
||||
<div>
|
||||
<div className="admin-page-header">
|
||||
<div style={{ display: "flex", alignItems: "center", gap: "0.5rem" }}>
|
||||
<a href="/projects" className="admin-btn-icon">
|
||||
<svg
|
||||
width="20"
|
||||
height="20"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
strokeWidth="2"
|
||||
>
|
||||
<path d="M19 12H5M12 19l-7-7 7-7" />
|
||||
</svg>
|
||||
</a>
|
||||
<div>
|
||||
<h1 className="admin-page-title">PRJ-001 Projekt Alpha</h1>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-page-actions">
|
||||
<button className="admin-btn admin-btn-primary">Uložit</button>
|
||||
<button className="admin-btn admin-btn-secondary">Smazat</button>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-card" style={{ marginBottom: "1rem" }}>
|
||||
<div className="admin-card-body">
|
||||
<div
|
||||
className="admin-form-row"
|
||||
style={{
|
||||
display: "grid",
|
||||
gridTemplateColumns: "1fr 1fr",
|
||||
gap: "1rem",
|
||||
}}
|
||||
>
|
||||
<div className="admin-form-group">
|
||||
<label className="admin-form-label">Název projektu</label>
|
||||
<input
|
||||
className="admin-form-input"
|
||||
value="Projekt Alpha"
|
||||
readOnly
|
||||
/>
|
||||
</div>
|
||||
<div className="admin-form-group">
|
||||
<label className="admin-form-label">Stav</label>
|
||||
<select className="admin-form-select">
|
||||
<option>Aktivní</option>
|
||||
</select>
|
||||
</div>
|
||||
<div className="admin-form-group">
|
||||
<label className="admin-form-label">Začátek</label>
|
||||
<input type="date" className="admin-form-input" readOnly />
|
||||
</div>
|
||||
<div className="admin-form-group">
|
||||
<label className="admin-form-label">Konec</label>
|
||||
<input type="date" className="admin-form-input" readOnly />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-card" style={{ marginBottom: "1rem" }}>
|
||||
<div className="admin-card-body">
|
||||
<h3 className="admin-card-title">Poznámky</h3>
|
||||
<textarea className="admin-form-input" rows={4} readOnly />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
53
src/admin/fixtures/ProjectFileManagerFixture.tsx
Normal file
53
src/admin/fixtures/ProjectFileManagerFixture.tsx
Normal file
@@ -0,0 +1,53 @@
|
||||
export default function ProjectFileManagerFixture() {
|
||||
return (
|
||||
<div className="admin-card">
|
||||
<div className="admin-card-body">
|
||||
<h3 className="admin-card-title">Soubory</h3>
|
||||
<div
|
||||
style={{
|
||||
display: "flex",
|
||||
alignItems: "center",
|
||||
gap: "0.5rem",
|
||||
marginBottom: "0.75rem",
|
||||
fontSize: "0.875rem",
|
||||
color: "var(--text-secondary)",
|
||||
}}
|
||||
>
|
||||
<span>Projekt</span>
|
||||
<span>/</span>
|
||||
<span>Dokumentace</span>
|
||||
</div>
|
||||
{Array.from({ length: 4 }, (_, i) => (
|
||||
<div
|
||||
key={i}
|
||||
style={{
|
||||
display: "flex",
|
||||
alignItems: "center",
|
||||
gap: "0.5rem",
|
||||
padding: "0.5rem 0",
|
||||
borderBottom: i < 3 ? "1px solid var(--border-color)" : "none",
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
width="18"
|
||||
height="18"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
strokeWidth="1.5"
|
||||
>
|
||||
<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" />
|
||||
<polyline points="14 2 14 8 20 8" />
|
||||
</svg>
|
||||
<span style={{ flex: 1 }}>dokument_{i + 1}.pdf</span>
|
||||
<span
|
||||
style={{ color: "var(--text-secondary)", fontSize: "0.8rem" }}
|
||||
>
|
||||
2.{i + 1} MB
|
||||
</span>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
51
src/admin/fixtures/ProjectsFixture.tsx
Normal file
51
src/admin/fixtures/ProjectsFixture.tsx
Normal file
@@ -0,0 +1,51 @@
|
||||
export default function ProjectsFixture() {
|
||||
return (
|
||||
<div>
|
||||
<div className="admin-page-header">
|
||||
<div>
|
||||
<h1 className="admin-page-title">Projekty</h1>
|
||||
<p className="admin-page-subtitle">6 projektů</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-card">
|
||||
<div className="admin-card-body">
|
||||
<div className="admin-search-bar mb-4">
|
||||
<input className="admin-form-input" placeholder="" />
|
||||
</div>
|
||||
<div className="admin-table-responsive">
|
||||
<table className="admin-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Číslo</th>
|
||||
<th>Název</th>
|
||||
<th>Zákazník</th>
|
||||
<th>Stav</th>
|
||||
<th>Akce</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{Array.from({ length: 5 }, (_, i) => (
|
||||
<tr key={i}>
|
||||
<td className="admin-mono">PRJ-2024-00{i + 1}</td>
|
||||
<td>Projekt Alpha</td>
|
||||
<td>Firma s.r.o.</td>
|
||||
<td>
|
||||
<span className="admin-badge admin-badge-project-active">
|
||||
Aktivní
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
<div className="admin-table-actions">
|
||||
<button className="admin-btn-icon">👁</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
80
src/admin/fixtures/ReceivedInvoicesFixture.tsx
Normal file
80
src/admin/fixtures/ReceivedInvoicesFixture.tsx
Normal file
@@ -0,0 +1,80 @@
|
||||
export default function ReceivedInvoicesFixture() {
|
||||
return (
|
||||
<div>
|
||||
<div className="admin-page-header">
|
||||
<div>
|
||||
<h1 className="admin-page-title">Přijaté faktury</h1>
|
||||
<p className="admin-page-subtitle">8 faktur</p>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
className="dash-kpi-grid"
|
||||
style={{
|
||||
display: "grid",
|
||||
gridTemplateColumns: "repeat(4, 1fr)",
|
||||
gap: "1rem",
|
||||
marginBottom: "1rem",
|
||||
}}
|
||||
>
|
||||
{["K úhradě", "Zaplaceno", "Po splatnosti", "Celkem"].map(
|
||||
(label, i) => (
|
||||
<div
|
||||
key={i}
|
||||
className="dash-kpi-card"
|
||||
style={{
|
||||
padding: "1.25rem",
|
||||
borderRadius: 10,
|
||||
background: "var(--bg-secondary)",
|
||||
}}
|
||||
>
|
||||
<div style={{ fontSize: "0.875rem", marginBottom: "0.25rem" }}>
|
||||
{label}
|
||||
</div>
|
||||
<div style={{ fontSize: "1.5rem", fontWeight: 600 }}>
|
||||
{i * 3 + 2}
|
||||
</div>
|
||||
</div>
|
||||
),
|
||||
)}
|
||||
</div>
|
||||
<div className="admin-card">
|
||||
<div className="admin-card-body">
|
||||
<div className="admin-table-responsive">
|
||||
<table className="admin-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Číslo</th>
|
||||
<th>Dodavatel</th>
|
||||
<th>Částka</th>
|
||||
<th>Datum</th>
|
||||
<th>Stav</th>
|
||||
<th>Akce</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{Array.from({ length: 5 }, (_, i) => (
|
||||
<tr key={i}>
|
||||
<td className="admin-mono">PF-2024-00{i + 1}</td>
|
||||
<td>Dodavatel s.r.o.</td>
|
||||
<td className="admin-mono text-right">10 000 Kč</td>
|
||||
<td className="admin-mono">1. 1. 2024</td>
|
||||
<td>
|
||||
<span className="admin-badge admin-badge-invoice-issued">
|
||||
K úhradě
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
<div className="admin-table-actions">
|
||||
<button className="admin-btn-icon">✎</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
70
src/admin/fixtures/SettingsFixture.tsx
Normal file
70
src/admin/fixtures/SettingsFixture.tsx
Normal file
@@ -0,0 +1,70 @@
|
||||
export default function SettingsFixture() {
|
||||
return (
|
||||
<div>
|
||||
<div className="admin-page-header">
|
||||
<div>
|
||||
<h1 className="admin-page-title">Nastavení</h1>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-tab-bar">
|
||||
<button className="admin-tab active">Role</button>
|
||||
<button className="admin-tab">Systém</button>
|
||||
</div>
|
||||
<div className="admin-card">
|
||||
<div className="admin-card-body">
|
||||
<div className="admin-table-responsive">
|
||||
<table className="admin-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Název role</th>
|
||||
<th>Popis</th>
|
||||
<th>Oprávnění</th>
|
||||
<th>Akce</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{Array.from({ length: 3 }, (_, i) => (
|
||||
<tr key={i}>
|
||||
<td className="fw-500">admin</td>
|
||||
<td>Správa celého systému</td>
|
||||
<td>
|
||||
<span className="admin-badge admin-badge-info">
|
||||
všechna
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
<div className="admin-table-actions">
|
||||
<button className="admin-btn-icon" title="Upravit">
|
||||
✎
|
||||
</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-card">
|
||||
<div className="admin-card-header">
|
||||
<h2 className="admin-card-title">Docházka</h2>
|
||||
</div>
|
||||
<div className="admin-card-body">
|
||||
<div className="admin-form">
|
||||
<div className="admin-form-row">
|
||||
<label className="admin-form-label">
|
||||
Limit pro přestávku (hodiny)
|
||||
</label>
|
||||
<input className="admin-form-input" readOnly value="6" />
|
||||
<label className="admin-form-label">
|
||||
Délka krátké přestávky (min)
|
||||
</label>
|
||||
<input className="admin-form-input" readOnly value="15" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
44
src/admin/fixtures/TripsAdminFixture.tsx
Normal file
44
src/admin/fixtures/TripsAdminFixture.tsx
Normal file
@@ -0,0 +1,44 @@
|
||||
export default function TripsAdminFixture() {
|
||||
return (
|
||||
<div>
|
||||
<div className="admin-page-header">
|
||||
<div>
|
||||
<h1 className="admin-page-title">Správa jízd</h1>
|
||||
<p className="admin-page-subtitle">10 jízd</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-card">
|
||||
<div className="admin-card-body">
|
||||
<div className="admin-table-responsive">
|
||||
<table className="admin-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Datum</th>
|
||||
<th>Vozidlo</th>
|
||||
<th>Uživatel</th>
|
||||
<th>Km</th>
|
||||
<th>Akce</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{Array.from({ length: 5 }, (_, i) => (
|
||||
<tr key={i}>
|
||||
<td className="admin-mono">1. 1. 2024</td>
|
||||
<td>Škoda Octavia</td>
|
||||
<td>Jan Novák</td>
|
||||
<td className="admin-mono">200</td>
|
||||
<td>
|
||||
<div className="admin-table-actions">
|
||||
<button className="admin-btn-icon">✎</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
132
src/admin/fixtures/TripsFixture.tsx
Normal file
132
src/admin/fixtures/TripsFixture.tsx
Normal file
@@ -0,0 +1,132 @@
|
||||
export default function TripsFixture() {
|
||||
return (
|
||||
<div>
|
||||
<div className="admin-page-header">
|
||||
<div>
|
||||
<h1 className="admin-page-title">Kniha jízd</h1>
|
||||
<p className="admin-page-subtitle">duben 2025</p>
|
||||
</div>
|
||||
<div className="admin-page-actions">
|
||||
<button className="admin-btn admin-btn-primary">Přidat jízdu</button>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-grid admin-grid-4">
|
||||
<div className="admin-stat-card info">
|
||||
<div className="admin-stat-icon info">
|
||||
<svg
|
||||
width="22"
|
||||
height="22"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
strokeWidth="2"
|
||||
>
|
||||
<line x1="12" y1="20" x2="12" y2="10" />
|
||||
<line x1="18" y1="20" x2="18" y2="4" />
|
||||
<line x1="6" y1="20" x2="6" y2="16" />
|
||||
</svg>
|
||||
</div>
|
||||
<div className="admin-stat-content">
|
||||
<span className="admin-stat-value">12</span>
|
||||
<span className="admin-stat-label">Počet jízd</span>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-stat-card">
|
||||
<div className="admin-stat-icon">
|
||||
<svg
|
||||
width="22"
|
||||
height="22"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
strokeWidth="2"
|
||||
>
|
||||
<path d="M22 12h-4l-3 9L9 3l-3 9H2" />
|
||||
</svg>
|
||||
</div>
|
||||
<div className="admin-stat-content">
|
||||
<span className="admin-stat-value">1 240 km</span>
|
||||
<span className="admin-stat-label">Celkem naježděno</span>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-stat-card success">
|
||||
<div className="admin-stat-icon success">
|
||||
<svg
|
||||
width="22"
|
||||
height="22"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
strokeWidth="2"
|
||||
>
|
||||
<rect x="1" y="3" width="15" height="13" rx="2" ry="2" />
|
||||
<path d="M16 8h2a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-1" />
|
||||
<circle cx="5.5" cy="18" r="2" />
|
||||
<circle cx="18.5" cy="18" r="2" />
|
||||
<path d="M8 18h8" />
|
||||
</svg>
|
||||
</div>
|
||||
<div className="admin-stat-content">
|
||||
<span className="admin-stat-value">980 km</span>
|
||||
<span className="admin-stat-label">Služební</span>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-stat-card warning">
|
||||
<div className="admin-stat-icon warning">
|
||||
<svg
|
||||
width="22"
|
||||
height="22"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
strokeWidth="2"
|
||||
>
|
||||
<path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z" />
|
||||
<polyline points="9 22 9 12 15 12 15 22" />
|
||||
</svg>
|
||||
</div>
|
||||
<div className="admin-stat-content">
|
||||
<span className="admin-stat-value">260 km</span>
|
||||
<span className="admin-stat-label">Soukromé</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-card mt-6">
|
||||
<div className="admin-card-header flex-between">
|
||||
<h2 className="admin-card-title">Poslední jízdy</h2>
|
||||
<a className="admin-btn admin-btn-secondary admin-btn-sm">
|
||||
Zobrazit historii
|
||||
</a>
|
||||
</div>
|
||||
<div className="admin-card-body">
|
||||
<div className="admin-table-responsive">
|
||||
<table className="admin-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Datum</th>
|
||||
<th>Vozidlo</th>
|
||||
<th>Trasa</th>
|
||||
<th>Vzdálenost</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{Array.from({ length: 4 }, (_, i) => (
|
||||
<tr key={i}>
|
||||
<td className="admin-mono">1. 4. 2025</td>
|
||||
<td>
|
||||
<span className="admin-badge">1A2 3456</span>
|
||||
</td>
|
||||
<td>Praha → Brno</td>
|
||||
<td className="admin-mono">
|
||||
<strong>200 km</strong>
|
||||
</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
40
src/admin/fixtures/TripsHistoryFixture.tsx
Normal file
40
src/admin/fixtures/TripsHistoryFixture.tsx
Normal file
@@ -0,0 +1,40 @@
|
||||
export default function TripsHistoryFixture() {
|
||||
return (
|
||||
<div>
|
||||
<div className="admin-page-header">
|
||||
<div>
|
||||
<h1 className="admin-page-title">Historie jízd</h1>
|
||||
<p className="admin-page-subtitle">10 jízd</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="admin-card">
|
||||
<div className="admin-card-body">
|
||||
<div className="admin-table-responsive">
|
||||
<table className="admin-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Datum</th>
|
||||
<th>Vozidlo</th>
|
||||
<th>Uživatel</th>
|
||||
<th>Trasa</th>
|
||||
<th>Km</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{Array.from({ length: 5 }, (_, i) => (
|
||||
<tr key={i}>
|
||||
<td className="admin-mono">1. 1. 2024</td>
|
||||
<td>Škoda Octavia</td>
|
||||
<td>Jan Novák</td>
|
||||
<td>Praha → Brno</td>
|
||||
<td className="admin-mono">200</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
66
src/admin/fixtures/UsersFixture.tsx
Normal file
66
src/admin/fixtures/UsersFixture.tsx
Normal file
@@ -0,0 +1,66 @@
|
||||
export default function UsersFixture() {
|
||||
return (
|
||||
<div>
|
||||
<div className="admin-page-header">
|
||||
<div>
|
||||
<h1 className="admin-page-title">Uživatelé</h1>
|
||||
<p className="admin-page-subtitle">5 uživatelů</p>
|
||||
</div>
|
||||
<button className="admin-btn admin-btn-primary">
|
||||
+ Přidat uživatele
|
||||
</button>
|
||||
</div>
|
||||
<div className="admin-card">
|
||||
<div className="admin-card-body">
|
||||
<div className="admin-search-bar mb-4">
|
||||
<input className="admin-form-input" placeholder="" />
|
||||
</div>
|
||||
<div className="admin-table-responsive">
|
||||
<table className="admin-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Uživatel</th>
|
||||
<th>E-mail</th>
|
||||
<th>Role</th>
|
||||
<th>Stav</th>
|
||||
<th>Akce</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{Array.from({ length: 5 }, (_, i) => (
|
||||
<tr key={i}>
|
||||
<td>
|
||||
<div className="admin-table-user">
|
||||
<div className="admin-table-avatar">A</div>
|
||||
<div>
|
||||
<div className="admin-table-name">Jan Novák</div>
|
||||
<div className="admin-table-username">@jan</div>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td>jan@email.cz</td>
|
||||
<td>
|
||||
<span className="admin-badge admin-badge-admin">
|
||||
Administrátor
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
<span className="admin-badge admin-badge-active">
|
||||
Aktivní
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
<div className="admin-table-actions">
|
||||
<button className="admin-btn-icon">✎</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
48
src/admin/fixtures/VehiclesFixture.tsx
Normal file
48
src/admin/fixtures/VehiclesFixture.tsx
Normal file
@@ -0,0 +1,48 @@
|
||||
export default function VehiclesFixture() {
|
||||
return (
|
||||
<div>
|
||||
<div className="admin-page-header">
|
||||
<h1 className="admin-page-title">Vozidla</h1>
|
||||
<button className="admin-btn admin-btn-primary">
|
||||
+ Přidat vozidlo
|
||||
</button>
|
||||
</div>
|
||||
<div className="admin-card">
|
||||
<div className="admin-card-body">
|
||||
<div className="admin-search-bar mb-4">
|
||||
<input className="admin-form-input" placeholder="" />
|
||||
</div>
|
||||
<div className="admin-table-responsive">
|
||||
<table className="admin-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Značka</th>
|
||||
<th>Model</th>
|
||||
<th>SPZ</th>
|
||||
<th>Rok</th>
|
||||
<th>Akce</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{Array.from({ length: 5 }, (_, i) => (
|
||||
<tr key={i}>
|
||||
<td>Škoda</td>
|
||||
<td>Octavia</td>
|
||||
<td className="admin-mono">1A2 3456</td>
|
||||
<td>2024</td>
|
||||
<td>
|
||||
<div className="admin-table-actions">
|
||||
<button className="admin-btn-icon">✎</button>
|
||||
<button className="admin-btn-icon danger">🗑</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -1,49 +0,0 @@
|
||||
import { useCallback, useRef } from "react";
|
||||
import { useAlert } from "../context/AlertContext";
|
||||
import apiFetch from "../utils/api";
|
||||
|
||||
interface ApiCallResult<T> {
|
||||
data: T | null;
|
||||
ok: boolean;
|
||||
response: Response | null;
|
||||
}
|
||||
|
||||
export default function useApiCall() {
|
||||
const alert = useAlert();
|
||||
const abortRef = useRef<AbortController | null>(null);
|
||||
|
||||
const call = useCallback(
|
||||
async <T = unknown>(
|
||||
url: string,
|
||||
options: RequestInit = {},
|
||||
errorMsg = "Chyba při načítání dat",
|
||||
): Promise<ApiCallResult<T>> => {
|
||||
if (abortRef.current) abortRef.current.abort();
|
||||
const controller = new AbortController();
|
||||
abortRef.current = controller;
|
||||
|
||||
try {
|
||||
const { signal: _, ...restOptions } = options;
|
||||
const response = await apiFetch(url, {
|
||||
...restOptions,
|
||||
signal: controller.signal,
|
||||
});
|
||||
const data = await response.json();
|
||||
if (!response.ok || !data.success) {
|
||||
alert.error(data.error || errorMsg);
|
||||
return { data: null, ok: false, response };
|
||||
}
|
||||
return { data: data.data as T, ok: true, response };
|
||||
} catch (err: unknown) {
|
||||
if (err instanceof Error && err.name === "AbortError") {
|
||||
return { data: null, ok: false, response: null };
|
||||
}
|
||||
alert.error(errorMsg);
|
||||
return { data: null, ok: false, response: null };
|
||||
}
|
||||
},
|
||||
[alert],
|
||||
);
|
||||
|
||||
return { call };
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
import { useState, useEffect, useCallback, useRef } from "react";
|
||||
import { useQueryClient } from "@tanstack/react-query";
|
||||
import apiFetch from "../utils/api";
|
||||
import {
|
||||
calcProjectMinutesTotal,
|
||||
@@ -461,6 +462,7 @@ function buildPrintHtml(
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export default function useAttendanceAdmin({ alert }: AlertContext) {
|
||||
const queryClient = useQueryClient();
|
||||
// ---- Core state ----
|
||||
const [loading, setLoading] = useState(true);
|
||||
const [month, setMonth] = useState(() => {
|
||||
@@ -771,6 +773,7 @@ export default function useAttendanceAdmin({ alert }: AlertContext) {
|
||||
|
||||
if (result.success) {
|
||||
setShowCreateModal(false);
|
||||
queryClient.invalidateQueries({ queryKey: ["attendance"] });
|
||||
await fetchData(false);
|
||||
await new Promise((resolve) => setTimeout(resolve, 300));
|
||||
alert.success(
|
||||
@@ -842,6 +845,7 @@ export default function useAttendanceAdmin({ alert }: AlertContext) {
|
||||
|
||||
if (result.success) {
|
||||
setShowBulkModal(false);
|
||||
queryClient.invalidateQueries({ queryKey: ["attendance"] });
|
||||
await fetchData(false);
|
||||
await new Promise((resolve) => setTimeout(resolve, 300));
|
||||
alert.success(
|
||||
@@ -976,6 +980,7 @@ export default function useAttendanceAdmin({ alert }: AlertContext) {
|
||||
|
||||
if (result.success) {
|
||||
setShowEditModal(false);
|
||||
queryClient.invalidateQueries({ queryKey: ["attendance"] });
|
||||
await fetchData(false);
|
||||
await new Promise((resolve) => setTimeout(resolve, 300));
|
||||
alert.success(
|
||||
@@ -1005,6 +1010,7 @@ export default function useAttendanceAdmin({ alert }: AlertContext) {
|
||||
|
||||
if (result.success) {
|
||||
setDeleteConfirm({ show: false, record: null });
|
||||
queryClient.invalidateQueries({ queryKey: ["attendance"] });
|
||||
await fetchData(false);
|
||||
alert.success(
|
||||
result.message || result.data?.message || "Záznam smazán",
|
||||
|
||||
@@ -1,139 +0,0 @@
|
||||
import { useState, useEffect, useCallback, useRef } from "react";
|
||||
import { useAlert } from "../context/AlertContext";
|
||||
import apiFetch from "../utils/api";
|
||||
import useDebounce from "./useDebounce";
|
||||
|
||||
const API_BASE = "/api/admin";
|
||||
|
||||
interface PaginationData {
|
||||
total: number;
|
||||
page: number;
|
||||
per_page: number;
|
||||
total_pages: number;
|
||||
}
|
||||
|
||||
interface UseListDataOptions {
|
||||
dataKey?: string;
|
||||
search?: string;
|
||||
sort?: string;
|
||||
order?: string;
|
||||
page?: number;
|
||||
perPage?: number;
|
||||
extraParams?: Record<string, string>;
|
||||
errorMsg?: string;
|
||||
}
|
||||
|
||||
export default function useListData<T = unknown>(
|
||||
endpoint: string,
|
||||
options: UseListDataOptions = {},
|
||||
) {
|
||||
const {
|
||||
dataKey,
|
||||
search = "",
|
||||
sort,
|
||||
order,
|
||||
page = 1,
|
||||
perPage = 25,
|
||||
extraParams = {},
|
||||
errorMsg = "Nepodařilo se načíst data",
|
||||
} = options;
|
||||
const alert = useAlert();
|
||||
const [items, setItems] = useState<T[]>([]);
|
||||
const [loading, setLoading] = useState(true);
|
||||
const [initialLoad, setInitialLoad] = useState(true);
|
||||
const [pagination, setPagination] = useState<PaginationData | null>(null);
|
||||
const abortRef = useRef<AbortController | null>(null);
|
||||
const mountedRef = useRef(true);
|
||||
const debouncedSearch = useDebounce(search, 300);
|
||||
|
||||
const extraParamsKey = Object.entries(extraParams)
|
||||
.sort((a, b) => a[0].localeCompare(b[0]))
|
||||
.map(([k, v]) => `${k}=${v}`)
|
||||
.join("&");
|
||||
|
||||
const fetchData = useCallback(async () => {
|
||||
if (abortRef.current) abortRef.current.abort();
|
||||
const controller = new AbortController();
|
||||
abortRef.current = controller;
|
||||
|
||||
try {
|
||||
const params = new URLSearchParams({
|
||||
page: String(page),
|
||||
per_page: String(perPage),
|
||||
});
|
||||
if (debouncedSearch) params.set("search", debouncedSearch);
|
||||
if (sort) params.set("sort", sort);
|
||||
if (order) params.set("order", order);
|
||||
Object.entries(extraParams).forEach(([k, v]) => {
|
||||
if (v) params.set(k, v);
|
||||
});
|
||||
|
||||
const url = endpoint.startsWith("/")
|
||||
? `${endpoint}?${params}`
|
||||
: `${API_BASE}/${endpoint}?${params}`;
|
||||
const response = await apiFetch(url, { signal: controller.signal });
|
||||
if (response.status === 401) {
|
||||
window.location.href = "/login";
|
||||
return;
|
||||
}
|
||||
const result = await response.json();
|
||||
if (result.success) {
|
||||
const data = dataKey
|
||||
? result.data[dataKey]
|
||||
: Array.isArray(result.data)
|
||||
? result.data
|
||||
: result.data?.items || [];
|
||||
setItems(data || []);
|
||||
const pag =
|
||||
result.pagination ||
|
||||
(!Array.isArray(result.data) && result.data?.pagination) ||
|
||||
null;
|
||||
setPagination(
|
||||
pag || {
|
||||
total: data?.length ?? 0,
|
||||
page,
|
||||
per_page: perPage,
|
||||
total_pages: 1,
|
||||
},
|
||||
);
|
||||
} else {
|
||||
alert.error(result.error || errorMsg);
|
||||
}
|
||||
} catch (err: unknown) {
|
||||
if (err instanceof Error && err.name === "AbortError") return;
|
||||
if (!mountedRef.current) return;
|
||||
alert.error(errorMsg);
|
||||
} finally {
|
||||
if (!mountedRef.current) return;
|
||||
setLoading(false);
|
||||
setInitialLoad(false);
|
||||
}
|
||||
}, [
|
||||
endpoint,
|
||||
debouncedSearch,
|
||||
sort,
|
||||
order,
|
||||
page,
|
||||
perPage,
|
||||
dataKey,
|
||||
extraParamsKey,
|
||||
]);
|
||||
|
||||
useEffect(() => {
|
||||
mountedRef.current = true;
|
||||
fetchData();
|
||||
return () => {
|
||||
mountedRef.current = false;
|
||||
if (abortRef.current) abortRef.current.abort();
|
||||
};
|
||||
}, [fetchData]);
|
||||
|
||||
return {
|
||||
items,
|
||||
setItems,
|
||||
loading,
|
||||
initialLoad,
|
||||
pagination,
|
||||
refetch: fetchData,
|
||||
};
|
||||
}
|
||||
44
src/admin/hooks/usePaginatedQuery.ts
Normal file
44
src/admin/hooks/usePaginatedQuery.ts
Normal file
@@ -0,0 +1,44 @@
|
||||
import {
|
||||
useQuery,
|
||||
keepPreviousData,
|
||||
useQueryClient,
|
||||
} from "@tanstack/react-query";
|
||||
import type { UseQueryOptions } from "@tanstack/react-query";
|
||||
|
||||
interface PaginatedResult<T> {
|
||||
data: T[];
|
||||
pagination: {
|
||||
total: number;
|
||||
page: number;
|
||||
per_page: number;
|
||||
total_pages: number;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrapper around useQuery for paginated list endpoints.
|
||||
* Accepts the return value of queryOptions() from lib/queries/*
|
||||
* and extracts items + pagination from the response.
|
||||
*/
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
export function usePaginatedQuery<T>(options: any) {
|
||||
const query = useQuery({
|
||||
...options,
|
||||
placeholderData: keepPreviousData,
|
||||
} as UseQueryOptions<PaginatedResult<T>>);
|
||||
|
||||
const data = query.data as PaginatedResult<T> | undefined;
|
||||
|
||||
return {
|
||||
items: (data?.data ?? []) as T[],
|
||||
pagination: data?.pagination ?? null,
|
||||
isPending: query.isPending,
|
||||
isFetching: query.isFetching,
|
||||
isPlaceholderData: query.isPlaceholderData,
|
||||
isError: query.isError,
|
||||
error: query.error,
|
||||
refetch: query.refetch,
|
||||
};
|
||||
}
|
||||
|
||||
export { useQueryClient, useQuery, keepPreviousData };
|
||||
83
src/admin/lib/apiAdapter.ts
Normal file
83
src/admin/lib/apiAdapter.ts
Normal file
@@ -0,0 +1,83 @@
|
||||
import apiFetch from "../utils/api";
|
||||
|
||||
/**
|
||||
* Thin adapter that converts apiFetch responses into the shape TanStack Query expects.
|
||||
* - Checks response.ok and result.success
|
||||
* - Throws on errors so TanStack Query can handle retry/error states
|
||||
* - Returns result.data directly (unwrapped from the API envelope)
|
||||
*/
|
||||
export async function jsonQuery<T>(
|
||||
url: string,
|
||||
options?: RequestInit,
|
||||
): Promise<T> {
|
||||
const response = await apiFetch(url, options);
|
||||
|
||||
if (response.status === 401) {
|
||||
throw new Error("Unauthorized");
|
||||
}
|
||||
|
||||
let result: { success: boolean; data?: unknown; error?: string };
|
||||
try {
|
||||
result = (await response.json()) as typeof result;
|
||||
} catch {
|
||||
throw new Error("Invalid JSON response");
|
||||
}
|
||||
|
||||
if (!response.ok || !result.success) {
|
||||
throw new Error(result.error || `Request failed (${response.status})`);
|
||||
}
|
||||
|
||||
return result.data as T;
|
||||
}
|
||||
|
||||
export interface PaginationMeta {
|
||||
total: number;
|
||||
page: number;
|
||||
per_page: number;
|
||||
total_pages: number;
|
||||
}
|
||||
|
||||
export interface PaginatedResult<T> {
|
||||
data: T[];
|
||||
pagination: PaginationMeta;
|
||||
}
|
||||
|
||||
export async function paginatedJsonQuery<T>(
|
||||
url: string,
|
||||
options?: RequestInit,
|
||||
): Promise<PaginatedResult<T>> {
|
||||
const response = await apiFetch(url, options);
|
||||
|
||||
if (response.status === 401) {
|
||||
throw new Error("Unauthorized");
|
||||
}
|
||||
|
||||
let result: {
|
||||
success: boolean;
|
||||
data?: unknown;
|
||||
error?: string;
|
||||
pagination?: PaginationMeta;
|
||||
};
|
||||
try {
|
||||
result = (await response.json()) as typeof result;
|
||||
} catch {
|
||||
throw new Error("Invalid JSON response");
|
||||
}
|
||||
|
||||
if (!response.ok || !result.success) {
|
||||
throw new Error(result.error || `Request failed (${response.status})`);
|
||||
}
|
||||
|
||||
const items = Array.isArray(result.data)
|
||||
? result.data
|
||||
: ((result.data as { items?: T[] })?.items ?? []);
|
||||
const pagination = result.pagination ??
|
||||
(result.data as { pagination?: PaginationMeta })?.pagination ?? {
|
||||
total: items.length,
|
||||
page: 1,
|
||||
per_page: items.length,
|
||||
total_pages: 1,
|
||||
};
|
||||
|
||||
return { data: items as T[], pagination };
|
||||
}
|
||||
185
src/admin/lib/queries/attendance.ts
Normal file
185
src/admin/lib/queries/attendance.ts
Normal file
@@ -0,0 +1,185 @@
|
||||
import { queryOptions } from "@tanstack/react-query";
|
||||
import apiFetch from "../../utils/api";
|
||||
import { jsonQuery } from "../apiAdapter";
|
||||
|
||||
interface LocationRaw {
|
||||
users?: { first_name: string; last_name: string };
|
||||
user_name?: string;
|
||||
shift_date: string;
|
||||
arrival_time?: string | null;
|
||||
departure_time?: string | null;
|
||||
arrival_lat?: string | number | null;
|
||||
arrival_lng?: string | number | null;
|
||||
arrival_accuracy?: number | null;
|
||||
arrival_address?: string | null;
|
||||
departure_lat?: string | number | null;
|
||||
departure_lng?: string | number | null;
|
||||
departure_accuracy?: number | null;
|
||||
departure_address?: string | null;
|
||||
}
|
||||
|
||||
export interface LocationRecord {
|
||||
user_name: string;
|
||||
shift_date: string;
|
||||
arrival_time?: string | null;
|
||||
departure_time?: string | null;
|
||||
arrival_lat?: string | number | null;
|
||||
arrival_lng?: string | number | null;
|
||||
arrival_accuracy?: number | null;
|
||||
arrival_address?: string | null;
|
||||
departure_lat?: string | number | null;
|
||||
departure_lng?: string | number | null;
|
||||
departure_accuracy?: number | null;
|
||||
departure_address?: string | null;
|
||||
}
|
||||
|
||||
export interface ProjectLogEntry {
|
||||
id?: number;
|
||||
project_id?: number;
|
||||
project_name?: string;
|
||||
started_at?: string;
|
||||
ended_at?: string | null;
|
||||
hours?: string | number | null;
|
||||
minutes?: string | number | null;
|
||||
}
|
||||
|
||||
export interface AttendanceRecord {
|
||||
id: number;
|
||||
shift_date: string;
|
||||
leave_type?: string;
|
||||
leave_hours?: number;
|
||||
arrival_time?: string | null;
|
||||
departure_time?: string | null;
|
||||
break_start?: string | null;
|
||||
break_end?: string | null;
|
||||
notes?: string;
|
||||
project_name?: string;
|
||||
project_logs?: ProjectLogEntry[];
|
||||
}
|
||||
|
||||
export interface BalanceEntry {
|
||||
name: string;
|
||||
vacation_total: number;
|
||||
vacation_used: number;
|
||||
vacation_remaining: number;
|
||||
sick_used: number;
|
||||
}
|
||||
|
||||
export interface UserShort {
|
||||
id: number | string;
|
||||
name: string;
|
||||
}
|
||||
|
||||
export interface BalancesData {
|
||||
users: UserShort[];
|
||||
balances: Record<string, BalanceEntry>;
|
||||
}
|
||||
|
||||
export interface FundUserData {
|
||||
name: string;
|
||||
worked: number;
|
||||
covered: number;
|
||||
overtime: number;
|
||||
missing: number;
|
||||
}
|
||||
|
||||
export interface MonthFundData {
|
||||
month_name: string;
|
||||
fund: number;
|
||||
fund_to_date: number;
|
||||
business_days: number;
|
||||
users?: Record<string, FundUserData>;
|
||||
}
|
||||
|
||||
export interface FundData {
|
||||
months: Record<string, MonthFundData>;
|
||||
holidays: unknown[];
|
||||
users: UserShort[];
|
||||
balances: Record<string, unknown>;
|
||||
}
|
||||
|
||||
export interface ProjectUser {
|
||||
user_id: number;
|
||||
user_name: string;
|
||||
hours: number;
|
||||
}
|
||||
|
||||
export interface ProjectEntry {
|
||||
project_id: number | null;
|
||||
project_number?: string;
|
||||
project_name?: string;
|
||||
hours: number;
|
||||
users: ProjectUser[];
|
||||
}
|
||||
|
||||
export interface MonthProjectData {
|
||||
month_name: string;
|
||||
projects: ProjectEntry[];
|
||||
}
|
||||
|
||||
export interface ProjectData {
|
||||
months: Record<string, MonthProjectData>;
|
||||
}
|
||||
|
||||
export const attendanceHistoryOptions = (filters: {
|
||||
month?: string;
|
||||
userId?: number;
|
||||
}) =>
|
||||
queryOptions({
|
||||
queryKey: ["attendance", "history", filters],
|
||||
queryFn: () => {
|
||||
const params = new URLSearchParams();
|
||||
params.set("limit", "1000");
|
||||
if (filters.month) params.set("month", filters.month);
|
||||
if (filters.userId) params.set("user_id", String(filters.userId));
|
||||
return jsonQuery<AttendanceRecord[]>(
|
||||
`/api/admin/attendance?${params.toString()}`,
|
||||
);
|
||||
},
|
||||
});
|
||||
|
||||
export const attendanceBalancesOptions = (year: number) =>
|
||||
queryOptions({
|
||||
queryKey: ["attendance", "balances", year],
|
||||
queryFn: () =>
|
||||
jsonQuery<BalancesData>(
|
||||
`/api/admin/attendance?action=balances&year=${year}`,
|
||||
),
|
||||
});
|
||||
|
||||
export const attendanceWorkFundOptions = (year: number) =>
|
||||
queryOptions({
|
||||
queryKey: ["attendance", "workfund", year],
|
||||
queryFn: () =>
|
||||
jsonQuery<FundData>(`/api/admin/attendance?action=workfund&year=${year}`),
|
||||
});
|
||||
|
||||
export const attendanceProjectReportOptions = (year: number) =>
|
||||
queryOptions({
|
||||
queryKey: ["attendance", "project-report", year],
|
||||
queryFn: () =>
|
||||
jsonQuery<ProjectData>(
|
||||
`/api/admin/attendance?action=project_report&year=${year}`,
|
||||
),
|
||||
});
|
||||
|
||||
export const attendanceLocationOptions = (id: string | undefined) =>
|
||||
queryOptions({
|
||||
queryKey: ["attendance", "location", id],
|
||||
queryFn: async (): Promise<LocationRecord> => {
|
||||
const response = await apiFetch(
|
||||
`/api/admin/attendance?action=location&id=${id}`,
|
||||
);
|
||||
const result = await response.json();
|
||||
if (!result.success) {
|
||||
throw new Error(result.error || "Záznam nebyl nalezen");
|
||||
}
|
||||
const raw = (result.data.record || result.data) as LocationRaw;
|
||||
const userName = raw.users
|
||||
? `${raw.users.first_name} ${raw.users.last_name}`.trim()
|
||||
: raw.user_name || "";
|
||||
const { users: _users, ...rest } = raw;
|
||||
return { ...rest, user_name: userName };
|
||||
},
|
||||
enabled: !!id,
|
||||
});
|
||||
28
src/admin/lib/queries/auditLog.ts
Normal file
28
src/admin/lib/queries/auditLog.ts
Normal file
@@ -0,0 +1,28 @@
|
||||
import { queryOptions } from "@tanstack/react-query";
|
||||
import { jsonQuery } from "../apiAdapter";
|
||||
|
||||
export const auditLogOptions = (filters: {
|
||||
search?: string;
|
||||
action?: string;
|
||||
entityType?: string;
|
||||
dateFrom?: string;
|
||||
dateTo?: string;
|
||||
page?: number;
|
||||
}) =>
|
||||
queryOptions({
|
||||
queryKey: ["audit-log", filters],
|
||||
queryFn: () => {
|
||||
const params = new URLSearchParams();
|
||||
if (filters.search) params.set("search", filters.search);
|
||||
if (filters.action) params.set("action", filters.action);
|
||||
if (filters.entityType) params.set("entity_type", filters.entityType);
|
||||
if (filters.dateFrom) params.set("date_from", filters.dateFrom);
|
||||
if (filters.dateTo) params.set("date_to", filters.dateTo);
|
||||
if (filters.page) params.set("page", String(filters.page));
|
||||
const qs = params.toString();
|
||||
return jsonQuery<{
|
||||
data: Record<string, unknown>[];
|
||||
pagination: Record<string, unknown>;
|
||||
}>(`/api/admin/audit-log${qs ? `?${qs}` : ""}`);
|
||||
},
|
||||
});
|
||||
28
src/admin/lib/queries/common.ts
Normal file
28
src/admin/lib/queries/common.ts
Normal file
@@ -0,0 +1,28 @@
|
||||
import { queryOptions } from "@tanstack/react-query";
|
||||
import { jsonQuery } from "../apiAdapter";
|
||||
|
||||
export interface BankAccount {
|
||||
id: number;
|
||||
account_name: string;
|
||||
bank_name: string;
|
||||
account_number: string;
|
||||
iban: string;
|
||||
bic: string;
|
||||
currency: string;
|
||||
is_default: boolean;
|
||||
}
|
||||
|
||||
export const bankAccountsOptions = () =>
|
||||
queryOptions({
|
||||
queryKey: ["bank-accounts"],
|
||||
queryFn: () => jsonQuery<BankAccount[]>("/api/admin/bank-accounts"),
|
||||
staleTime: 2 * 60_000,
|
||||
});
|
||||
|
||||
export const supplierListOptions = () =>
|
||||
queryOptions({
|
||||
queryKey: ["suppliers"],
|
||||
queryFn: () =>
|
||||
jsonQuery<string[]>("/api/admin/received-invoices/suppliers"),
|
||||
staleTime: 2 * 60_000,
|
||||
});
|
||||
42
src/admin/lib/queries/dashboard.ts
Normal file
42
src/admin/lib/queries/dashboard.ts
Normal file
@@ -0,0 +1,42 @@
|
||||
import { queryOptions } from "@tanstack/react-query";
|
||||
import apiFetch from "../../utils/api";
|
||||
import { jsonQuery } from "../apiAdapter";
|
||||
|
||||
export const dashboardOptions = () =>
|
||||
queryOptions({
|
||||
queryKey: ["dashboard"],
|
||||
queryFn: () => jsonQuery<Record<string, unknown>>("/api/admin/dashboard"),
|
||||
staleTime: 60_000,
|
||||
});
|
||||
|
||||
export const require2FAOptions = () =>
|
||||
queryOptions({
|
||||
queryKey: ["settings", "2fa"],
|
||||
queryFn: () =>
|
||||
jsonQuery<{ require_2fa: boolean }>("/api/admin/totp/required"),
|
||||
});
|
||||
|
||||
export interface Session {
|
||||
id: number | string;
|
||||
is_current: boolean;
|
||||
device_info?: {
|
||||
icon?: string;
|
||||
browser?: string;
|
||||
os?: string;
|
||||
};
|
||||
ip_address: string;
|
||||
created_at: string;
|
||||
}
|
||||
|
||||
export const sessionsOptions = () =>
|
||||
queryOptions({
|
||||
queryKey: ["sessions"],
|
||||
queryFn: async (): Promise<Session[]> => {
|
||||
const response = await apiFetch("/api/admin/sessions");
|
||||
const data = await response.json();
|
||||
if (data.success) {
|
||||
return Array.isArray(data.data) ? data.data : data.data?.sessions || [];
|
||||
}
|
||||
throw new Error(data.error || "Nepodařilo se načíst relace");
|
||||
},
|
||||
});
|
||||
208
src/admin/lib/queries/invoices.ts
Normal file
208
src/admin/lib/queries/invoices.ts
Normal file
@@ -0,0 +1,208 @@
|
||||
import { queryOptions } from "@tanstack/react-query";
|
||||
import { jsonQuery, paginatedJsonQuery } from "../apiAdapter";
|
||||
|
||||
export interface CurrencyAmount {
|
||||
amount: number;
|
||||
currency: string;
|
||||
}
|
||||
|
||||
export interface Invoice {
|
||||
id: number;
|
||||
invoice_number: string;
|
||||
customer_name: string | null;
|
||||
status: string;
|
||||
issue_date: string;
|
||||
due_date: string;
|
||||
total: number;
|
||||
currency: string;
|
||||
}
|
||||
|
||||
export interface InvoiceStats {
|
||||
paid_month: CurrencyAmount[];
|
||||
paid_month_czk: number;
|
||||
paid_month_count: number;
|
||||
awaiting: CurrencyAmount[];
|
||||
awaiting_czk: number;
|
||||
awaiting_count: number;
|
||||
overdue: CurrencyAmount[];
|
||||
overdue_czk: number;
|
||||
overdue_count: number;
|
||||
vat_month: CurrencyAmount[];
|
||||
vat_month_czk: number;
|
||||
}
|
||||
|
||||
export interface InvoiceItem {
|
||||
id?: number;
|
||||
description: string;
|
||||
item_description: string;
|
||||
quantity: number;
|
||||
unit: string;
|
||||
unit_price: number;
|
||||
is_included_in_total: boolean;
|
||||
position?: number;
|
||||
}
|
||||
|
||||
export interface InvoiceDetail {
|
||||
id: number;
|
||||
invoice_number: string;
|
||||
customer_id: number | null;
|
||||
customer_name: string;
|
||||
customer?: {
|
||||
company_id?: string;
|
||||
vat_id?: string;
|
||||
};
|
||||
status: string;
|
||||
issue_date: string;
|
||||
due_date: string;
|
||||
taxable_date?: string;
|
||||
tax_date?: string;
|
||||
currency: string;
|
||||
language: string;
|
||||
vat_rate: number;
|
||||
apply_vat: boolean;
|
||||
exchange_rate: string;
|
||||
notes?: string;
|
||||
payment_method?: string;
|
||||
variable_symbol?: string;
|
||||
constant_symbol?: string;
|
||||
issued_by?: string | null;
|
||||
paid_date?: string;
|
||||
billing_text?: string;
|
||||
bank_name?: string;
|
||||
bank_swift?: string;
|
||||
bank_iban?: string;
|
||||
bank_account?: string;
|
||||
bank_account_id?: number | null;
|
||||
items?: InvoiceItem[];
|
||||
subtotal: number;
|
||||
vat_amount: number;
|
||||
total: number;
|
||||
order?: {
|
||||
id: number;
|
||||
order_number: string;
|
||||
status?: string;
|
||||
} | null;
|
||||
order_id?: number;
|
||||
order_number?: string;
|
||||
has_pdf?: boolean;
|
||||
valid_transitions?: string[];
|
||||
}
|
||||
|
||||
export interface ReceivedInvoice {
|
||||
id: number;
|
||||
supplier_name: string;
|
||||
invoice_number: string;
|
||||
amount: number;
|
||||
currency: string;
|
||||
vat_rate: number;
|
||||
issue_date: string;
|
||||
due_date: string;
|
||||
notes: string;
|
||||
status: string;
|
||||
file_name?: string;
|
||||
created_at: string;
|
||||
}
|
||||
|
||||
export interface ReceivedStats {
|
||||
total_month: CurrencyAmount[];
|
||||
total_month_czk: number | null;
|
||||
vat_month: CurrencyAmount[];
|
||||
vat_month_czk: number | null;
|
||||
unpaid: CurrencyAmount[];
|
||||
unpaid_czk: number | null;
|
||||
unpaid_count: number;
|
||||
month_count: number;
|
||||
}
|
||||
|
||||
export const invoiceListOptions = (filters: {
|
||||
search?: string;
|
||||
sort?: string;
|
||||
order?: string;
|
||||
page?: number;
|
||||
perPage?: number;
|
||||
month?: number;
|
||||
year?: number;
|
||||
status?: string;
|
||||
}) =>
|
||||
queryOptions({
|
||||
queryKey: ["invoices", "list", filters],
|
||||
queryFn: () => {
|
||||
const params = new URLSearchParams();
|
||||
if (filters.search) params.set("search", filters.search);
|
||||
if (filters.sort) params.set("sort", filters.sort);
|
||||
if (filters.order) params.set("order", filters.order);
|
||||
if (filters.page) params.set("page", String(filters.page));
|
||||
if (filters.perPage) params.set("per_page", String(filters.perPage));
|
||||
if (filters.month) params.set("month", String(filters.month));
|
||||
if (filters.year) params.set("year", String(filters.year));
|
||||
if (filters.status) params.set("status", filters.status);
|
||||
const qs = params.toString();
|
||||
return paginatedJsonQuery<Invoice>(
|
||||
`/api/admin/invoices${qs ? `?${qs}` : ""}`,
|
||||
);
|
||||
},
|
||||
});
|
||||
|
||||
export const receivedInvoiceListOptions = (filters: {
|
||||
month?: number;
|
||||
year?: number;
|
||||
search?: string;
|
||||
sort?: string;
|
||||
order?: string;
|
||||
page?: number;
|
||||
perPage?: number;
|
||||
}) =>
|
||||
queryOptions({
|
||||
queryKey: [
|
||||
"invoices",
|
||||
"received",
|
||||
{
|
||||
month: filters.month,
|
||||
year: filters.year,
|
||||
search: filters.search,
|
||||
sort: filters.sort,
|
||||
order: filters.order,
|
||||
page: filters.page,
|
||||
perPage: filters.perPage,
|
||||
},
|
||||
],
|
||||
queryFn: () => {
|
||||
const params = new URLSearchParams();
|
||||
if (filters.month) params.set("month", String(filters.month));
|
||||
if (filters.year) params.set("year", String(filters.year));
|
||||
if (filters.search) params.set("search", filters.search);
|
||||
if (filters.sort) params.set("sort", filters.sort);
|
||||
if (filters.order) params.set("order", filters.order);
|
||||
if (filters.page) params.set("page", String(filters.page));
|
||||
if (filters.perPage) params.set("per_page", String(filters.perPage));
|
||||
const qs = params.toString();
|
||||
return paginatedJsonQuery<ReceivedInvoice>(
|
||||
`/api/admin/received-invoices${qs ? `?${qs}` : ""}`,
|
||||
);
|
||||
},
|
||||
});
|
||||
|
||||
export const invoiceStatsOptions = (month: number, year: number) =>
|
||||
queryOptions({
|
||||
queryKey: ["invoices", "stats", month, year],
|
||||
queryFn: () =>
|
||||
jsonQuery<InvoiceStats>(
|
||||
`/api/admin/invoices/stats?month=${month}&year=${year}`,
|
||||
),
|
||||
});
|
||||
|
||||
export const receivedInvoiceStatsOptions = (month: number, year: number) =>
|
||||
queryOptions({
|
||||
queryKey: ["invoices", "received", "stats", month, year],
|
||||
queryFn: () =>
|
||||
jsonQuery<ReceivedStats>(
|
||||
`/api/admin/received-invoices/stats?month=${month}&year=${year}`,
|
||||
),
|
||||
});
|
||||
|
||||
export const invoiceDetailOptions = (id: string | undefined) =>
|
||||
queryOptions({
|
||||
queryKey: ["invoices", id],
|
||||
queryFn: () => jsonQuery<InvoiceDetail>(`/api/admin/invoices/${id}`),
|
||||
enabled: !!id,
|
||||
});
|
||||
42
src/admin/lib/queries/leave.ts
Normal file
42
src/admin/lib/queries/leave.ts
Normal file
@@ -0,0 +1,42 @@
|
||||
import { queryOptions } from "@tanstack/react-query";
|
||||
import { jsonQuery } from "../apiAdapter";
|
||||
|
||||
export interface LeaveRequest {
|
||||
id: number;
|
||||
leave_type: string;
|
||||
date_from: string;
|
||||
date_to: string;
|
||||
total_days: number;
|
||||
total_hours: number;
|
||||
status: string;
|
||||
notes?: string;
|
||||
reviewer_note?: string;
|
||||
created_at: string;
|
||||
}
|
||||
|
||||
export const leaveRequestsOptions = (mine = true) =>
|
||||
queryOptions({
|
||||
queryKey: ["leave-requests", mine ? "mine" : "all"],
|
||||
queryFn: () =>
|
||||
jsonQuery<LeaveRequest[]>(
|
||||
`/api/admin/leave-requests${mine ? "?mine=1" : ""}`,
|
||||
),
|
||||
});
|
||||
|
||||
export const leavePendingOptions = () =>
|
||||
queryOptions({
|
||||
queryKey: ["leave", "pending"],
|
||||
queryFn: () =>
|
||||
jsonQuery<Record<string, unknown>[]>(
|
||||
"/api/admin/leave-requests?status=pending",
|
||||
),
|
||||
});
|
||||
|
||||
export const leaveProcessedOptions = () =>
|
||||
queryOptions({
|
||||
queryKey: ["leave", "processed"],
|
||||
queryFn: () =>
|
||||
jsonQuery<Record<string, unknown>[]>(
|
||||
"/api/admin/leave-requests?status=approved,rejected",
|
||||
),
|
||||
});
|
||||
157
src/admin/lib/queries/offers.ts
Normal file
157
src/admin/lib/queries/offers.ts
Normal file
@@ -0,0 +1,157 @@
|
||||
import { queryOptions } from "@tanstack/react-query";
|
||||
import { jsonQuery, paginatedJsonQuery } from "../apiAdapter";
|
||||
|
||||
export interface ItemTemplate {
|
||||
id: number;
|
||||
name: string;
|
||||
description: string;
|
||||
default_price: number;
|
||||
category: string;
|
||||
}
|
||||
|
||||
export interface ScopeSection {
|
||||
_key: string;
|
||||
title: string;
|
||||
title_cz: string;
|
||||
content: string;
|
||||
}
|
||||
|
||||
export interface ScopeTemplate {
|
||||
id: number;
|
||||
name: string;
|
||||
title?: string;
|
||||
description?: string;
|
||||
scope_template_sections?: ScopeSection[];
|
||||
}
|
||||
|
||||
export interface CustomField {
|
||||
name: string;
|
||||
value: string;
|
||||
showLabel: boolean;
|
||||
_key?: string;
|
||||
}
|
||||
|
||||
export interface Customer {
|
||||
id: number;
|
||||
name: string;
|
||||
street?: string;
|
||||
city?: string;
|
||||
postal_code?: string;
|
||||
country?: string;
|
||||
company_id?: string;
|
||||
vat_id?: string;
|
||||
quotation_count: number;
|
||||
custom_fields?: CustomField[];
|
||||
customer_field_order?: string[];
|
||||
}
|
||||
|
||||
export const offerCustomersOptions = () =>
|
||||
queryOptions({
|
||||
queryKey: ["offer-customers"],
|
||||
queryFn: () => jsonQuery<Customer[]>("/api/admin/customers"),
|
||||
staleTime: 2 * 60_000,
|
||||
});
|
||||
|
||||
export const itemTemplatesOptions = () =>
|
||||
queryOptions({
|
||||
queryKey: ["offer-templates", "items"],
|
||||
queryFn: () =>
|
||||
jsonQuery<ItemTemplate[]>("/api/admin/offers-templates?action=items"),
|
||||
});
|
||||
|
||||
export const scopeTemplatesOptions = () =>
|
||||
queryOptions({
|
||||
queryKey: ["offer-templates", "scopes"],
|
||||
queryFn: () => jsonQuery<ScopeTemplate[]>("/api/admin/offers-templates"),
|
||||
});
|
||||
|
||||
export const offerListOptions = (filters: {
|
||||
search?: string;
|
||||
sort?: string;
|
||||
order?: string;
|
||||
page?: number;
|
||||
perPage?: number;
|
||||
status?: string;
|
||||
customer_id?: number;
|
||||
}) =>
|
||||
queryOptions({
|
||||
queryKey: ["offers", "list", filters],
|
||||
queryFn: () => {
|
||||
const params = new URLSearchParams();
|
||||
if (filters.search) params.set("search", filters.search);
|
||||
if (filters.sort) params.set("sort", filters.sort);
|
||||
if (filters.order) params.set("order", filters.order);
|
||||
if (filters.page) params.set("page", String(filters.page));
|
||||
if (filters.perPage) params.set("per_page", String(filters.perPage));
|
||||
if (filters.status) params.set("status", filters.status);
|
||||
if (filters.customer_id)
|
||||
params.set("customer_id", String(filters.customer_id));
|
||||
const qs = params.toString();
|
||||
return paginatedJsonQuery(`/api/admin/offers${qs ? `?${qs}` : ""}`);
|
||||
},
|
||||
});
|
||||
|
||||
export interface OfferItemData {
|
||||
id?: number;
|
||||
description: string;
|
||||
item_description: string;
|
||||
quantity: number;
|
||||
unit: string;
|
||||
unit_price: number;
|
||||
is_included_in_total: boolean;
|
||||
position?: number;
|
||||
}
|
||||
|
||||
export interface OfferSectionData {
|
||||
title: string;
|
||||
title_cz: string;
|
||||
content: string;
|
||||
position?: number;
|
||||
}
|
||||
|
||||
export interface OfferLockInfo {
|
||||
user_id: number;
|
||||
username: string;
|
||||
full_name: string;
|
||||
}
|
||||
|
||||
export interface OfferOrderInfo {
|
||||
id: number;
|
||||
order_number: string;
|
||||
status?: string;
|
||||
}
|
||||
|
||||
export interface OfferDetailData {
|
||||
id: number;
|
||||
quotation_number: string;
|
||||
project_code: string;
|
||||
customer_id: number | null;
|
||||
customer_name: string;
|
||||
created_at: string;
|
||||
valid_until: string;
|
||||
currency: string;
|
||||
language: string;
|
||||
vat_rate: number;
|
||||
apply_vat: boolean;
|
||||
items?: OfferItemData[];
|
||||
sections?: OfferSectionData[];
|
||||
status: string;
|
||||
order: OfferOrderInfo | null;
|
||||
locked_by: OfferLockInfo | null;
|
||||
}
|
||||
|
||||
export const offerDetailOptions = (id: string | undefined) =>
|
||||
queryOptions({
|
||||
queryKey: ["offers", id],
|
||||
queryFn: () => jsonQuery<OfferDetailData>(`/api/admin/offers/${id}`),
|
||||
enabled: !!id,
|
||||
});
|
||||
|
||||
export const offerNextNumberOptions = () =>
|
||||
queryOptions({
|
||||
queryKey: ["offers", "next-number"],
|
||||
queryFn: () =>
|
||||
jsonQuery<{ next_number?: string; number?: string }>(
|
||||
"/api/admin/offers/next-number",
|
||||
),
|
||||
});
|
||||
84
src/admin/lib/queries/orders.ts
Normal file
84
src/admin/lib/queries/orders.ts
Normal file
@@ -0,0 +1,84 @@
|
||||
import { queryOptions } from "@tanstack/react-query";
|
||||
import { jsonQuery, paginatedJsonQuery } from "../apiAdapter";
|
||||
|
||||
export interface OrderItem {
|
||||
id?: number;
|
||||
description: string;
|
||||
item_description?: string;
|
||||
quantity: number;
|
||||
unit: string;
|
||||
unit_price: number;
|
||||
is_included_in_total: number | boolean;
|
||||
}
|
||||
|
||||
export interface OrderSection {
|
||||
id?: number;
|
||||
title: string;
|
||||
title_cz?: string;
|
||||
content: string;
|
||||
}
|
||||
|
||||
export interface OrderInvoice {
|
||||
id: number;
|
||||
invoice_number: string;
|
||||
}
|
||||
|
||||
export interface OrderProject {
|
||||
id: number;
|
||||
project_number: string;
|
||||
name: string;
|
||||
has_nas_folder?: boolean;
|
||||
}
|
||||
|
||||
export interface OrderData {
|
||||
id: number;
|
||||
order_number: string;
|
||||
quotation_id: number;
|
||||
quotation_number: string;
|
||||
project_code?: string;
|
||||
customer_name: string;
|
||||
customer_order_number: string;
|
||||
currency: string;
|
||||
created_at: string;
|
||||
status: string;
|
||||
notes: string;
|
||||
attachment_name?: string;
|
||||
apply_vat: number | boolean;
|
||||
vat_rate: number;
|
||||
language?: string;
|
||||
items: OrderItem[];
|
||||
sections: OrderSection[];
|
||||
scope_title?: string;
|
||||
scope_description?: string;
|
||||
valid_transitions?: string[];
|
||||
invoice?: OrderInvoice;
|
||||
project?: OrderProject;
|
||||
}
|
||||
|
||||
export const orderListOptions = (filters: {
|
||||
search?: string;
|
||||
sort?: string;
|
||||
order?: string;
|
||||
page?: number;
|
||||
perPage?: number;
|
||||
}) =>
|
||||
queryOptions({
|
||||
queryKey: ["orders", "list", filters],
|
||||
queryFn: () => {
|
||||
const params = new URLSearchParams();
|
||||
if (filters.search) params.set("search", filters.search);
|
||||
if (filters.sort) params.set("sort", filters.sort);
|
||||
if (filters.order) params.set("order", filters.order);
|
||||
if (filters.page) params.set("page", String(filters.page));
|
||||
if (filters.perPage) params.set("per_page", String(filters.perPage));
|
||||
const qs = params.toString();
|
||||
return paginatedJsonQuery(`/api/admin/orders${qs ? `?${qs}` : ""}`);
|
||||
},
|
||||
});
|
||||
|
||||
export const orderDetailOptions = (id: string | undefined) =>
|
||||
queryOptions({
|
||||
queryKey: ["orders", id],
|
||||
queryFn: () => jsonQuery<OrderData>(`/api/admin/orders/${id}`),
|
||||
enabled: !!id,
|
||||
});
|
||||
103
src/admin/lib/queries/projects.ts
Normal file
103
src/admin/lib/queries/projects.ts
Normal file
@@ -0,0 +1,103 @@
|
||||
import { queryOptions } from "@tanstack/react-query";
|
||||
import { jsonQuery, paginatedJsonQuery } from "../apiAdapter";
|
||||
import apiFetch from "../../utils/api";
|
||||
|
||||
export interface ProjectNote {
|
||||
id: number;
|
||||
content: string;
|
||||
user_name: string;
|
||||
created_at: string;
|
||||
}
|
||||
|
||||
export interface ProjectData {
|
||||
id: number;
|
||||
project_number: string;
|
||||
name: string;
|
||||
status: string;
|
||||
start_date: string;
|
||||
end_date: string;
|
||||
customer_name: string;
|
||||
responsible_user_id: string;
|
||||
notes?: string;
|
||||
order_id?: number;
|
||||
order_number?: string;
|
||||
order_status?: string;
|
||||
quotation_id?: number;
|
||||
quotation_number?: string;
|
||||
has_nas_folder?: boolean;
|
||||
project_notes?: ProjectNote[];
|
||||
}
|
||||
|
||||
export const projectListOptions = (filters: {
|
||||
search?: string;
|
||||
sort?: string;
|
||||
order?: string;
|
||||
page?: number;
|
||||
perPage?: number;
|
||||
}) =>
|
||||
queryOptions({
|
||||
queryKey: ["projects", "list", filters],
|
||||
queryFn: () => {
|
||||
const params = new URLSearchParams();
|
||||
if (filters.search) params.set("search", filters.search);
|
||||
if (filters.sort) params.set("sort", filters.sort);
|
||||
if (filters.order) params.set("order", filters.order);
|
||||
if (filters.page) params.set("page", String(filters.page));
|
||||
if (filters.perPage) params.set("per_page", String(filters.perPage));
|
||||
const qs = params.toString();
|
||||
return paginatedJsonQuery(`/api/admin/projects${qs ? `?${qs}` : ""}`);
|
||||
},
|
||||
});
|
||||
|
||||
export const projectDetailOptions = (id: string | undefined) =>
|
||||
queryOptions({
|
||||
queryKey: ["projects", id],
|
||||
queryFn: () => jsonQuery<ProjectData>(`/api/admin/projects/${id}`),
|
||||
enabled: !!id,
|
||||
});
|
||||
|
||||
export interface ProjectFilesData {
|
||||
items: Array<{
|
||||
name: string;
|
||||
type: "file" | "folder";
|
||||
size?: number;
|
||||
size_formatted?: string;
|
||||
modified?: string;
|
||||
extension?: string;
|
||||
item_count?: number;
|
||||
is_symlink?: boolean;
|
||||
link_target?: string;
|
||||
}>;
|
||||
breadcrumb: string[];
|
||||
path: string;
|
||||
full_path: string;
|
||||
}
|
||||
|
||||
export const projectFilesOptions = (projectId: number, path: string) =>
|
||||
queryOptions({
|
||||
queryKey: ["projects", String(projectId), "files", path],
|
||||
queryFn: async (): Promise<ProjectFilesData> => {
|
||||
const params = new URLSearchParams({ project_id: String(projectId) });
|
||||
if (path) params.set("path", path);
|
||||
let res: Response;
|
||||
try {
|
||||
res = await apiFetch(`/api/admin/project-files?${params}`);
|
||||
} catch {
|
||||
throw new Error("Chyba připojení");
|
||||
}
|
||||
if (res.status === 401) throw new Error("Unauthorized");
|
||||
if (res.status === 404) {
|
||||
return { items: [], breadcrumb: [""], path: "", full_path: "" };
|
||||
}
|
||||
const data = await res.json();
|
||||
if (!res.ok || !data.success) {
|
||||
throw new Error(data.error || `Request failed (${res.status})`);
|
||||
}
|
||||
return {
|
||||
items: data.data.items || [],
|
||||
breadcrumb: data.data.breadcrumb || [""],
|
||||
path: data.data.path || "",
|
||||
full_path: data.data.full_path || "",
|
||||
};
|
||||
},
|
||||
});
|
||||
81
src/admin/lib/queries/settings.ts
Normal file
81
src/admin/lib/queries/settings.ts
Normal file
@@ -0,0 +1,81 @@
|
||||
import { queryOptions } from "@tanstack/react-query";
|
||||
import { jsonQuery } from "../apiAdapter";
|
||||
|
||||
export interface CompanySettingsCustomField {
|
||||
name: string;
|
||||
value: string;
|
||||
showLabel: boolean;
|
||||
}
|
||||
|
||||
export interface CompanySettingsData {
|
||||
// Company info
|
||||
company_name?: string;
|
||||
street?: string;
|
||||
city?: string;
|
||||
postal_code?: string;
|
||||
country?: string;
|
||||
company_id?: string;
|
||||
vat_id?: string;
|
||||
ico?: string;
|
||||
dic?: string;
|
||||
has_logo?: boolean;
|
||||
has_logo_dark?: boolean;
|
||||
custom_fields?: CompanySettingsCustomField[];
|
||||
supplier_field_order?: string[];
|
||||
|
||||
// System settings
|
||||
require_2fa?: boolean;
|
||||
default_currency?: string;
|
||||
default_vat_rate?: number;
|
||||
available_currencies?: string[];
|
||||
available_vat_rates?: number[];
|
||||
break_threshold_hours?: number;
|
||||
break_duration_short?: number;
|
||||
break_duration_long?: number;
|
||||
clock_rounding_minutes?: number;
|
||||
invoice_alert_email?: string;
|
||||
leave_notify_email?: string;
|
||||
smtp_from?: string;
|
||||
smtp_from_name?: string;
|
||||
max_login_attempts?: number;
|
||||
lockout_minutes?: number;
|
||||
max_requests_per_minute?: number;
|
||||
|
||||
// Numbering
|
||||
quotation_prefix?: string;
|
||||
order_type_code?: string;
|
||||
invoice_type_code?: string;
|
||||
offer_number_pattern?: string;
|
||||
order_number_pattern?: string;
|
||||
invoice_number_pattern?: string;
|
||||
|
||||
// Misc
|
||||
app_version?: string;
|
||||
}
|
||||
|
||||
export const companySettingsOptions = () =>
|
||||
queryOptions({
|
||||
queryKey: ["company-settings"],
|
||||
queryFn: () =>
|
||||
jsonQuery<CompanySettingsData>("/api/admin/company-settings"),
|
||||
staleTime: 5 * 60_000,
|
||||
});
|
||||
|
||||
export const systemInfoOptions = () =>
|
||||
queryOptions({
|
||||
queryKey: ["settings", "system-info"],
|
||||
queryFn: () =>
|
||||
jsonQuery<Record<string, unknown>>(
|
||||
"/api/admin/company-settings/system-info",
|
||||
),
|
||||
});
|
||||
|
||||
/** @deprecated Use systemInfoOptions instead — this query fetches system-info, not system settings. */
|
||||
export const systemSettingsOptions = systemInfoOptions;
|
||||
|
||||
export const require2FAOptions = () =>
|
||||
queryOptions({
|
||||
queryKey: ["settings", "2fa"],
|
||||
queryFn: () =>
|
||||
jsonQuery<{ require_2fa: boolean }>("/api/admin/totp/required"),
|
||||
});
|
||||
104
src/admin/lib/queries/trips.ts
Normal file
104
src/admin/lib/queries/trips.ts
Normal file
@@ -0,0 +1,104 @@
|
||||
import { queryOptions } from "@tanstack/react-query";
|
||||
import { jsonQuery } from "../apiAdapter";
|
||||
|
||||
export interface TripVehicle {
|
||||
id: number;
|
||||
spz: string;
|
||||
name: string;
|
||||
}
|
||||
|
||||
export interface TripUser {
|
||||
id: number;
|
||||
name: string;
|
||||
}
|
||||
|
||||
export interface BackendTrip {
|
||||
id: number;
|
||||
vehicle_id: number;
|
||||
user_id: number;
|
||||
trip_date: string;
|
||||
start_km: number;
|
||||
end_km: number;
|
||||
distance: number | null;
|
||||
route_from: string;
|
||||
route_to: string;
|
||||
is_business: boolean;
|
||||
notes: string | null;
|
||||
users: { id: number; first_name: string; last_name: string };
|
||||
vehicles: { id: number; name: string; spz: string };
|
||||
}
|
||||
|
||||
export const tripListOptions = (filters: {
|
||||
month?: number;
|
||||
year?: number;
|
||||
vehicleId?: number;
|
||||
userId?: number;
|
||||
page?: number;
|
||||
perPage?: number;
|
||||
}) =>
|
||||
queryOptions({
|
||||
queryKey: [
|
||||
"trips",
|
||||
"list",
|
||||
{
|
||||
month: filters.month,
|
||||
year: filters.year,
|
||||
vehicleId: filters.vehicleId,
|
||||
userId: filters.userId,
|
||||
page: filters.page,
|
||||
perPage: filters.perPage,
|
||||
},
|
||||
],
|
||||
queryFn: () => {
|
||||
const params = new URLSearchParams();
|
||||
if (filters.month) params.set("month", String(filters.month));
|
||||
if (filters.year) params.set("year", String(filters.year));
|
||||
if (filters.vehicleId)
|
||||
params.set("vehicle_id", String(filters.vehicleId));
|
||||
if (filters.userId) params.set("user_id", String(filters.userId));
|
||||
if (filters.page) params.set("page", String(filters.page));
|
||||
if (filters.perPage) params.set("per_page", String(filters.perPage));
|
||||
const qs = params.toString();
|
||||
return jsonQuery<BackendTrip[]>(`/api/admin/trips${qs ? `?${qs}` : ""}`);
|
||||
},
|
||||
});
|
||||
|
||||
export const tripVehiclesOptions = () =>
|
||||
queryOptions({
|
||||
queryKey: ["trips", "vehicles"],
|
||||
queryFn: () => jsonQuery<TripVehicle[]>("/api/admin/vehicles"),
|
||||
staleTime: 2 * 60_000,
|
||||
});
|
||||
|
||||
export const tripUsersOptions = () =>
|
||||
queryOptions({
|
||||
queryKey: ["trips", "users"],
|
||||
queryFn: () => jsonQuery<TripUser[]>("/api/admin/trips/users"),
|
||||
staleTime: 2 * 60_000,
|
||||
});
|
||||
|
||||
export const tripHistoryOptions = (filters: {
|
||||
month?: string;
|
||||
vehicleId?: number;
|
||||
userId?: number;
|
||||
}) =>
|
||||
queryOptions({
|
||||
queryKey: [
|
||||
"trips",
|
||||
"history",
|
||||
{
|
||||
month: filters.month,
|
||||
vehicleId: filters.vehicleId,
|
||||
userId: filters.userId,
|
||||
},
|
||||
],
|
||||
queryFn: () => {
|
||||
const params = new URLSearchParams();
|
||||
if (filters.month) params.set("month", filters.month);
|
||||
if (filters.vehicleId)
|
||||
params.set("vehicle_id", String(filters.vehicleId));
|
||||
if (filters.userId) params.set("user_id", String(filters.userId));
|
||||
const qs = params.toString();
|
||||
return jsonQuery<BackendTrip[]>(`/api/admin/trips${qs ? `?${qs}` : ""}`);
|
||||
},
|
||||
});
|
||||
37
src/admin/lib/queries/users.ts
Normal file
37
src/admin/lib/queries/users.ts
Normal file
@@ -0,0 +1,37 @@
|
||||
import { queryOptions } from "@tanstack/react-query";
|
||||
import { jsonQuery } from "../apiAdapter";
|
||||
|
||||
export interface User {
|
||||
id: number;
|
||||
username: string;
|
||||
email: string;
|
||||
first_name: string;
|
||||
last_name: string;
|
||||
role_id: number;
|
||||
roles?: { id: number; name: string; display_name: string } | null;
|
||||
is_active: boolean;
|
||||
}
|
||||
|
||||
export interface Role {
|
||||
id: number;
|
||||
name: string;
|
||||
display_name: string;
|
||||
}
|
||||
|
||||
export const userListOptions = (permission?: string) =>
|
||||
queryOptions({
|
||||
queryKey: ["users", { permission }],
|
||||
queryFn: () => {
|
||||
const url = permission
|
||||
? `/api/admin/users?permission=${encodeURIComponent(permission)}&limit=100`
|
||||
: "/api/admin/users?limit=100";
|
||||
return jsonQuery<User[]>(url);
|
||||
},
|
||||
});
|
||||
|
||||
export const roleListOptions = () =>
|
||||
queryOptions({
|
||||
queryKey: ["roles"],
|
||||
queryFn: () => jsonQuery<Role[]>("/api/admin/roles"),
|
||||
staleTime: 2 * 60_000,
|
||||
});
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user